/** * @license * Copyright Google Inc. 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'; import {getClassDeclFromDecoratorProp} from '../src/template'; import {MockTypescriptHost} from './test_utils'; describe('getClassDeclFromTemplateNode', () => { it('should find class declaration in syntax-only mode', () => { const sourceFile = ts.createSourceFile( 'foo.ts', ` @Component({ template: '
' }) class MyComponent {}`, ts.ScriptTarget.ES2015, true /* setParentNodes */); function visit(node: ts.Node): ts.ClassDeclaration|undefined { if (ts.isPropertyAssignment(node)) { return getClassDeclFromDecoratorProp(node); } return node.forEachChild(visit); } const classDecl = sourceFile.forEachChild(visit); expect(classDecl).toBeTruthy(); expect(classDecl!.kind).toBe(ts.SyntaxKind.ClassDeclaration); expect((classDecl as ts.ClassDeclaration).name!.text).toBe('MyComponent'); }); it('should return class declaration for AppComponent', () => { const host = new MockTypescriptHost(['/app/app.component.ts']); const tsLS = ts.createLanguageService(host); const sourceFile = tsLS.getProgram()!.getSourceFile('/app/app.component.ts'); expect(sourceFile).toBeTruthy(); const classDecl = sourceFile!.forEachChild(function visit(node): ts.Node|undefined { if (ts.isPropertyAssignment(node)) { return getClassDeclFromDecoratorProp(node); } return node.forEachChild(visit); }); expect(classDecl).toBeTruthy(); expect(ts.isClassDeclaration(classDecl!)).toBe(true); expect((classDecl as ts.ClassDeclaration).name!.text).toBe('AppComponent'); }); });