class MockSerializable(core.Serializable): TEST_INT = 2 var1 = core.Boolean() var2 = core.Int(default=TEST_INT) var3 = core.String(optional=True) var4 = core.List(optional=True)
class ConceptSuite(ok_models.Suite): scored = core.Boolean(default=False) def post_instantiation(self): for i, case in enumerate(self.cases): if not isinstance(case, dict): raise ex.SerializeException('Test cases must be dictionaries') self.cases[i] = ConceptCase(**case)
class SqliteSuite(doctest.DoctestSuite): console_type = SqliteConsole # TODO: Ordered should be a property of cases, not entire suites. ordered = core.Boolean(default=False) def __init__(self, test, verbose, interactive, timeout=None, **fields): super().__init__(test, verbose, interactive, timeout, **fields) self.console.ordered = fields.get('ordered', False)
class Case(core.Serializable): """Abstract case class.""" hidden = core.Boolean(default=False) locked = core.Boolean(optional=True) multiline = core.Boolean(default=False) def run(self): """Subclasses should override this method for running a test case. RETURNS: bool; True if the test case passes, False otherwise. """ raise NotImplementedError def lock(self, hash_fn): """Subclasses should override this method for locking a test case. This method should mutate the object into a locked state. PARAMETERS: hash_fn -- function; computes the hash code of a given string. """ raise NotImplementedError def unlock(self, unique_id_prefix, case_id, interact): """Subclasses should override this method for unlocking a test case. It is the responsibility of the the subclass to make any changes to the test case, including setting its locked field to False. PARAMETERS: unique_id_prefix -- string; an identifier for this Case, for purposes of analytics. case_id -- string; an identifier for this Case, for purposes of analytics. interact -- function; handles user interaction during the unlocking phase. """ raise NotImplementedError
class Suite(core.Serializable): type = core.String() scored = core.Boolean(default=True) cases = core.List() def __init__(self, verbose, interactive, timeout=None, **fields): super().__init__(**fields) self.verbose = verbose self.interactive = interactive self.timeout = timeout def run(self, test_name, suite_number): """Subclasses should override this method to run tests. PARAMETERS: test_name -- str; name of the parent test. suite_number -- int; suite number, assumed to be 1-indexed. RETURNS: dict; results of the following form: { 'passed': int, 'failed': int, 'locked': int, } """ raise NotImplementedError def _run_case(self, test_name, suite_number, case, case_number): """A wrapper for case.run(). Prints informative output and also captures output of the test case and returns it as a log. The output is suppressed -- it is up to the calling function to decide whether or not to print the log. """ output.off() # Delay printing until case status is determined. log_id = output.new_log() format.print_line('-') print('{} > Suite {} > Case {}'.format(test_name, suite_number, case_number)) print() success = case.run() if success: print('-- OK! --') output.on() output_log = output.get_log(log_id) output.remove_log(log_id) return success, output_log
class WwppSuite(models.Suite): scored = core.Boolean(default=False) console_type = pyconsole.PythonConsole def __init__(self, test, verbose, interactive, timeout=None, **fields): super().__init__(test, verbose, interactive, timeout, **fields) self.console = self.console_type(verbose, interactive, timeout) def post_instantiation(self): for i, case in enumerate(self.cases): if not isinstance(case, dict): raise ex.SerializeException('Test cases must be dictionaries') self.cases[i] = WwppCase(self.console, **case)
class Suite(core.Serializable): type = core.String() scored = core.Boolean(default=True) cases = core.List() def __init__(self, test, verbose, interactive, timeout=None, **fields): super().__init__(**fields) self.test = test self.verbose = verbose self.interactive = interactive self.timeout = timeout self.run_only = [] def run(self, test_name, suite_number, env=None): """Subclasses should override this method to run tests. PARAMETERS: test_name -- str; name of the parent test. suite_number -- int; suite number, assumed to be 1-indexed. env -- dict; used by programmatic API to provide a custom environment to run tests with. RETURNS: dict; results of the following form: { 'passed': int, 'failed': int, 'locked': int, } """ raise NotImplementedError def enumerate_cases(self): enumerated = enumerate(self.cases) if self.run_only: return [x for x in enumerated if x[0] + 1 in self.run_only] return enumerated def _run_case(self, test_name, suite_number, case, case_number): """A wrapper for case.run(). Prints informative output and also captures output of the test case and returns it as a log. The output is printed only if the case fails, or if self.verbose is True. """ output.off() # Delay printing until case status is determined. log_id = output.new_log() format.print_line('-') print('{} > Suite {} > Case {}'.format(test_name, suite_number, case_number)) print() success = case.run() if success: print('-- OK! --') output.on() output_log = output.get_log(log_id) output.remove_log(log_id) if not success or self.verbose: print(''.join(output_log)) if not success: short_name = self.test.get_short_name() # TODO: Change when in notebook mode print('Run only this test case with ' '"python3 ok -q {} --suite {} --case {}"'.format( short_name, suite_number, case_number)) return success