Skip to content

Commit 52d992c

Browse files
committed
PMap property test
1 parent c7a77c9 commit 52d992c

File tree

6 files changed

+115
-2
lines changed

6 files changed

+115
-2
lines changed

.vscode/settings.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"deno.enable": true
3+
}

deno.jsonc

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"tasks": {
3+
"test": "deno test"
4+
},
5+
"test": {
6+
"files": {
7+
"exclude": ["src/", "build/"]
8+
}
9+
}
10+
}

deno.lock

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

properties/main_test.ts

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import fc from "https://cdn.skypack.dev/fast-check";
2+
import PMap from "../build/dev/javascript/gleam_stdlib/persistent-hash-map.mjs";
3+
4+
const options = Object.freeze({
5+
numRuns: 1000_000,
6+
});
7+
8+
Deno.test("all inserted numbers must exist within", () => {
9+
const property = (numbers: Array<number>) => {
10+
let map = PMap.new();
11+
12+
// Insert all numbers
13+
for (const number of numbers) {
14+
map = map.set(number, 1);
15+
}
16+
17+
// Check that all numbers are in the map
18+
for (const number of numbers) {
19+
if (!map.has(number)) {
20+
console.log(`Number ${number} not found`);
21+
return false;
22+
}
23+
}
24+
};
25+
26+
const arbitrary = fc.array(fc.integer());
27+
fc.assert(fc.property(arbitrary, property), options);
28+
});
29+
30+
Deno.test("all inserted values can be got", () => {
31+
const property = (numbers: Array<[number, number]>) => {
32+
const reference = new Map();
33+
let map = PMap.new();
34+
35+
// Insert all pairs
36+
for (const [k, v] of numbers) {
37+
reference.set(k, v);
38+
map = map.set(k, v);
39+
}
40+
41+
// Check that all keys have the correct value
42+
for (const [k, _] of numbers) {
43+
const expected = reference.get(k);
44+
const found = map.get(k, undefined);
45+
if (found !== expected) {
46+
console.log(`${k} was ${found} not ${expected}`);
47+
return false;
48+
}
49+
}
50+
};
51+
52+
const arbitrary = fc.array(fc.tuple(fc.integer(), fc.integer()));
53+
fc.assert(fc.property(arbitrary, property), options);
54+
});
55+
56+
Deno.test("size", () => {
57+
const property = (numbers: Array<number>) => {
58+
const reference = new Map();
59+
let map = PMap.new();
60+
61+
// Insert all values
62+
for (const k of numbers) {
63+
reference.set(k, 1);
64+
map = map.set(k, 1);
65+
}
66+
67+
// Map size should match reference
68+
if (map.size !== reference.size) {
69+
console.log(`size was ${map.size} not ${reference.size}`);
70+
return false;
71+
}
72+
};
73+
74+
const arbitrary = fc.array(fc.integer());
75+
fc.assert(fc.property(arbitrary, property), options);
76+
});

src/persistent-hash-map.mjs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ function hashObject(o) {
7777
try {
7878
const code = o.hashCode(o);
7979
if (typeof code === "number") {
80-
return code
80+
return code;
8181
}
8282
} catch {}
8383
}
@@ -955,4 +955,3 @@ export default class PMap {
955955
return equal;
956956
}
957957
}
958-

test/gleam/map_test.gleam

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,3 +361,17 @@ pub fn peters_bug_test() {
361361
|> map.get(0)
362362
|> should.equal(Error(Nil))
363363
}
364+
365+
pub fn zero_must_be_contained_test() {
366+
let map =
367+
map.new()
368+
|> map.insert(0, Nil)
369+
370+
map
371+
|> map.get(0)
372+
|> should.equal(Ok(Nil))
373+
374+
map
375+
|> map.has_key(0)
376+
|> should.equal(True)
377+
}

0 commit comments

Comments
 (0)