class TestGraph(unittest.TestCase):

    txt_out_file = "_.txt"
    xlsx_out_file = "_.xlsx"

    def setUp(self):
        self.g = Graph()
        touch(self.txt_out_file)
        touch(self.xlsx_out_file)

    def tearDown(self):
        # return
        os.remove(self.txt_out_file)
        os.remove(self.xlsx_out_file)

    def test_add_word(self):
        self.g.add_word("test", 5, "synonym", "target_word")

    def test___contains(self):
        self.g.add_word("test", 5, "synonym", "target_word")
        self.assertTrue("test" in self.g)
        self.assertFalse("notest" in self.g)

    def test_str(self):
        self.g.add_word("test", 5, "synonym", "target_word")
        self.assertIsInstance(self.g.to_str(), str)
        g2 = rdflib.Graph()
        g2.parse(data=str(self.g), format="ttl")

    def test_word_in_graph(self):
        self.g.add_word("test", 5, "synonym", "target_word")
        self.assertTrue(self.g.word_in_graph("test"))
        self.assertFalse(self.g.word_in_graph("tfdfdfest"))

    def test_to_text_file(self):
        self.g.parse(self.graph_test_path, format="ttl")
        self.g.to_text_file(self.txt_out_file)
        with open(self.txt_out_file) as f:
            words = sorted([line.strip() for line in f if line.strip()])
        self.assertEqual(words, self.g.to_list())

    def test_good_words(self):
        self.g.parse(self.graph_test_path, format="ttl")
        for word in self.g.to_list():
            self.assertTrue(word)  # no empty words
            self.assertEqual(unidecode(word.lower().strip()), word)

    def test_is_empty(self):
        self.assertTrue(self.g.is_empty())
        self.assertRaises(AssertionError, self.g._set_root_word_attribute)
        rw_strings = [
            "root_word_string_1", "root_word_string_2", "root_word_string_3"
        ]
        for w in rw_strings:
            self.g.add_root_word(w)
            self.assertTrue(self.g.is_empty())
        self.assertEqual(rw_strings, self.g.to_list())
        self.g._set_root_word_attribute()
        for w in self.g.root_words:
            self.assertTrue(isinstance(w, str))

    def test_add_several_root_words(self):
        self.g.add_root_word("root_word_string_1")
        self.g.add_root_word("root_word_string_2")
        self.g.add_root_word("root_word_string_3")
        self.g.to_text_file(self.txt_out_file)
        with open(self.txt_out_file) as f:
            words = sorted([line.strip() for line in f if line.strip()])
        self.assertEqual(words, self.g.to_list())

    def test_add_several_root_words_with_previous_graph(self):
        self.g.parse(self.graph_test_path, format="ttl")
        self.g.add_root_word("root_word_string_1")
        self.g.add_root_word("root_word_string_2")
        self.g.add_root_word("root_word_string_3")

        self.g.to_text_file(self.txt_out_file)
        with open(self.txt_out_file) as f:
            words = sorted([line.strip() for line in f if line.strip()])
        self.assertEqual(words, self.g.to_list())
        self.test_list_is_sorted()

    def test_list_is_sorted(self):
        self.assertEqual(sorted(self.g.to_list()), self.g.to_list())

    def test___len__(self):
        self.assertFalse(len(self.g))
        for i in range(1, 10):
            self.g.add_root_word(f"test_{i}")
            self.assertEqual(len(self.g), i)
        self.g.add_word("test", 5, "synonym", "target_word")
        self.assertEqual(len(self.g), i + 1)

    def test_add_relation(self):
        self.g.add_root_word("root_word_string_1")
        self.g.add_word("test", 1, "synonym", "root_word_string_1")
        self.g.add_word("test", 1, "hyponym", "root_word_string_1")
        self.g.add_word("test", 1, "hypernym", "root_word_string_1")
        self.g.add_word("test", 1, "holonym", "root_word_string_1")
        self.assertRaises(
            ValueError,
            self.g.add_word,
            "test",
            1,
            "thing_that_ends_with_nym",
            "root_word_string_1",
        )

    def test_to_xlsx(self):
        self.g.add_root_word("dog")
        self.g.to_xlsx_file(self.xlsx_out_file)

    def test__get_maximum_origin(self):
        self.assertFalse(self.g._get_maximum_origin())
        for i in range(1, 5):
            self.g.add((
                rdflib.Literal("node_uri"),
                rdflib.URIRef("urn:default:baseUri:#comesFrom"),
                rdflib.Literal(f"test-{i}"),
            ))
            self.assertEqual(self.g._get_maximum_origin(), i)

    def test_pop_non_relevant_words(self):
        self.assertFalse(len(self.g))
        for i in range(10):
            self.g.add_word("test",
                            1,
                            "synonym",
                            "target_word",
                            comesFrom=f"test-{i}")
        self.g.add_word("test2",
                        1,
                        "synonym",
                        "target_word_2",
                        comesFrom=f"test-x")
        self.assertEqual(len(self.g), 2)
        self.g.pop_non_relevant_words()
        self.assertEqual(len(self.g), 1)