# Path: esc/commands.py
# BINOP = 'binop'
# UNOP = 'unop'
# MAIN_DOC = """
#     The main menu. All other esc functions and menus are eventually accessible
#     from this menu.
# """
# class EscCommand:
# class EscMenu(EscCommand):
# class EscOperation(EscCommand):
# class EscBuiltin(EscCommand):
#     def __init__(self, key, description):
#     def help_title(self):
#     def signature_info(self):
#     def execute(self, access_key, ss, registry):
#     def register_child(self, child):
#     def simulated_result(self, ss, registry):  # pylint: disable=no-self-use, unused-argument
#     def test(self):
#     def __init__(self, key, description, doc, mode_display=None):
#     def __repr__(self):
#     def signature_info(self):
#     def is_main_menu(self):
#     def anonymous_children(self):
#     def named_children(self):
#     def child(self, access_key):
#     def execute(self, access_key, ss, registry):
#     def test(self):
#     def __init__(self, key, func, pop, push, description, menu, retain=False,
#                  log_as=None, simulate=True):
#     def __repr__(self):
#     def __doc__(self):
#     def signature_info(self):
#     def _describe_operation(self, args, retvals, registry):
#     def _insufficient_items_on_stack(self, pops_requested=None):
#     def _retrieve_arguments(self, ss):
#     def _simulated_description(self, args, log, results):
#     def _store_results(self, ss, args, return_values, registry):
#     def execute(self, access_key, ss, registry):  # pylint: disable=useless-return
#     def simulated_result(self, ss, registry):
#     def test(self):
#     def __init__(self):
#     def execute(self, access_key, ss, registry):  # pylint: disable=useless-return
#     def simulated_result(self, ss, registry):
#     def test(self):
#     def signature_info(self):
# def Menu(key, description, parent, doc, mode_display=None):  # pylint: disable=invalid-name
# def Constant(value, key, description, menu):  # pylint: disable=invalid-name
#     def func():
# def Operation(key, menu, push, description=None, retain=False, log_as=None, simulate=True):  # pylint: disable=invalid-name
#     def function_decorator(func):
#         def _bind_stack_parm(stack_item, parm):
#         def wrapper(stack, registry):
#         def ensure(before, after=None, raises=None, close=False):
# def Mode(name, default_value, allowable_values=None):  # pylint: disable=invalid-name
# def ModeChange(key, description, menu, mode_name, to_value):  # pylint: disable=invalid-name
# 
# Path: esc/oops.py
# class FunctionProgrammingError(ProgrammingError):
#     r"""
#     A more specific type of :class:`ProgrammingError` that occurs when a
#     user's :func:`@Operation <esc.commands.Operation>` decorator or function
#     parameters are invalid or function tests fail.
# 
#     The distinction is mostly for convenience within esc's codebase rather
#     than because client code needs to tell the difference from other
#     :class:`ProgrammingError`\ s; this class wraps some handy logic for
#     generating a standardized message.
#     """
#     def __init__(self, operation, problem):
#         super().__init__()
#         self.operation = operation
#         self.function_name = self.operation.function.__name__
#         self.key = self.operation.key
#         self.description = self.operation.description
#         self.problem = problem
# 
#         self.message = (f"The function '{self.function_name}' "
#                         f"(key '{self.key}', description '{self.description}') "
#                         f"{self.problem}. ")
# 
#     def __str__(self):
#         return self.message


from decimal import Decimal
from esc.commands import Menu, Operation, main_menu
from esc.oops import FunctionProgrammingError
import pytest


@Operation('Z', menu=main_menu, push=1, description="divide")
def divide(sos, bos):
    return sos / bos


@pytest.fixture(autouse=True)
def ensure_wrapper():
    """
    We need to clear the tests list on the divide function after every test,
    so we are running only the esc test defined in each pytest test on each
    pytest test run (confused yet?).
    """
    yield
    divide.tests.clear()


def division_test_case(**kwargs):
    "Get a new division test case. Kwargs are passed through to ensure."
    assert not divide.tests
    divide.ensure(**kwargs)

