143 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			143 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @license
							 | 
						||
| 
								 | 
							
								 * Copyright Google LLC All Rights Reserved.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Use of this source code is governed by an MIT-style license that can be
							 | 
						||
| 
								 | 
							
								 * found in the LICENSE file at https://angular.io/license
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import {initMockFileSystem} from '@angular/compiler-cli/src/ngtsc/file_system/testing';
							 | 
						||
| 
								 | 
							
								import {getText} from '@angular/language-service/ivy/testing/src/util';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import {LanguageServiceTestEnv, OpenBuffer} from '../testing';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								describe('signature help', () => {
							 | 
						||
| 
								 | 
							
								  beforeEach(() => {
							 | 
						||
| 
								 | 
							
								    initMockFileSystem('Native');
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  it('should handle an empty argument list', () => {
							 | 
						||
| 
								 | 
							
								    const main = setup(`
							 | 
						||
| 
								 | 
							
								      import {Component} from '@angular/core';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      @Component({
							 | 
						||
| 
								 | 
							
								        template: '{{ foo() }}',
							 | 
						||
| 
								 | 
							
								      })
							 | 
						||
| 
								 | 
							
								      export class MainCmp {
							 | 
						||
| 
								 | 
							
								        foo(alpha: string, beta: number): string {
							 | 
						||
| 
								 | 
							
								          return 'blah';
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    `);
							 | 
						||
| 
								 | 
							
								    main.moveCursorToText('foo(¦)');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    const items = main.getSignatureHelpItems()!;
							 | 
						||
| 
								 | 
							
								    expect(items).toBeDefined();
							 | 
						||
| 
								 | 
							
								    expect(items.applicableSpan.start).toEqual(main.cursor);
							 | 
						||
| 
								 | 
							
								    expect(items.applicableSpan.length).toEqual(0);
							 | 
						||
| 
								 | 
							
								    expect(items.argumentCount).toEqual(0);
							 | 
						||
| 
								 | 
							
								    expect(items.argumentIndex).toEqual(0);
							 | 
						||
| 
								 | 
							
								    expect(items.items.length).toEqual(1);
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  it('should handle a single argument', () => {
							 | 
						||
| 
								 | 
							
								    const main = setup(`
							 | 
						||
| 
								 | 
							
								      import {Component} from '@angular/core';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      @Component({
							 | 
						||
| 
								 | 
							
								        template: '{{ foo("test") }}',
							 | 
						||
| 
								 | 
							
								      })
							 | 
						||
| 
								 | 
							
								      export class MainCmp {
							 | 
						||
| 
								 | 
							
								        foo(alpha: string, beta: number): string {
							 | 
						||
| 
								 | 
							
								          return 'blah';
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    `);
							 | 
						||
| 
								 | 
							
								    main.moveCursorToText('foo("test"¦)');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    const items = main.getSignatureHelpItems()!;
							 | 
						||
| 
								 | 
							
								    expect(items).toBeDefined();
							 | 
						||
| 
								 | 
							
								    expect(getText(main.contents, items.applicableSpan)).toEqual('"test"');
							 | 
						||
| 
								 | 
							
								    expect(items.argumentCount).toEqual(1);
							 | 
						||
| 
								 | 
							
								    expect(items.argumentIndex).toEqual(0);
							 | 
						||
| 
								 | 
							
								    expect(items.items.length).toEqual(1);
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  it('should handle a position within the first of two arguments', () => {
							 | 
						||
| 
								 | 
							
								    const main = setup(`
							 | 
						||
| 
								 | 
							
								      import {Component} from '@angular/core';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      @Component({
							 | 
						||
| 
								 | 
							
								        template: '{{ foo("test", 3) }}',
							 | 
						||
| 
								 | 
							
								      })
							 | 
						||
| 
								 | 
							
								      export class MainCmp {
							 | 
						||
| 
								 | 
							
								        foo(alpha: string, beta: number): string {
							 | 
						||
| 
								 | 
							
								          return 'blah';
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    `);
							 | 
						||
| 
								 | 
							
								    main.moveCursorToText('foo("te¦st", 3)');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    const items = main.getSignatureHelpItems()!;
							 | 
						||
| 
								 | 
							
								    expect(items).toBeDefined();
							 | 
						||
| 
								 | 
							
								    expect(getText(main.contents, items.applicableSpan)).toEqual('"test", 3');
							 | 
						||
| 
								 | 
							
								    expect(items.argumentCount).toEqual(2);
							 | 
						||
| 
								 | 
							
								    expect(items.argumentIndex).toEqual(0);
							 | 
						||
| 
								 | 
							
								    expect(items.items.length).toEqual(1);
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  it('should handle a position within the second of two arguments', () => {
							 | 
						||
| 
								 | 
							
								    const main = setup(`
							 | 
						||
| 
								 | 
							
								      import {Component} from '@angular/core';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      @Component({
							 | 
						||
| 
								 | 
							
								        template: '{{ foo("test", 1 + 2) }}',
							 | 
						||
| 
								 | 
							
								      })
							 | 
						||
| 
								 | 
							
								      export class MainCmp {
							 | 
						||
| 
								 | 
							
								        foo(alpha: string, beta: number): string {
							 | 
						||
| 
								 | 
							
								          return 'blah';
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    `);
							 | 
						||
| 
								 | 
							
								    main.moveCursorToText('foo("test", 1 +¦ 2)');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    const items = main.getSignatureHelpItems()!;
							 | 
						||
| 
								 | 
							
								    expect(items).toBeDefined();
							 | 
						||
| 
								 | 
							
								    expect(getText(main.contents, items.applicableSpan)).toEqual('"test", 1 + 2');
							 | 
						||
| 
								 | 
							
								    expect(items.argumentCount).toEqual(2);
							 | 
						||
| 
								 | 
							
								    expect(items.argumentIndex).toEqual(1);
							 | 
						||
| 
								 | 
							
								    expect(items.items.length).toEqual(1);
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  it('should handle a position within a new, EmptyExpr argument', () => {
							 | 
						||
| 
								 | 
							
								    const main = setup(`
							 | 
						||
| 
								 | 
							
								      import {Component} from '@angular/core';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      @Component({
							 | 
						||
| 
								 | 
							
								        template: '{{ foo("test", ) }}',
							 | 
						||
| 
								 | 
							
								      })
							 | 
						||
| 
								 | 
							
								      export class MainCmp {
							 | 
						||
| 
								 | 
							
								        foo(alpha: string, beta: number): string {
							 | 
						||
| 
								 | 
							
								          return 'blah';
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    `);
							 | 
						||
| 
								 | 
							
								    main.moveCursorToText('foo("test", ¦)');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    const items = main.getSignatureHelpItems()!;
							 | 
						||
| 
								 | 
							
								    expect(items).toBeDefined();
							 | 
						||
| 
								 | 
							
								    expect(getText(main.contents, items.applicableSpan)).toEqual('"test", ');
							 | 
						||
| 
								 | 
							
								    expect(items.argumentCount).toEqual(2);
							 | 
						||
| 
								 | 
							
								    expect(items.argumentIndex).toEqual(1);
							 | 
						||
| 
								 | 
							
								    expect(items.items.length).toEqual(1);
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function setup(mainTs: string): OpenBuffer {
							 | 
						||
| 
								 | 
							
								  const env = LanguageServiceTestEnv.setup();
							 | 
						||
| 
								 | 
							
								  const project = env.addProject('test', {
							 | 
						||
| 
								 | 
							
								    'main.ts': mainTs,
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  return project.openFile('main.ts');
							 | 
						||
| 
								 | 
							
								}
							 |