4985267211
In many testing scenarios, there is a common pattern: 1. Overwrite template (inline or external) 2. Find cursor position 3. Call one of language service APIs 4. Inspect spans in result In order to faciliate this pattern, this commit refactors `MockHost.overwrite()` and `MockHost.overwriteInlineTemplate()` to allow a faux cursor symbol `¦` to be injected into the template, and the methods will automatically remove it before updating the script snapshot. Both methods will return the cursor position and the new text without the cursor symbol. This makes testing very convenient. Here's a typical example: ```ts const {position, text} = mockHost.overwrite('template.html', `{{ ti¦tle }}`); const quickInfo = ngLS.getQuickInfoAtPosition('template.html', position); const {start, length} = quickInfo!.textSpan; expect(text.substring(start, start + length)).toBe('title'); ``` PR Close #38552
39 lines
1.2 KiB
TypeScript
39 lines
1.2 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 * as ts from 'typescript/lib/tsserverlibrary';
|
|
|
|
import {LanguageService} from '../language_service';
|
|
|
|
import {APP_COMPONENT, setup} from './mock_host';
|
|
|
|
describe('diagnostic', () => {
|
|
const {project, service, tsLS} = setup();
|
|
const ngLS = new LanguageService(project, tsLS);
|
|
|
|
beforeEach(() => {
|
|
service.reset();
|
|
});
|
|
|
|
it('should not produce error for AppComponent', () => {
|
|
const diags = ngLS.getSemanticDiagnostics(APP_COMPONENT);
|
|
expect(diags).toEqual([]);
|
|
});
|
|
|
|
it('should report member does not exist', () => {
|
|
const {text} = service.overwriteInlineTemplate(APP_COMPONENT, '{{ nope }}');
|
|
const diags = ngLS.getSemanticDiagnostics(APP_COMPONENT);
|
|
expect(diags.length).toBe(1);
|
|
const {category, file, start, length, messageText} = diags[0];
|
|
expect(category).toBe(ts.DiagnosticCategory.Error);
|
|
expect(file?.fileName).toBe(APP_COMPONENT);
|
|
expect(text.substring(start!, start! + length!)).toBe('nope');
|
|
expect(messageText).toBe(`Property 'nope' does not exist on type 'AppComponent'.`);
|
|
});
|
|
});
|