rea/tests/boundary/process/sourceMapUncHosts.test.ts

93 lines
2.8 KiB
TypeScript

import { expect } from "vitest";
import { processTest } from "../../support/process/processFixture.js";
const cases = [
{
name: "soft hyphen U+00AD",
source: "\\\\\u00ad\\share\\source.ts",
expected: { kind: "unresolved" },
},
{
name: "zero width non joiner U+200C",
source: "\\\\\u200c\\share\\source.ts",
expected: { kind: "unresolved" },
},
{
name: "ASCII delimiter",
source: "\\\\bad#host\\share\\source.ts",
expected: { kind: "unresolved" },
},
{
name: "empty host",
source: "\\\\\\share\\source.ts",
expected: { kind: "unresolved" },
},
{
name: "normal host",
source: "\\\\server\\share\\source.ts",
expected: { kind: "suffix", path: "server/share/source.ts" },
},
{
name: "valid IDNA host",
source: "\\\\bücher.example\\share\\source.ts",
expected: { kind: "suffix", path: "bücher.example/share/source.ts" },
},
{
name: "nonempty normalized host",
source: "\\\\\u00adserver\\share\\source.ts",
expected: { kind: "suffix", path: "server/share/source.ts" },
},
{
name: "localhost host",
source: "\\\\localhost\\share\\source.ts",
expected: { kind: "suffix", path: "share/source.ts" },
},
{
name: "drive letter",
source: "C:\\src\\source.ts",
expected: { kind: "suffix", path: "C:/src/source.ts" },
},
{
name: "soft hyphen source root",
source: "source.ts",
root: "\\\\\u00ad\\share",
expected: { kind: "unresolved" },
},
{
name: "zero width non joiner source root",
source: "source.ts",
root: "\\\\\u200c\\share",
expected: { kind: "unresolved" },
},
] as const;
processTest.for(cases)(
"resolves $name in an owned subprocess without a native abort",
async (scenario, { processes }) => {
const sourceRoot = "root" in scenario ? scenario.root : null;
// Import the built production helper in a child. A native assertion must
// become a failed signal assertion here, never terminate the Vitest worker.
const result = await processes.run(
process.execPath,
[
"--input-type=module",
"--eval",
`import { resolveJavaScriptSourceMapReference } from "./dist/domain/javascript/javascriptSourceMapPaths.js";
const [source, root] = JSON.parse(process.argv[1]);
console.log(JSON.stringify(resolveJavaScriptSourceMapReference(source, root, "maps/main.js.map")));`,
JSON.stringify([scenario.source, sourceRoot]),
],
{ timeoutMs: 10_000 },
);
expect(result.signal, result.stderr).toBeNull();
expect(result.exitCode, result.stderr).toBe(0);
expect(JSON.parse(result.stdout)).toMatchObject({
source_name: scenario.source,
source_root: sourceRoot,
map_path: "maps/main.js.map",
resolution: scenario.expected,
});
},
);