def test_answer_correctly(self): r1 = BotlangSystem().eval_bot(self.SLOTS_DIGRESS, 'hola') self.assertEqual(r1.message, '¿De qué tipo quieres tu café?') self.assertEqual(r1.next_node, 'node1') r2 = BotlangSystem().eval_bot(self.SLOTS_DIGRESS, 'latte', r1.next_node, r1.data) self.assertEqual(r2.message, '¿De qué tamaño quieres tu café?') self.assertEqual(r2.data.get('type'), 'latte') self.assertEqual(r2.next_node, 'node1') r3 = BotlangSystem().eval_bot(self.SLOTS_DIGRESS, 'mediano', r2.next_node, r2.data) self.assertEqual(r3.message, '¿Lo quieres con crema?') self.assertEqual(r3.data.get('size'), 'mediano') self.assertEqual(r3.next_node, 'node1') r4 = BotlangSystem().eval_bot(self.SLOTS_DIGRESS, 'no', r3.next_node, r3.data) self.assertEqual(r4.message, 'Tu pedido es un latte mediano sin crema?') self.assertEqual(r4.data.get('with-cream'), False) self.assertEqual(r4.next_node, 'node3') r5 = BotlangSystem().eval_bot(self.SLOTS_DIGRESS, 'si', r4.next_node, r4.data) self.assertEqual(r5.message, 'Confirmado') self.assertEqual(r5.data.get('confirm'), True) self.assertEqual(r5.next_node, None)
def test_in_disgression_check(self): r1 = BotlangSystem().eval_bot(self.SLOTS_DIGRESS, 'digress?', 'node1') self.assertEqual(r1.message, 'Sí') r2 = BotlangSystem().eval_bot(self.SLOTS_DIGRESS, 'digress?', 'node2') self.assertEqual(r2.message, 'No')
def test_before_block(self): r = BotlangSystem().eval_bot(self.SLOTS_WITH_BEFORE, 'hola', 'node1') self.assertEqual(r.data['meta'], 'b') r = BotlangSystem().eval_bot(self.SLOTS_WITH_BEFORE, 'a', 'node1') self.assertEqual(r.data['meta'], 'a')
def test_give_partial_information(self): r1 = BotlangSystem().eval_bot( self.SLOTS_DIGRESS, 'Hola, quiero un cafe mocha grande por favor') self.assertEqual(r1.message, '¿Lo quieres con crema?') self.assertEqual(r1.data.get('type'), 'mocha') self.assertEqual(r1.data.get('size'), 'grande') self.assertEqual(r1.next_node, 'node1') r2 = BotlangSystem().eval_bot(self.SLOTS_DIGRESS, 'si', r1.next_node, r1.data) self.assertEqual(r2.message, 'Tu pedido es un mocha grande con crema?') self.assertEqual(r2.data.get('with-cream'), True) self.assertEqual(r2.next_node, 'node3') r3 = BotlangSystem().eval_bot(self.SLOTS_DIGRESS, 'no', r2.next_node, r2.data) self.assertEqual(r3.message, 'Bueno, ¿qué café quieres?') self.assertEqual(r3.next_node, 'node1') r4 = BotlangSystem().eval_bot(self.SLOTS_DIGRESS, 'un latte grande', r3.next_node, r3.data) self.assertEqual(r4.message, '¿Lo quieres con crema?') self.assertEqual(r4.next_node, 'node1') r5 = BotlangSystem().eval_bot(self.SLOTS_DIGRESS, 'si', r4.next_node, r4.data) self.assertEqual(r5.message, 'Tu pedido es un latte grande con crema?') self.assertEqual(r5.next_node, 'node3')
def test_recursive_digression(self): r1 = BotlangSystem().eval_bot(self.SLOTS_DIGRESS, 'mocha', 'node1') self.assertEqual(r1.message, '¿De qué tamaño quieres tu café?') self.assertEqual(r1.next_node, 'node1') r2 = BotlangSystem().eval_bot(self.SLOTS_DIGRESS, 'coffee', r1.next_node, r1.data) self.assertEqual(r2.message, '¿De qué tipo quieres tu café?') self.assertEqual(r2.next_node, 'node1')
def test_exception_values(self): self.assertFalse(BotlangSystem().eval('(exception? #t)')) self.assertFalse(BotlangSystem().eval('(exception? nil)')) self.assertTrue(BotlangSystem().eval( '(exception? (try-catch (fun () (get (make-dict) 1)) (fun (e) e)))' )) self.assertFalse(BotlangSystem().eval( '(exception? (try-catch (fun () (get (list 1) 0)) (fun (e) e)))')) self.assertTrue(BotlangSystem().eval( '(exception? (try-catch (fun () (get (list 1) 1)) (fun (e) e)))'))
def test_optional_slot(self): r1 = BotlangSystem().eval_bot(self.SLOTS_DIGRESS, 'descuento 123 para mocha chico', 'node1') self.assertEqual(r1.data.get('discount'), '123') self.assertEqual(r1.message, '¿Lo quieres con crema?') r2 = BotlangSystem().eval_bot(self.SLOTS_DIGRESS, 'si', r1.next_node, r1.data) self.assertEqual(r2.message, 'Tu pedido es un mocha chico con crema?') r3 = BotlangSystem().eval_bot(self.SLOTS_DIGRESS, 'si', r2.next_node, r2.data) self.assertEqual(r3.message, 'Confirmado. Te saldrá gratis :)')
def test_primitives_exception(self): try: BotlangSystem().eval('(+ (list 1) #f)') self.fail('Should not reach this') except BotlangErrorException as e: self.assertEqual(len(e.stack), 1)
def test_answer_incorrectly_no_digress(self): r1 = BotlangSystem().eval_bot( self.SLOTS_NO_DIGRESS, 'Hola, quiero un cafe americano chico por favor') self.assertEqual(r1.message, '¿Lo quieres con crema?') self.assertEqual(r1.next_node, 'node1') r2 = BotlangSystem().eval_bot(self.SLOTS_NO_DIGRESS, 'qwerty', r1.next_node, r1.data) self.assertEqual(r2.message, '¿Lo quieres con crema?') self.assertEqual(r2.next_node, 'node1') r3 = BotlangSystem().eval_bot(self.SLOTS_NO_DIGRESS, 'no', r2.next_node, r2.data) self.assertEqual(r3.message, 'Tu pedido es un americano chico sin crema?') self.assertEqual(r3.next_node, 'node3')
def test_stack_trace(self): code = """ (begin (define f (fun (n) (fun (x) (n x)) ) ) (define g (f 3)) (+ (g 3) (g 2)) ) """ try: BotlangSystem().eval(code) self.fail('Should not reach this') except BotlangErrorException as e: self.assertEqual(len(e.stack), 5) self.assertTrue( e.print_stack_trace().endswith('3 is not a function')) self.assertTrue('line 5' in e.print_stack_trace()) code = """ [define API_KEY "Yzy4kaJjPsWz7LVRB6Q86GcnJX9SvxaC"] [define ACCESS_HEADERS (make-dict (list (cons "Content-Type" "application/json") (cons "ApiKey" API_KEY) ) ) ] (non-existent-function 1) """ try: BotlangSystem().eval(code) except BotlangErrorException as e: self.assertEqual(len(e.stack), 2)
def test_to_json(self): json_list = BotlangSystem.run('(to-json (list 1 2 3))') self.assertEqual(json_list, "[1, 2, 3]") json_dict = BotlangSystem.run( '(to-json (make-dict (list (cons "a" 2))))') self.assertEqual(json_dict, '{"a": 2}') python_dict = {'a': None, 'b': 'hola', 'c': 12, 'd': True, 'e': False} runtime = BotlangSystem() runtime.environment.update({'python-dict': python_dict}) json_dict = runtime.eval('(to-json python-dict)') self.assertEqual(json_dict, json.dumps(python_dict, sort_keys=True))
def test_digression(self): r1 = BotlangSystem().eval_bot(self.SLOTS_DIGRESS, 'Hola, quiero un latte por favor') self.assertEqual(r1.message, '¿De qué tamaño quieres tu café?') self.assertEqual(r1.next_node, 'node1') # Digression with return r2 = BotlangSystem().eval_bot(self.SLOTS_DIGRESS, 'ctm', r1.next_node, r1.data) self.assertEqual(r2.message, 'No me insultes') self.assertEqual(r2.next_node, 'node1') r3 = BotlangSystem().eval_bot(self.SLOTS_DIGRESS, 'lo quiero mediano', r2.next_node, r2.data) self.assertEqual(r3.message, '¿Lo quieres con crema?') self.assertEqual(r3.next_node, 'node1') # Digression without return r4 = BotlangSystem().eval_bot(self.SLOTS_DIGRESS, 'chao', r3.next_node, r3.data) self.assertEqual(r4.message, 'Adiós') self.assertEqual(r4.next_node, None) self.assertEqual(r4.bot_state, 'BOT_ENDED')
def test_from_json(self): python_list = BotlangSystem.run('(from-json "[1, 2, 3]")') self.assertEqual(python_list, [1, 2, 3]) json_dict = json.dumps({ 'a': None, 'b': 'hola', 'c': 12, 'd': True, 'e': False }) runtime = BotlangSystem() runtime.environment.update({'json-dict': json_dict}) python_dict = runtime.eval('(from-json json-dict)') self.assertDictEqual(json.loads(json_dict), python_dict)
def test_return_does_not_interfere(self): r = BotlangSystem().eval_bot(self.SLOTS_DIGRESS, 'ctm', 'node2') self.assertEqual(r.message, 'No me insultes') self.assertEqual(r.next_node, None) self.assertEqual(r.bot_state, 'BOT_ENDED')