Skip to content

Commit

Permalink
PMap property test
Browse files Browse the repository at this point in the history
  • Loading branch information
lpil committed Apr 10, 2023
1 parent c7a77c9 commit 52d992c
Show file tree
Hide file tree
Showing 6 changed files with 115 additions and 2 deletions.
3 changes: 3 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"deno.enable": true
}
10 changes: 10 additions & 0 deletions deno.jsonc
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"tasks": {
"test": "deno test"
},
"test": {
"files": {
"exclude": ["src/", "build/"]
}
}
}
11 changes: 11 additions & 0 deletions deno.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

76 changes: 76 additions & 0 deletions properties/main_test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
import fc from "https://cdn.skypack.dev/fast-check";
import PMap from "../build/dev/javascript/gleam_stdlib/persistent-hash-map.mjs";

const options = Object.freeze({
numRuns: 1000_000,
});

Deno.test("all inserted numbers must exist within", () => {
const property = (numbers: Array<number>) => {
let map = PMap.new();

// Insert all numbers
for (const number of numbers) {
map = map.set(number, 1);
}

// Check that all numbers are in the map
for (const number of numbers) {
if (!map.has(number)) {
console.log(`Number ${number} not found`);
return false;
}
}
};

const arbitrary = fc.array(fc.integer());
fc.assert(fc.property(arbitrary, property), options);
});

Deno.test("all inserted values can be got", () => {
const property = (numbers: Array<[number, number]>) => {
const reference = new Map();
let map = PMap.new();

// Insert all pairs
for (const [k, v] of numbers) {
reference.set(k, v);
map = map.set(k, v);
}

// Check that all keys have the correct value
for (const [k, _] of numbers) {
const expected = reference.get(k);
const found = map.get(k, undefined);
if (found !== expected) {
console.log(`${k} was ${found} not ${expected}`);
return false;
}
}
};

const arbitrary = fc.array(fc.tuple(fc.integer(), fc.integer()));
fc.assert(fc.property(arbitrary, property), options);
});

Deno.test("size", () => {
const property = (numbers: Array<number>) => {
const reference = new Map();
let map = PMap.new();

// Insert all values
for (const k of numbers) {
reference.set(k, 1);
map = map.set(k, 1);
}

// Map size should match reference
if (map.size !== reference.size) {
console.log(`size was ${map.size} not ${reference.size}`);
return false;
}
};

const arbitrary = fc.array(fc.integer());
fc.assert(fc.property(arbitrary, property), options);
});
3 changes: 1 addition & 2 deletions src/persistent-hash-map.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ function hashObject(o) {
try {
const code = o.hashCode(o);
if (typeof code === "number") {
return code
return code;
}
} catch {}
}
Expand Down Expand Up @@ -955,4 +955,3 @@ export default class PMap {
return equal;
}
}

14 changes: 14 additions & 0 deletions test/gleam/map_test.gleam
Original file line number Diff line number Diff line change
Expand Up @@ -361,3 +361,17 @@ pub fn peters_bug_test() {
|> map.get(0)
|> should.equal(Error(Nil))
}

pub fn zero_must_be_contained_test() {
let map =
map.new()
|> map.insert(0, Nil)

map
|> map.get(0)
|> should.equal(Ok(Nil))

map
|> map.has_key(0)
|> should.equal(True)
}

0 comments on commit 52d992c

Please sign in to comment.