• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1namespace ts.projectSystem {
2    describe("unittests:: tsserver:: with project references and error reporting", () => {
3        const dependecyLocation = `${tscWatch.projectRoot}/dependency`;
4        const usageLocation = `${tscWatch.projectRoot}/usage`;
5
6        function verifyUsageAndDependency(scenario: string, dependencyTs: File, dependencyConfig: File, usageTs: File, usageConfig: File) {
7            function usageProjectDiagnostics(): GetErrForProjectDiagnostics {
8                return { project: usageTs, files: [usageTs, dependencyTs] };
9            }
10
11            function dependencyProjectDiagnostics(): GetErrForProjectDiagnostics {
12                return { project: dependencyTs, files: [dependencyTs] };
13            }
14
15            describe("when dependency project is not open", () => {
16                verifyGetErrScenario({
17                    scenario: "projectReferenceErrors",
18                    subScenario: `${scenario} when dependency project is not open`,
19                    allFiles: () => [dependencyTs, dependencyConfig, usageTs, usageConfig],
20                    openFiles: () => [usageTs],
21                    getErrRequest: () => [usageTs],
22                    getErrForProjectRequest: () => [
23                        usageProjectDiagnostics(),
24                        {
25                            project: dependencyTs,
26                            files: [dependencyTs, usageTs]
27                        }
28                    ],
29                    syncDiagnostics: () => [
30                        // Without project
31                        { file: usageTs },
32                        { file: dependencyTs },
33                        // With project
34                        { file: usageTs, project: usageConfig },
35                        { file: dependencyTs, project: usageConfig },
36                    ],
37                });
38            });
39
40            describe("when the depedency file is open", () => {
41                verifyGetErrScenario({
42                    scenario: "projectReferenceErrors",
43                    subScenario: `${scenario} when the depedency file is open`,
44                    allFiles: () => [dependencyTs, dependencyConfig, usageTs, usageConfig],
45                    openFiles: () => [usageTs, dependencyTs],
46                    getErrRequest: () => [usageTs, dependencyTs],
47                    getErrForProjectRequest: () => [
48                        usageProjectDiagnostics(),
49                        dependencyProjectDiagnostics()
50                    ],
51                    syncDiagnostics: () => [
52                        // Without project
53                        { file: usageTs },
54                        { file: dependencyTs },
55                        // With project
56                        { file: usageTs, project: usageConfig },
57                        { file: dependencyTs, project: usageConfig },
58                        { file: dependencyTs, project: dependencyConfig },
59                    ],
60                });
61            });
62        }
63
64        describe("with module scenario", () => {
65            const dependencyTs: File = {
66                path: `${dependecyLocation}/fns.ts`,
67                content: `export function fn1() { }
68export function fn2() { }
69// Introduce error for fnErr import in main
70// export function fnErr() { }
71// Error in dependency ts file
72export let x: string = 10;`
73            };
74            const dependencyConfig: File = {
75                path: `${dependecyLocation}/tsconfig.json`,
76                content: JSON.stringify({ compilerOptions: { composite: true, declarationDir: "../decls" } })
77            };
78            const usageTs: File = {
79                path: `${usageLocation}/usage.ts`,
80                content: `import {
81    fn1,
82    fn2,
83    fnErr
84} from '../decls/fns'
85fn1();
86fn2();
87fnErr();
88`
89            };
90            const usageConfig: File = {
91                path: `${usageLocation}/tsconfig.json`,
92                content: JSON.stringify({
93                    compilerOptions: { composite: true },
94                    references: [{ path: "../dependency" }]
95                })
96            };
97            verifyUsageAndDependency("with module scenario", dependencyTs, dependencyConfig, usageTs, usageConfig);
98        });
99
100        describe("with non module --out", () => {
101            const dependencyTs: File = {
102                path: `${dependecyLocation}/fns.ts`,
103                content: `function fn1() { }
104function fn2() { }
105// Introduce error for fnErr import in main
106// function fnErr() { }
107// Error in dependency ts file
108let x: string = 10;`
109            };
110            const dependencyConfig: File = {
111                path: `${dependecyLocation}/tsconfig.json`,
112                content: JSON.stringify({ compilerOptions: { composite: true, outFile: "../dependency.js" } })
113            };
114            const usageTs: File = {
115                path: `${usageLocation}/usage.ts`,
116                content: `fn1();
117fn2();
118fnErr();
119`
120            };
121            const usageConfig: File = {
122                path: `${usageLocation}/tsconfig.json`,
123                content: JSON.stringify({
124                    compilerOptions: { composite: true, outFile: "../usage.js" },
125                    references: [{ path: "../dependency" }]
126                })
127            };
128            verifyUsageAndDependency("with non module", dependencyTs, dependencyConfig, usageTs, usageConfig);
129        });
130    });
131}
132