67 lines
1.2 KiB
JavaScript
67 lines
1.2 KiB
JavaScript
import assert from "node:assert";
|
|
import { assignFn, makeGeneric, unify, UnifyError } from "../lib/generics/generics.js";
|
|
import { getDefaultTypeParser } from "../lib/parser/type_parser.js";
|
|
import { prettyT } from "../lib/util/pretty.js";
|
|
|
|
const mkType = getDefaultTypeParser();
|
|
|
|
// It would be better to compare the types directly with 'compareTypes', but the assert-module does not allow passing a custom comparison function.
|
|
|
|
assert.equal(
|
|
// actual
|
|
prettyT(
|
|
unify(
|
|
mkType("(a -> Int)"),
|
|
makeGeneric(() => mkType("[Bool] -> Int")),
|
|
)
|
|
),
|
|
// expected
|
|
"([Bool] -> Int)",
|
|
);
|
|
|
|
assert.equal(
|
|
// actual
|
|
prettyT(
|
|
unify(
|
|
mkType("(a -> a) -> b"),
|
|
mkType("(Bool -> Bool) -> a"),
|
|
)
|
|
),
|
|
// expected
|
|
"((Bool -> Bool) -> a)",
|
|
);
|
|
|
|
assert.equal(
|
|
// actual
|
|
prettyT(
|
|
assignFn(
|
|
mkType("(a -> b) -> [a] -> [b]"),
|
|
mkType("a -> a")
|
|
)
|
|
),
|
|
// expected
|
|
"([a] -> [a])",
|
|
);
|
|
|
|
assert.equal(
|
|
// actual
|
|
prettyT(
|
|
assignFn(
|
|
mkType("(a -> Int) -> [a] -> a"),
|
|
mkType("a -> a")
|
|
)
|
|
),
|
|
// expected
|
|
"([Int] -> Int)",
|
|
);
|
|
|
|
assert.throws(
|
|
() => {
|
|
unify(
|
|
mkType("Int"),
|
|
mkType("Bool")
|
|
)
|
|
},
|
|
// expected error
|
|
UnifyError,
|
|
);
|