Skip to content

Commit 1cd74c6

Browse files
committed
Baseline reuse program structure tests for easy update when making changes to module resolution
1 parent 9931a1e commit 1cd74c6

28 files changed

+2679
-355
lines changed

src/testRunner/unittests/helpers.ts

Lines changed: 2 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ export interface ProgramWithSourceTexts extends ts.Program {
2525

2626
export interface TestCompilerHost extends ts.CompilerHost {
2727
getTrace(): string[];
28+
clearTrace(): void;
2829
}
2930

3031
export class SourceText implements ts.IScriptSnapshot {
@@ -124,6 +125,7 @@ export function createTestCompilerHost(texts: readonly NamedSourceText[], target
124125
const result: TestCompilerHost = {
125126
trace: s => trace.push(s),
126127
getTrace: () => trace,
128+
clearTrace: () => trace.length = 0,
127129
getSourceFile: fileName => files.get(fileName),
128130
getDefaultLibFileName: () => "lib.d.ts",
129131
writeFile: ts.notImplemented,
@@ -176,42 +178,6 @@ export function checkResolvedTypeDirective(actual: ts.ResolvedTypeReferenceDirec
176178
return true;
177179
}
178180

179-
function checkCache<T>(caption: string, program: ts.Program, fileName: string, expectedContent: Map<string, T> | undefined, getCache: (f: ts.SourceFile) => ts.ModeAwareCache<T> | undefined, entryChecker: (expected: T, original: T) => boolean): void {
180-
const file = program.getSourceFile(fileName);
181-
assert.isTrue(file !== undefined, `cannot find file ${fileName}`);
182-
const cache = getCache(file!);
183-
if (expectedContent === undefined) {
184-
assert.isTrue(cache === undefined, `expected ${caption} to be undefined`);
185-
}
186-
else {
187-
assert.isTrue(cache !== undefined, `expected ${caption} to be set`);
188-
assert.isTrue(mapEqualToCache(expectedContent, cache!, entryChecker), `contents of ${caption} did not match the expected contents.`);
189-
}
190-
}
191-
192-
/** True if the maps have the same keys and values. */
193-
function mapEqualToCache<T>(left: Map<string, T>, right: ts.ModeAwareCache<T>, valuesAreEqual?: (left: T, right: T) => boolean): boolean {
194-
if (left as any === right) return true; // given the type mismatch (the tests never pass a cache), this'll never be true
195-
if (!left || !right) return false;
196-
const someInLeftHasNoMatch = ts.forEachEntry(left, (leftValue, leftKey) => {
197-
if (!right.has(leftKey, /*mode*/ undefined)) return true;
198-
const rightValue = right.get(leftKey, /*mode*/ undefined)!;
199-
return !(valuesAreEqual ? valuesAreEqual(leftValue, rightValue) : leftValue === rightValue);
200-
});
201-
if (someInLeftHasNoMatch) return false;
202-
let someInRightHasNoMatch = false;
203-
right.forEach((_, rightKey) => someInRightHasNoMatch = someInRightHasNoMatch || !left.has(rightKey));
204-
return !someInRightHasNoMatch;
205-
}
206-
207-
export function checkResolvedModulesCache(program: ts.Program, fileName: string, expectedContent: Map<string, ts.ResolvedModule | undefined> | undefined): void {
208-
checkCache("resolved modules", program, fileName, expectedContent, f => f.resolvedModules, checkResolvedModule);
209-
}
210-
211-
export function checkResolvedTypeDirectivesCache(program: ts.Program, fileName: string, expectedContent: Map<string, ts.ResolvedTypeReferenceDirective> | undefined): void {
212-
checkCache("resolved type directives", program, fileName, expectedContent, f => f.resolvedTypeReferenceDirectiveNames, checkResolvedTypeDirective);
213-
}
214-
215181
export function createResolvedModule(resolvedFileName: string, isExternalLibraryImport = false): ts.ResolvedModuleFull {
216182
return { resolvedFileName, extension: ts.extensionFromPath(resolvedFileName), isExternalLibraryImport };
217183
}

src/testRunner/unittests/reuseProgramStructure.ts

Lines changed: 150 additions & 319 deletions
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
Program Reused:: Not
2+
File: /a/b/app.ts
3+
4+
import * as fs from 'fs'
5+
6+
resolvedModules:
7+
fs: undefined
8+
resolvedTypeReferenceDirectiveNames: undefined
9+
10+
File: /a/b/node.d.ts
11+
12+
13+
declare module 'fs' {}
14+
resolvedModules: undefined
15+
resolvedTypeReferenceDirectiveNames: undefined
16+
17+
======== Resolving module 'fs' from '/a/b/app.ts'. ========
18+
Module resolution kind is not specified, using 'Classic'.
19+
File '/a/b/fs.ts' does not exist.
20+
File '/a/b/fs.tsx' does not exist.
21+
File '/a/b/fs.d.ts' does not exist.
22+
File '/a/fs.ts' does not exist.
23+
File '/a/fs.tsx' does not exist.
24+
File '/a/fs.d.ts' does not exist.
25+
File '/fs.ts' does not exist.
26+
File '/fs.tsx' does not exist.
27+
File '/fs.d.ts' does not exist.
28+
File '/a/b/node_modules/@types/fs/package.json' does not exist.
29+
File '/a/b/node_modules/@types/fs.d.ts' does not exist.
30+
File '/a/b/node_modules/@types/fs/index.d.ts' does not exist.
31+
File '/a/node_modules/@types/fs/package.json' does not exist.
32+
File '/a/node_modules/@types/fs.d.ts' does not exist.
33+
File '/a/node_modules/@types/fs/index.d.ts' does not exist.
34+
File '/node_modules/@types/fs/package.json' does not exist.
35+
File '/node_modules/@types/fs.d.ts' does not exist.
36+
File '/node_modules/@types/fs/index.d.ts' does not exist.
37+
File '/a/b/fs.js' does not exist.
38+
File '/a/b/fs.jsx' does not exist.
39+
File '/a/fs.js' does not exist.
40+
File '/a/fs.jsx' does not exist.
41+
File '/fs.js' does not exist.
42+
File '/fs.jsx' does not exist.
43+
======== Module name 'fs' was not resolved. ========
44+
45+
MissingPaths:: ["lib.d.ts"]
46+
47+
48+
49+
50+
Program Reused:: Completely
51+
File: /a/b/app.ts
52+
53+
import * as fs from 'fs'
54+
var x = 1;
55+
resolvedModules:
56+
fs: undefined
57+
resolvedTypeReferenceDirectiveNames: undefined
58+
59+
File: /a/b/node.d.ts
60+
61+
62+
declare module 'fs' {}
63+
resolvedModules: undefined
64+
resolvedTypeReferenceDirectiveNames: undefined
65+
66+
Module 'fs' was resolved as ambient module declared in '/a/b/node.d.ts' since this file was not modified.
67+
68+
MissingPaths:: ["lib.d.ts"]
69+
70+
71+
72+
73+
Program Reused:: Completely
74+
File: /a/b/app.ts
75+
76+
import * as fs from 'fs'
77+
var y = 1;
78+
resolvedModules:
79+
fs: undefined
80+
resolvedTypeReferenceDirectiveNames: undefined
81+
82+
File: /a/b/node.d.ts
83+
84+
85+
declare var process: any
86+
resolvedModules: undefined
87+
resolvedTypeReferenceDirectiveNames: undefined
88+
89+
======== Resolving module 'fs' from '/a/b/app.ts'. ========
90+
Module resolution kind is not specified, using 'Classic'.
91+
File '/a/b/fs.ts' does not exist.
92+
File '/a/b/fs.tsx' does not exist.
93+
File '/a/b/fs.d.ts' does not exist.
94+
File '/a/fs.ts' does not exist.
95+
File '/a/fs.tsx' does not exist.
96+
File '/a/fs.d.ts' does not exist.
97+
File '/fs.ts' does not exist.
98+
File '/fs.tsx' does not exist.
99+
File '/fs.d.ts' does not exist.
100+
File '/a/b/node_modules/@types/fs/package.json' does not exist.
101+
File '/a/b/node_modules/@types/fs.d.ts' does not exist.
102+
File '/a/b/node_modules/@types/fs/index.d.ts' does not exist.
103+
File '/a/node_modules/@types/fs/package.json' does not exist.
104+
File '/a/node_modules/@types/fs.d.ts' does not exist.
105+
File '/a/node_modules/@types/fs/index.d.ts' does not exist.
106+
File '/node_modules/@types/fs/package.json' does not exist.
107+
File '/node_modules/@types/fs.d.ts' does not exist.
108+
File '/node_modules/@types/fs/index.d.ts' does not exist.
109+
File '/a/b/fs.js' does not exist.
110+
File '/a/b/fs.jsx' does not exist.
111+
File '/a/fs.js' does not exist.
112+
File '/a/fs.jsx' does not exist.
113+
File '/fs.js' does not exist.
114+
File '/fs.jsx' does not exist.
115+
======== Module name 'fs' was not resolved. ========
116+
117+
MissingPaths:: ["lib.d.ts"]
118+
119+
/a/b/app.ts(2,21): error TS2792: Cannot find module 'fs'. Did you mean to set the 'moduleResolution' option to 'node', or to add aliases to the 'paths' option?
120+
121+

0 commit comments

Comments
 (0)