• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1namespace ts.projectSystem {
2    describe("unittests:: tsserver:: events:: LargeFileReferencedEvent with large file", () => {
3
4        function getLargeFile(useLargeTsFile: boolean) {
5            return `src/large.${useLargeTsFile ? "ts" : "js"}`;
6        }
7
8        function createSessionWithEventHandler(files: File[], useLargeTsFile: boolean) {
9            const largeFile: File = {
10                path: `${tscWatch.projectRoot}/${getLargeFile(useLargeTsFile)}`,
11                content: "export var x = 10;",
12                fileSize: server.maxFileSize + 1
13            };
14            files.push(largeFile);
15            const host = createServerHost(files);
16            const { session, events: largeFileReferencedEvents } = createSessionWithEventTracking<server.LargeFileReferencedEvent>(host, server.LargeFileReferencedEvent);
17
18            return { session, verifyLargeFile };
19
20            function verifyLargeFile(project: server.Project) {
21                checkProjectActualFiles(project, files.map(f => f.path));
22
23                // large file for non ts file should be empty and for ts file should have content
24                const service = session.getProjectService();
25                const info = service.getScriptInfo(largeFile.path)!;
26                assert.equal(info.cacheSourceFile!.sourceFile.text, useLargeTsFile ? largeFile.content : "");
27
28                assert.deepEqual(largeFileReferencedEvents, useLargeTsFile ? emptyArray : [{
29                    eventName: server.LargeFileReferencedEvent,
30                    data: { file: largeFile.path, fileSize: largeFile.fileSize, maxFileSize: server.maxFileSize }
31                }]);
32            }
33        }
34
35        function verifyLargeFile(useLargeTsFile: boolean) {
36            it("when large file is included by tsconfig", () => {
37                const file: File = {
38                    path: `${tscWatch.projectRoot}/src/file.ts`,
39                    content: "export var y = 10;"
40                };
41                const tsconfig: File = {
42                    path: `${tscWatch.projectRoot}/tsconfig.json`,
43                    content: JSON.stringify({ files: ["src/file.ts", getLargeFile(useLargeTsFile)], compilerOptions: { target: 1, allowJs: true } })
44                };
45                const files = [file, libFile, tsconfig];
46                const { session, verifyLargeFile } = createSessionWithEventHandler(files, useLargeTsFile);
47                const service = session.getProjectService();
48                openFilesForSession([file], session);
49                checkNumberOfProjects(service, { configuredProjects: 1 });
50                verifyLargeFile(service.configuredProjects.get(tsconfig.path)!);
51            });
52
53            it("when large file is included by module resolution", () => {
54                const file: File = {
55                    path: `${tscWatch.projectRoot}/src/file.ts`,
56                    content: `export var y = 10;import {x} from "./large"`
57                };
58                const files = [file, libFile];
59                const { session, verifyLargeFile } = createSessionWithEventHandler(files, useLargeTsFile);
60                const service = session.getProjectService();
61                openFilesForSession([file], session);
62                checkNumberOfProjects(service, { inferredProjects: 1 });
63                verifyLargeFile(service.inferredProjects[0]);
64            });
65        }
66
67        describe("large file is ts file", () => {
68            verifyLargeFile(/*useLargeTsFile*/ true);
69        });
70
71        describe("large file is js file", () => {
72            verifyLargeFile(/*useLargeTsFile*/ false);
73        });
74    });
75}
76