예제 #1
0
 def test_last(self):
     doubleLinkedList = DoubleLinkedList()
     doubleLinkedList.push("test1")
     doubleLinkedList.push(1)
     doubleLinkedList.push(2)
     doubleLinkedList.delete("test1")
     assert (doubleLinkedList.last().elem == 2)
예제 #2
0
 def test_first(self):
     doubleLinkedList = DoubleLinkedList()
     doubleLinkedList.push("test1")
     doubleLinkedList.push(1)
     doubleLinkedList.push("test1")
     doubleLinkedList.delete("test1")
     assert (doubleLinkedList.first().elem == 1)
예제 #3
0
 def test_delete2(self):
     doubleLinkedList = DoubleLinkedList()
     doubleLinkedList.push(1)
     doubleLinkedList.push(1)
     doubleLinkedList.push(1)
     doubleLinkedList.delete(1)
     assert (doubleLinkedList.pop() == None and doubleLinkedList.len() == 0
             and doubleLinkedList.first() == None
             and doubleLinkedList.last() == None)
예제 #4
0
 def test_delete1(self):
     doubleLinkedList = DoubleLinkedList()
     doubleLinkedList.push("test1")
     doubleLinkedList.push(1)
     doubleLinkedList.push("test1")
     doubleLinkedList.push(2)
     doubleLinkedList.push("test1")
     doubleLinkedList.delete("test1")
     assert ([doubleLinkedList.pop(), doubleLinkedList.pop()] == [2, 1])
예제 #5
0
 def test_delete_when_no_this_element(self):
     """Test method which delete element from list, when no this element in the list"""
     l_list = DoubleLinkedList()
     l_list.push(1234)
     l_list.push(12)
     l_list.push(1)
     with self.assertRaises(Exception) as context:
         l_list.delete(123)
     self.assertTrue('No this Element' in str(context.exception))
예제 #6
0
 def test_delete(self):
     """Test method which delete element from list"""
     delete_test_list = DoubleLinkedList()
     delete_test_list.push(12)
     delete_test_list.push(123)
     delete_test_list.push(1234)
     delete_test_list.push(12345)
     delete_test_list.delete(123)
     self.assertEqual(delete_test_list.get_list()[1].get_elem(), 1234)
 def test_delete_implementation(self):
     dll = DoubleLinkedList(array)
     assert dll.delete(1) == 1
     assert dll.delete(4) == 4
     assert dll.delete(6) == 6
     assert dll.size == 3
     assert dll.head.data == 2
     assert dll.tail.data == 5
     assert dll.tail.prev.data == 3
     assert dll.head.next.data == 3
