Skip to content

Commit 9f5090c

Browse files
committed
Test case for microsoft#30891
1 parent f617d16 commit 9f5090c

File tree

8 files changed

+197
-3
lines changed

8 files changed

+197
-3
lines changed

src/testRunner/tsconfig.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@
9292
"unittests/tsbuild/amdModulesWithOut.ts",
9393
"unittests/tsbuild/emptyFiles.ts",
9494
"unittests/tsbuild/graphOrdering.ts",
95+
"unittests/tsbuild/lateBoundSymbol.ts",
9596
"unittests/tsbuild/missingExtendedFile.ts",
9697
"unittests/tsbuild/outFile.ts",
9798
"unittests/tsbuild/referencesWithRootDirInParent.ts",

src/testRunner/unittests/tsbuild/helpers.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -285,8 +285,10 @@ Mismatch Actual(path, actual, expected): ${JSON.stringify(arrayFrom(mapDefinedIt
285285
let newFs: vfs.FileSystem;
286286
let actualReadFileMap: Map<number>;
287287
let host: fakes.SolutionBuilderHost;
288+
let beforeBuildTime: number;
289+
let afterBuildTime: number;
288290
before(() => {
289-
assert.equal(fs.statSync(lastProjectOutputJs).mtimeMs, firstBuildTime, "First build timestamp is correct");
291+
beforeBuildTime = fs.statSync(lastProjectOutputJs).mtimeMs;
290292
tick();
291293
newFs = fs.shadow();
292294
tick();
@@ -298,14 +300,18 @@ Mismatch Actual(path, actual, expected): ${JSON.stringify(arrayFrom(mapDefinedIt
298300
expectedBuildInfoFilesForSectionBaselines,
299301
modifyFs: incrementalModifyFs,
300302
}));
301-
assert.equal(newFs.statSync(lastProjectOutputJs).mtimeMs, time(), "Second build timestamp is correct");
303+
afterBuildTime = newFs.statSync(lastProjectOutputJs).mtimeMs;
302304
});
303305
after(() => {
304306
newFs = undefined!;
305307
actualReadFileMap = undefined!;
306308
host = undefined!;
307309
});
308-
if (!baselineOnly) {
310+
it("verify build output times", () => {
311+
assert.equal(beforeBuildTime, firstBuildTime, "First build timestamp is correct");
312+
assert.equal(afterBuildTime, time(), "Second build timestamp is correct");
313+
});
314+
if (!baselineOnly || verifyDiagnostics) {
309315
it(`verify diagnostics`, () => {
310316
host.assertDiagnosticMessages(...(incrementalExpectedDiagnostics || emptyArray));
311317
});
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
namespace ts {
2+
describe("unittests:: tsbuild:: lateBoundSymbol:: interface is merged and contains late bound member", () => {
3+
let projFs: vfs.FileSystem;
4+
const { time, tick } = getTime();
5+
before(() => {
6+
projFs = loadProjectFromDisk("tests/projects/lateBoundSymbol", time);
7+
});
8+
after(() => {
9+
projFs = undefined!; // Release the contents
10+
});
11+
12+
verifyTsbuildOutput({
13+
scenario: "interface is merged and contains late bound member",
14+
projFs: () => projFs,
15+
time,
16+
tick,
17+
proj: "lateBoundSymbol",
18+
rootNames: ["/src/tsconfig.json"],
19+
expectedMapFileNames: emptyArray,
20+
lastProjectOutputJs: "/src/src/main.js",
21+
outputFiles: [
22+
"/src/src/hkt.js",
23+
"/src/src/main.js",
24+
"/src/tsconfig.tsbuildinfo",
25+
],
26+
initialBuild: {
27+
modifyFs: noop,
28+
expectedDiagnostics: [
29+
getExpectedDiagnosticForProjectsInBuild("src/tsconfig.json"),
30+
[Diagnostics.Project_0_is_out_of_date_because_output_file_1_does_not_exist, "src/tsconfig.json", "src/src/hkt.js"],
31+
[Diagnostics.Building_project_0, "/src/tsconfig.json"]
32+
]
33+
},
34+
incrementalDtsUnchangedBuild: {
35+
modifyFs: fs => replaceText(fs, "/src/src/main.ts", "const x = 10;", ""),
36+
expectedDiagnostics: [
37+
getExpectedDiagnosticForProjectsInBuild("src/tsconfig.json"),
38+
[Diagnostics.Project_0_is_out_of_date_because_oldest_output_1_is_older_than_newest_input_2, "src/tsconfig.json", "src/src/hkt.js", "src/src/main.ts"],
39+
[Diagnostics.Building_project_0, "/src/tsconfig.json"],
40+
[Diagnostics.Updating_unchanged_output_timestamps_of_project_0, "/src/tsconfig.json"]
41+
]
42+
},
43+
baselineOnly: true,
44+
verifyDiagnostics: true
45+
});
46+
});
47+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
//// [/src/src/main.ts]
2+
import { HKT } from "./hkt";
3+
4+
const sym = Symbol();
5+
6+
declare module "./hkt" {
7+
interface HKT<T> {
8+
[sym]: { a: T }
9+
}
10+
}
11+
12+
type A = HKT<number>[typeof sym];
13+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
//// [/src/src/hkt.js]
2+
"use strict";
3+
exports.__esModule = true;
4+
5+
6+
//// [/src/src/main.js]
7+
"use strict";
8+
exports.__esModule = true;
9+
var sym = Symbol();
10+
var x = 10;
11+
12+
13+
//// [/src/tsconfig.tsbuildinfo]
14+
{
15+
"program": {
16+
"fileInfos": {
17+
"/lib/lib.es5.d.ts": {
18+
"version": "/lib/lib.es5.d.ts",
19+
"signature": "/lib/lib.es5.d.ts"
20+
},
21+
"/lib/lib.es2015.d.ts": {
22+
"version": "/lib/lib.es2015.d.ts",
23+
"signature": "/lib/lib.es2015.d.ts"
24+
},
25+
"/lib/lib.es2015.core.d.ts": {
26+
"version": "/lib/lib.es2015.core.d.ts",
27+
"signature": "/lib/lib.es2015.core.d.ts"
28+
},
29+
"/lib/lib.es2015.collection.d.ts": {
30+
"version": "/lib/lib.es2015.collection.d.ts",
31+
"signature": "/lib/lib.es2015.collection.d.ts"
32+
},
33+
"/lib/lib.es2015.generator.d.ts": {
34+
"version": "/lib/lib.es2015.generator.d.ts",
35+
"signature": "/lib/lib.es2015.generator.d.ts"
36+
},
37+
"/lib/lib.es2015.iterable.d.ts": {
38+
"version": "/lib/lib.es2015.iterable.d.ts",
39+
"signature": "/lib/lib.es2015.iterable.d.ts"
40+
},
41+
"/lib/lib.es2015.promise.d.ts": {
42+
"version": "/lib/lib.es2015.promise.d.ts",
43+
"signature": "/lib/lib.es2015.promise.d.ts"
44+
},
45+
"/lib/lib.es2015.proxy.d.ts": {
46+
"version": "/lib/lib.es2015.proxy.d.ts",
47+
"signature": "/lib/lib.es2015.proxy.d.ts"
48+
},
49+
"/lib/lib.es2015.reflect.d.ts": {
50+
"version": "/lib/lib.es2015.reflect.d.ts",
51+
"signature": "/lib/lib.es2015.reflect.d.ts"
52+
},
53+
"/lib/lib.es2015.symbol.d.ts": {
54+
"version": "/lib/lib.es2015.symbol.d.ts",
55+
"signature": "/lib/lib.es2015.symbol.d.ts"
56+
},
57+
"/lib/lib.es2015.symbol.wellknown.d.ts": {
58+
"version": "/lib/lib.es2015.symbol.wellknown.d.ts",
59+
"signature": "/lib/lib.es2015.symbol.wellknown.d.ts"
60+
},
61+
"/src/src/hkt.ts": {
62+
"version": "675797797",
63+
"signature": "2373810515"
64+
},
65+
"/src/src/main.ts": {
66+
"version": "-28387946490",
67+
"signature": "-7779857705"
68+
}
69+
},
70+
"options": {
71+
"rootDir": "/src/src",
72+
"lib": [
73+
"lib.es2015.d.ts"
74+
],
75+
"incremental": true,
76+
"configFilePath": "/src/tsconfig.json"
77+
},
78+
"referencedMap": {
79+
"/src/src/main.ts": [
80+
"/src/src/hkt.ts"
81+
]
82+
},
83+
"exportedModulesMap": {
84+
"/src/src/main.ts": [
85+
"/src/src/hkt.ts"
86+
]
87+
},
88+
"semanticDiagnosticsPerFile": [
89+
"/lib/lib.es2015.collection.d.ts",
90+
"/lib/lib.es2015.core.d.ts",
91+
"/lib/lib.es2015.d.ts",
92+
"/lib/lib.es2015.generator.d.ts",
93+
"/lib/lib.es2015.iterable.d.ts",
94+
"/lib/lib.es2015.promise.d.ts",
95+
"/lib/lib.es2015.proxy.d.ts",
96+
"/lib/lib.es2015.reflect.d.ts",
97+
"/lib/lib.es2015.symbol.d.ts",
98+
"/lib/lib.es2015.symbol.wellknown.d.ts",
99+
"/lib/lib.es5.d.ts",
100+
"/src/src/hkt.ts",
101+
"/src/src/main.ts"
102+
]
103+
},
104+
"version": "FakeTSVersion"
105+
}
106+
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export interface HKT<T> { }
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { HKT } from "./hkt";
2+
3+
const sym = Symbol();
4+
5+
declare module "./hkt" {
6+
interface HKT<T> {
7+
[sym]: { a: T }
8+
}
9+
}
10+
const x = 10;
11+
type A = HKT<number>[typeof sym];
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"compilerOptions": {
3+
"rootDir": "src",
4+
"lib": [
5+
"es2015"
6+
],
7+
"incremental": true
8+
}
9+
}

0 commit comments

Comments
 (0)