test_sparsearray.py 7.8 KB

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