123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312 |
- package test_internal_map
- import "core:log"
- import "base:intrinsics"
- import "core:math/rand"
- import "core:testing"
- ENTRY_COUNTS := []int{11, 101, 1_001, 10_001, 100_001, 1_000_001}
- @test
- map_insert_random_key_value :: proc(t: ^testing.T) {
- seed_incr := u64(0)
- for entries in ENTRY_COUNTS {
- log.infof("Testing %v entries", entries)
- m: map[i64]i64
- defer delete(m)
- unique_keys := 0
- r := rand.create(t.seed + seed_incr)
- for _ in 0..<entries {
- k := rand.int63(&r)
- v := rand.int63(&r)
- if k not_in m {
- unique_keys += 1
- }
- m[k] = v
- }
- key_count := 0
- for _ in m {
- key_count += 1
- }
- testing.expectf(t, key_count == unique_keys, "Expected key_count to equal %v, got %v", unique_keys, key_count)
- testing.expectf(t, len(m) == unique_keys, "Expected len(map) to equal %v, got %v", unique_keys, len(m))
- // Reset randomizer and verify
- r = rand.create(t.seed + seed_incr)
- num_fails := 0
- for _ in 0..<entries {
- k := rand.int63(&r)
- v := rand.int63(&r)
- cond := m[k] == v
- if !cond {
- num_fails += 1
- if num_fails > 5 {
- log.info("... and more")
- break
- }
- testing.expectf(t, false, "Unexpected value. Expected m[%v] = %v, got %v", k, v, m[k])
- }
- }
- seed_incr += 1
- }
- }
- @test
- map_update_random_key_value :: proc(t: ^testing.T) {
- seed_incr := u64(0)
- for entries in ENTRY_COUNTS {
- log.infof("Testing %v entries", entries)
- m: map[i64]i64
- defer delete(m)
- unique_keys := 0
- r := rand.create(t.seed + seed_incr)
- for _ in 0..<entries {
- k := rand.int63(&r)
- v := rand.int63(&r)
- if k not_in m {
- unique_keys += 1
- }
- m[k] = v
- }
- key_count := 0
- for _ in m {
- key_count += 1
- }
- testing.expectf(t, key_count == unique_keys, "Expected key_count to equal %v, got %v", unique_keys, key_count)
- testing.expectf(t, len(m) == unique_keys, "Expected len(map) to equal %v, got %v", unique_keys, len(m))
- half_entries := entries / 2
- // Reset randomizer and update half the entries
- r = rand.create(t.seed + seed_incr)
- for _ in 0..<half_entries {
- k := rand.int63(&r)
- v := rand.int63(&r)
- m[k] = v + 42
- }
- // Reset randomizer and verify
- r = rand.create(t.seed + seed_incr)
- num_fails := 0
- for i in 0..<entries {
- k := rand.int63(&r)
- v := rand.int63(&r)
- diff := i64(42) if i < half_entries else i64(0)
- cond := m[k] == (v + diff)
- if !cond {
- num_fails += 1
- if num_fails > 5 {
- log.info("... and more")
- break
- }
- testing.expectf(t, false, "Unexpected value. Expected m[%v] = %v, got %v", k, v, m[k])
- }
- }
- seed_incr += 1
- }
- }
- @test
- map_delete_random_key_value :: proc(t: ^testing.T) {
- seed_incr := u64(0)
- for entries in ENTRY_COUNTS {
- log.infof("Testing %v entries", entries)
- m: map[i64]i64
- defer delete(m)
- unique_keys := 0
- r := rand.create(t.seed + seed_incr)
- for _ in 0..<entries {
- k := rand.int63(&r)
- v := rand.int63(&r)
- if k not_in m {
- unique_keys += 1
- }
- m[k] = v
- }
- key_count := 0
- for _ in m {
- key_count += 1
- }
- testing.expectf(t, key_count == unique_keys, "Expected key_count to equal %v, got %v", unique_keys, key_count)
- testing.expectf(t, len(m) == unique_keys, "Expected len(map) to equal %v, got %v", unique_keys, len(m))
- half_entries := entries / 2
- // Reset randomizer and delete half the entries
- r = rand.create(t.seed + seed_incr)
- for _ in 0..<half_entries {
- k := rand.int63(&r)
- _ = rand.int63(&r)
- delete_key(&m, k)
- }
- // Reset randomizer and verify
- r = rand.create(t.seed + seed_incr)
- num_fails := 0
- for i in 0..<entries {
- k := rand.int63(&r)
- v := rand.int63(&r)
- if i < half_entries {
- if k in m {
- num_fails += 1
- if num_fails > 5 {
- log.info("... and more")
- break
- }
- testing.expectf(t, false, "Unexpected key present. Expected m[%v] to have been deleted, got %v", k, m[k])
- }
- } else {
- if k not_in m {
- num_fails += 1
- if num_fails > 5 {
- log.info("... and more")
- break
- }
- testing.expectf(t, false, "Expected key not present. Expected m[%v] = %v", k, v)
- } else if m[k] != v {
- num_fails += 1
- if num_fails > 5 {
- log.info("... and more")
- break
- }
- testing.expectf(t, false, "Unexpected value. Expected m[%v] = %v, got %v", k, v, m[k])
- }
- }
- }
- seed_incr += 1
- }
- }
- @test
- set_insert_random_key_value :: proc(t: ^testing.T) {
- seed_incr := u64(0)
- for entries in ENTRY_COUNTS {
- log.infof("Testing %v entries", entries)
- m: map[i64]struct{}
- defer delete(m)
- unique_keys := 0
- r := rand.create(t.seed + seed_incr)
- for _ in 0..<entries {
- k := rand.int63(&r)
- if k not_in m {
- unique_keys += 1
- }
- m[k] = {}
- }
- key_count := 0
- for _ in m {
- key_count += 1
- }
- testing.expectf(t, key_count == unique_keys, "Expected key_count to equal %v, got %v", unique_keys, key_count)
- testing.expectf(t, len(m) == unique_keys, "Expected len(map) to equal %v, got %v", unique_keys, len(m))
- // Reset randomizer and verify
- r = rand.create(t.seed + seed_incr)
- num_fails := 0
- for _ in 0..<entries {
- k := rand.int63(&r)
- cond := k in m
- if !cond {
- num_fails += 1
- if num_fails > 5 {
- log.info("... and more")
- break
- }
- testing.expectf(t, false, "Unexpected value. Expected m[%v] to exist", k)
- }
- }
- seed_incr += 1
- }
- }
- @test
- set_delete_random_key_value :: proc(t: ^testing.T) {
- seed_incr := u64(0)
- for entries in ENTRY_COUNTS {
- log.infof("Testing %v entries", entries)
- m: map[i64]struct{}
- defer delete(m)
- unique_keys := 0
- r := rand.create(t.seed + seed_incr)
- for _ in 0..<entries {
- k := rand.int63(&r)
- if k not_in m {
- unique_keys += 1
- }
- m[k] = {}
- }
- key_count := 0
- for _ in m {
- key_count += 1
- }
- testing.expectf(t, key_count == unique_keys, "Expected key_count to equal %v, got %v", unique_keys, key_count)
- testing.expectf(t, len(m) == unique_keys, "Expected len(map) to equal %v, got %v", unique_keys, len(m))
- half_entries := entries / 2
- // Reset randomizer and delete half the entries
- r = rand.create(t.seed + seed_incr)
- for _ in 0..<half_entries {
- k := rand.int63(&r)
- delete_key(&m, k)
- }
- // Reset randomizer and verify
- r = rand.create(t.seed + seed_incr)
- num_fails := 0
- for i in 0..<entries {
- k := rand.int63(&r)
- if i < half_entries {
- if k in m {
- num_fails += 1
- if num_fails > 5 {
- log.info("... and more")
- break
- }
- testing.expectf(t, false, "Unexpected key present. Expected m[%v] to have been deleted", k)
- }
- } else {
- if k not_in m {
- num_fails += 1
- if num_fails > 5 {
- log.info("... and more")
- break
- }
- testing.expectf(t, false, "Expected key not present. Expected m[%v] to exist", k)
- }
- }
- }
- seed_incr += 1
- }
- }
|