def test_some_connected_total_infection(self):
        """
        Tests total infection of a network where only some of the users are connected to each other.
        Each time the algorithm is called, only one connected portion of the network should be infected.
        """
        u1 = User("u1", 1)
        u2 = User("u2", 1)
        u3 = User("u3", 1)
        u4 = User("u4", 1)
        u5 = User("u5", 1)
        u6 = User("u6", 1)

        u1.add_student(u2)
        u1.add_student(u3)
        u2.add_student(u4)

        u5.add_student(u6)

        network = UserNetwork()
        network.add_user(u1)
        network.add_user(u2)
        network.add_user(u3)
        network.add_user(u4)
        network.add_user(u5)
        network.add_user(u6)

        network.total_infection(u1, 2)
        self.assertEqual(u1.version, 2)
        self.assertEqual(u2.version, 2)
        self.assertEqual(u3.version, 2)
        self.assertEqual(u4.version, 2)
        self.assertEqual(u5.version, 1)
        self.assertEqual(u6.version, 1)

        network.total_infection(u2, 3)
        self.assertEqual(u1.version, 3)
        self.assertEqual(u2.version, 3)
        self.assertEqual(u3.version, 3)
        self.assertEqual(u4.version, 3)
        self.assertEqual(u5.version, 1)
        self.assertEqual(u6.version, 1)

        network.total_infection(u4, 4)
        self.assertEqual(u1.version, 4)
        self.assertEqual(u2.version, 4)
        self.assertEqual(u3.version, 4)
        self.assertEqual(u4.version, 4)
        self.assertEqual(u5.version, 1)
        self.assertEqual(u6.version, 1)

        network.total_infection(u5, 5)
        self.assertEqual(u1.version, 4)
        self.assertEqual(u2.version, 4)
        self.assertEqual(u3.version, 4)
        self.assertEqual(u4.version, 4)
        self.assertEqual(u5.version, 5)
        self.assertEqual(u6.version, 5)
    def test_unconnected_total_infection(self):
        """
        Tests the total infection algorithm with 3 unconnected users.
        Each time the algorithm is called, only one user should be infected.
        """
        u1 = User("u1", 1)
        u2 = User("u2", 1)
        u3 = User("u3", 1)

        network = UserNetwork()
        network.add_user(u1)
        network.add_user(u2)
        network.add_user(u3)

        network.total_infection(u1, 2)
        self.assertEqual(u1.version, 2)
        self.assertEqual(u2.version, 1)
        self.assertEqual(u3.version, 1)

        network.total_infection(u2, 3)
        self.assertEqual(u1.version, 2)
        self.assertEqual(u2.version, 3)
        self.assertEqual(u3.version, 1)

        network.total_infection(u3, 4)
        self.assertEqual(u1.version, 2)
        self.assertEqual(u2.version, 3)
        self.assertEqual(u3.version, 4)
    def test_basic_total_infection(self):
        """
        Basic test of the total infection algorithm. There are 3 users such that user 1 coaches
        user 2 and user 2 coaches user 3. All of the users should be infected.
        """
        u1 = User("u1", 1)
        u2 = User("u2", 1)
        u3 = User("u3", 1)
        u1.add_student(u2)
        u2.add_student(u3)

        network = UserNetwork()
        network.add_user(u1)
        network.add_user(u2)
        network.add_user(u3)

        network.total_infection(u1, 2)
        self.assertEqual(u1.version, 2)
        self.assertEqual(u2.version, 2)
        self.assertEqual(u3.version, 2)

        network.total_infection(u2, 3)
        self.assertEqual(u1.version, 3)
        self.assertEqual(u2.version, 3)
        self.assertEqual(u3.version, 3)

        network.total_infection(u2, 4)
        self.assertEqual(u1.version, 4)
        self.assertEqual(u2.version, 4)
        self.assertEqual(u3.version, 4)