def test_can_create_new_function(self): # Create a square function (which will be added to the environment) env = Environment() square_function = "(defun square(x)(* x x)))" Evaluator.evaluate(Parser.parse(Tokenizer.tokenize(square_function)), env) self.assertTrue(env.get("square")) # Call the square function call_square_function = "(square 9)" returned_value = Evaluator.evaluate(Parser.parse(Tokenizer.tokenize(call_square_function)), env) self.assertEqual(returned_value, 81)
def test_can_parse_function_definition(self): tokens = ["(", "defun", "square", "(", "x", ")", "(", "*", "x", "x", ")", ")" ] parse_tree = Parser.parse(tokens) self.assertEqual(len(parse_tree), 1) self.assertEqual(type(parse_tree[0]), Procedure) self.assertEqual("square", parse_tree[0].name) self.assertEqual(len(parse_tree[0].arguments), 1)
def test_can_parse_simple_tokens(self): tokens = ["(", "*", "a", "b", ")"] parse_tree = Parser.parse(tokens) self.assertEqual(type(parse_tree), list) self.assertEqual(len(parse_tree), 3) self.assertEqual(type(parse_tree[0]), Operator) self.assertEqual(type(parse_tree[1]), Symbol) self.assertEqual(type(parse_tree[2]), Symbol)
def test_can_parse_nested_expression(self): tokens = ["(", "+", "2.3", "(", "*", "4.5", "3", ")", ")"] parse_tree = Parser.parse(tokens) self.assertEqual(len(parse_tree), 3) self.assertEqual(type(parse_tree[0]), Operator) self.assertEqual(type(parse_tree[1]), Number) self.assertEqual(type(parse_tree[2]), list) self.assertEqual(len(parse_tree[2]), 3) self.assertEqual(type(parse_tree[2][0]), Operator)
def test_can_parse_floating_point_numbers(self): tokens = ["(", "3.14", ")"] parse_tree = Parser.parse(tokens) self.assertEqual(len(parse_tree), 1) self.assertEqual(type(parse_tree[0]), Number)