예제 #8
0
class Model:
    def __init__(self):
        self.pellets = DoubleLinkedList()
        self.blobs = DoubleLinkedList()
        self.bullet_blobs = DoubleLinkedList()
        self.blob_families = []
        self.controllers = []
        self.lastime = time.time()

        for _ in range(SMALL_PELLET_NUM):
            self.__generate_pellet()

        for _ in range(LARGE_PELLET_NUM):
            self.__generate_large_pellet()

    def update(self):
        dt = self.__get_dt()
        self.__move(dt)
        self.__resolve_collisions()

    def get_board_size(self):
        return (BOARD_WIDTH, BOARD_HEIGHT)

    def get_items(self):
        return [pellet.get() for pellet in self.pellets] + [
            bullet_blob.get() for bullet_blob in self.bullet_blobs
        ] + [blob.get() for blob in self.blobs]

    def register_controller(self, controller):
        blob_family = BlobFamily(self, len(self.controllers))
        blob = Blob(self, self.__random_position(100), len(self.controllers),
                    blob_family)
        blob_family.add_blob(blob)
        controller.set_manipulator(Manipulator(blob_family, self))

        self.controllers.append(controller)
        self.blobs.append(blob)
        self.blob_families.append(blob_family)

    def add_blob(self, blob):
        self.blobs.append(blob)

    def add_bullet_blob(self, bullet_blob):
        self.bullet_blobs.append(bullet_blob)

    def __move(self, dt):
        for controller in self.controllers:
            controller.update()
        for family in self.blob_families:
            family.update(dt)
        for bullet_blob in self.bullet_blobs:
            bullet_blob.get().update(dt)
        for pellet in self.pellets:
            if isinstance(pellet.get(), LargePellet): pellet.get().update(dt)

    def __get_dt(self):
        currentTime = time.time()
        dt = currentTime - self.lastime
        self.lastime = currentTime
        return dt

    def __random_position(self, offset):
        return (random.randint(offset, BOARD_WIDTH - offset),
                random.randint(offset, BOARD_HEIGHT - offset))

    def __resolve_collisions(self):
        blob_iter = self.blobs.get_first_iterator()
        while blob_iter is not None:

            self.__resolve_collisions_blob_pellets(blob_iter.get())

            if self.__resolve_collisions_blob_other_blobs(blob_iter):
                tmp = blob_iter.get_next()
                self.blobs.delete(blob_iter)
                blob_iter.get().remove_from_family()
                blob_iter = tmp
                continue

            blob_iter = blob_iter.get_next()

        bullet_blob = self.bullet_blobs.get_first_iterator()
        while bullet_blob is not None:

            if self.__resolve_collisions_bullet_blobs(bullet_blob.get(
            )) or self.__resolve_collisions_bullet_pellets(bullet_blob.get()):
                tmp = bullet_blob.get_next()
                self.bullet_blobs.delete(bullet_blob)
                bullet_blob = tmp
            else:
                bullet_blob = bullet_blob.get_next()

    def __resolve_collisions_blob_pellets(self, blob):
        pellet = self.pellets.get_first_iterator()
        while pellet is not None:
            if blob.collides(pellet.get()):
                pellet.get().affect(blob)

                if isinstance(pellet.get(), LargePellet):
                    self.__generate_large_pellet()
                else:
                    self.__generate_pellet()

                tmp = pellet.get_next()
                self.pellets.delete(pellet)
                pellet = tmp

            else:
                pellet = pellet.get_next()

    def __resolve_collisions_blob_other_blobs(self, blob_iter_1):
        # returns true if blob_iter_1.get() should be deleted

        blob_1 = blob_iter_1.get()
        blob_iter_2 = blob_iter_1.get_next()

        can_merge = not blob_1.get_blob_family().should_stay_divided()

        while blob_iter_2 is not None:

            blob_2 = blob_iter_2.get()
            same_family = blob_1.get_blob_family() is blob_2.get_blob_family()

            if blob_1.collides(blob_2):
                if (not same_family and blob_1.can_eat(blob_2)) or (
                        same_family and can_merge
                        and blob_1.get_weight() >= blob_2.get_weight()):
                    blob_1.add_weight(blob_2.get_weight())
                    tmp = blob_iter_2.get_next()
                    self.blobs.delete(blob_iter_2)
                    blob_2.remove_from_family()
                    blob_iter_2 = tmp
                    continue

                elif (not same_family and blob_2.can_eat(blob_1)) or (
                        same_family and can_merge
                        and blob_1.get_weight() <= blob_2.get_weight()):
                    blob_2.add_weight(blob_1.get_weight())
                    return True

            if same_family and not can_merge and blob_1.touches(blob_2):
                blob_1.repel_from_each_other(blob_2)

            blob_iter_2 = blob_iter_2.get_next()

    def __resolve_collisions_bullet_blobs(self, bullet_blob):
        for blob in self.blobs:
            if bullet_blob.collides(blob.get()):
                blob.get().push(bullet_blob, BULLET_BLOB_STRENGTH)
                blob.get().add_weight(BULLET_EAT_RATIO *
                                      bullet_blob.get_weight())
                return True
        return False

    def __resolve_collisions_bullet_pellets(self, bullet_blob):
        for pellet in self.pellets:
            if isinstance(pellet.get(),
                          LargePellet) and pellet.get().collides(bullet_blob):
                pellet.get().push(bullet_blob, BULLET_PELLET_STRENGTH)
                return True
        return False

    def __generate_pellet(self):
        weight = random.randint(1, 5)
        pellet = Pellet(self.__random_position(10), weight)

        while True:
            for blob in self.blobs:
                if blob.get().touches(pellet):
                    break
            else:
                break
            pellet.position = self.__random_position(50)

        self.pellets.append(pellet)

    def __generate_large_pellet(self):
        pellet = LargePellet(self, self.__random_position(50))

        while True:
            for blob in self.blobs:
                if blob.get().touches(pellet):
                    break
            else:
                break
            pellet.position = self.__random_position(50)

        self.pellets.append(pellet)
