refactor(language-service): remove callback functions in test code (#32656)
Removes `addCodeAndCallback` function, opting instead to add code to a file and then testing expectations on that fileName. Also renames `contains` to `expectContains` to clarify its expectations. PR Close #32656
This commit is contained in:
		
							parent
							
								
									bbb2798d41
								
							
						
					
					
						commit
						c7ea3260bc
					
				| @ -21,24 +21,24 @@ describe('completions', () => { | |||||||
|   let ngService = createLanguageService(ngHost); |   let ngService = createLanguageService(ngHost); | ||||||
| 
 | 
 | ||||||
|   it('should be able to get entity completions', |   it('should be able to get entity completions', | ||||||
|      () => { contains('/app/test.ng', 'entity-amp', '&', '>', '<', 'ι'); }); |      () => { expectContains('/app/test.ng', 'entity-amp', '&', '>', '<', 'ι'); }); | ||||||
| 
 | 
 | ||||||
|   it('should be able to return html elements', () => { |   it('should be able to return html elements', () => { | ||||||
|     let htmlTags = ['h1', 'h2', 'div', 'span']; |     let htmlTags = ['h1', 'h2', 'div', 'span']; | ||||||
|     let locations = ['empty', 'start-tag-h1', 'h1-content', 'start-tag', 'start-tag-after-h']; |     let locations = ['empty', 'start-tag-h1', 'h1-content', 'start-tag', 'start-tag-after-h']; | ||||||
|     for (let location of locations) { |     for (let location of locations) { | ||||||
|       contains('/app/test.ng', location, ...htmlTags); |       expectContains('/app/test.ng', location, ...htmlTags); | ||||||
|     } |     } | ||||||
|   }); |   }); | ||||||
| 
 | 
 | ||||||
|   it('should be able to return element diretives', |   it('should be able to return element diretives', | ||||||
|      () => { contains('/app/test.ng', 'empty', 'my-app'); }); |      () => { expectContains('/app/test.ng', 'empty', 'my-app'); }); | ||||||
| 
 | 
 | ||||||
|   it('should be able to return h1 attributes', |   it('should be able to return h1 attributes', | ||||||
|      () => { contains('/app/test.ng', 'h1-after-space', 'id', 'dir', 'lang', 'onclick'); }); |      () => { expectContains('/app/test.ng', 'h1-after-space', 'id', 'dir', 'lang', 'onclick'); }); | ||||||
| 
 | 
 | ||||||
|   it('should be able to find common angular attributes', |   it('should be able to find common angular attributes', | ||||||
|      () => { contains('/app/test.ng', 'div-attributes', '(click)', '[ngClass]'); }); |      () => { expectContains('/app/test.ng', 'div-attributes', '(click)', '[ngClass]'); }); | ||||||
| 
 | 
 | ||||||
|   it('should be able to get completions in some random garbage', () => { |   it('should be able to get completions in some random garbage', () => { | ||||||
|     const fileName = '/app/test.ng'; |     const fileName = '/app/test.ng'; | ||||||
| @ -48,8 +48,7 @@ describe('completions', () => { | |||||||
|   }); |   }); | ||||||
| 
 | 
 | ||||||
|   it('should be able to infer the type of a ngForOf', () => { |   it('should be able to infer the type of a ngForOf', () => { | ||||||
|     addCodeAndCallback( |     const fileName = mockHost.addCode(` | ||||||
|         ` |  | ||||||
|       interface Person { |       interface Person { | ||||||
|         name: string, |         name: string, | ||||||
|         street: string |         street: string | ||||||
| @ -58,13 +57,12 @@ describe('completions', () => { | |||||||
|       @Component({template: '<div *ngFor="let person of people">{{person.~{name}name}}</div'}) |       @Component({template: '<div *ngFor="let person of people">{{person.~{name}name}}</div'}) | ||||||
|       export class MyComponent { |       export class MyComponent { | ||||||
|         people: Person[] |         people: Person[] | ||||||
|       }`,
 |       }`);
 | ||||||
|         () => { contains('/app/app.component.ts', 'name', 'name', 'street'); }); |     expectContains(fileName, 'name', 'name', 'street'); | ||||||
|   }); |   }); | ||||||
| 
 | 
 | ||||||
|   it('should be able to infer the type of a ngForOf with an async pipe', () => { |   it('should be able to infer the type of a ngForOf with an async pipe', () => { | ||||||
|     addCodeAndCallback( |     const fileName = mockHost.addCode(` | ||||||
|         ` |  | ||||||
|       interface Person { |       interface Person { | ||||||
|         name: string, |         name: string, | ||||||
|         street: string |         street: string | ||||||
| @ -73,8 +71,8 @@ describe('completions', () => { | |||||||
|       @Component({template: '<div *ngFor="let person of people | async">{{person.~{name}name}}</div'}) |       @Component({template: '<div *ngFor="let person of people | async">{{person.~{name}name}}</div'}) | ||||||
|       export class MyComponent { |       export class MyComponent { | ||||||
|         people: Promise<Person[]>; |         people: Promise<Person[]>; | ||||||
|       }`,
 |       }`);
 | ||||||
|         () => { contains('/app/app.component.ts', 'name', 'name', 'street'); }); |     expectContains(fileName, 'name', 'name', 'street'); | ||||||
|   }); |   }); | ||||||
| 
 | 
 | ||||||
|   it('should be able to complete every character in the file', () => { |   it('should be able to complete every character in the file', () => { | ||||||
| @ -135,20 +133,22 @@ describe('completions', () => { | |||||||
|   describe('with regression tests', () => { |   describe('with regression tests', () => { | ||||||
|     it('should not crash with an incomplete component', () => { |     it('should not crash with an incomplete component', () => { | ||||||
|       expect(() => { |       expect(() => { | ||||||
|         const code = ` |         const fileName = mockHost.addCode(` | ||||||
| @Component({ |           @Component({ | ||||||
|   template: '~{inside-template}' |             template: '~{inside-template}' | ||||||
| }) |           }) | ||||||
| export class MyComponent { |           export class MyComponent { | ||||||
|  |            | ||||||
|  |           }`);
 | ||||||
| 
 | 
 | ||||||
| }`;
 |         expectContains(fileName, 'inside-template', 'h1'); | ||||||
|         addCodeAndCallback(code, fileName => { contains(fileName, 'inside-template', 'h1'); }); |  | ||||||
|       }).not.toThrow(); |       }).not.toThrow(); | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|     it('should hot crash with an incomplete class', () => { |     it('should hot crash with an incomplete class', () => { | ||||||
|       expect(() => { |       expect(() => { | ||||||
|         addCodeAndCallback('\nexport class', fileName => { ngHost.getAnalyzedModules(); }); |         mockHost.addCode('\nexport class'); | ||||||
|  |         ngHost.getAnalyzedModules(); | ||||||
|       }).not.toThrow(); |       }).not.toThrow(); | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
| @ -178,12 +178,11 @@ export class MyComponent { | |||||||
|       } |       } | ||||||
|     `);
 |     `);
 | ||||||
|     ngHost.getAnalyzedModules(); |     ngHost.getAnalyzedModules(); | ||||||
|     contains('/app/my.component.ts', 'tree', 'children'); |     expectContains('/app/my.component.ts', 'tree', 'children'); | ||||||
|   }); |   }); | ||||||
| 
 | 
 | ||||||
|   it('should work with input and output', () => { |   it('should work with input and output', () => { | ||||||
|     addCodeAndCallback( |     const fileName = mockHost.addCode(` | ||||||
|         ` |  | ||||||
|       @Component({ |       @Component({ | ||||||
|         selector: 'foo-component', |         selector: 'foo-component', | ||||||
|         template: \` |         template: \` | ||||||
| @ -195,24 +194,12 @@ export class MyComponent { | |||||||
|         text: string; |         text: string; | ||||||
|         value: number; |         value: number; | ||||||
|       } |       } | ||||||
|     `,
 |     `);
 | ||||||
|         (fileName) => { |     expectContains(fileName, 'stringMarker', '[model]', '(model)'); | ||||||
|           contains(fileName, 'stringMarker', '[model]', '(model)'); |     expectContains(fileName, 'numberMarker', '[inputAlias]', '(outputAlias)'); | ||||||
|           contains(fileName, 'numberMarker', '[inputAlias]', '(outputAlias)'); |  | ||||||
|         }); |  | ||||||
|   }); |   }); | ||||||
| 
 | 
 | ||||||
|   function addCodeAndCallback(code: string, cb: (fileName: string, content?: string) => void) { |   function expectContains(fileName: string, locationMarker: string, ...names: string[]) { | ||||||
|     const fileName = mockHost.addCode(code); |  | ||||||
|     ngHost.getAnalyzedModules(); |  | ||||||
|     try { |  | ||||||
|       cb(fileName, mockHost.getFileContent(fileName) !); |  | ||||||
|     } finally { |  | ||||||
|       mockHost.override(fileName, undefined !); |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   function contains(fileName: string, locationMarker: string, ...names: string[]) { |  | ||||||
|     let location = mockHost.getMarkerLocations(fileName) ![locationMarker]; |     let location = mockHost.getMarkerLocations(fileName) ![locationMarker]; | ||||||
|     if (location == null) { |     if (location == null) { | ||||||
|       throw new Error(`No marker ${locationMarker} found.`); |       throw new Error(`No marker ${locationMarker} found.`); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user