import unittest

from sandbox import relationship

relations_first_grade_female = [
    (("1.2.3.4.5", "1.2.3.4", "w"), "Mutter"),
    (("1.2.3.4.5", "1.2.3", "w"), "Großmutter"),
    (("1.2.3.4.5", "1.2", "w"), "Ur-Großmutter"),
    (("1.2.3.4.5", "1", "w"), "Ur-Ur-Großmutter"),
    (("1.2.3.4.5", "1.2.3.4.5.6", "w"), "Tochter"),
    (("1.2.3.4.5", "1.2.3.4.5.6.7", "w"), "Enkelin"),
    (("1.2.3.4.5", "1.2.3.4.5.6.7.8", "w"), "Ur-Enkelin"),
    (("1.2.3.4.5", "1.2.3.4.5.6.7.8.9", "w"), "Ur-Ur-Enkelin"),
]

relations_second_grade_female = [
    (("1.2.3.4.5", "1.2.3.x", "w"), "Tante"),
    (("1.2.3.4.5", "1.2.x", "w"), "Großtante"),
    (("1.2.3.4.5", "1.x", "w"), "Ur-Großtante"),
    (("1.2.3.4.5", "x", "w"), "Ur-Ur-Großtante"),
    (("1.2.3.4.5", "1.2.3.4.x", "w"), "Schwester"),
    (("1.2.3.4.5", "1.2.3.4.x.6", "w"), "Nichte"),
    (("1.2.3.4.5", "1.2.3.4.x.6.7", "w"), "Großnichte"),
    (("1.2.3.4.5", "1.2.3.4.x.6.7.8", "w"), "Ur-Großnichte"),
    (("1.2.3.4.5", "1.2.3.4.x.6.7.8.9", "w"), "Ur-Ur-Großnichte"),
]

relations_higher_grade_female = [
    (("1.2.3.4.5", "1.2.3.x", "w"), "Tante"),
    (("1.2.3.4.5", "1.2.x.x", "w"), "Tante 2. Grades"),
    (("1.2.3.4.5", "1.x.x.x", "w"), "Tante 3. Grades"),
    (("1.2.3.4.5", "x.x.x.x", "w"), "Tante 4. Grades"),
    (("1.2.3.4.5", "1.2.x", "w"), "Großtante"),
    (("1.2.3.4.5", "1.x.x", "w"), "Großtante 2. Grades"),
    (("1.2.3.4.5", "x.x.x", "w"), "Großtante 3. Grades"),
    (("1.2.3.4.5", "1.x", "w"), "Ur-Großtante"),
    (("1.2.3.4.5", "x.x", "w"), "Ur-Großtante 2. Grades"),
    (("1.2.3.4.5", "1.2.3.4.x.x", "w"), "Nichte"),
    (("1.2.3.4.5", "1.2.3.x.x.x", "w"), "Nichte 2. Grades"),
    (("1.2.3.4.5", "1.2.x.x.x.x", "w"), "Nichte 3. Grades"),
    (("1.2.3.4.5", "1.x.x.x.x.x", "w"), "Nichte 4. Grades"),
    (("1.2.3.4.5", "1.2.3.4.x.x.x", "w"), "Großnichte"),
    (("1.2.3.4.5", "1.2.3.x.x.x.x", "w"), "Großnichte 2. Grades"),
    (("1.2.3.4.5", "1.2.x.x.x.x.x", "w"), "Großnichte 3. Grades"),
    (("1.2.3.4.5", "1.x.x.x.x.x.x", "w"), "Großnichte 4. Grades"),
    (("1.2.3.4.5", "1.2.3.4.x.x.x.x", "w"), "Ur-Großnichte"),
    (("1.2.3.4.5", "1.2.3.x.x.x.x.x", "w"), "Ur-Großnichte 2. Grades"),
    (("1.2.3.4.5", "1.2.x.x.x.x.x.x", "w"), "Ur-Großnichte 3. Grades"),
    (("1.2.3.4.5", "1.x.x.x.x.x.x.x", "w"), "Ur-Großnichte 4. Grades"),
    (("1.2.3.4.5", "1.2.3.4.x.x.x.x.x", "w"), "Ur-Ur-Großnichte"),
    (("1.2.3.4.5", "1.2.3.x.x.x.x.x.x", "w"), "Ur-Ur-Großnichte 2. Grades"),
]

relations_special_grade_female = [
    (("1.2.3.4.5", "1.2.3.4.x", "w"), "Schwester"),
    (("1.2.3.4.5", "1.2.3.x.x", "w"), "Cousine"),
    (("1.2.3.4.5", "1.2.x.x.x", "w"), "Cousine 2. Grades"),
    (("1.2.3.4.5", "1.x.x.x.x", "w"), "Cousine 3. Grades"),
]

