def testLambda_call_expand_argument(self): """Arguments are expanded before the call method is executed. """ # Makes an instance of Lambda. forms = Parser.parse('((x) (* x x x))') lambda_func = Lambda(forms, PackageManager.current_package.env['VARIABLE'], PackageManager.current_package.env['FUNCTION'], PackageManager.current_package.env['MACRO']) # Define macro. forms = Parser.parse('(defmacro cube (x) `(* ,x ,x ,x))') exp = Expander.expand(forms, PackageManager.current_package.env['VARIABLE'], PackageManager.current_package.env['FUNCTION'], PackageManager.current_package.env['MACRO']) Evaluator.eval(exp, PackageManager.current_package.env['VARIABLE'], PackageManager.current_package.env['FUNCTION'], PackageManager.current_package.env['MACRO']) # Checks call. retval = lambda_func( Parser.parse('((cube 2))'), # an argument is expression. PackageManager.current_package.env['VARIABLE'], PackageManager.current_package.env['FUNCTION'], PackageManager.current_package.env['MACRO']) # Checks return value. self.assertTrue(retval, Integer(512))
def testLambda_call_keyword_argument_with_default_value(self): """Checks assigning keyword arguments. """ # Makes an instance of Lmabda. forms = Parser.parse('((x &key (y t)) (if y (* x x) (* x x x))))') lambda_func = Lambda(forms, PackageManager.current_package.env['VARIABLE'], PackageManager.current_package.env['FUNCTION'], PackageManager.current_package.env['MACRO']) # Checks call. # When a keyword argumet is not given, Null() is set to an argument. retval = lambda_func(Parser.parse('(2)'), PackageManager.current_package.env['VARIABLE'], PackageManager.current_package.env['FUNCTION'], PackageManager.current_package.env['MACRO']) # retval is result of (* x x x). self.assertTrue(retval is Integer(4)) # When an keyword argumet is given, this is set to an argument. retval = lambda_func(Parser.parse('(2 :y nil)'), PackageManager.current_package.env['VARIABLE'], PackageManager.current_package.env['FUNCTION'], PackageManager.current_package.env['MACRO']) # retval is result of (* x x). self.assertTrue(retval is Integer(8))
def testLambda_call_optional_argument(self): """Checks assigning optinal arguments. """ # Makes an instance of Lmabda. forms = Parser.parse('((x &optional y) (if y (* x x) (* x x x))))') lambda_func = Lambda(forms, PackageManager.current_package.env['VARIABLE'], PackageManager.current_package.env['FUNCTION'], PackageManager.current_package.env['MACRO']) # Checks call. # When an optional argumet is not given, Null() is set to an argument. retval = lambda_func(Parser.parse('(2)'), PackageManager.current_package.env['VARIABLE'], PackageManager.current_package.env['FUNCTION'], PackageManager.current_package.env['MACRO']) # retval is result of (* x x x). self.assertTrue(retval is Integer(8)) # When an optional argumet is given, this is set to an argument. retval = lambda_func(Parser.parse('(2 t)'), PackageManager.current_package.env['VARIABLE'], PackageManager.current_package.env['FUNCTION'], PackageManager.current_package.env['MACRO']) # retval is result of (* x x). self.assertTrue(retval is Integer(4))
def testLambda_properties(self): """Checks object properties. Properties are as follow, self.params: Parameters. self.forms: Body (forms). self.var_env: Lexical variable environment. self.func_env: Lexical function environment. self.macro_env: Lexical macro environment. """ # makes an instance of Lmabda. forms = Parser.parse('((x) (* x x x))') lambda_func = Lambda(forms, PackageManager.current_package.env['VARIABLE'], PackageManager.current_package.env['FUNCTION'], PackageManager.current_package.env['MACRO']) # Checks properties. # Checks lambda_func.params. self.assertEqual(lambda_func.params, ['X']) # Checks lambda_func.forms. self.assertEqual(str(lambda_func.forms), '(* X X X)') # Checks lambda_func lexical scope. self.assertTrue(lambda_func.var_env is PackageManager.current_package.env['VARIABLE']) self.assertTrue(lambda_func.func_env is PackageManager.current_package.env['FUNCTION']) self.assertTrue(lambda_func.macro_env is PackageManager.current_package.env['MACRO'])
def test_read(self): # test only EOF in_port = InPort(io.StringIO('')) eof = Parser._read(in_port) self.assertIsInstance(eof, Symbol) self.assertEqual(eof, Parser.eof_object)
def testLambdaSystemFunction_call(self): # Makes an instance of LambdaSytemFunction. forms = Parser.parse('((x) (* x x x))') lambda_func = Lambda(forms, PackageManager.current_package.env['VARIABLE'], PackageManager.current_package.env['FUNCTION'], PackageManager.current_package.env['MACRO']) # Executes lambda function. retval = lambda_func(Parser.parse("(2)"), PackageManager.current_package.env['VARIABLE'], PackageManager.current_package.env['FUNCTION'], PackageManager.current_package.env['MACRO']) # Checks return value. # exp is (* x x x) and arg is 2, so retval must be Integer(8). self.assertEqual(retval, Integer(8))
def test_tokenize(self): in_port = InPort(io.StringIO('(list 1 2.3 "string")')) token = in_port.next_token() token_list = Parser._read_ahead(token, in_port) self.assertIsInstance(token_list[0], Symbol) self.assertIsInstance(token_list[1], Integer) self.assertIsInstance(token_list[2], SingleFloat) self.assertIsInstance(token_list[3], String)
def test_atom(self): self.assertIsInstance(Parser._convert_to_atom('"string"'), String) self.assertIsInstance(Parser._convert_to_atom('1'), Integer) self.assertIsInstance(Parser._convert_to_atom('2.3'), SingleFloat) self.assertIsInstance(Parser._convert_to_atom('symbol'), Symbol) # check values self.assertEqual(Parser._convert_to_atom('"string"').value, 'string') self.assertEqual(Parser._convert_to_atom('1').value, np.int(1)) self.assertEqual(Parser._convert_to_atom('2.3').value, np.float32(2.3)) self.assertEqual(Parser._convert_to_atom('symbol').value, 'SYMBOL')
def testLambda_call_evaluate_argument(self): """Arguments are evaluated before the call method is executed. """ # Makes an instance of Lambda. forms = Parser.parse('((x) (* x x x))') lambda_func = Lambda(forms, PackageManager.current_package.env['VARIABLE'], PackageManager.current_package.env['FUNCTION'], PackageManager.current_package.env['MACRO']) # Checks call. retval = lambda_func( Parser.parse('((* 2 2 2))'), # an argument is expression. PackageManager.current_package.env['VARIABLE'], PackageManager.current_package.env['FUNCTION'], PackageManager.current_package.env['MACRO']) # Checks return value. self.assertTrue(retval, Integer(512))
def testLambda_call(self): """Checks call method of Lambda. The body of Lmabda is expanded and executed when the method is called. """ # Makes an instance of Lambda. forms = Parser.parse('((x) (* x x x))') lambda_func = Lambda(forms, PackageManager.current_package.env['VARIABLE'], PackageManager.current_package.env['FUNCTION'], PackageManager.current_package.env['MACRO']) # Checks call. retval = lambda_func(Parser.parse('(2)'), PackageManager.current_package.env['VARIABLE'], PackageManager.current_package.env['FUNCTION'], PackageManager.current_package.env['MACRO']) # Checks return value. self.assertTrue(retval, Integer(8))
def testLambdaSystemFunction(self): # Makes an instance of LambdaSytemFunction. forms = Parser.parse('((x) (* x x x))') lambda_func = Lambda(forms, PackageManager.current_package.env['VARIABLE'], PackageManager.current_package.env['FUNCTION'], PackageManager.current_package.env['MACRO']) # Checks official representation. self.assertRegex(str(lambda_func), r"#<FUNCTION LAMBDA \{[0-9A-Z]+\}>")
def test_tokenize_sharpquote(self): in_port = InPort(io.StringIO("#'+")) token = in_port.next_token() token_list = Parser._read_ahead(token, in_port) # token_list must be [FUNCTION +] self.assertIsInstance(token_list[0], Symbol) self.assertTrue(token_list[0] is Symbol('FUNCTION')) self.assertIsInstance(token_list[1], Symbol)
def testLambda_call_rest_argument(self): """Checks assigning rest arguments. """ # Makes an instance of Lmabda. forms = Parser.parse('((x &rest y) (cons x y))') lambda_func = Lambda(forms, PackageManager.current_package.env['VARIABLE'], PackageManager.current_package.env['FUNCTION'], PackageManager.current_package.env['MACRO']) # Checks call. # When an optional argumet is not given, Null() is set to an argument. retval = lambda_func(Parser.parse('(1 2 3 4 5)'), PackageManager.current_package.env['VARIABLE'], PackageManager.current_package.env['FUNCTION'], PackageManager.current_package.env['MACRO']) # retval is result of being given &rest parameter. self.assertEqual(str(retval), '(1 2 3 4 5)')
def testEqSystemFunction_call_nil(self): # Make an instance of EqSystemFunction. eq = EqSystemFunction() # If args are not the same objects, eq return nil. forms = Parser.parse('(1 1.0)') retval = eq(forms, PackageManager.current_package.env['VARIABLE'], PackageManager.current_package.env['FUNCTION'], PackageManager.current_package.env['MACRO']) # Checks return value. self.assertEqual(retval, Null())
def testEqSystemFunction_call_cons(self): # Make an instance of EqSystemFunction. eq = EqSystemFunction() # If args are cons, eq return nil because cons returns a different object. forms = Parser.parse('((cons 1 1) (cons 1 1))') retval = eq(forms, PackageManager.current_package.env['VARIABLE'], PackageManager.current_package.env['FUNCTION'], PackageManager.current_package.env['MACRO']) # Checks return value self.assertEqual(retval, Null())
def testConsSystemFunction_call(self): # Makes an instance of CdrSystemFunction. cdr = CdrSystemFunction() # Calls cdr. forms = Parser.parse("('(1 2))") retval = cdr(forms, PackageManager.current_package.env['VARIABLE'], PackageManager.current_package.env['FUNCTION'], PackageManager.current_package.env['MACRO']) # Chesk return value. self.assertEqual(str(retval), '(2)')
def testMulSystemFunction_call(self): # Makes an instance of MulSystemFunction. mul = MulSystemFunction() # Calls mul. forms = Parser.parse('(1 2 3)') retval = mul(forms, PackageManager.current_package.env['VARIABLE'], PackageManager.current_package.env['FUNCTION'], PackageManager.current_package.env['MACRO']) # Chesk return value. self.assertEqual(retval, Integer(6))
def testSubSystemFunction_call(self): # Makes an instance of SubSystemFunction. sub = SubSystemFunction() # Calls sub. forms = Parser.parse('(1 2 3)') retval = sub(forms, PackageManager.current_package.env['VARIABLE'], PackageManager.current_package.env['FUNCTION'], PackageManager.current_package.env['MACRO']) # Chesk return value. self.assertEqual(retval, Integer(-4))
def testAppendSystemFunction_call_dotted_list(self): # Makes an instance of AppendSystemFunction. append = AppendSystemFunction() # Calls append. forms = Parser.parse("('(1 2) 3)") retval = append(forms, PackageManager.current_package.env['VARIABLE'], PackageManager.current_package.env['FUNCTION'], PackageManager.current_package.env['MACRO']) # Chesk return value. self.assertEqual(str(retval), '(1 2 . 3)')
def testListSystemFunction_call(self): # Makes an instance of ListSystemFunction. lst = ListSystemFunction() # Calls list. forms = Parser.parse("(3 4 'a (car '(b . c)) (+ 6 -2))") retval = lst(forms, PackageManager.current_package.env['VARIABLE'], PackageManager.current_package.env['FUNCTION'], PackageManager.current_package.env['MACRO']) # Chesk return value. self.assertEqual(str(retval), '(3 4 A B 4)')
def testExpanderUnitTestCase_expand_atom(self): # Sets atom. forms = Parser.parse('3.14') # Expand forms. forms = Expander.expand(forms, PackageManager.current_package.env['VARIABLE'], PackageManager.current_package.env['FUNCTION'], PackageManager.current_package.env['MACRO']) # Checks forms. self.assertEqual(forms, SingleFloat(3.14))
def testMulSystemFunction_call(self): # Makes an instance of DivSystemFunction. div = DivSystemFunction() # Calls cons. forms = Parser.parse('(1 2 3)') retval = div(forms, PackageManager.current_package.env['VARIABLE'], PackageManager.current_package.env['FUNCTION'], PackageManager.current_package.env['MACRO']) # Chesk return value. self.assertEqual(retval, Ratio('1/6'))
def test_tokenize_backquote(self): in_port = InPort(io.StringIO("`(+ 1 2.3)")) token = in_port.next_token() token_list = Parser._read_ahead(token, in_port) # token_list must be [BACKQUOTE, [+, 1, 2.3]] self.assertIsInstance(token_list[0], Symbol) self.assertTrue(token_list[0] is Symbol('BACKQUOTE')) self.assertIsInstance(token_list[1][0], Symbol) self.assertIsInstance(token_list[1][1], Integer) self.assertIsInstance(token_list[1][2], SingleFloat)
def testUsePackageSystemFunction_call(self): # Makes an instance of UsePackageSystemFunction. use_package = UsePackageSystemFunction() # Calls use_package. forms = Parser.parse("('COMMON-LISP 'COMMON-LISP-USER)") retval = use_package(forms, PackageManager.current_package.env['VARIABLE'], PackageManager.current_package.env['FUNCTION'], PackageManager.current_package.env['MACRO']) # Checks return value. self.assertEqual(retval, T())
def testNumericalEqualSystemFunction_call_false_case(self): # Makes an instance of NumericalEqualSystemFunction. numerical_equal = NumericalEqualSystemFunction() # Calls numerical_euqal, false case. forms = Parser.parse('(1 2 3 4 5)') retval = numerical_equal( forms, PackageManager.current_package.env['VARIABLE'], PackageManager.current_package.env['FUNCTION'], PackageManager.current_package.env['MACRO']) # Checks return value. self.assertEqual(retval, Null())
def testQuitSystemFunction_call(self): # Import Interrupt exception class form clispy.interpreter. from clispy.interpreter import Interrupt # Makes an instance of QuitSystemFunction. quit_ = QuitSystemFunction() # Checks raise exception. with self.assertRaises(Interrupt): quit_(Parser.parse('()'), PackageManager.current_package.env['VARIABLE'], PackageManager.current_package.env['FUNCTION'], PackageManager.current_package.env['MACRO'])
def testInternSystemFunction_call(self): # Make an instance of InternSystemFunction. intern_ = InternSystemFunction() # Calls intern_. forms = Parser.parse('("G1")') retval = intern_(forms, PackageManager.current_package.env['VARIABLE'], PackageManager.current_package.env['FUNCTION'], PackageManager.current_package.env['MACRO']) # Chesk return value. self.assertEqual(retval[0], Symbol('G1')) self.assertEqual(retval[1], Null()) # Second calls intern_. forms = Parser.parse('("G1")') retval = intern_(forms, PackageManager.current_package.env['VARIABLE'], PackageManager.current_package.env['FUNCTION'], PackageManager.current_package.env['MACRO']) # Chesk second return value. self.assertEqual(retval[0], Symbol('G1')) self.assertEqual(retval[1], Keyword(':INTERNAL'))
def testNumericalNotEqualSystemFunction_call_true_case(self): """Makes an instance of NumeciralNotEqualSystemFunction. """ numerical_not_equal = NumericalNotEqualSystemFunction() # Calls numerical_not_euqal, true case. forms = Parser.parse('(1 2 3 4 5)') retval = numerical_not_equal( forms, PackageManager.current_package.env['VARIABLE'], PackageManager.current_package.env['FUNCTION'], PackageManager.current_package.env['MACRO']) # Checks return value. self.assertEqual(retval, T())
def testLessThanEqualSystemFunction_call_false_case(self): """Makes an instance of LessThanEqualSystemFunction. """ less_than_equal = LessThanEqualSystemFunction() # Calls less_than_equal, false case. forms = Parser.parse('(1 2 1 4 5)') retval = less_than_equal( forms, PackageManager.current_package.env['VARIABLE'], PackageManager.current_package.env['FUNCTION'], PackageManager.current_package.env['MACRO']) # Checks return value. self.assertEqual(retval, Null())
def testGreaterThanEqualSystemFunction_call_false_case(self): """Makes an instance of GreaterThanEqualSystemFunction. """ greater_than_equal = GreaterThanEqualSystemFunction() # Calls greater_than_equal, false case. forms = Parser.parse('(5 4 5 2 1)') retval = greater_than_equal( forms, PackageManager.current_package.env['VARIABLE'], PackageManager.current_package.env['FUNCTION'], PackageManager.current_package.env['MACRO']) # Checks return value. self.assertEqual(retval, Null())