From 3c8042fb33d2f622dc5b3e47a1ad2bb4f71c79cc Mon Sep 17 00:00:00 2001 From: montjeffrey Date: Thu, 8 Oct 2026 15:46:49 +0000 Subject: [PATCH] test(carriers): pin scanner edge cases and share one registry run --- .../scripts/validate-carrier-closure.test.js | 63 +++++++++++++------ 1 file changed, 45 insertions(+), 18 deletions(-) diff --git a/tests/scripts/validate-carrier-closure.test.js b/tests/scripts/validate-carrier-closure.test.js index 2aa0b22c5..61dfd07f4 100644 --- a/tests/scripts/validate-carrier-closure.test.js +++ b/tests/scripts/validate-carrier-closure.test.js @@ -13,6 +13,17 @@ function validator() { return require(SCRIPT_PATH); } +let realRun = null; +function realRegistryRun() { + if (!realRun) { + const result = childProcess.spawnSync(process.execPath, [SCRIPT_PATH, '--json'], { + cwd: REPO_ROOT, encoding: 'utf8', timeout: 120_000, + }); + realRun = { status: result.status, stderr: result.stderr, receipt: JSON.parse(result.stdout) }; + } + return realRun; +} + function plantSkillScript(root, source) { write(root, 'skills/ecc-guide/scripts/tool.js', source); } @@ -21,17 +32,6 @@ function specifiersOf(failures) { return failures.map(failure => failure.specifier); } -test('the real registry closes: every planned script resolves inside its carrier', () => { - const result = validator().validate(); - assert.equal(result.status, 'success'); - assert.deepEqual(result.failures, []); - assert.equal(result.layouts.length, 5); - assert.deepEqual(result.profiles, ['lean@1', 'full@1']); - assert.ok(result.scriptCount > 0, 'expected planned JavaScript files to inspect'); - assert.ok(result.resolvedCount > 0, 'expected at least one resolved relative specifier'); - assert.ok(result.plannedFileCount > result.scriptCount); -}); - test('a planted require that leaves the carrier tree fails with its specifier', () => withFixture(root => { const escape = '../../../../../scripts/lib/context-profile-support'; plantSkillScript(root, `'use strict';\n\nconst support = require('${escape}');\n\nmodule.exports = { support };\n`); @@ -69,20 +69,47 @@ test('a require shape quoted inside a string literal is not a dependency', () => })); test('--json emits a machine-readable receipt and exits zero on a clean registry', () => { - const result = childProcess.spawnSync(process.execPath, [SCRIPT_PATH, '--json'], { - cwd: REPO_ROOT, encoding: 'utf8', timeout: 120_000, - }); - assert.equal(result.status, 0, result.stderr); - const receipt = JSON.parse(result.stdout); - assert.equal(receipt.status, 'success'); + const { status, stderr, receipt } = realRegistryRun(); + assert.equal(status, 0, stderr); assert.equal(receipt.schemaVersion, 'ecc.carrier-closure.v1'); assert.equal(receipt.projectionCount, receipt.layouts.length * receipt.profiles.length); - assert.deepEqual(receipt.failures, []); assert.ok(Array.isArray(receipt.warnings)); assert.ok(Number.isInteger(receipt.scriptCount)); assert.equal(receipt.loadSmoke, 'deferred'); }); +test('the real registry closes: every planned script resolves inside its carrier', () => { + const { receipt } = realRegistryRun(); + assert.equal(receipt.status, 'success'); + assert.deepEqual(receipt.failures, []); + assert.equal(receipt.layouts.length, 5); + assert.deepEqual(receipt.profiles, ['lean@1', 'full@1']); + assert.ok(receipt.scriptCount > 0, 'expected planned JavaScript files to inspect'); + assert.ok(receipt.resolvedCount > 0, 'expected at least one resolved relative specifier'); + assert.ok(receipt.plannedFileCount > receipt.scriptCount); +}); + +const SCANNER_CASES = [ + ['division before a require', "const r = a / b; require('./after-division');", ['./after-division']], + ['regex holding a quote', "const re = /it's/; require('./after-regex');", ['./after-regex']], + ['regex holding a slash in a class', "const re = /[/]/g; require('./after-class');", ['./after-class']], + ['regex after return', "function f() { return /x/.test(y); } require('./after-return');", ['./after-return']], + ['division after a closing paren', "const v = (a) / 2 / 3; require('./after-paren');", ['./after-paren']], + ['object braces inside an interpolation', "const s = `a ${ {k: 1}.k } b`; require('./after-template');", ['./after-template']], + ['require text inside a template', "const s = `require('./fake')`;", []], + ['require inside an interpolation', "const s = `${require('./in-interpolation')}`;", ['./in-interpolation']], + ['block comment', "/* require('./commented') */ require('./real');", ['./real']], + ['multi-line import', "import {\n a,\n b\n} from\n './multi';", ['./multi']], + ['re-export', 'export * from "./reexport.js";', ['./reexport.js']], + ['path.join from __dirname', "require(path.join(__dirname, '..', 'lib', 'x.js'));", ['./../lib/x.js']], +]; + +for (const [label, source, expected] of SCANNER_CASES) { + test(`scanner: ${label}`, () => { + assert.deepEqual(validator().extractReferences(source).specifiers.sort(), [...expected].sort()); + }); +} + test('unknown flags are rejected', () => { const result = childProcess.spawnSync(process.execPath, [SCRIPT_PATH, '--write'], { cwd: REPO_ROOT, encoding: 'utf8', timeout: 120_000,