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');
|
|
}
|