class TestSocialNetwork(unittest.TestCase):

    def setUp(self):
        self.ivo = Panda("Ivo", "*****@*****.**", "male")
        self.network = PandaSocialNetwork()

    def test_has_and_add_panda_in_network(self):
        self.network.add_panda(self.ivo)
        self.assertTrue(self.network.has_panda(self.ivo))

    def test_has_panda_when_panda_not_in_network(self):
        rado = Panda("Rado", "*****@*****.**", "male")
        self.assertFalse(self.network.has_panda(rado))

    def test_make_and_are_friends(self):
        rado = Panda("Rado", "*****@*****.**", "male")
        self.network.make_friends(self.ivo, rado)
        self.assertTrue(self.network.are_friends(self.ivo, rado))

    def test_connection_level(self):
        rado = Panda("Rado", "*****@*****.**", "male")
        self.network.make_friends(self.ivo, rado)
        self.assertEqual(self.network.connection_level(self.ivo, rado), 1)

    def test_are_connected(self):
        rado = Panda("Rado", "*****@*****.**", "male")
        self.network.make_friends(self.ivo, rado)
        self.assertTrue(self.network.are_connected(self.ivo, rado))
        mimi = Panda("Mimi", "*****@*****.**", "female")
        self.assertFalse(self.network.are_connected(self.ivo, mimi))
        self.network.make_friends(rado, mimi)
        self.assertTrue(self.network.are_connected(mimi, rado))

    def test_genders_in_level(self):

        rado = Panda("Rado", "*****@*****.**", "male")
        pavli = Panda("Pavli", "*****@*****.**", "female")
        maria = Panda("maria", "*****@*****.**", "female")
        ivo = Panda("Ivo", "*****@*****.**", "male")
        niki = Panda("Niki", "*****@*****.**", 'male')
 
        self.network.add_panda(rado)
        self.network.add_panda(pavli)
        self.network.add_panda(maria)
        self.network.add_panda(ivo)
        self.network.add_panda(niki)
 
        self.network.make_friends(ivo, rado)
        self.network.make_friends(rado, pavli)
        self.network.make_friends(pavli, maria)
        self.network.make_friends(rado, niki)

        self.assertEqual(self.network.how_many_gender_in_network(3, maria, 'male'),3)

    def test_save_and_load(self):
        self.network.add_panda(self.ivo)
        niki = Panda("Niki", "*****@*****.**", 'male')
        self.network.add_panda(niki)
        self.network.make_friends(self.ivo, niki)
        self.network.save("unit_test_save_file_cache")
        new_network = PandaSocialNetwork()
        self.assertFalse(new_network.has_panda(self.ivo))
        new_network.load("unit_test_save_file_cache")
        self.assertTrue(new_network.has_panda(self.ivo))
        self.assertTrue(new_network.has_panda(niki))
        self.assertTrue(new_network.are_friends(self.ivo, niki))