class TeachSystemTest(unittest.TestCase):
    def setUp(self):
        self.db_mock = Mock()
        self.task_grounding = TaskGrounding(db=self.db_mock)

    def test_teach_new_task__valid_input__returns_success(self):
        self.db_mock.add_task = Mock()
        self.db_mock.get_task = Mock()
        self.db_mock.get_task.side_effect = [(1, None), (2, None), (3, None)]
        self.db_mock.add_sub_task = Mock()

        returned = self.task_grounding.teach_new_task("nice task name", [Task("take"), Task("move"), Task("put")], "nice task keyword")
        self.assertTrue(returned.is_success)

    def test_teach_new_task__contains_unknown_task__returns_unknown_error_code(self):
        self.db_mock.add_task = Mock()
        self.db_mock.get_task = Mock()
        self.db_mock.get_task.side_effect = [(None, None)]
        self.db_mock.add_sub_task = Mock()

        returned = self.task_grounding.teach_new_task("nice task name", [Task("take"), Task("move"), Task("put")], "nice task keyword")

        self.assertFalse(returned.is_success)
        self.assertEqual(TaskErrorType.UNKNOWN, returned.error.error_code)

    def test_add_sub_task__valid_input__returns_success(self):
        self.db_mock.get_task = Mock()
        self.db_mock.add_sub_task = Mock()
        self.db_mock.get_task.side_effect = [(5, "clear table"), (1, "pick up")]

        returned = self.task_grounding.add_sub_task("tidy", ["get"])

        self.assertTrue(returned.is_success)
class TeachSystemIntegration(unittest.TestCase):
    def setUp(self):
        self.db = DatabaseHandler("test_grounding.db")
        self.task_grounding = TaskGrounding(self.db)
        self.returned = TaskGroundingReturn()

    def test_TeachTask(self):
        returned = self.task_grounding.teach_new_task("test_task1", ["take", "move", "put"], ["test1-1", "test1-2"])
        self.assertTrue(returned.is_success)
        self.clean_test_db("test_task1")

    def test_AddWord(self):
        returned = self.task_grounding.add_word_to_task("blue1", "blue2")
        self.assertTrue(returned.is_success)
        self.db.conn.execute("delete from TASK_WORDS where WORD='blue2';")
        self.db.conn.commit()

    def test_TeachTaskUnknownSubTask(self):
        returned = self.task_grounding.teach_new_task("test_task2", ["UNKNOWN TASK"], ["test1", "test2-1"])
        self.assertFalse(returned.is_success)
        self.assertEqual(returned.error_code, TaskErrorType.UNKNOWN)
        self.clean_test_db("test_task2")

    def test_AddWordsToTask(self):
        #self.task_grounding.teach_new_task("test_task3", ["take", "move", "put"], ["test3-1", "test3-2"])
        #returned = self.task_grounding.add_word_to_task("test_task3-1", "TEST WORD")
        #self.assertTrue(returned.is_success)
        self.clean_test_db("test_task3")

    def test_AddSubTask(self):
        self.task_grounding.teach_new_task("test_task4", ["take", "move", "put"], ["test4-1", "test4-2"])
        returned = self.task_grounding.add_sub_task("test_task4", ["get"])
        self.assertTrue(returned.is_success)
        self.clean_test_db("test_task4")

    def clean_test_db(self, task_name):
        task_id = self.db.get_task_id(task_name)
        self.db.conn.execute("delete from TASK_WORDS where TASK_ID=?;", (task_id,))
        self.db.conn.execute("delete from TASK_INFO where TASK_NAME=?;", (task_name,))
        self.db.conn.commit()





################################# INTEGRATION TESTS ----- END ##########################################################