# Path: esc/commands.py
# BINOP = 'binop'
# UNOP = 'unop'
# MAIN_DOC = """
#     The main menu. All other esc functions and menus are eventually accessible
#     from this menu.
# """
# class EscCommand:
# class EscMenu(EscCommand):
# class EscOperation(EscCommand):
# class EscBuiltin(EscCommand):
#     def __init__(self, key, description):
#     def help_title(self):
#     def signature_info(self):
#     def execute(self, access_key, ss, registry):
#     def register_child(self, child):
#     def simulated_result(self, ss, registry):  # pylint: disable=no-self-use, unused-argument
#     def test(self):
#     def __init__(self, key, description, doc, mode_display=None):
#     def __repr__(self):
#     def signature_info(self):
#     def is_main_menu(self):
#     def anonymous_children(self):
#     def named_children(self):
#     def child(self, access_key):
#     def execute(self, access_key, ss, registry):
#     def test(self):
#     def __init__(self, key, func, pop, push, description, menu, retain=False,
#                  log_as=None, simulate=True):
#     def __repr__(self):
#     def __doc__(self):
#     def signature_info(self):
#     def _describe_operation(self, args, retvals, registry):
#     def _insufficient_items_on_stack(self, pops_requested=None):
#     def _retrieve_arguments(self, ss):
#     def _simulated_description(self, args, log, results):
#     def _store_results(self, ss, args, return_values, registry):
#     def execute(self, access_key, ss, registry):  # pylint: disable=useless-return
#     def simulated_result(self, ss, registry):
#     def test(self):
#     def __init__(self):
#     def execute(self, access_key, ss, registry):  # pylint: disable=useless-return
#     def simulated_result(self, ss, registry):
#     def test(self):
#     def signature_info(self):
# def Menu(key, description, parent, doc, mode_display=None):  # pylint: disable=invalid-name
# def Constant(value, key, description, menu):  # pylint: disable=invalid-name
#     def func():
# def Operation(key, menu, push, description=None, retain=False, log_as=None, simulate=True):  # pylint: disable=invalid-name
#     def function_decorator(func):
#         def _bind_stack_parm(stack_item, parm):
#         def wrapper(stack, registry):
#         def ensure(before, after=None, raises=None, close=False):
# def Mode(name, default_value, allowable_values=None):  # pylint: disable=invalid-name
# def ModeChange(key, description, menu, mode_name, to_value):  # pylint: disable=invalid-name
# 
# Path: esc/oops.py
# class FunctionProgrammingError(ProgrammingError):
#     r"""
#     A more specific type of :class:`ProgrammingError` that occurs when a
#     user's :func:`@Operation <esc.commands.Operation>` decorator or function
#     parameters are invalid or function tests fail.
# 
#     The distinction is mostly for convenience within esc's codebase rather
#     than because client code needs to tell the difference from other
#     :class:`ProgrammingError`\ s; this class wraps some handy logic for
#     generating a standardized message.
#     """
#     def __init__(self, operation, problem):
#         super().__init__()
#         self.operation = operation
#         self.function_name = self.operation.function.__name__
#         self.key = self.operation.key
#         self.description = self.operation.description
#         self.problem = problem
# 
#         self.message = (f"The function '{self.function_name}' "
#                         f"(key '{self.key}', description '{self.description}') "
#                         f"{self.problem}. ")
# 
#     def __str__(self):
#         return self.message


# Path: tests/esc/test_functest.py
from decimal import Decimal
from esc.commands import Menu, Operation, main_menu
from esc.oops import FunctionProgrammingError
import pytest



@Operation('Z', menu=main_menu, push=1, description="divide")
def divide(sos, bos):
    return sos / bos


@pytest.fixture(autouse=True)
def ensure_wrapper():
    """
    We need to clear the tests list on the divide function after every test,
    so we are running only the esc test defined in each pytest test on each
    pytest test run (confused yet?).
    """
    yield
    divide.tests.clear()


def division_test_case(**kwargs):
    "Get a new division test case. Kwargs are passed through to ensure."
    assert not divide.tests
    divide.ensure(**kwargs)

    op = main_menu.child('Z')