test_map.odin 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. package test_internal_map
  2. import "core:log"
  3. import "base:intrinsics"
  4. import "core:math/rand"
  5. import "core:testing"
  6. ENTRY_COUNTS := []int{11, 101, 1_001, 10_001, 100_001, 1_000_001}
  7. @test
  8. map_insert_random_key_value :: proc(t: ^testing.T) {
  9. seed_incr := u64(0)
  10. for entries in ENTRY_COUNTS {
  11. log.infof("Testing %v entries", entries)
  12. m: map[i64]i64
  13. defer delete(m)
  14. unique_keys := 0
  15. r := rand.create(t.seed + seed_incr)
  16. for _ in 0..<entries {
  17. k := rand.int63(&r)
  18. v := rand.int63(&r)
  19. if k not_in m {
  20. unique_keys += 1
  21. }
  22. m[k] = v
  23. }
  24. key_count := 0
  25. for _ in m {
  26. key_count += 1
  27. }
  28. testing.expectf(t, key_count == unique_keys, "Expected key_count to equal %v, got %v", unique_keys, key_count)
  29. testing.expectf(t, len(m) == unique_keys, "Expected len(map) to equal %v, got %v", unique_keys, len(m))
  30. // Reset randomizer and verify
  31. r = rand.create(t.seed + seed_incr)
  32. num_fails := 0
  33. for _ in 0..<entries {
  34. k := rand.int63(&r)
  35. v := rand.int63(&r)
  36. cond := m[k] == v
  37. if !cond {
  38. num_fails += 1
  39. if num_fails > 5 {
  40. log.info("... and more")
  41. break
  42. }
  43. testing.expectf(t, false, "Unexpected value. Expected m[%v] = %v, got %v", k, v, m[k])
  44. }
  45. }
  46. seed_incr += 1
  47. }
  48. }
  49. @test
  50. map_update_random_key_value :: proc(t: ^testing.T) {
  51. seed_incr := u64(0)
  52. for entries in ENTRY_COUNTS {
  53. log.infof("Testing %v entries", entries)
  54. m: map[i64]i64
  55. defer delete(m)
  56. unique_keys := 0
  57. r := rand.create(t.seed + seed_incr)
  58. for _ in 0..<entries {
  59. k := rand.int63(&r)
  60. v := rand.int63(&r)
  61. if k not_in m {
  62. unique_keys += 1
  63. }
  64. m[k] = v
  65. }
  66. key_count := 0
  67. for _ in m {
  68. key_count += 1
  69. }
  70. testing.expectf(t, key_count == unique_keys, "Expected key_count to equal %v, got %v", unique_keys, key_count)
  71. testing.expectf(t, len(m) == unique_keys, "Expected len(map) to equal %v, got %v", unique_keys, len(m))
  72. half_entries := entries / 2
  73. // Reset randomizer and update half the entries
  74. r = rand.create(t.seed + seed_incr)
  75. for _ in 0..<half_entries {
  76. k := rand.int63(&r)
  77. v := rand.int63(&r)
  78. m[k] = v + 42
  79. }
  80. // Reset randomizer and verify
  81. r = rand.create(t.seed + seed_incr)
  82. num_fails := 0
  83. for i in 0..<entries {
  84. k := rand.int63(&r)
  85. v := rand.int63(&r)
  86. diff := i64(42) if i < half_entries else i64(0)
  87. cond := m[k] == (v + diff)
  88. if !cond {
  89. num_fails += 1
  90. if num_fails > 5 {
  91. log.info("... and more")
  92. break
  93. }
  94. testing.expectf(t, false, "Unexpected value. Expected m[%v] = %v, got %v", k, v, m[k])
  95. }
  96. }
  97. seed_incr += 1
  98. }
  99. }
  100. @test
  101. map_delete_random_key_value :: proc(t: ^testing.T) {
  102. seed_incr := u64(0)
  103. for entries in ENTRY_COUNTS {
  104. log.infof("Testing %v entries", entries)
  105. m: map[i64]i64
  106. defer delete(m)
  107. unique_keys := 0
  108. r := rand.create(t.seed + seed_incr)
  109. for _ in 0..<entries {
  110. k := rand.int63(&r)
  111. v := rand.int63(&r)
  112. if k not_in m {
  113. unique_keys += 1
  114. }
  115. m[k] = v
  116. }
  117. key_count := 0
  118. for _ in m {
  119. key_count += 1
  120. }
  121. testing.expectf(t, key_count == unique_keys, "Expected key_count to equal %v, got %v", unique_keys, key_count)
  122. testing.expectf(t, len(m) == unique_keys, "Expected len(map) to equal %v, got %v", unique_keys, len(m))
  123. half_entries := entries / 2
  124. // Reset randomizer and delete half the entries
  125. r = rand.create(t.seed + seed_incr)
  126. for _ in 0..<half_entries {
  127. k := rand.int63(&r)
  128. _ = rand.int63(&r)
  129. delete_key(&m, k)
  130. }
  131. // Reset randomizer and verify
  132. r = rand.create(t.seed + seed_incr)
  133. num_fails := 0
  134. for i in 0..<entries {
  135. k := rand.int63(&r)
  136. v := rand.int63(&r)
  137. if i < half_entries {
  138. if k in m {
  139. num_fails += 1
  140. if num_fails > 5 {
  141. log.info("... and more")
  142. break
  143. }
  144. testing.expectf(t, false, "Unexpected key present. Expected m[%v] to have been deleted, got %v", k, m[k])
  145. }
  146. } else {
  147. if k not_in m {
  148. num_fails += 1
  149. if num_fails > 5 {
  150. log.info("... and more")
  151. break
  152. }
  153. testing.expectf(t, false, "Expected key not present. Expected m[%v] = %v", k, v)
  154. } else if m[k] != v {
  155. num_fails += 1
  156. if num_fails > 5 {
  157. log.info("... and more")
  158. break
  159. }
  160. testing.expectf(t, false, "Unexpected value. Expected m[%v] = %v, got %v", k, v, m[k])
  161. }
  162. }
  163. }
  164. seed_incr += 1
  165. }
  166. }
  167. @test
  168. set_insert_random_key_value :: proc(t: ^testing.T) {
  169. seed_incr := u64(0)
  170. for entries in ENTRY_COUNTS {
  171. log.infof("Testing %v entries", entries)
  172. m: map[i64]struct{}
  173. defer delete(m)
  174. unique_keys := 0
  175. r := rand.create(t.seed + seed_incr)
  176. for _ in 0..<entries {
  177. k := rand.int63(&r)
  178. if k not_in m {
  179. unique_keys += 1
  180. }
  181. m[k] = {}
  182. }
  183. key_count := 0
  184. for _ in m {
  185. key_count += 1
  186. }
  187. testing.expectf(t, key_count == unique_keys, "Expected key_count to equal %v, got %v", unique_keys, key_count)
  188. testing.expectf(t, len(m) == unique_keys, "Expected len(map) to equal %v, got %v", unique_keys, len(m))
  189. // Reset randomizer and verify
  190. r = rand.create(t.seed + seed_incr)
  191. num_fails := 0
  192. for _ in 0..<entries {
  193. k := rand.int63(&r)
  194. cond := k in m
  195. if !cond {
  196. num_fails += 1
  197. if num_fails > 5 {
  198. log.info("... and more")
  199. break
  200. }
  201. testing.expectf(t, false, "Unexpected value. Expected m[%v] to exist", k)
  202. }
  203. }
  204. seed_incr += 1
  205. }
  206. }
  207. @test
  208. set_delete_random_key_value :: proc(t: ^testing.T) {
  209. seed_incr := u64(0)
  210. for entries in ENTRY_COUNTS {
  211. log.infof("Testing %v entries", entries)
  212. m: map[i64]struct{}
  213. defer delete(m)
  214. unique_keys := 0
  215. r := rand.create(t.seed + seed_incr)
  216. for _ in 0..<entries {
  217. k := rand.int63(&r)
  218. if k not_in m {
  219. unique_keys += 1
  220. }
  221. m[k] = {}
  222. }
  223. key_count := 0
  224. for _ in m {
  225. key_count += 1
  226. }
  227. testing.expectf(t, key_count == unique_keys, "Expected key_count to equal %v, got %v", unique_keys, key_count)
  228. testing.expectf(t, len(m) == unique_keys, "Expected len(map) to equal %v, got %v", unique_keys, len(m))
  229. half_entries := entries / 2
  230. // Reset randomizer and delete half the entries
  231. r = rand.create(t.seed + seed_incr)
  232. for _ in 0..<half_entries {
  233. k := rand.int63(&r)
  234. delete_key(&m, k)
  235. }
  236. // Reset randomizer and verify
  237. r = rand.create(t.seed + seed_incr)
  238. num_fails := 0
  239. for i in 0..<entries {
  240. k := rand.int63(&r)
  241. if i < half_entries {
  242. if k in m {
  243. num_fails += 1
  244. if num_fails > 5 {
  245. log.info("... and more")
  246. break
  247. }
  248. testing.expectf(t, false, "Unexpected key present. Expected m[%v] to have been deleted", k)
  249. }
  250. } else {
  251. if k not_in m {
  252. num_fails += 1
  253. if num_fails > 5 {
  254. log.info("... and more")
  255. break
  256. }
  257. testing.expectf(t, false, "Expected key not present. Expected m[%v] to exist", k)
  258. }
  259. }
  260. }
  261. seed_incr += 1
  262. }
  263. }