aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorJeroen van Rijn <Kelimion@users.noreply.github.com>2022-11-12 17:25:42 +0100
committerJeroen van Rijn <Kelimion@users.noreply.github.com>2022-11-12 17:25:42 +0100
commit9c1b464c945b607a104f5e01ae734373f9300316 (patch)
tree3b649ef63d973deb1265bc0c859dcb92310f8513 /tests
parent04a1e7d638ec20d52fab954fa432bd76d2eeb395 (diff)
Add tests for new map implementation.
Diffstat (limited to 'tests')
-rw-r--r--tests/internal/test_map.odin122
1 files changed, 122 insertions, 0 deletions
diff --git a/tests/internal/test_map.odin b/tests/internal/test_map.odin
new file mode 100644
index 000000000..c318b6bdc
--- /dev/null
+++ b/tests/internal/test_map.odin
@@ -0,0 +1,122 @@
+package test_internal_map
+
+import "core:fmt"
+import "core:intrinsics"
+import "core:math/rand"
+import "core:mem"
+import "core:os"
+import "core:testing"
+
+seed: u64
+
+ENTRY_COUNTS := []int{11, 101} // , 1_001, 10_001, 100_001, 1_000_001}
+
+@test
+map_insert_random_key_value :: proc(t: ^testing.T) {
+ for entries in ENTRY_COUNTS {
+ fmt.printf("[map_insert_random_key_value] Testing %v entries.\n", entries)
+ m: map[i64]i64
+
+ unique_keys := 0
+ r := rand.create(seed)
+ 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)))
+
+ // Reset randomizer and verify
+ r = rand.create(seed)
+
+ 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 {
+ fmt.println("... and more")
+ break
+ }
+ expect(t, false, fmt.tprintf("Unexpected value. Expected m[%v] = %v, got %v", k, v, m[k]))
+ }
+ }
+ clear(&m)
+ delete(m)
+ }
+}
+
+// -------- -------- -------- -------- -------- -------- -------- -------- -------- --------
+
+main :: proc() {
+ t := testing.T{}
+
+ // Allow tests to be repeatable
+ SEED :: #config(SEED, -1)
+ when SEED > 0 {
+ seed = u64(SEED)
+ } else {
+ seed = u64(intrinsics.read_cycle_counter())
+ }
+ fmt.println("Initialized seed to", seed)
+
+ mem_track_test(&t, map_insert_random_key_value)
+
+ fmt.printf("%v/%v tests successful.\n", TEST_count - TEST_fail, TEST_count)
+ if TEST_fail > 0 {
+ os.exit(1)
+ }
+}
+
+mem_track_test :: proc(t: ^testing.T, test: proc(t: ^testing.T)) {
+ track: mem.Tracking_Allocator
+ mem.tracking_allocator_init(&track, context.allocator)
+ context.allocator = mem.tracking_allocator(&track)
+
+ test(t)
+
+ expect(t, len(track.allocation_map) == 0, "Expected no leaks.")
+ expect(t, len(track.bad_free_array) == 0, "Expected no leaks.")
+
+ for _, leak in track.allocation_map {
+ fmt.printf("%v leaked %v bytes\n", leak.location, leak.size)
+ }
+ for bad_free in track.bad_free_array {
+ fmt.printf("%v allocation %p was freed badly\n", bad_free.location, bad_free.memory)
+ }
+}
+
+TEST_count := 0
+TEST_fail := 0
+
+when ODIN_TEST {
+ expect :: testing.expect
+ log :: testing.log
+} else {
+ expect :: proc(t: ^testing.T, condition: bool, message: string, loc := #caller_location) {
+ TEST_count += 1
+ if !condition {
+ TEST_fail += 1
+ fmt.printf("[%v] %v\n", loc, message)
+ return
+ }
+ }
+ log :: proc(t: ^testing.T, v: any, loc := #caller_location) {
+ fmt.printf("[%v] ", loc)
+ fmt.printf("log: %v\n", v)
+ }
+} \ No newline at end of file