aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/gleam/map_test.gleam80
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"))
+}