Skip to content

Commit 0fd4a08

Browse files
committed
Add test for noEmitOnError with SemanticDiagnosticsBuilder
1 parent 8bae521 commit 0fd4a08

File tree

1 file changed

+52
-16
lines changed

1 file changed

+52
-16
lines changed

src/testRunner/unittests/tscWatch/watchApi.ts

+52-16
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,21 @@ namespace ts.tscWatch {
147147
const watch = getWatch(config, { noEmit: true }, sys, createProgram);
148148
return { sys, watch, mainFile, otherFile, config };
149149
}
150+
151+
function verifyOutputs(sys: System, emitSys: System) {
152+
for (const output of [`${projectRoot}/main.js`, `${projectRoot}/main.d.ts`, `${projectRoot}/other.js`, `${projectRoot}/other.d.ts`, `${projectRoot}/tsconfig.tsbuildinfo`]) {
153+
assert.strictEqual(sys.readFile(output), emitSys.readFile(output), `Output file text for ${output}`);
154+
}
155+
}
156+
157+
function verifyBuilder<T extends BuilderProgram, U extends BuilderProgram>(config: File, sys: System, emitSys: System, createProgram: CreateProgram<T>, createEmitProgram: CreateProgram<U>, optionsToExtend?: CompilerOptions) {
158+
const watch = getWatch(config, /*optionsToExtend*/ optionsToExtend, sys, createProgram);
159+
const emitWatch = getWatch(config, /*optionsToExtend*/ optionsToExtend, emitSys, createEmitProgram);
160+
verifyOutputs(sys, emitSys);
161+
watch.close();
162+
emitWatch.close();
163+
}
164+
150165
it("verifies that noEmit is handled on createSemanticDiagnosticsBuilderProgram and typechecking happens only on affected files", () => {
151166
const { sys, watch, mainFile, otherFile } = setup(createSemanticDiagnosticsBuilderProgram, "{}");
152167
checkProgramActualFiles(watch.getProgram().getProgram(), [mainFile.path, otherFile.path, libFile.path]);
@@ -168,38 +183,59 @@ namespace ts.tscWatch {
168183
emitWatch.close();
169184

170185
// Emit on both sys should result in same output
171-
verifyBuilder(createEmitAndSemanticDiagnosticsBuilderProgram, createEmitAndSemanticDiagnosticsBuilderProgram);
186+
verifyBuilder(config, sys, emitSys, createEmitAndSemanticDiagnosticsBuilderProgram, createEmitAndSemanticDiagnosticsBuilderProgram);
172187

173188
// Change file
174189
sys.appendFile(mainFile.path, "\n// SomeComment");
175190
emitSys.appendFile(mainFile.path, "\n// SomeComment");
176191

177192
// Verify noEmit results in same output
178-
verifyBuilder(createSemanticDiagnosticsBuilderProgram, createEmitAndSemanticDiagnosticsBuilderProgram, { noEmit: true });
193+
verifyBuilder(config, sys, emitSys, createSemanticDiagnosticsBuilderProgram, createEmitAndSemanticDiagnosticsBuilderProgram, { noEmit: true });
179194

180195
// Emit on both sys should result in same output
181-
verifyBuilder(createEmitAndSemanticDiagnosticsBuilderProgram, createEmitAndSemanticDiagnosticsBuilderProgram);
196+
verifyBuilder(config, sys, emitSys, createEmitAndSemanticDiagnosticsBuilderProgram, createEmitAndSemanticDiagnosticsBuilderProgram);
182197

183198
// Change file
184199
sys.appendFile(mainFile.path, "\n// SomeComment");
185200
emitSys.appendFile(mainFile.path, "\n// SomeComment");
186201

187202
// Emit on both the builders should result in same files
188-
verifyBuilder(createSemanticDiagnosticsBuilderProgram, createEmitAndSemanticDiagnosticsBuilderProgram);
203+
verifyBuilder(config, sys, emitSys, createSemanticDiagnosticsBuilderProgram, createEmitAndSemanticDiagnosticsBuilderProgram);
204+
});
189205

190-
function verifyOutputs(sys: System, emitSys: System) {
191-
for (const output of [`${projectRoot}/main.js`, `${projectRoot}/main.d.ts`, `${projectRoot}/other.js`, `${projectRoot}/other.d.ts`, `${projectRoot}/tsconfig.tsbuildinfo`]) {
192-
assert.strictEqual(sys.readFile(output), emitSys.readFile(output), `Output file text for ${output}`);
193-
}
194-
}
206+
it("noEmitOnError with composite writes the tsbuildinfo with pending affected files correctly", () => {
207+
const config: File = {
208+
path: `${projectRoot}/tsconfig.json`,
209+
content: JSON.stringify({ compilerOptions: { composite: true } })
210+
};
211+
const mainFile: File = {
212+
path: `${projectRoot}/main.ts`,
213+
content: "export const x: string = 10;"
214+
};
215+
const otherFile: File = {
216+
path: `${projectRoot}/other.ts`,
217+
content: "export const y = 10;"
218+
};
219+
const sys = createWatchedSystem([config, mainFile, otherFile, libFile]);
220+
const emitSys = createWatchedSystem([config, mainFile, otherFile, libFile]);
195221

196-
function verifyBuilder<T extends BuilderProgram, U extends BuilderProgram>(createProgram: CreateProgram<T>, createEmitProgram: CreateProgram<U>, optionsToExtend?: CompilerOptions) {
197-
const watch = getWatch(config, /*optionsToExtend*/ optionsToExtend, sys, createProgram);
198-
const emitWatch = getWatch(config, /*optionsToExtend*/ optionsToExtend, emitSys, createEmitProgram);
199-
verifyOutputs(sys, emitSys);
200-
watch.close();
201-
emitWatch.close();
202-
}
222+
// Verify noEmit results in same output
223+
verifyBuilder(config, sys, emitSys, createSemanticDiagnosticsBuilderProgram, createEmitAndSemanticDiagnosticsBuilderProgram, { noEmitOnError: true });
224+
225+
// Change file
226+
sys.appendFile(mainFile.path, "\n// SomeComment");
227+
emitSys.appendFile(mainFile.path, "\n// SomeComment");
228+
229+
// Verify noEmit results in same output
230+
verifyBuilder(config, sys, emitSys, createSemanticDiagnosticsBuilderProgram, createEmitAndSemanticDiagnosticsBuilderProgram, { noEmitOnError: true });
231+
232+
// Fix error
233+
const fixed = "export const x = 10;";
234+
sys.appendFile(mainFile.path, fixed);
235+
emitSys.appendFile(mainFile.path, fixed);
236+
237+
// Emit on both the builders should result in same files
238+
verifyBuilder(config, sys, emitSys, createSemanticDiagnosticsBuilderProgram, createEmitAndSemanticDiagnosticsBuilderProgram, { noEmitOnError: true });
203239
});
204240
});
205241
}

0 commit comments

Comments
 (0)