test_sparsearray.py 6.8 KB

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