def test_cond_branches_evaluation(self): test_code = """ (define dict (make-dict (list))) (cond [(equal? sup 1) (put! dict "sup" 1)] [(< sup dawg) (put! dict "dawg" 2)] ) dict """ environment = BotlangSystem.base_environment().update({ 'sup': 1, 'dawg': 2 }) result = BotlangSystem(environment).eval(test_code) self.assertEqual(result.get('sup'), 1) self.assertIsNone(result.get('dawg')) environment = BotlangSystem.base_environment().update({ 'sup': 0, 'dawg': 1 }) result = BotlangSystem(environment).eval(test_code) self.assertIsNone(result.get('sup')) self.assertEqual(result.get('dawg'), 2) environment = BotlangSystem.base_environment().update({ 'sup': 0, 'dawg': -1 }) result = BotlangSystem(environment).eval(test_code) self.assertIsNone(result.get('sup')) self.assertIsNone(result.get('dawg'))
def test_cond_results(self): test_code = """ (cond [(equal? sup dawg) "1"] [(< sup dawg) 2] [else (+ 1 2)] ) """ environment = BotlangSystem.base_environment().update({ 'sup': 3, 'dawg': 4 }) self.assertEqual(BotlangSystem(environment).eval(test_code), 2) environment = BotlangSystem.base_environment().update({ 'sup': 4, 'dawg': 4 }) self.assertEqual(BotlangSystem(environment).eval(test_code), '1') environment = BotlangSystem.base_environment().update({ 'sup': 5, 'dawg': 4 }) self.assertEqual(BotlangSystem(environment).eval(test_code), 3)
def test_environment(self): runtime = BotlangSystem() bindings = { 'x': 4, 'hola': BotlangSystem.run('(max (list 1 3 2))'), '+': Primitive(lambda x, y: x * y, runtime.environment) } new_env = runtime.environment.new_environment(bindings) self.assertEqual(BotlangSystem.run('(- 3 x)', new_env), -1) self.assertEqual(BotlangSystem.run('(- 10 hola)', new_env), 7) self.assertEqual(BotlangSystem.run('(+ 2 3)', new_env), 6)
def test_bot_node(self): code = """ (bot-node (data) (node-result data "Holi, soy Botcito" (terminal-node "HOLA") ) ) """ node_result = BotlangSystem(BotlangSystem.base_environment()).eval_bot( code, 'mensaje inicial') self.assertTrue(isinstance(node_result, BotResultValue)) self.assertTrue(isinstance(node_result.data, dict)) self.assertEqual(node_result.message, 'Holi, soy Botcito') self.assertEqual(node_result.bot_state, 'HOLA')
def test_add_python_functions(self): def fibonacci(n): assert n >= 0 if n == 0: return 0 if n == 1: return 1 return fibonacci(n - 1) + fibonacci(n - 2) def test_stuff(d, key): return {}.get(key, [key]) def i_explode(): raise Exception('Boom!') def i_explode_a_lot(): raise Exception(lambda: 'Boom') runtime = BotlangSystem() runtime.environment.add_primitives({ 'fibo': fibonacci, 'stuff': test_stuff, 'explosion': i_explode, 'kaboom': i_explode_a_lot, }) self.assertEqual(runtime.eval('(fibo 4)'), 3) self.assertEqual(runtime.eval('(fibo 7)'), 13) with self.assertRaises(BotlangErrorException) as e: runtime.eval('(stuff data)') self.assertTrue('data' in e.exception.print_stack_trace()) with self.assertRaises(BotlangErrorException) as e: runtime.eval('(explosion)') self.assertTrue('Boom!' in e.exception.print_stack_trace()) with self.assertRaises(BotlangErrorException) as e: runtime.eval('(kaboom)') self.assertTrue('lambda' in str(e.exception))
def test_random(self): iterations = 100 for _ in range(iterations): value = BotlangSystem().eval('(random 0 5)') self.assertTrue(0 <= value <= 5)
def test_type_checking(self): self.assertTrue(BotlangSystem().eval('(bool? #t)')) self.assertTrue(BotlangSystem().eval('(bool? #f)')) self.assertFalse(BotlangSystem().eval('(bool? "#t")')) self.assertFalse(BotlangSystem().eval('(bool? "#f")')) self.assertTrue(BotlangSystem().eval('(str? "#t")')) self.assertTrue(BotlangSystem().eval('(str? "#f")')) self.assertFalse(BotlangSystem().eval('(str? 2)')) self.assertFalse(BotlangSystem().eval('(str? #f)')) self.assertTrue(BotlangSystem().eval('(num? 1)')) self.assertTrue(BotlangSystem().eval('(num? 6.1212121)')) self.assertFalse(BotlangSystem().eval('(num? "#t")')) self.assertFalse(BotlangSystem().eval('(num? #f)')) self.assertTrue(BotlangSystem().eval('(int? 2)')) self.assertTrue(BotlangSystem().eval('(int? -667)')) self.assertFalse(BotlangSystem().eval('(int? 6.12)')) self.assertFalse(BotlangSystem().eval('(int? "#f")')) self.assertTrue(BotlangSystem().eval('(list? (list 1 2 3))')) self.assertTrue(BotlangSystem().eval('(list? (list))')) self.assertFalse(BotlangSystem().eval('(list? 1)')) self.assertFalse(BotlangSystem().eval('(list? "#f")'))