Files
panda3d/tests/putil/test_uniqueidallocator.py

152 lines
3.6 KiB
Python

from panda3d.core import UniqueIdAllocator
# Value from panda/src/putil/uniqueIdAllocator.cxx, not published
IndexEnd = 0xFFFFFFFF
def test_inclusive_allocation():
allocator = UniqueIdAllocator(0, 0)
assert allocator.allocate() == 0
assert allocator.allocate() == IndexEnd
def test_normal_allocation():
allocator = UniqueIdAllocator(0, 10)
for i in range(10 + 1):
assert allocator.allocate() == i
assert allocator.allocate() == IndexEnd
def test_min_value_allocation():
allocator = UniqueIdAllocator(1, 5)
for i in range(1, 5 + 1):
assert allocator.allocate() == i
assert allocator.allocate() == IndexEnd
def test_regular_is_allocated():
allocator = UniqueIdAllocator(1, 5)
for i in range(1, 5 + 1):
assert not allocator.is_allocated(i)
for i in range(1, 5 + 1):
assert allocator.is_allocated(allocator.allocate())
def test_bounded_is_allocated():
allocator = UniqueIdAllocator(1, 5)
for i in range(1, 5 + 1):
assert allocator.is_allocated(allocator.allocate())
assert not allocator.is_allocated(0) # Out of range, left side
assert not allocator.is_allocated(10) # Out of range, right side
def test_initial_reserve_id():
allocator = UniqueIdAllocator(1, 3)
assert not allocator.is_allocated(2)
allocator.initial_reserve_id(2)
assert allocator.is_allocated(2)
assert allocator.allocate() == 1
assert allocator.allocate() == 3
assert allocator.allocate() == IndexEnd
def test_initial_reserve_id_exhaustion():
allocator = UniqueIdAllocator(1, 3)
for i in range(1, 3 + 1):
allocator.initial_reserve_id(i)
assert allocator.allocate() == IndexEnd
def test_free():
allocator = UniqueIdAllocator(0, 0)
assert allocator.allocate() == 0
assert allocator.is_allocated(0)
assert allocator.free(0)
assert not allocator.is_allocated(0)
def test_free_reallocation():
allocator = UniqueIdAllocator(1, 5)
for i in range(1, 5 + 1):
assert allocator.allocate() == i
assert allocator.is_allocated(i)
for i in range(1, 5 + 1):
assert allocator.free(i)
for i in range(1, 5 + 1):
assert not allocator.is_allocated(i)
assert allocator.allocate() == i
assert allocator.allocate() == IndexEnd
def test_free_unallocated():
allocator = UniqueIdAllocator(0, 2)
assert allocator.allocate() == 0
assert allocator.free(0)
for i in range(0, 2 + 1):
assert not allocator.free(i)
def test_free_bounds():
allocator = UniqueIdAllocator(1, 3)
assert not allocator.free(0) # Out of range, left side
assert not allocator.free(4) # Out of range, right side
def test_free_reallocation_mid():
allocator = UniqueIdAllocator(1, 5)
for i in range(1, 5 + 1):
assert allocator.allocate() == i
assert allocator.is_allocated(i)
assert allocator.free(2)
assert allocator.free(3)
assert allocator.allocate() == 2
assert allocator.allocate() == 3
assert allocator.allocate() == IndexEnd
def test_free_initial_reserve_id():
allocator = UniqueIdAllocator(1, 3)
allocator.initial_reserve_id(1)
assert allocator.free(1)
assert allocator.allocate() == 2
assert allocator.allocate() == 3
assert allocator.allocate() == 1
assert allocator.allocate() == IndexEnd
def test_fraction_used():
allocator = UniqueIdAllocator(1, 4)
assert allocator.fraction_used() == 0
for fraction in (0.25, 0.5, 0.75, 1):
allocator.allocate()
assert allocator.fraction_used() == fraction
assert allocator.allocate() == IndexEnd