Skip to content

Commit f7189e1

Browse files
committed
Some reorg in creating sessions for testing
1 parent 878b7a2 commit f7189e1

File tree

2 files changed

+40
-26
lines changed

2 files changed

+40
-26
lines changed

src/server/protocol.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2401,6 +2401,7 @@ namespace ts.server.protocol {
24012401
*/
24022402
export interface DiagnosticEvent extends Event {
24032403
body?: DiagnosticEventBody;
2404+
event: DiagnosticEventKind;
24042405
}
24052406

24062407
export interface ConfigFileDiagnosticEventBody {
@@ -2520,6 +2521,9 @@ namespace ts.server.protocol {
25202521
maxFileSize: number;
25212522
}
25222523

2524+
export type AnyEvent = RequestCompletedEvent | DiagnosticEvent | ConfigFileDiagnosticEvent | ProjectLanguageServiceStateEvent | TelemetryEvent |
2525+
ProjectsUpdatedInBackgroundEvent | ProjectLoadingStartEvent | ProjectLoadingFinishEvent | SurveyReadyEvent | LargeFileReferencedEvent;
2526+
25232527
/**
25242528
* Arguments for reload request.
25252529
*/

src/testRunner/unittests/tsserverProjectSystem.ts

Lines changed: 36 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -330,19 +330,46 @@ namespace ts.projectSystem {
330330
return new TestSession({ ...sessionOptions, ...opts });
331331
}
332332

333-
function createSessionWithEventTracking<T extends server.ProjectServiceEvent, U extends server.ProjectServiceEvent = T>(host: server.ServerHost, eventName: T["eventName"], eventName2?: U["eventName"]) {
334-
const events: (T | U)[] = [];
333+
function createSessionWithEventTracking<T extends server.ProjectServiceEvent>(host: server.ServerHost, eventName: T["eventName"], ...eventNames: T["eventName"][]) {
334+
const events: T[] = [];
335335
const session = createSession(host, {
336336
eventHandler: e => {
337-
if (e.eventName === eventName || (eventName2 && e.eventName === eventName2)) {
338-
events.push(e as T | U);
337+
if (e.eventName === eventName || eventNames.some(eventName => e.eventName === eventName)) {
338+
events.push(e as T);
339339
}
340340
}
341341
});
342342

343343
return { session, events };
344344
}
345345

346+
function createSessionWithDefaultEventHandler<T extends protocol.AnyEvent>(host: TestServerHost, eventName: T["event"], opts: Partial<server.SessionOptions> = {}, ...eventNames: T["event"][]) {
347+
const session = createSession(host, { canUseEvents: true, ...opts });
348+
349+
return {
350+
session,
351+
getEvents,
352+
clearEvents
353+
};
354+
355+
function getEvents() {
356+
const outputEventRegex = /Content\-Length: [\d]+\r\n\r\n/;
357+
return filter(
358+
map(
359+
host.getOutput(), s => convertToObject(
360+
parseJsonText("json.json", s.replace(outputEventRegex, "")),
361+
[]
362+
)
363+
),
364+
e => e.event === eventName || eventNames.some(eventName => e.event === eventName)
365+
) as T[];
366+
}
367+
368+
function clearEvents() {
369+
session.clearMessages();
370+
}
371+
}
372+
346373
interface CreateProjectServiceParameters {
347374
cancellationToken?: HostCancellationToken;
348375
logger?: server.Logger;
@@ -8062,15 +8089,7 @@ namespace ts.projectSystem {
80628089
verifyProjectsUpdatedInBackgroundEvent(createSessionWithProjectChangedEventHandler);
80638090

80648091
function createSessionWithProjectChangedEventHandler(host: TestServerHost): ProjectsUpdatedInBackgroundEventVerifier {
8065-
const projectChangedEvents: server.ProjectsUpdatedInBackgroundEvent[] = [];
8066-
const session = createSession(host, {
8067-
eventHandler: e => {
8068-
if (e.eventName === server.ProjectsUpdatedInBackgroundEvent) {
8069-
projectChangedEvents.push(e);
8070-
}
8071-
}
8072-
});
8073-
8092+
const { session, events: projectChangedEvents } = createSessionWithEventTracking<server.ProjectsUpdatedInBackgroundEvent>(host, server.ProjectsUpdatedInBackgroundEvent);
80748093
return {
80758094
session,
80768095
verifyProjectsUpdatedInBackgroundEventHandler,
@@ -8110,7 +8129,7 @@ namespace ts.projectSystem {
81108129

81118130

81128131
function createSessionThatUsesEvents(host: TestServerHost, noGetErrOnBackgroundUpdate?: boolean): ProjectsUpdatedInBackgroundEventVerifier {
8113-
const session = createSession(host, { canUseEvents: true, noGetErrOnBackgroundUpdate });
8132+
const { session, getEvents, clearEvents } = createSessionWithDefaultEventHandler<protocol.ProjectsUpdatedInBackgroundEvent>(host, server.ProjectsUpdatedInBackgroundEvent, { noGetErrOnBackgroundUpdate });
81148133

81158134
return {
81168135
session,
@@ -8124,24 +8143,15 @@ namespace ts.projectSystem {
81248143
openFiles: e.data.openFiles
81258144
};
81268145
});
8127-
const outputEventRegex = /Content\-Length: [\d]+\r\n\r\n/;
8128-
const events: protocol.ProjectsUpdatedInBackgroundEvent[] = filter(
8129-
map(
8130-
host.getOutput(), s => convertToObject(
8131-
parseJsonText("json.json", s.replace(outputEventRegex, "")),
8132-
[]
8133-
)
8134-
),
8135-
e => e.event === server.ProjectsUpdatedInBackgroundEvent
8136-
);
8146+
const events = getEvents();
81378147
assert.equal(events.length, expectedEvents.length, `Incorrect number of events Actual: ${map(events, e => e.body)} Expected: ${expectedEvents}`);
81388148
forEach(events, (actualEvent, i) => {
81398149
const expectedEvent = expectedEvents[i];
81408150
verifyFiles("openFiles", actualEvent.body.openFiles, expectedEvent.openFiles);
81418151
});
81428152

81438153
// Verified the events, reset them
8144-
session.clearMessages();
8154+
clearEvents();
81458155

81468156
if (events.length) {
81478157
host.checkTimeoutQueueLength(noGetErrOnBackgroundUpdate ? 0 : 1); // Error checking queued only if not noGetErrOnBackgroundUpdate
@@ -9467,7 +9477,7 @@ export const x = 10;`
94679477
}
94689478
return originalReadFile.call(host, file);
94699479
};
9470-
const { session, events } = createSessionWithEventTracking<server.ProjectLoadingStartEvent, server.ProjectLoadingFinishEvent>(host, server.ProjectLoadingStartEvent, server.ProjectLoadingFinishEvent);
9480+
const { session, events } = createSessionWithEventTracking<server.ProjectLoadingStartEvent | server.ProjectLoadingFinishEvent>(host, server.ProjectLoadingStartEvent, server.ProjectLoadingFinishEvent);
94719481
const service = session.getProjectService();
94729482
return { host, session, verifyEvent, verifyEventWithOpenTs, service, events };
94739483

0 commit comments

Comments
 (0)