relations_first_grade_male = [
    (("1.2.3.4.5", "1.2.3.4", "m"), "Vater"),
    (("1.2.3.4.5", "1.2.3", "m"), "Großvater"),
    (("1.2.3.4.5", "1.2", "m"), "Ur-Großvater"),
    (("1.2.3.4.5", "1", "m"), "Ur-Ur-Großvater"),
    (("1.2.3.4.5", "1.2.3.4.5.6", "m"), "Sohn"),
    (("1.2.3.4.5", "1.2.3.4.5.6.7", "m"), "Enkel"),
    (("1.2.3.4.5", "1.2.3.4.5.6.7.8", "m"), "Ur-Enkel"),
    (("1.2.3.4.5", "1.2.3.4.5.6.7.8.9", "m"), "Ur-Ur-Enkel"),
]

relations_second_grade_male = [
    (("1.2.3.4.5", "1.2.3.x", "m"), "Onkel"),
    (("1.2.3.4.5", "1.2.x", "m"), "Großonkel"),
    (("1.2.3.4.5", "1.x", "m"), "Ur-Großonkel"),
    (("1.2.3.4.5", "x", "m"), "Ur-Ur-Großonkel"),
    (("1.2.3.4.5", "1.2.3.4.x", "m"), "Bruder"),
    (("1.2.3.4.5", "1.2.3.4.x.6", "m"), "Neffe"),
    (("1.2.3.4.5", "1.2.3.4.x.6.7", "m"), "Großneffe"),
    (("1.2.3.4.5", "1.2.3.4.x.6.7.8", "m"), "Ur-Großneffe"),
    (("1.2.3.4.5", "1.2.3.4.x.6.7.8.9", "m"), "Ur-Ur-Großneffe"),
]

relations_higher_grade_male = [
    (("1.2.3.4.5", "1.2.3.x", "m"), "Onkel"),
    (("1.2.3.4.5", "1.2.x.x", "m"), "Onkel 2. Grades"),
    (("1.2.3.4.5", "1.x.x.x", "m"), "Onkel 3. Grades"),
    (("1.2.3.4.5", "x.x.x.x", "m"), "Onkel 4. Grades"),
    (("1.2.3.4.5", "1.2.x", "m"), "Großonkel"),
    (("1.2.3.4.5", "1.x.x", "m"), "Großonkel 2. Grades"),
    (("1.2.3.4.5", "x.x.x", "m"), "Großonkel 3. Grades"),
    (("1.2.3.4.5", "1.x", "m"), "Ur-Großonkel"),
    (("1.2.3.4.5", "x.x", "m"), "Ur-Großonkel 2. Grades"),
    (("1.2.3.4.5", "1.2.3.4.x.x", "m"), "Neffe"),
    (("1.2.3.4.5", "1.2.3.x.x.x", "m"), "Neffe 2. Grades"),
    (("1.2.3.4.5", "1.2.x.x.x.x", "m"), "Neffe 3. Grades"),
    (("1.2.3.4.5", "1.x.x.x.x.x", "m"), "Neffe 4. Grades"),
    (("1.2.3.4.5", "1.2.3.4.x.x.x", "m"), "Großneffe"),
    (("1.2.3.4.5", "1.2.3.x.x.x.x", "m"), "Großneffe 2. Grades"),
    (("1.2.3.4.5", "1.2.x.x.x.x.x", "m"), "Großneffe 3. Grades"),
    (("1.2.3.4.5", "1.x.x.x.x.x.x", "m"), "Großneffe 4. Grades"),
    (("1.2.3.4.5", "1.2.3.4.x.x.x.x", "m"), "Ur-Großneffe"),
    (("1.2.3.4.5", "1.2.3.x.x.x.x.x", "m"), "Ur-Großneffe 2. Grades"),
    (("1.2.3.4.5", "1.2.x.x.x.x.x.x", "m"), "Ur-Großneffe 3. Grades"),
    (("1.2.3.4.5", "1.x.x.x.x.x.x.x", "m"), "Ur-Großneffe 4. Grades"),
    (("1.2.3.4.5", "1.2.3.4.x.x.x.x.x", "m"), "Ur-Ur-Großneffe"),
    (("1.2.3.4.5", "1.2.3.x.x.x.x.x.x", "m"), "Ur-Ur-Großneffe 2. Grades"),
]

relations_special_grade_male = [
    (("1.2.3.4.5", "1.2.3.4.x", "m"), "Bruder"),
    (("1.2.3.4.5", "1.2.3.x.x", "m"), "Cousin"),
    (("1.2.3.4.5", "1.2.x.x.x", "m"), "Cousin 2. Grades"),
    (("1.2.3.4.5", "1.x.x.x.x", "m"), "Cousin 3. Grades"),
]

