diff options
| author | Jeroen van Rijn <Kelimion@users.noreply.github.com> | 2022-11-13 16:24:20 +0100 |
|---|---|---|
| committer | Jeroen van Rijn <Kelimion@users.noreply.github.com> | 2022-11-13 16:24:20 +0100 |
| commit | 16a494347c82ea22686146b5e932d6683d761751 (patch) | |
| tree | 9137a491c91d6cccccc13c8a23de32fafdf1ed8c /tests | |
| parent | ad0f11668b4ddd74f719c0861d2e1e4cd6812ac3 (diff) | |
map: Add tests for update + delete.
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/internal/test_map.odin | 153 |
1 files changed, 148 insertions, 5 deletions
diff --git a/tests/internal/test_map.odin b/tests/internal/test_map.odin index c318b6bdc..597f3ea1c 100644 --- a/tests/internal/test_map.odin +++ b/tests/internal/test_map.odin @@ -9,16 +9,18 @@ import "core:testing" seed: u64 -ENTRY_COUNTS := []int{11, 101} // , 1_001, 10_001, 100_001, 1_000_001} +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 { fmt.printf("[map_insert_random_key_value] Testing %v entries.\n", entries) m: map[i64]i64 + defer delete(m) unique_keys := 0 - r := rand.create(seed) + r := rand.create(seed + seed_incr) for _ in 0..<entries { k := rand.int63(&r) v := rand.int63(&r) @@ -38,7 +40,7 @@ map_insert_random_key_value :: proc(t: ^testing.T) { expect(t, len(m) == unique_keys, fmt.tprintf("Expected len(map) to equal %v, got %v", unique_keys, len(m))) // Reset randomizer and verify - r = rand.create(seed) + r = rand.create(seed + seed_incr) num_fails := 0 for _ in 0..<entries { @@ -55,8 +57,147 @@ map_insert_random_key_value :: proc(t: ^testing.T) { expect(t, false, fmt.tprintf("Unexpected value. Expected m[%v] = %v, got %v", k, v, m[k])) } } - clear(&m) - delete(m) + seed_incr += 1 + } +} + +@test +map_update_random_key_value :: proc(t: ^testing.T) { + seed_incr := u64(0) + for entries in ENTRY_COUNTS { + fmt.printf("[map_update_random_key_value] Testing %v entries.\n", entries) + m: map[i64]i64 + defer delete(m) + + unique_keys := 0 + r := rand.create(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 k in m { + key_count += 1 + } + + expect(t, key_count == unique_keys, fmt.tprintf("Expected key_count to equal %v, got %v", unique_keys, key_count)) + expect(t, len(m) == unique_keys, fmt.tprintf("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(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(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 { + fmt.println("... and more") + break + } + expect(t, false, fmt.tprintf("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 { + fmt.printf("[map_delete_random_key_value] Testing %v entries.\n", entries) + m: map[i64]i64 + defer delete(m) + + unique_keys := 0 + r := rand.create(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 k in m { + key_count += 1 + } + + expect(t, key_count == unique_keys, fmt.tprintf("Expected key_count to equal %v, got %v", unique_keys, key_count)) + expect(t, len(m) == unique_keys, fmt.tprintf("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(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(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 { + fmt.println("... and more") + break + } + expect(t, false, fmt.tprintf("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 { + fmt.println("... and more") + break + } + expect(t, false, fmt.tprintf("Expected key not present. Expected m[%v] = %v", k, v)) + } else if m[k] != v { + num_fails += 1 + if num_fails > 5 { + fmt.println("... and more") + break + } + expect(t, false, fmt.tprintf("Unexpected value. Expected m[%v] = %v, got %v", k, v, m[k])) + } + } + } + seed_incr += 1 } } @@ -75,6 +216,8 @@ main :: proc() { fmt.println("Initialized seed to", seed) mem_track_test(&t, map_insert_random_key_value) + mem_track_test(&t, map_update_random_key_value) + mem_track_test(&t, map_delete_random_key_value) fmt.printf("%v/%v tests successful.\n", TEST_count - TEST_fail, TEST_count) if TEST_fail > 0 { |