dope2/tests/generics.js

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,
);