relations_higher_grade_distance = [
    (("1.2.3.4.5", "1.2.3.4.5.6", "w"), "Tochter", 1),
    (("1.2.3.4.5", "1.2.3.4.5.6.7", "w"), "Enkelin", 2),
    (("1.2.3.4.5", "1", "w"), "Ur-Ur-Großmutter", 4),
    (("1.2.3.4.5", "1.2.3.x", "w"), "Tante", 3),
    (("1.2.3.4.5", "1.2.x.x", "w"), "Tante 2. Grades", 5),
    (("1.2.3.4.5", "1.x.x.x", "w"), "Tante 3. Grades", 7),
    (("1.2.3.4.5", "x.x.x.x", "w"), "Tante 4. Grades", 9),
    (("1.2.3.4.5", "1.2.x", "w"), "Großtante", 4),
    (("1.2.3.4.5", "1.x.x", "w"), "Großtante 2. Grades", 6),
    (("1.2.3.4.5", "x.x.x", "w"), "Großtante 3. Grades", 8),
    (("1.2.3.4.5", "1.x", "w"), "Ur-Großtante", 5),
    (("1.2.3.4.5", "x.x", "w"), "Ur-Großtante 2. Grades", 7),
    (("1.2.3.4.5", "1.2.3.4.x.x", "w"), "Nichte", 3),
    (("1.2.3.4.5", "1.2.3.x.x.x", "w"), "Nichte 2. Grades", 5),
    (("1.2.3.4.5", "1.2.x.x.x.x", "w"), "Nichte 3. Grades", 7),
    (("1.2.3.4.5", "1.x.x.x.x.x", "w"), "Nichte 4. Grades", 9),
    (("1.2.3.4.5", "1.2.3.4.x.x.x", "w"), "Großnichte", 4),
    (("1.2.3.4.5", "1.2.3.x.x.x.x", "w"), "Großnichte 2. Grades", 6),
    (("1.2.3.4.5", "1.2.x.x.x.x.x", "w"), "Großnichte 3. Grades", 8),
    (("1.2.3.4.5", "1.x.x.x.x.x.x", "w"), "Großnichte 4. Grades", 10),
    (("1.2.3.4.5", "1.2.3.4.x.x.x.x", "w"), "Ur-Großnichte", 5),
    (("1.2.3.4.5", "1.2.3.x.x.x.x.x", "w"), "Ur-Großnichte 2. Grades", 7),
    (("1.2.3.4.5", "1.2.x.x.x.x.x.x", "w"), "Ur-Großnichte 3. Grades", 9),
    (("1.2.3.4.5", "1.x.x.x.x.x.x.x", "w"), "Ur-Großnichte 4. Grades", 11),
    (("1.2.3.4.5", "1.2.3.4.x.x.x.x.x", "w"), "Ur-Ur-Großnichte", 6),
    (("1.2.3.4.5", "1.2.3.x.x.x.x.x.x", "w"), "Ur-Ur-Großnichte 2. Grades", 8),
]

burghard = [
    ("Harald", "1.4.6.3.4", "m"),
    ("Alice", "1.4.6.3.4.1", "w"),
    ("Janina", "1.4.6.3.4.2", "w"),
    ("Theresa", "1.4.6.3.4.2.1", "w"),
    ("Valentin", "1.4.6.3.4.2.2", "m"),
    ("Freya", "1.4.6.3.4.3", "w"),
]

burghard_freya = [("Freya", "1.4.6.3.4.3", "w", "Tochter", "Harald", "1.4.6.3.4", "m", "Vater", 1)]

burghard_all = [("Harald", "1.4.6.3.4", "m", "ich", "Harald", "1.4.6.3.4", "m", "ich", 0)]


class test_relatives(unittest.TestCase):
    def test_first_grade_female(self):
        self.relations(relations_first_grade_female)

    def test_second_grade_female(self):
        self.relations(relations_second_grade_female)

    def test_higher_grade_female(self):
        self.relations(relations_higher_grade_female)

    def test_special_grade_female(self):
        self.relations(relations_special_grade_female)

    def test_first_grade_male(self):
        self.relations(relations_first_grade_male)

    def test_second_grade_male(self):
        self.relations(relations_second_grade_male)

    def test_higher_grade_male(self):
        self.relations(relations_higher_grade_male)

    def test_special_grade_male(self):
        self.relations(relations_special_grade_male)

    def relations(self, relations_list):
        for rel, title in relations_list:
            result = relationship.relationship_name(*rel)
            self.assertEqual(result, title)

    def test_distance(self):
        for rel, title, distance in relations_higher_grade_distance:
            result = relationship.relationship_distance(rel[0], rel[1])
            self.assertEqual(result, distance, title)

    def test_relations_list(self):
        result = relationship.relationship_list(burghard, 5)
        self.assertEqual(result[0], burghard_freya[0])

    def test_relations_list_all(self):
        result = relationship.relationship_list_all(burghard)
        self.assertEqual(result[0], burghard_all[0])


if __name__ == "__main__":
    unittest.main()