testWatchResultsCachedByHash

tcmts.cli.test.e2e.watch.testWatchResultsCachedByHash · #ujymle4u · term

Watch results are cached by hash; --fresh re-runs; a changed dependency re-evaluates. One whose code reaches outside (randomness, the clock) isn't cached: it's evaluated every time.

import { setUp } from "#codebase/tcmts/cli/test/e2e/watch";
import assert from "node:assert/strict";

export const testWatchResultsCachedByHash = () => {
  const { tcm, scratch } = setUp();
  scratch(
    "scratch.ts",
    `export const double = (x: number) => x * 2;\n\ndouble(21);\nMath.random();\n`,
  );
  const first = tcm("check");
  assert.match(first, /double\(21\)\n\s+⧩ 42/);
  const random = /Math\.random\(\)\n\s+⧩ (\S+)/.exec(first)![1];

  const again = tcm("check");
  assert.match(again, /double\(21\)  \(cached\)\n\s+⧩ 42/);
  assert.notEqual(
    /Math\.random\(\)\n\s+⧩ (\S+)/.exec(again)?.[1],
    random,
    "evaluated again: its value isn't its hash's",
  );

  assert.match(tcm("check", "--fresh"), /double\(21\)\n\s+⧩ 42/, "--fresh evaluates again");

  // the watch's hash covers what it calls: change double and it's evaluated again
  scratch("scratch.ts", `export const double = (x: number) => x * 3;\n\ndouble(21);\n`);
  assert.match(tcm("check"), /double\(21\)\n\s+⧩ 63/);
}

uses