class test_environment(TestCase): def setUp(self): self.env = Environment() def set_namespace(self, namespace): self.env.namespace = namespace def assert_eval_results(self, inp, outp): result = self.env.eval(inp) self.assertEqual(outp, result) def test_eval_numerical_primitive(self): self.assert_eval_results(INT_VAL_EXPR, INT_VAL) def test_eval_numerical_float_primitive(self): self.assert_eval_results(FLOAT_VAL_EXPR, FLOAT_VAL) def test_eval_variable(self): self.set_namespace({VAL1: NUMERIC_VAL}) self.assert_eval_results(VAL1_EXPR, NUMERIC_VAL) def test_eval_function(self): self.set_namespace({ADD: add}) self.assert_eval_results(ADD_EXPR, add) def test_eval_combination(self): self.set_namespace({ADD: BuiltinProcedure(add), VAL1: 123}) self.assert_eval_results(E([ADD_EXPR, VAL1_EXPR, E(456, CT)], C), 579) def test_eval_nested_combination(self): self.set_namespace({ADD: BuiltinProcedure(add), VAL1: 123}) self.assert_eval_results(E([ADD_EXPR, VAL1_EXPR, E([ADD_EXPR, E(1, CT), E(2, CT)], C)], C), 126) def test_eval_special_form(self): self.env = Environment(special_forms={SPEC_FORM_NAME: lambda x: x[0]}) self.assert_eval_results(E([SPEC_FORM_NAME_EXPR, PM1_EXPR], C), PM1_EXPR) def test_eval_defined_procedure(self): self.set_namespace({ADD: BuiltinProcedure(add), PROC_NAME: Procedure( [E([ADD_EXPR, PM1_EXPR, PM2_EXPR], C)], parameters=[PM1, PM2])}) self.assert_eval_results(E([PROC_NAME_EXPR, E(1, CT), E(2, CT)], C), 3) def test_eval_nested_defined_procedure(self): self.set_namespace({ADD: BuiltinProcedure(add), PROC_NAME: Procedure( [E([ADD_EXPR, PM1_EXPR, E([ADD_EXPR, E(20, CT), PM2_EXPR], C)], C)], parameters=[PM1, PM2])}) self.assert_eval_results(E([PROC_NAME_EXPR, E(1, CT), E(2, CT)], C), 23) def test_eval_symbol_not_found_raises_error(self): self.assertRaises(SymbolError, self.env.eval, E('foo'))
def run_session(filename): """Run session test. Output summary to stdout and return True if all test pass, otherwise return False.""" env = Environment(namespace=Builtins.namespace()) num_tests, num_passed = 0, 0 with open(filename) as f: input_expression = "" # Iterate over non-blank lines for line in ifilter(None, imap(str.strip, f)): if line.startswith(';'): continue elif line.startswith('> '): # Lines are stripped, so add a space to get whitespace # between the lines. input_expression += " " + line[2:] elif input_expression: # We got a line not starting with '> ', this is the # expected result from the preceding input expression num_tests += 1 parser = Parser(StringIO.StringIO(input_expression)) for expr in parser.expressions(): result = env.eval(expr) result = repr(result) if result is not None else '' expected = line.rstrip('\n') if result != expected: print 'Failure: "%s" != "%s"' % (result, expected) else: num_passed += 1 input_expression = "" else: # If we got a non-empty line without an input # expression something is wrong print 'Unexpected line: "%s"' % line print "{:20} Ran {} tests, {} passed".format(os.path.basename(filename), num_tests, num_passed) return num_tests == num_passed
def test_eval_special_form(self): self.env = Environment(special_forms={SPEC_FORM_NAME: lambda x: x[0]}) self.assert_eval_results(E([SPEC_FORM_NAME_EXPR, PM1_EXPR], C), PM1_EXPR)
def setUp(self): self.env = Environment()