Skip to content

Create baselines for tsserver event tests #53330

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Mar 17, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions src/server/session.ts
Original file line number Diff line number Diff line change
Expand Up @@ -267,9 +267,12 @@ function convertToLocation(lineAndCharacter: LineAndCharacter): protocol.Locatio
return { line: lineAndCharacter.line + 1, offset: lineAndCharacter.character + 1 };
}

function formatDiagnosticToProtocol(diag: Diagnostic, includeFileName: true): protocol.DiagnosticWithFileName;
function formatDiagnosticToProtocol(diag: Diagnostic, includeFileName: false): protocol.Diagnostic;
function formatDiagnosticToProtocol(diag: Diagnostic, includeFileName: boolean): protocol.Diagnostic | protocol.DiagnosticWithFileName {
/** @internal */
export function formatDiagnosticToProtocol(diag: Diagnostic, includeFileName: true): protocol.DiagnosticWithFileName;
/** @internal */
export function formatDiagnosticToProtocol(diag: Diagnostic, includeFileName: false): protocol.Diagnostic;
/** @internal */
export function formatDiagnosticToProtocol(diag: Diagnostic, includeFileName: boolean): protocol.Diagnostic | protocol.DiagnosticWithFileName {
const start = (diag.file && convertToLocation(getLineAndCharacterOfPosition(diag.file, diag.start!)))!; // TODO: GH#18217
const end = (diag.file && convertToLocation(getLineAndCharacterOfPosition(diag.file, diag.start! + diag.length!)))!; // TODO: GH#18217
const text = flattenDiagnosticMessageText(diag.messageText, "\n");
Expand Down
35 changes: 11 additions & 24 deletions src/testRunner/unittests/tsserver/configuredProjects.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ import {
createLoggerWithInMemoryLogs,
createProjectService,
createSession,
createSessionWithEventTracking,
openFilesForSession,
verifyGetErrRequest,
} from "./helpers";
Expand Down Expand Up @@ -751,25 +750,22 @@ describe("unittests:: tsserver:: ConfiguredProjects", () => {
const originalGetFileSize = host.getFileSize;
host.getFileSize = (filePath: string) =>
filePath === f2.path ? ts.server.maxProgramSizeForNonTsFiles + 1 : originalGetFileSize.call(host, filePath);
const { session, events } = createSessionWithEventTracking<ts.server.ProjectLanguageServiceStateEvent>(host, ts.server.ProjectLanguageServiceStateEvent);
const session = createSession(host, { canUseEvents: true, logger: createLoggerWithInMemoryLogs(host) });
session.executeCommand({
seq: 0,
type: "request",
command: "open",
arguments: { file: f1.path }
} as ts.server.protocol.OpenRequest);
session.logger.log(`Language languageServiceEnabled:: ${session.getProjectService().configuredProjects.get(config.path)!.languageServiceEnabled}`);

const projectService = session.getProjectService();
checkNumberOfProjects(projectService, { configuredProjects: 1 });
const project = configuredProjectAt(projectService, 0);
assert.isFalse(project.languageServiceEnabled, "Language service enabled");
assert.equal(events.length, 1, "should receive event");
assert.equal(events[0].data.project, project, "project name");
assert.isFalse(events[0].data.languageServiceEnabled, "Language service state");

const options = projectService.getFormatCodeOptions(f1.path as ts.server.NormalizedPath);
const edits = project.getLanguageService().getFormattingEditsForDocument(f1.path, options);
assert.deepEqual(edits, [{ span: ts.createTextSpan(/*start*/ 7, /*length*/ 3), newText: " " }]);
session.executeCommandSeq({
command: ts.server.protocol.CommandTypes.FormatFull,
arguments: {
file: f1.path,
}
});
baselineTsserverLogs("configuredProjects", "syntactic features work even if language service is disabled", session);
});

it("when multiple projects are open, detects correct default project", () => {
Expand Down Expand Up @@ -1263,7 +1259,7 @@ describe("unittests:: tsserver:: ConfiguredProjects:: when reading tsconfig file
};

const host = createServerHost([file1, libFile, configFile]);
const { session, events } = createSessionWithEventTracking<ts.server.ConfigFileDiagEvent>(host, ts.server.ConfigFileDiagEvent);
const session = createSession(host, { canUseEvents: true, logger: createLoggerWithInMemoryLogs(host) });
const originalReadFile = host.readFile;
host.readFile = f => {
return f === configFile.path ?
Expand All @@ -1272,15 +1268,6 @@ describe("unittests:: tsserver:: ConfiguredProjects:: when reading tsconfig file
};
openFilesForSession([file1], session);

assert.deepEqual(events, [{
eventName: ts.server.ConfigFileDiagEvent,
data: {
triggerFile: file1.path,
configFileName: configFile.path,
diagnostics: [
ts.createCompilerDiagnostic(ts.Diagnostics.Cannot_read_file_0, configFile.path)
]
}
}]);
baselineTsserverLogs("configuredProjects", "should be tolerated without crashing the server", session);
});
});
42 changes: 13 additions & 29 deletions src/testRunner/unittests/tsserver/events/largeFileReferenced.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,18 @@ import {
libFile,
} from "../../virtualFileSystemWithWatch";
import {
checkNumberOfProjects,
checkProjectActualFiles,
createSessionWithEventTracking,
baselineTsserverLogs,
createLoggerWithInMemoryLogs,
createSession,
openFilesForSession,
} from "../helpers";

describe("unittests:: tsserver:: events:: LargeFileReferencedEvent with large file", () => {

function getFileType(useLargeTsFile: boolean) {
return useLargeTsFile ? "ts" : "js";
}
function getLargeFile(useLargeTsFile: boolean) {
return `src/large.${useLargeTsFile ? "ts" : "js"}`;
return `src/large.${getFileType(useLargeTsFile)}`;
}

function createSessionWithEventHandler(files: File[], useLargeTsFile: boolean) {
Expand All @@ -25,23 +27,9 @@ describe("unittests:: tsserver:: events:: LargeFileReferencedEvent with large fi
};
files.push(largeFile);
const host = createServerHost(files);
const { session, events: largeFileReferencedEvents } = createSessionWithEventTracking<ts.server.LargeFileReferencedEvent>(host, ts.server.LargeFileReferencedEvent);

return { session, verifyLargeFile };

function verifyLargeFile(project: ts.server.Project) {
checkProjectActualFiles(project, files.map(f => f.path));

// large file for non ts file should be empty and for ts file should have content
const service = session.getProjectService();
const info = service.getScriptInfo(largeFile.path)!;
assert.equal(info.cacheSourceFile!.sourceFile.text, useLargeTsFile ? largeFile.content : "");
const session = createSession(host, { canUseEvents: true, logger: createLoggerWithInMemoryLogs(host) });

assert.deepEqual(largeFileReferencedEvents, useLargeTsFile ? ts.emptyArray : [{
eventName: ts.server.LargeFileReferencedEvent,
data: { file: largeFile.path, fileSize: largeFile.fileSize, maxFileSize: ts.server.maxFileSize }
}]);
}
return session;
}

function verifyLargeFile(useLargeTsFile: boolean) {
Expand All @@ -55,11 +43,9 @@ describe("unittests:: tsserver:: events:: LargeFileReferencedEvent with large fi
content: JSON.stringify({ files: ["src/file.ts", getLargeFile(useLargeTsFile)], compilerOptions: { target: 1, allowJs: true } })
};
const files = [file, libFile, tsconfig];
const { session, verifyLargeFile } = createSessionWithEventHandler(files, useLargeTsFile);
const service = session.getProjectService();
const session = createSessionWithEventHandler(files, useLargeTsFile);
openFilesForSession([file], session);
checkNumberOfProjects(service, { configuredProjects: 1 });
verifyLargeFile(service.configuredProjects.get(tsconfig.path)!);
baselineTsserverLogs("events/largeFileReferenced", `when large ${getFileType(useLargeTsFile)} file is included by tsconfig`, session);
});

it("when large file is included by module resolution", () => {
Expand All @@ -68,11 +54,9 @@ describe("unittests:: tsserver:: events:: LargeFileReferencedEvent with large fi
content: `export var y = 10;import {x} from "./large"`
};
const files = [file, libFile];
const { session, verifyLargeFile } = createSessionWithEventHandler(files, useLargeTsFile);
const service = session.getProjectService();
const session = createSessionWithEventHandler(files, useLargeTsFile);
openFilesForSession([file], session);
checkNumberOfProjects(service, { inferredProjects: 1 });
verifyLargeFile(service.inferredProjects[0]);
baselineTsserverLogs("events/largeFileReferenced", `when large ${getFileType(useLargeTsFile)} file is included by module resolution`, session);
});
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,9 @@ import {
} from "../../virtualFileSystemWithWatch";
import {
baselineTsserverLogs,
checkNumberOfProjects,
configuredProjectAt,
createLoggerWithInMemoryLogs,
createProjectService,
createSessionWithEventTracking,
createSession,
} from "../helpers";

describe("unittests:: tsserver:: events:: ProjectLanguageServiceStateEvent", () => {
Expand All @@ -36,30 +34,19 @@ describe("unittests:: tsserver:: events:: ProjectLanguageServiceStateEvent", ()
host.getFileSize = (filePath: string) =>
filePath === f2.path ? ts.server.maxProgramSizeForNonTsFiles + 1 : originalGetFileSize.call(host, filePath);

const { session, events } = createSessionWithEventTracking<ts.server.ProjectLanguageServiceStateEvent>(host, ts.server.ProjectLanguageServiceStateEvent);
const session = createSession(host, { canUseEvents: true, logger: createLoggerWithInMemoryLogs(host) });
session.executeCommand({
seq: 0,
type: "request",
command: "open",
arguments: { file: f1.path }
} as ts.server.protocol.OpenRequest);
const projectService = session.getProjectService();
checkNumberOfProjects(projectService, { configuredProjects: 1 });
const project = configuredProjectAt(projectService, 0);
assert.isFalse(project.languageServiceEnabled, "Language service enabled");
assert.equal(events.length, 1, "should receive event");
assert.equal(events[0].data.project, project, "project name");
assert.equal(events[0].data.project.getProjectName(), config.path, "config path");
assert.isFalse(events[0].data.languageServiceEnabled, "Language service state");
session.logger.log(`Language service enabled: ${session.getProjectService().configuredProjects.get(config.path)!.languageServiceEnabled}`);

host.writeFile(configWithExclude.path, configWithExclude.content);
host.checkTimeoutQueueLengthAndRun(2);
checkNumberOfProjects(projectService, { configuredProjects: 1 });
assert.isTrue(project.languageServiceEnabled, "Language service enabled");
assert.equal(events.length, 2, "should receive event");
assert.equal(events[1].data.project, project, "project");
assert.equal(events[1].data.project.getProjectName(), config.path, "config path");
assert.isTrue(events[1].data.languageServiceEnabled, "Language service state");
session.logger.log(`Language service enabled: ${session.getProjectService().configuredProjects.get(config.path)!.languageServiceEnabled}`);
baselineTsserverLogs("events/projectLanguageServiceState", "language service disabled events are triggered", session);
});

it("Large file size is determined correctly", () => {
Expand Down Expand Up @@ -87,6 +74,6 @@ describe("unittests:: tsserver:: events:: ProjectLanguageServiceStateEvent", ()
const project = service.configuredProjects.get(config.path)!;
service.logger.info(`languageServiceEnabled: ${project.languageServiceEnabled}`);
service.logger.info(`lastFileExceededProgramSize: ${project.lastFileExceededProgramSize}`);
baselineTsserverLogs("projectLanguageServiceStateEvent", "large file size is determined correctly", service);
baselineTsserverLogs("events/projectLanguageServiceState", "large file size is determined correctly", service);
});
});
Loading