153 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			153 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
/**
 | 
						|
 * @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 {setup} from '@angular/compiler/test/aot/test_util';
 | 
						|
import {compile, expectEmit} from './mock_compile';
 | 
						|
 | 
						|
describe('compiler compliance: providers', () => {
 | 
						|
  const angularFiles = setup({
 | 
						|
    compileAngular: false,
 | 
						|
    compileFakeCore: true,
 | 
						|
    compileAnimations: false,
 | 
						|
  });
 | 
						|
 | 
						|
  it('should emit the ProvidersFeature feature when providers and viewProviders', () => {
 | 
						|
    const files = {
 | 
						|
      app: {
 | 
						|
        'spec.ts': `
 | 
						|
              import {Component, NgModule} from '@angular/core';
 | 
						|
 | 
						|
              abstract class Greeter { abstract greet(): string; }
 | 
						|
 | 
						|
              class GreeterEN implements Greeter {
 | 
						|
                greet() { return 'Hi'; }
 | 
						|
              }
 | 
						|
 | 
						|
              @Component({
 | 
						|
                selector: 'my-component',
 | 
						|
                template: '<div></div>',
 | 
						|
                providers: [GreeterEN, {provide: Greeter, useClass: GreeterEN}],
 | 
						|
                viewProviders: [GreeterEN]
 | 
						|
              })
 | 
						|
              export class MyComponent {
 | 
						|
              }
 | 
						|
 | 
						|
              @NgModule({declarations: [MyComponent]})
 | 
						|
              export class MyModule {}
 | 
						|
          `
 | 
						|
      }
 | 
						|
    };
 | 
						|
 | 
						|
    const result = compile(files, angularFiles);
 | 
						|
    expectEmit(
 | 
						|
        result.source,
 | 
						|
        'features: [i0.ɵProvidersFeature([GreeterEN, {provide: Greeter, useClass: GreeterEN}], [GreeterEN])],',
 | 
						|
        'Incorrect features');
 | 
						|
  });
 | 
						|
 | 
						|
  it('should emit the ProvidersFeature feature when providers only', () => {
 | 
						|
    const files = {
 | 
						|
      app: {
 | 
						|
        'spec.ts': `
 | 
						|
              import {Component, NgModule} from '@angular/core';
 | 
						|
 | 
						|
              abstract class Greeter { abstract greet(): string; }
 | 
						|
 | 
						|
              class GreeterEN implements Greeter {
 | 
						|
                greet() { return 'Hi'; }
 | 
						|
              }
 | 
						|
 | 
						|
              @Component({
 | 
						|
                selector: 'my-component',
 | 
						|
                template: '<div></div>',
 | 
						|
                providers: [GreeterEN, {provide: Greeter, useClass: GreeterEN}]
 | 
						|
              })
 | 
						|
              export class MyComponent {
 | 
						|
              }
 | 
						|
 | 
						|
              @NgModule({declarations: [MyComponent]})
 | 
						|
              export class MyModule {}
 | 
						|
          `
 | 
						|
      }
 | 
						|
    };
 | 
						|
 | 
						|
    const result = compile(files, angularFiles);
 | 
						|
    expectEmit(
 | 
						|
        result.source,
 | 
						|
        'features: [i0.ɵProvidersFeature([GreeterEN, {provide: Greeter, useClass: GreeterEN}])],',
 | 
						|
        'Incorrect features');
 | 
						|
  });
 | 
						|
 | 
						|
  it('should emit the ProvidersFeature feature when viewProviders only', () => {
 | 
						|
    const files = {
 | 
						|
      app: {
 | 
						|
        'spec.ts': `
 | 
						|
              import {Component, NgModule} from '@angular/core';
 | 
						|
 | 
						|
              abstract class Greeter { abstract greet(): string; }
 | 
						|
 | 
						|
              class GreeterEN implements Greeter {
 | 
						|
                greet() { return 'Hi'; }
 | 
						|
              }
 | 
						|
 | 
						|
              @Component({
 | 
						|
                selector: 'my-component',
 | 
						|
                template: '<div></div>',
 | 
						|
                viewProviders: [GreeterEN]
 | 
						|
              })
 | 
						|
              export class MyComponent {
 | 
						|
              }
 | 
						|
 | 
						|
              @NgModule({declarations: [MyComponent]})
 | 
						|
              export class MyModule {}
 | 
						|
          `
 | 
						|
      }
 | 
						|
    };
 | 
						|
 | 
						|
    const result = compile(files, angularFiles);
 | 
						|
    expectEmit(
 | 
						|
        result.source, 'features: [i0.ɵProvidersFeature([], [GreeterEN])],', 'Incorrect features');
 | 
						|
  });
 | 
						|
 | 
						|
  it('should not emit the ProvidersFeature feature when no providers', () => {
 | 
						|
    const files = {
 | 
						|
      app: {
 | 
						|
        'spec.ts': `
 | 
						|
              import {Component, NgModule} from '@angular/core';
 | 
						|
 | 
						|
              abstract class Greeter { abstract greet(): string; }
 | 
						|
 | 
						|
              class GreeterEN implements Greeter {
 | 
						|
                greet() { return 'Hi'; }
 | 
						|
              }
 | 
						|
 | 
						|
              @Component({
 | 
						|
                selector: 'my-component',
 | 
						|
                template: '<div></div>'
 | 
						|
              })
 | 
						|
              export class MyComponent {
 | 
						|
              }
 | 
						|
 | 
						|
              @NgModule({declarations: [MyComponent]})
 | 
						|
              export class MyModule {}
 | 
						|
          `
 | 
						|
      }
 | 
						|
    };
 | 
						|
 | 
						|
    const result = compile(files, angularFiles);
 | 
						|
    expectEmit(
 | 
						|
        result.source, `
 | 
						|
    export class MyComponent {
 | 
						|
    }
 | 
						|
    MyComponent.ngComponentDef = i0.ɵdefineComponent({ type: MyComponent, selectors: [["my-component"]], factory: function MyComponent_Factory(t) { return new (t || MyComponent)(); }, consts: 1, vars: 0, template: function MyComponent_Template(rf, ctx) { if (rf & 1) {
 | 
						|
            i0.ɵelement(0, "div");
 | 
						|
        } } });`,
 | 
						|
        'Incorrect features');
 | 
						|
  });
 | 
						|
});
 |