testOwnEffects
tcmts.core.effects.testOwnEffects · #updiy6mq · term
import { ownEffects } from "#codebase/tcmts/core/effects";
import assert from "node:assert/strict";
export const testOwnEffects = () => {
const G = (n: string) => ["G", n];
const prop = (e: unknown, n: string) => [
"PropertyAccessExpression",
["expression", e],
["name", ["N", n]],
];
const call = (e: unknown, ...args: unknown[]) => [
"CallExpression",
["expression", e],
["arguments", ["[", ...args]],
];
const neu = (e: unknown, ...args: unknown[]) => [
"NewExpression",
["expression", e],
["arguments", ["[", ...args]],
];
assert.deepEqual(
ownEffects(call(prop(G("Math"), "floor"), ["Num", "1"])),
[],
"Math.floor is the same every time",
);
assert.deepEqual(ownEffects(call(prop(G("Math"), "random"))), ["random"]);
assert.deepEqual(ownEffects(call(prop(G("Date"), "now"))), ["clock"]);
assert.deepEqual(ownEffects(neu(G("Date"))), ["clock"]);
assert.deepEqual(
ownEffects(neu(G("Date"), ["Num", "0"])),
[],
"a given date is the same every time",
);
assert.deepEqual(ownEffects(call(G("fetch"), ["Str", "https://example.com"])), ["network"]);
assert.deepEqual(ownEffects(prop(prop(G("process"), "env"), "HOME")), ["environment"]);
assert.deepEqual(ownEffects(call(prop(G("console"), "log"), ["Str", "hi"])), ["output"]);
assert.deepEqual(ownEffects(call(prop(G("process"), "exit"), ["Num", "1"])), []);
assert.deepEqual(
ownEffects(call(prop(prop(G("process"), "stdout"), "write"), ["Str", "hi"])),
["output"],
"writing out, which a kept value wouldn't",
);
assert.deepEqual(ownEffects(call(["Ext", "node:fs", "", "readFileSync"], ["Str", "x"])), [
"files",
]);
assert.deepEqual(
ownEffects(call(["Ext", "node:crypto", "", "createHash"], ["Str", "sha256"])),
[],
"hashing is the same every time",
);
assert.deepEqual(ownEffects(call(prop(["Ext", "node:crypto", "", "default"], "randomUUID"))), [
"random",
]);
assert.deepEqual(ownEffects(call(["Ext", "node:crypto", "", "randomBytes"], ["Num", "8"])), [
"random",
]);
assert.deepEqual(ownEffects(["Block", call(G("fetch")), call(prop(G("Date"), "now"))]), [
"clock",
"network",
]);
// stored IR, as a string
assert.deepEqual(ownEffects(JSON.stringify(call(prop(G("Math"), "random")))), ["random"]);
// types are erased: `(p: typeof process, s: Stats) => …` with `Stats` from node:fs, `x as Date`, `implements`
const param = (type: unknown) => ["Parameter", ["name", ["L", "0"]], ["type", type]];
assert.deepEqual(ownEffects(param(["TypeQuery", ["exprName", G("process")]])), []);
assert.deepEqual(
ownEffects(param(["TypeReference", ["typeName", ["Ext", "node:fs", "", "Stats"]]])),
[],
);
assert.deepEqual(
ownEffects([
"AsExpression",
["expression", ["L", "0"]],
["type", ["TypeReference", ["typeName", G("Date")]]],
]),
[],
);
assert.deepEqual(
ownEffects([
"HeritageClause",
"implements",
["types", ["[", ["ExpressionWithTypeArguments", ["expression", G("window")]]]],
]),
[],
);
assert.deepEqual(ownEffects(call(G("f"), ["TypeOfExpression", ["expression", G("window")]])), [
"environment",
]);
}
uses