Ejemplo n.º 1
0
class Gangster:
    def __init__(self, name, age, location=None):
        if not isinstance(age, int):
            raise Exception("Age can be only a integer")

        self.name = name
        self.age = age

        self.status = GangsterStatus.FREE
        self.location = location or GangsterLocation.UNKNOWN

        self.__boss = None
        self.__subordinates = LinkedList()


    def subordinates_count(self):
        return len(self.__subordinates)

    def add_subordinate(self, gangster):
        if not isinstance(gangster, Gangster):
            raise Exception("You can add only Gangsters as subordinates")

        gangster.set_boss(self)
        return self.__subordinates.add_first(gangster)

    def delete_subordinate(self, gangster):
        if not isinstance(gangster, Gangster):
            raise Exception("You can delete only Gangsters subordinates")

        return self.__subordinates.remove(gangster)

    def subordinates(self):
        return self.__subordinates.get_elements()

    def set_boss(self, gangster):
        if not isinstance(gangster, Gangster) and gangster is not None:
            raise Exception("You can add only Gangsters as bosses")

        self.__boss = gangster

        return True

    def get_boss(self):
        return self.__boss

    def has_boss(self):
        return self.__boss is not None
class TestLinkedList(unittest.TestCase):
    def setUp(self) -> None:
        self.ll = LinkedList()

    def test_add_first(self) -> None:
        self.ll.add_first(1)
        self.assertEqual(self.ll.__str__(), "[1]")
        self.ll.add_first(2)
        self.assertEqual(self.ll.__str__(), "[2, 1]")
        self.ll.add_first(3)
        self.assertEqual(self.ll.__str__(), "[3, 2, 1]")

    def test_append(self) -> None:
        self.ll.append(1)
        self.assertEqual(self.ll.__str__(), "[1]")
        self.ll.append(2)
        self.assertEqual(self.ll.__str__(), "[1, 2]")
        self.ll.append(3)
        self.assertEqual(self.ll.__str__(), "[1, 2, 3]")

    def test_get(self) -> None:
        with self.assertRaises(IndexError) as context:
            self.ll.get(0)
            self.assertTrue("Index is out of range" in context.exception)
        self.ll.append(1)
        self.assertEqual(self.ll.get(0), 1)
        with self.assertRaises(IndexError) as context:
            self.ll.get(-1)
            self.assertTrue("Index is out of range" in context.exception)
        with self.assertRaises(IndexError) as context:
            self.ll.get(1)
            self.assertTrue("Index is out of range" in context.exception)
        self.ll.append(2)
        self.assertEqual(self.ll.get(0), 1)
        self.assertEqual(self.ll.get(1), 2)
        with self.assertRaises(IndexError) as context:
            self.ll.get(2)
            self.assertTrue("Index is out of range" in context.exception)
        self.ll.add_first(3)
        self.assertEqual(self.ll.get(0), 3)
        self.assertEqual(self.ll.get(1), 1)
        self.assertEqual(self.ll.get(2), 2)
        with self.assertRaises(IndexError) as context:
            self.ll.get(3)
            self.assertTrue("Index is out of range" in context.exception)

    def test_pop(self) -> None:
        with self.assertRaises(IndexError) as context:
            self.ll.pop(0)
            self.assertTrue("Index is out of range" in context.exception)
        self.ll.append(1)
        self.assertEqual(self.ll.pop(0), 1)
        with self.assertRaises(IndexError) as context:
            self.ll.pop(1)
            self.assertTrue("Index is out of range" in context.exception)
        self.ll.append(1)
        self.ll.append(2)
        self.assertEqual(self.ll.pop(0), 1)
        self.assertEqual(self.ll.pop(0), 2)
        self.ll.add_first(3)
        self.ll.add_first(2)
        self.ll.add_first(1)
        self.assertEqual(self.ll.pop(0), 1)
        self.assertEqual(self.ll.pop(1), 3)
        with self.assertRaises(IndexError) as context:
            self.ll.pop(2)
            self.assertTrue("Index is out of range" in context.exception)

    def test_clear(self) -> None:
        self.assertEqual(len(self.ll), 0)
        self.ll.append(1)
        self.assertEqual(len(self.ll), 1)
        self.ll.clear()
        self.assertEqual(len(self.ll), 0)
        self.ll.append(2)
        self.assertEqual(len(self.ll), 1)
        self.ll.clear()
        self.assertEqual(len(self.ll), 0)

    def test_big_test(self) -> None:
        test_case = 100_000
        for i in range(test_case):
            self.ll.add_first(i)
        for i in reversed(range(test_case)):
            self.assertEqual(self.ll.pop(0), i)

    def test_iterable(self) -> None:
        for i in range(10):
            self.ll.append(i)
        for i in self.ll:
            self.assertEqual(self.ll[i], i)
        self.ll[5] = 6
        self.assertEqual(self.ll[5], 6)

    def test_repr(self) -> None:
        for i in range(6):
            self.ll.append(i)
        self.assertEqual(self.ll.__repr__(), "LinkedList [0, 1, 2, 3, 4, 5]")
        self.ll.append(3)
        self.assertEqual(self.ll.__repr__(),
                         "LinkedList [0, 1, 2, 3, 4, 5, ...]")
