test_sparsearray.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. from panda3d import core
  2. def test_sparse_array_set_bit_to():
  3. """Tests SparseArray behavior for set_bit_to()."""
  4. s = core.SparseArray()
  5. s.set_bit_to(5, True)
  6. assert s.get_bit(5)
  7. s = core.SparseArray.all_on()
  8. s.set_bit_to(5, False)
  9. assert not s.get_bit(5)
  10. def test_sparse_array_clear():
  11. """Tests SparseArray behavior for clear()."""
  12. s = core.SparseArray.all_on()
  13. s.clear()
  14. assert s.is_zero()
  15. assert not s.is_inverse()
  16. assert s.get_num_subranges() == 0
  17. assert s.get_num_on_bits() == 0
  18. assert s.get_num_bits() == 0
  19. s = core.SparseArray()
  20. s.set_range(5, 10)
  21. s.clear()
  22. assert s.is_zero()
  23. assert not s.is_inverse()
  24. assert s.get_num_subranges() == 0
  25. assert s.get_num_on_bits() == 0
  26. assert s.get_num_bits() == 0
  27. def test_sparse_array_clear_range():
  28. # Not using parametrize because there are too many values for that.
  29. for mask in range(0x7f):
  30. for begin in range(8):
  31. for size in range(8):
  32. b = core.BitArray(mask)
  33. s = core.SparseArray(b)
  34. s.clear_range(begin, size)
  35. b.clear_range(begin, size)
  36. assert core.BitArray(s) == b
  37. assert s == core.SparseArray(b)
  38. def test_sparse_array_set_clear_ranges():
  39. """Tests SparseArray behavior for setting and clearing ranges."""
  40. # test clear_range with single overlapping on-range
  41. # (clear_range extends beyond highest on-bit)
  42. s = core.SparseArray()
  43. s.set_range(2, 3)
  44. s.clear_range(3, 3)
  45. assert s.get_bit(2)
  46. assert not s.get_bit(3)
  47. # same as above, using set_range_to
  48. s = core.SparseArray()
  49. s.set_range_to(True, 2, 3)
  50. s.set_range_to(False, 3, 3)
  51. assert s.get_bit(2)
  52. assert not s.get_bit(3)
  53. # test clear_range using off-range which overlaps two on-ranges
  54. # (lowest off-bit in lowest on-range, highest off-bit in highest on-range)
  55. s = core.SparseArray()
  56. s.set_range(2, 3)
  57. s.set_range(7, 3)
  58. s.clear_range(3, 6)
  59. assert s.get_bit(2)
  60. assert not s.get_bit(3)
  61. assert not s.get_bit(8)
  62. assert s.get_bit(9)
  63. # same as above, using set_range_to
  64. s = core.SparseArray()
  65. s.set_range_to(True, 2, 3)
  66. s.set_range_to(True, 7, 3)
  67. s.set_range_to(False, 3, 6)
  68. assert s.get_bit(2)
  69. assert not s.get_bit(3)
  70. assert not s.get_bit(8)
  71. assert s.get_bit(9)
  72. def test_sparse_array_set_range():
  73. """Tests SparseArray behavior for set_range()."""
  74. # test set_range with single overlapping off-range
  75. # (set_range extends beyond highest off-bit)
  76. s = core.SparseArray.all_on()
  77. s.clear_range(2, 3)
  78. s.set_range(3, 3)
  79. assert not s.get_bit(2)
  80. assert s.get_bit(3)
  81. # same as above, using set_range_to
  82. s = core.SparseArray.all_on()
  83. s.set_range_to(False, 2, 3)
  84. s.set_range_to(True, 3, 3)
  85. assert not s.get_bit(2)
  86. assert s.get_bit(3)
  87. # test set_range using on-range which overlaps two off-ranges
  88. # (lowest on-bit in lowest off-range, highest on-bit in highest off-range)
  89. s = core.SparseArray.all_on()
  90. s.clear_range(2, 3)
  91. s.clear_range(7, 3)
  92. s.set_range(3, 6)
  93. assert not s.get_bit(2)
  94. assert s.get_bit(3)
  95. assert s.get_bit(8)
  96. assert not s.get_bit(9)
  97. # same as above, using set_range_to
  98. s = core.SparseArray.all_on()
  99. s.set_range_to(False, 2, 3)
  100. s.set_range_to(False, 7, 3)
  101. s.set_range_to(True, 3, 6)
  102. assert not s.get_bit(2)
  103. assert s.get_bit(3)
  104. assert s.get_bit(8)
  105. assert not s.get_bit(9)
  106. def test_sparse_array_bits_in_common():
  107. """Tests SparseArray behavior for has_bits_in_common()."""
  108. s = core.SparseArray()
  109. t = core.SparseArray()
  110. s.set_range(2, 4)
  111. t.set_range(5, 4)
  112. assert s.has_bits_in_common(t)
  113. s = core.SparseArray()
  114. t = core.SparseArray()
  115. s.set_range(2, 4)
  116. t.set_range(6, 4)
  117. assert not s.has_bits_in_common(t)
  118. def test_sparse_array_operations():
  119. """Tests SparseArray behavior for various operations."""
  120. # test bitshift to left
  121. s = core.SparseArray()
  122. s.set_bit(2)
  123. t = s << 2
  124. assert t.get_bit(4)
  125. assert not t.get_bit(2)
  126. # test bitshift to right
  127. s = core.SparseArray()
  128. s.set_bit(4)
  129. t = s >> 2
  130. assert t.get_bit(2)
  131. assert not t.get_bit(4)
  132. # test bitwise AND
  133. s = core.SparseArray()
  134. t = core.SparseArray()
  135. s.set_bit(2)
  136. s.set_bit(3)
  137. t.set_bit(1)
  138. t.set_bit(3)
  139. u = s & t
  140. assert not u.get_bit(0)
  141. assert not u.get_bit(1)
  142. assert not u.get_bit(2)
  143. assert u.get_bit(3)
  144. # test bitwise OR
  145. s = core.SparseArray()
  146. t = core.SparseArray()
  147. s.set_bit(2)
  148. s.set_bit(3)
  149. t.set_bit(1)
  150. t.set_bit(3)
  151. u = s | t
  152. assert not u.get_bit(0)
  153. assert u.get_bit(1)
  154. assert u.get_bit(2)
  155. assert u.get_bit(3)
  156. # test bitwise XOR
  157. s = core.SparseArray()
  158. t = core.SparseArray()
  159. s.set_bit(2)
  160. s.set_bit(3)
  161. t.set_bit(1)
  162. t.set_bit(3)
  163. u = s ^ t
  164. assert not u.get_bit(0)
  165. assert u.get_bit(1)
  166. assert u.get_bit(2)
  167. assert not u.get_bit(3)
  168. def test_sparse_array_augm_assignment():
  169. """Tests SparseArray behavior for augmented assignments."""
  170. # test in-place bitshift to left
  171. s = t = core.SparseArray()
  172. t <<= 2
  173. assert s is t
  174. # test in-place bitshift to right
  175. s = t = core.SparseArray()
  176. t >>= 2
  177. assert s is t
  178. # test in-place bitwise AND
  179. s = t = core.SparseArray()
  180. u = core.SparseArray()
  181. t &= u
  182. assert s is t
  183. # test in-place bitwise OR
  184. s = t = core.SparseArray()
  185. u = core.SparseArray()
  186. t |= u
  187. assert s is t
  188. # test in-place bitwise XOR
  189. s = t = core.SparseArray()
  190. u = core.SparseArray()
  191. t ^= u
  192. assert s is t