| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339 |
- package test_internal
- 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
- rand.reset(t.seed + seed_incr)
- for _ in 0..<entries {
- k := rand.int63()
- v := rand.int63()
- 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
- rand.reset(t.seed + seed_incr)
- num_fails := 0
- for _ in 0..<entries {
- k := rand.int63()
- v := rand.int63()
- 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
- rand.reset(t.seed + seed_incr)
- for _ in 0..<entries {
- k := rand.int63()
- v := rand.int63()
- 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
- rand.reset(t.seed + seed_incr)
- for _ in 0..<half_entries {
- k := rand.int63()
- v := rand.int63()
- m[k] = v + 42
- }
- // Reset randomizer and verify
- rand.reset(t.seed + seed_incr)
- num_fails := 0
- for i in 0..<entries {
- k := rand.int63()
- v := rand.int63()
- 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
- rand.reset(t.seed + seed_incr)
- for _ in 0..<entries {
- k := rand.int63()
- v := rand.int63()
- 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
- rand.reset(t.seed + seed_incr)
- for _ in 0..<half_entries {
- k := rand.int63()
- _ = rand.int63()
- delete_key(&m, k)
- }
- // Reset randomizer and verify
- rand.reset(t.seed + seed_incr)
- num_fails := 0
- for i in 0..<entries {
- k := rand.int63()
- v := rand.int63()
- 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
- rand.reset(t.seed + seed_incr)
- for _ in 0..<entries {
- k := rand.int63()
- 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
- rand.reset(t.seed + seed_incr)
- num_fails := 0
- for _ in 0..<entries {
- k := rand.int63()
- 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
- rand.reset(t.seed + seed_incr)
- for _ in 0..<entries {
- k := rand.int63()
- 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
- rand.reset(t.seed + seed_incr)
- for _ in 0..<half_entries {
- k := rand.int63()
- delete_key(&m, k)
- }
- // Reset randomizer and verify
- rand.reset(t.seed + seed_incr)
- num_fails := 0
- for i in 0..<entries {
- k := rand.int63()
- 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
- }
- }
- @test
- test_union_key_should_not_be_hashing_specifc_variant :: proc(t: ^testing.T) {
- Vec2 :: [2]f32
- BoneId :: distinct int
- VertexId :: distinct int
- Id :: union {
- BoneId,
- VertexId,
- }
- m: map[Id]Vec2
- defer delete(m)
- bone_1: BoneId = 69
- m[bone_1] = {4, 20}
- testing.expect_value(t, bone_1 in m, true)
- testing.expect_value(t, Id(bone_1) in m, true)
- }
|