Ejemplo n.º 3
0
class TestLinkedList(TestCase):
    @classmethod
    def get_next_element(cls, node):
        return node.get_next().get_element()

    def setUp(self):
        self.l = LinkedList()

    def test_is_empty_for_new_list_returns_true(self):
        self.assertTrue(self.l.is_empty)

    def test_is_empty_for_populated_list_returns_false(self):
        self.l.add_first(1)

        self.assertFalse(self.l.is_empty())

    def test_get_first_from_empty_list_throws_exception(self):
        self.assertRaises(Empty, self.l.get_first)

    def test_get_first_from_populated_list_returns_head_node(self):
        self.l.add_first(1)
        self.l.add_first(2)

        h = self.l.get_first()
        self.assertEquals(h.get_element(), 2)

    def test_add_first_returns_added_node(self):
        self.assertEquals(self.l.add_first(1).get_element(), 1)

    def test_add_first_links_nodes_between_them(self):
        self.l.add_first(2)
        self.l.add_first(1)

        h = self.l.get_first()
        self.assertEquals(TestLinkedList.get_next_element(h), 2)

    def test_length_on_empty_list_returns_0(self):
        self.assertEquals(len(self.l), 0)

    def test_length_on_populated_list_returns_correct_length(self):
        self.l.add_first(1)

        self.assertEquals(len(self.l), 1)

    def test_find_when_list_is_empty(self):
        self.assertRaises(Empty, self.l.find, 1)

    def test_find_on_populated_list_returns_the_element_node(self):
        self.l.add_first(1)

        self.assertEquals(self.l.find(1).get_element(), 1)

    def test_find_non_existing_element_returns_null(self):
        self.l.add_first(1)

        self.assertEquals(self.l.find(2), None)

    def test_contains_on_empty_list_throws_exception(self):
        self.assertRaises(Empty, self.l.contains, 1)

    def test_contains_existing_element_returns_true(self):
        self.l.add_first(1)

        self.assertTrue(self.l.contains(1))

    def test_contains_non_existing_element_returns_false(self):
        self.l.add_first(1)

        self.assertFalse(self.l.contains(2))

    def test_remove_from_empty_list_throws_error(self):
        self.assertRaises(Empty, self.l.remove, 1)

    def test_remove_non_existing_element_returns_false(self):
        self.l.add_first(10)

        self.assertFalse(self.l.remove(2))

    def test_remove_first_element_of_one_element_list_returns_true(self):
        self.l.add_first(1)

        self.assertTrue(self.l.remove(1))

    def test_remove_first_element_of_one_element_list_decreases_the_length_of_the_list(
            self):
        self.l.add_first(1)
        self.l.remove(1)

        self.assertEquals(len(self.l), 0)

    def test_remove_first_element_of_one_element_list_makes_head_empty(self):
        self.l.add_first(1)
        self.l.remove(1)

        self.assertRaises(Empty, self.l.get_first)

    def test_remove_first_element_of_a_list_returns_true(self):
        self.l.add_first(1)
        self.l.add_first(2)

        self.assertTrue(self.l.remove(2))

    def test_remove_first_element_of_a_list_makes_the_next_element_as_new_head(
            self):
        self.l.add_first(1)
        self.l.add_first(2)

        self.l.remove(2)

        self.assertTrue(self.l.get_first().get_element(), 1)

    def test_remove_last_element_of_a_list_with_two_elements_returns_true(
            self):
        self.l.add_first(1)
        self.l.add_first(2)

        self.assertTrue(self.l.remove(1))

    def test_remove_last_element_of_a_list_with_two_elements_doesnt_change_head(
            self):
        self.l.add_first(1)
        self.l.add_first(2)

        self.l.remove(1)

        self.assertTrue(self.l.get_first().get_element(), 2)

    def test_remove_last_element_of_a_list_with_two_elements_breaks_the_link_with_head(
            self):
        self.l.add_first(1)
        n = self.l.add_first(2)

        self.l.remove(1)

        self.assertEquals(n.get_next(), None)

    def test_remove_element_of_a_list_returns_true(self):
        self.l.add_first(1)
        self.l.add_first(2)
        self.l.add_first(3)

        self.assertTrue(self.l.remove(2))

    def test_remove_element_of_a_list_updates_link_between_nodes(self):
        self.l.add_first(1)
        self.l.add_first(2)
        self.l.add_first(3)

        self.l.remove(2)

        v = TestLinkedList.get_next_element(self.l.get_first())
        self.assertEquals(v, 1)

    def test_remove_first_element_changes_the_head_node(self):
        self.l.add_first(1)
        n = self.l.add_first(2)
        self.l.add_first(3)

        self.l.remove(3)

        self.assertEquals(self.l.get_first(), n)

    def test_list_nodes_from_empty_list_returns_nothing(self):
        r = set()

        for node in self.l.get_elements():
            r.add(node)

        self.assertEquals(r, set())

    def test_list_nodes_iterates_through_all_list(self):
        self.l.add_first(1)
        self.l.add_first(2)
        self.l.add_first(3)

        r = set()
        for node in self.l.get_elements():
            r.add(node)

        self.assertEquals(r, set([1, 2, 3]))