Esempio n. 1
0
    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'))
Esempio n. 2
0
    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)
Esempio n. 3
0
    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)
Esempio n. 4
0
    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')
Esempio n. 5
0
    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))
Esempio n. 6
0
 def test_random(self):
     iterations = 100
     for _ in range(iterations):
         value = BotlangSystem().eval('(random 0 5)')
         self.assertTrue(0 <= value <= 5)
Esempio n. 7
0
    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")'))