5
5
namespace ts {
6
6
describe ( "Organize imports" , ( ) => {
7
7
describe ( "Sort imports" , ( ) => {
8
- it ( "No imports" , ( ) => {
9
- assert . isEmpty ( OrganizeImports . sortImports ( [ ] ) ) ;
10
- } ) ;
11
-
12
- it ( "One import" , ( ) => {
13
- const unsortedImports = parseImports ( `import "lib";` ) ;
14
- const actualSortedImports = OrganizeImports . sortImports ( unsortedImports ) ;
15
- const expectedSortedImports = unsortedImports ;
16
- assertListEqual ( expectedSortedImports , actualSortedImports ) ;
17
- } ) ;
18
-
19
- it ( "Stable - import kind" , ( ) => {
20
- assertUnaffectedBySort (
21
- `import "lib";` ,
22
- `import * as x from "lib";` ,
23
- `import x from "lib";` ,
24
- `import {x} from "lib";` ) ;
25
- } ) ;
26
-
27
- it ( "Stable - default property alias" , ( ) => {
28
- assertUnaffectedBySort (
29
- `import x from "lib";` ,
30
- `import y from "lib";` ) ;
31
- } ) ;
32
-
33
- it ( "Stable - module alias" , ( ) => {
34
- assertUnaffectedBySort (
35
- `import * as x from "lib";` ,
36
- `import * as y from "lib";` ) ;
37
- } ) ;
38
-
39
- it ( "Stable - symbol" , ( ) => {
40
- assertUnaffectedBySort (
41
- `import {x} from "lib";` ,
42
- `import {y} from "lib";` ) ;
43
- } ) ;
44
-
45
8
it ( "Sort - non-relative vs non-relative" , ( ) => {
46
9
assertSortsBefore (
47
10
`import y from "lib1";` ,
@@ -60,18 +23,10 @@ namespace ts {
60
23
`import x from "./lib";` ) ;
61
24
} ) ;
62
25
63
- function assertUnaffectedBySort ( ...importStrings : string [ ] ) {
64
- const unsortedImports1 = parseImports ( ...importStrings ) ;
65
- assertListEqual ( unsortedImports1 , OrganizeImports . sortImports ( unsortedImports1 ) ) ;
66
-
67
- const unsortedImports2 = reverse ( unsortedImports1 ) ;
68
- assertListEqual ( unsortedImports2 , OrganizeImports . sortImports ( unsortedImports2 ) ) ;
69
- }
70
-
71
26
function assertSortsBefore ( importString1 : string , importString2 : string ) {
72
- const imports = parseImports ( importString1 , importString2 ) ;
73
- assertListEqual ( imports , OrganizeImports . sortImports ( imports ) ) ;
74
- assertListEqual ( imports , OrganizeImports . sortImports ( reverse ( imports ) ) ) ;
27
+ const [ { moduleSpecifier : moduleSpecifier1 } , { moduleSpecifier : moduleSpecifier2 } ] = parseImports ( importString1 , importString2 ) ;
28
+ assert . equal ( OrganizeImports . compareModuleSpecifiers ( moduleSpecifier1 , moduleSpecifier2 ) , Comparison . LessThan ) ;
29
+ assert . equal ( OrganizeImports . compareModuleSpecifiers ( moduleSpecifier2 , moduleSpecifier1 ) , Comparison . GreaterThan ) ;
75
30
}
76
31
} ) ;
77
32
@@ -84,7 +39,7 @@ namespace ts {
84
39
const sortedImports = parseImports ( `import { default as m, a as n, b, y, z as o } from "lib";` ) ;
85
40
const actualCoalescedImports = OrganizeImports . coalesceImports ( sortedImports ) ;
86
41
const expectedCoalescedImports = parseImports ( `import { a as n, b, default as m, y, z as o } from "lib";` ) ;
87
- assertListEqual ( expectedCoalescedImports , actualCoalescedImports ) ;
42
+ assertListEqual ( actualCoalescedImports , expectedCoalescedImports ) ;
88
43
} ) ;
89
44
90
45
it ( "Combine side-effect-only imports" , ( ) => {
@@ -93,7 +48,7 @@ namespace ts {
93
48
`import "lib";` ) ;
94
49
const actualCoalescedImports = OrganizeImports . coalesceImports ( sortedImports ) ;
95
50
const expectedCoalescedImports = parseImports ( `import "lib";` ) ;
96
- assertListEqual ( expectedCoalescedImports , actualCoalescedImports ) ;
51
+ assertListEqual ( actualCoalescedImports , expectedCoalescedImports ) ;
97
52
} ) ;
98
53
99
54
it ( "Combine namespace imports" , ( ) => {
@@ -102,7 +57,7 @@ namespace ts {
102
57
`import * as y from "lib";` ) ;
103
58
const actualCoalescedImports = OrganizeImports . coalesceImports ( sortedImports ) ;
104
59
const expectedCoalescedImports = sortedImports ;
105
- assertListEqual ( expectedCoalescedImports , actualCoalescedImports ) ;
60
+ assertListEqual ( actualCoalescedImports , expectedCoalescedImports ) ;
106
61
} ) ;
107
62
108
63
it ( "Combine default imports" , ( ) => {
@@ -111,7 +66,7 @@ namespace ts {
111
66
`import y from "lib";` ) ;
112
67
const actualCoalescedImports = OrganizeImports . coalesceImports ( sortedImports ) ;
113
68
const expectedCoalescedImports = parseImports ( `import { default as x, default as y } from "lib";` ) ;
114
- assertListEqual ( expectedCoalescedImports , actualCoalescedImports ) ;
69
+ assertListEqual ( actualCoalescedImports , expectedCoalescedImports ) ;
115
70
} ) ;
116
71
117
72
it ( "Combine property imports" , ( ) => {
@@ -120,7 +75,7 @@ namespace ts {
120
75
`import { y as z } from "lib";` ) ;
121
76
const actualCoalescedImports = OrganizeImports . coalesceImports ( sortedImports ) ;
122
77
const expectedCoalescedImports = parseImports ( `import { x, y as z } from "lib";` ) ;
123
- assertListEqual ( expectedCoalescedImports , actualCoalescedImports ) ;
78
+ assertListEqual ( actualCoalescedImports , expectedCoalescedImports ) ;
124
79
} ) ;
125
80
126
81
it ( "Combine side-effect-only import with namespace import" , ( ) => {
@@ -129,7 +84,7 @@ namespace ts {
129
84
`import * as x from "lib";` ) ;
130
85
const actualCoalescedImports = OrganizeImports . coalesceImports ( sortedImports ) ;
131
86
const expectedCoalescedImports = sortedImports ;
132
- assertListEqual ( expectedCoalescedImports , actualCoalescedImports ) ;
87
+ assertListEqual ( actualCoalescedImports , expectedCoalescedImports ) ;
133
88
} ) ;
134
89
135
90
it ( "Combine side-effect-only import with default import" , ( ) => {
@@ -138,7 +93,7 @@ namespace ts {
138
93
`import x from "lib";` ) ;
139
94
const actualCoalescedImports = OrganizeImports . coalesceImports ( sortedImports ) ;
140
95
const expectedCoalescedImports = sortedImports ;
141
- assertListEqual ( expectedCoalescedImports , actualCoalescedImports ) ;
96
+ assertListEqual ( actualCoalescedImports , expectedCoalescedImports ) ;
142
97
} ) ;
143
98
144
99
it ( "Combine side-effect-only import with property import" , ( ) => {
@@ -147,7 +102,7 @@ namespace ts {
147
102
`import { x } from "lib";` ) ;
148
103
const actualCoalescedImports = OrganizeImports . coalesceImports ( sortedImports ) ;
149
104
const expectedCoalescedImports = sortedImports ;
150
- assertListEqual ( expectedCoalescedImports , actualCoalescedImports ) ;
105
+ assertListEqual ( actualCoalescedImports , expectedCoalescedImports ) ;
151
106
} ) ;
152
107
153
108
it ( "Combine namespace import with default import" , ( ) => {
@@ -157,7 +112,7 @@ namespace ts {
157
112
const actualCoalescedImports = OrganizeImports . coalesceImports ( sortedImports ) ;
158
113
const expectedCoalescedImports = parseImports (
159
114
`import y, * as x from "lib";` ) ;
160
- assertListEqual ( expectedCoalescedImports , actualCoalescedImports ) ;
115
+ assertListEqual ( actualCoalescedImports , expectedCoalescedImports ) ;
161
116
} ) ;
162
117
163
118
it ( "Combine namespace import with property import" , ( ) => {
@@ -166,7 +121,7 @@ namespace ts {
166
121
`import { y } from "lib";` ) ;
167
122
const actualCoalescedImports = OrganizeImports . coalesceImports ( sortedImports ) ;
168
123
const expectedCoalescedImports = sortedImports ;
169
- assertListEqual ( expectedCoalescedImports , actualCoalescedImports ) ;
124
+ assertListEqual ( actualCoalescedImports , expectedCoalescedImports ) ;
170
125
} ) ;
171
126
172
127
it ( "Combine default import with property import" , ( ) => {
@@ -176,7 +131,7 @@ namespace ts {
176
131
const actualCoalescedImports = OrganizeImports . coalesceImports ( sortedImports ) ;
177
132
const expectedCoalescedImports = parseImports (
178
133
`import x, { y } from "lib";` ) ;
179
- assertListEqual ( expectedCoalescedImports , actualCoalescedImports ) ;
134
+ assertListEqual ( actualCoalescedImports , expectedCoalescedImports ) ;
180
135
} ) ;
181
136
182
137
it ( "Combine many imports" , ( ) => {
@@ -195,20 +150,7 @@ namespace ts {
195
150
`import * as x from "lib";` ,
196
151
`import * as y from "lib";` ,
197
152
`import { a, b, default as w, default as z } from "lib";` ) ;
198
- assertListEqual ( expectedCoalescedImports , actualCoalescedImports ) ;
199
- } ) ;
200
-
201
- it ( "Combine imports from different modules" , ( ) => {
202
- const sortedImports = parseImports (
203
- `import { d } from "lib1";` ,
204
- `import { b } from "lib1";` ,
205
- `import { c } from "lib2";` ,
206
- `import { a } from "lib2";` ) ;
207
- const actualCoalescedImports = OrganizeImports . coalesceImports ( sortedImports ) ;
208
- const expectedCoalescedImports = parseImports (
209
- `import { b, d } from "lib1";` ,
210
- `import { a, c } from "lib2";` ) ;
211
- assertListEqual ( expectedCoalescedImports , actualCoalescedImports ) ;
153
+ assertListEqual ( actualCoalescedImports , expectedCoalescedImports ) ;
212
154
} ) ;
213
155
214
156
// This is descriptive, rather than normative
@@ -219,7 +161,7 @@ namespace ts {
219
161
`import z from "lib";` ) ;
220
162
const actualCoalescedImports = OrganizeImports . coalesceImports ( sortedImports ) ;
221
163
const expectedCoalescedImports = sortedImports ;
222
- assertListEqual ( expectedCoalescedImports , actualCoalescedImports ) ;
164
+ assertListEqual ( actualCoalescedImports , expectedCoalescedImports ) ;
223
165
} ) ;
224
166
} ) ;
225
167
@@ -233,6 +175,17 @@ export default function F2();
233
175
` ,
234
176
} ;
235
177
178
+ // Don't bother to actually emit a baseline for this.
179
+ it ( "NoImports" , ( ) => {
180
+ const testFile = {
181
+ path : "/a.ts" ,
182
+ content : "function F() { }" ,
183
+ } ;
184
+ const languageService = makeLanguageService ( testFile ) ;
185
+ const changes = languageService . organizeImports ( { type : "file" , fileName : testFile . path } , testFormatOptions ) ;
186
+ assert . isEmpty ( changes ) ;
187
+ } ) ;
188
+
236
189
testOrganizeImports ( "Simple" ,
237
190
{
238
191
path : "/test.ts" ,
@@ -283,6 +236,19 @@ D();
283
236
libFile ) ;
284
237
// tslint:enable no-invalid-template-strings
285
238
239
+ testOrganizeImports ( "CoalesceMultipleModules" ,
240
+ {
241
+ path : "/test.ts" ,
242
+ content : `
243
+ import { d } from "lib1";
244
+ import { b } from "lib1";
245
+ import { c } from "lib2";
246
+ import { a } from "lib2";
247
+ ` ,
248
+ } ,
249
+ { path : "/lib1.ts" , content : "" } ,
250
+ { path : "/lib2.ts" , content : "" } ) ;
251
+
286
252
testOrganizeImports ( "CoalesceTrivia" ,
287
253
{
288
254
path : "/test.ts" ,
@@ -315,8 +281,8 @@ F2();
315
281
const { path : testPath , content : testContent } = testFile ;
316
282
const languageService = makeLanguageService ( testFile , ...otherFiles ) ;
317
283
const changes = languageService . organizeImports ( { type : "file" , fileName : testPath } , testFormatOptions ) ;
318
- assert . equal ( 1 , changes . length ) ;
319
- assert . equal ( testPath , changes [ 0 ] . fileName ) ;
284
+ assert . equal ( changes . length , 1 ) ;
285
+ assert . equal ( changes [ 0 ] . fileName , testPath ) ;
320
286
321
287
Harness . Baseline . runBaseline ( baselinePath , ( ) => {
322
288
const newText = textChanges . applyChanges ( testContent , changes [ 0 ] . textChanges ) ;
@@ -340,7 +306,7 @@ F2();
340
306
function parseImports ( ...importStrings : string [ ] ) : ReadonlyArray < ImportDeclaration > {
341
307
const sourceFile = createSourceFile ( "a.ts" , importStrings . join ( "\n" ) , ScriptTarget . ES2015 , /*setParentNodes*/ true , ScriptKind . TS ) ;
342
308
const imports = filter ( sourceFile . statements , isImportDeclaration ) ;
343
- assert . equal ( importStrings . length , imports . length ) ;
309
+ assert . equal ( imports . length , importStrings . length ) ;
344
310
return imports ;
345
311
}
346
312
@@ -414,13 +380,5 @@ F2();
414
380
assertEqual ( list1 [ i ] , list2 [ i ] ) ;
415
381
}
416
382
}
417
-
418
- function reverse < T > ( list : ReadonlyArray < T > ) {
419
- const result = [ ] ;
420
- for ( let i = list . length - 1 ; i >= 0 ; i -- ) {
421
- result . push ( list [ i ] ) ;
422
- }
423
- return result ;
424
- }
425
383
} ) ;
426
384
}
0 commit comments