diff options
author | Julian Schurhammer <julian.schurhammer@gmail.com> | 2022-08-13 23:09:32 +1200 |
---|---|---|
committer | Louis Pilfold <louis@lpil.uk> | 2023-03-13 10:48:28 +0000 |
commit | 507b28c8557af2f74d6504cd75eb687b1fc96a05 (patch) | |
tree | 2921364f3405b82b62ffe3600c084bcb577d7432 /test | |
parent | c97949eace0bd934a0adbc1cf0b6a8ad98efd4ad (diff) | |
download | gleam_stdlib-507b28c8557af2f74d6504cd75eb687b1fc96a05.tar.gz gleam_stdlib-507b28c8557af2f74d6504cd75eb687b1fc96a05.zip |
js maps: add more tests and fix stuff
Diffstat (limited to 'test')
-rw-r--r-- | test/gleam/map_test.gleam | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/test/gleam/map_test.gleam b/test/gleam/map_test.gleam index 34f3ee6..cd669f9 100644 --- a/test/gleam/map_test.gleam +++ b/test/gleam/map_test.gleam @@ -204,3 +204,83 @@ pub fn fold_test() { |> map.fold(0, add) |> should.equal(0) } + +fn range(start, end, a) { + case end - start { + n if n < 1 -> a + _ -> range(start, end - 1, [end - 1, ..a]) + } +} + +fn list_to_map(list) { + list + |> list.map(fn(n) { #(n, n) }) + |> map.from_list +} + +fn grow_and_shrink_map(initial_size, final_size) { + range(0, initial_size, []) + |> list_to_map + |> list.fold( + range(final_size, initial_size, []), + _, + fn(map, item) { map.delete(map, item) }, + ) +} + +// maps should be equal even if the insert/removal order was different +pub fn insert_order_equality_test() { + grow_and_shrink_map(8, 2) + |> should.equal(grow_and_shrink_map(4, 2)) + grow_and_shrink_map(17, 10) + |> should.equal(grow_and_shrink_map(12, 10)) + grow_and_shrink_map(2000, 1000) + |> should.equal(grow_and_shrink_map(1000, 1000)) +} + +// ensure operations on a map don't mutate it +pub fn persistence_test() { + let a = list_to_map([0]) + map.insert(a, 0, 5) + map.insert(a, 1, 6) + map.delete(a, 0) + map.get(a, 0) + |> should.equal(Ok(0)) +} + +// using maps as keys should work (tests hash function) +pub fn map_as_key_test() { + let l = range(0, 1000, []) + let a = list_to_map(l) + let a2 = list_to_map(list.reverse(l)) + let a3 = grow_and_shrink_map(2000, 1000) + let b = grow_and_shrink_map(60, 50) + let c = grow_and_shrink_map(50, 20) + let d = grow_and_shrink_map(2, 2) + + let map1 = + map.new() + |> map.insert(a, "a") + |> map.insert(b, "b") + |> map.insert(c, "c") + |> map.insert(d, "d") + + map.get(map1, a) + |> should.equal(Ok("a")) + map.get(map1, a2) + |> should.equal(Ok("a")) + map.get(map1, a3) + |> should.equal(Ok("a")) + map.get(map1, b) + |> should.equal(Ok("b")) + map.get(map1, c) + |> should.equal(Ok("c")) + map.get(map1, d) + |> should.equal(Ok("d")) + map.insert(map1, a2, "a2") + |> map.get(a) + |> should.equal(Ok("a2")) + map.insert(map1, a3, "a3") + |> map.get(a) + |> should.equal(Ok("a3")) +} |