예제 #9
0
 def test_delete_when_empty(self):
     """Test method which delete element from list, when list is empty"""
     l_list = DoubleLinkedList()
     with self.assertRaises(Exception) as context:
         l_list.delete(123)
     self.assertTrue('Empty list' in str(context.exception))
class TestDoubleLinkedList(unittest.TestCase):
    def setUp(self):
        self.double_list = DoubleLinkedList()

    def test_insert_one_item(self):
        self.assertEqual(0, self.double_list.size)
        self.assertEqual(None, self.double_list.root)

        item1 = create_item(1, 1)

        self.double_list.insert(item1)
        self.assertEqual(1, self.double_list.size)
        self.assertEqual(item1, self.double_list.root)
        self.assertEqual(None, self.double_list.root.next)
        self.assertEqual(None, self.double_list.root.before)

    def test_insert_two_items(self):
        self.assertEqual(0, self.double_list.size)
        self.assertEqual(None, self.double_list.root)

        item1 = create_item(1, 1)
        item2 = create_item(2, 2)

        self.double_list.insert(item1)
        self.double_list.insert(item2)
        self.assertEqual(2, self.double_list.size)
        self.assertEqual(item1, self.double_list.root)
        self.assertEqual(item2, self.double_list.root.next)
        self.assertEqual(None, self.double_list.root.next.next)
        self.assertEqual(item1, self.double_list.root.next.before)

    def test_insert_three_items(self):
        self.assertEqual(0, self.double_list.size)
        self.assertEqual(None, self.double_list.root)

        item1 = create_item(1, 1)
        item2 = create_item(2, 2)
        item3 = create_item(3, 3)

        self.double_list.insert(item1)
        self.double_list.insert(item2)
        self.double_list.insert(item3)
        self.assertEqual(3, self.double_list.size)
        self.assertEqual(item1, self.double_list.root)
        self.assertEqual(item2, self.double_list.root.next)
        self.assertEqual(item1, self.double_list.root.next.before)
        self.assertEqual(item3, self.double_list.root.next.next)
        self.assertEqual(item2, self.double_list.root.next.next.before)
        self.assertEqual(item1, self.double_list.root.next.next.before.before)

    def test_search_item_exist(self):
        item1 = create_item(1, 1)
        item2 = create_item(2, 2)
        item3 = create_item(3, 3)

        self.double_list.insert(item1)
        self.double_list.insert(item2)
        self.double_list.insert(item3)

        self.assertEqual(item3, self.double_list.search(item3.id_))

    def test_search_item_not_exist(self):
        item1 = create_item(1, 1)
        item2 = create_item(2, 2)
        item3 = create_item(3, 3)

        self.double_list.insert(item1)
        self.double_list.insert(item2)
        self.double_list.insert(item3)

        self.assertEqual(None, self.double_list.search(4))

    def test_search_in_list_empty(self):
        self.assertEqual(None, self.double_list.search(1))

    def test_remove_last_item(self):
        item1 = create_item(1, 1)
        item2 = create_item(2, 2)
        item3 = create_item(3, 3)

        self.double_list.insert(item1)
        self.double_list.insert(item2)
        self.double_list.insert(item3)

        item_removed = self.double_list.delete(item3.id_)
        self.assertEqual(item3, item_removed)
        self.assertEqual(2, self.double_list.size)
        self.assertEqual(item1, self.double_list.root)
        self.assertEqual(item2, self.double_list.root.next)

    def test_remove_first_item(self):
        item1 = create_item(1, 1)
        item2 = create_item(2, 2)
        item3 = create_item(3, 3)

        self.double_list.insert(item1)
        self.double_list.insert(item2)
        self.double_list.insert(item3)

        item_removed = self.double_list.delete(item1.id_)
        self.assertEqual(item1, item_removed)
        self.assertEqual(2, self.double_list.size)
        self.assertEqual(item2, self.double_list.root)
        self.assertEqual(item3, self.double_list.root.next)

    def test_remove_middle_item(self):
        item1 = create_item(1, 1)
        item2 = create_item(2, 2)
        item3 = create_item(3, 3)

        self.double_list.insert(item1)
        self.double_list.insert(item2)
        self.double_list.insert(item3)

        item_removed = self.double_list.delete(item2.id_)
        self.assertEqual(item2, item_removed)
        self.assertEqual(2, self.double_list.size)
        self.assertEqual(item1, self.double_list.root)
        self.assertEqual(item3, self.double_list.root.next)