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