def test_garbage_collection_protects_latest(self):
        pc = PhysicsCache()
        pc.acquire(1)
        pc.release(1)

        # verify that the latest snapshot will not permit itself to be deleted
        pc.graphics_loop_finish(1)
        pc.game_loop_finish(1)
        pc._garbage_collect(2)
        self.assertTrue(pc.has(1))
    def test_garbage_collection_precondition(self):
        pc = PhysicsCache()
        pc.acquire(1)
        pc.release(1)
        pc.acquire(2)
        pc.release(2)

        # verify that game_loop_finish does not permit collection by itself,
        # but does in conjunction with graphics_loop_finish
        pc.game_loop_finish(0)
        pc._garbage_collect()
        self.assertEqual(pc.count, 3)
        self.assertEqual(pc.latest, 2)
        self.assertTrue(pc.has(0))
        pc.graphics_loop_finish(0)
        pc._garbage_collect()
        self.assertEqual(pc.count, 2)
        self.assertEqual(pc.latest, 2)
        self.assertTrue(not pc.has(0))

        # verify that graphics_loop_finish does not permit collection by
        # itself, but does in conjunction with game_loop_finish
        pc.graphics_loop_finish(1)
        pc._garbage_collect()
        self.assertEqual(pc.count, 2)
        self.assertEqual(pc.latest, 2)
        self.assertTrue(pc.has(1))
        pc.game_loop_finish(1)
        pc._garbage_collect()
        self.assertEqual(pc.count, 1)
        self.assertEqual(pc.latest, 2)
        self.assertTrue(not pc.has(1))
    def test_garbage_collection_cascade(self):
        pc = PhysicsCache()
        pc.acquire(1)
        pc.release(1)
        pc.acquire(2)
        pc.release(2)

        # verify that a snapshot that's okay_to_delete also causes earlier
        # snapshots to be okay_to_delete
        pc.graphics_loop_finish(1)
        pc.game_loop_finish(1)
        pc._garbage_collect(2)
        self.assertEqual(pc.count, 1)
        self.assertEqual(pc.latest, 2)
        self.assertTrue(not pc.has(0))
        self.assertTrue(not pc.has(1))
        self.assertTrue(pc.has(2))