From 7695dbd0bdadc6a5e2abcbf944c009729ac28062 Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Tue, 13 Nov 2018 11:51:02 +0100 Subject: [PATCH] test(ivy): run common tests with ivy on ci (#27071) PR Close #27071 --- packages/common/test/BUILD.bazel | 7 +- packages/common/test/common_module_spec.ts | 25 +- .../directives/ng_component_outlet_spec.ts | 293 +++++++------- .../directives/ng_template_outlet_spec.ts | 381 +++++++++--------- .../common/test/i18n/localization_spec.ts | 4 +- .../common/test/location/location_spec.ts | 50 ++- .../common/test/pipes/keyvalue_pipe_spec.ts | 9 +- 7 files changed, 378 insertions(+), 391 deletions(-) diff --git a/packages/common/test/BUILD.bazel b/packages/common/test/BUILD.bazel index d550182039..3a7c7cf38f 100644 --- a/packages/common/test/BUILD.bazel +++ b/packages/common/test/BUILD.bazel @@ -15,15 +15,13 @@ ts_library( "//packages/platform-browser", "//packages/platform-browser-dynamic", "//packages/platform-browser/testing", + "//packages/private/testing", ], ) jasmine_node_test( name = "test", bootstrap = ["angular/tools/testing/init_node_spec.js"], - tags = [ - "fixme-ivy-aot", - ], deps = [ ":test_lib", "//tools/testing:node", @@ -32,9 +30,6 @@ jasmine_node_test( ts_web_test_suite( name = "test_web", - tags = [ - "fixme-ivy-aot", - ], deps = [ ":test_lib", ], diff --git a/packages/common/test/common_module_spec.ts b/packages/common/test/common_module_spec.ts index be40f6722f..773df8a328 100644 --- a/packages/common/test/common_module_spec.ts +++ b/packages/common/test/common_module_spec.ts @@ -7,20 +7,17 @@ */ +import {DeprecatedI18NPipesModule, Plural} from '@angular/common'; +import {DEPRECATED_PLURAL_FN, getPluralCase} from '@angular/common/src/i18n/localization'; import {TestBed, inject} from '@angular/core/testing'; -import {DeprecatedI18NPipesModule} from '../src/common_module'; -import {Plural} from '../src/i18n/locale_data_api'; -import {DEPRECATED_PLURAL_FN, getPluralCase} from '../src/i18n/localization'; -{ - describe('DeprecatedI18NPipesModule', () => { - beforeEach(() => { TestBed.configureTestingModule({imports: [DeprecatedI18NPipesModule]}); }); +describe('DeprecatedI18NPipesModule', () => { + beforeEach(() => { TestBed.configureTestingModule({imports: [DeprecatedI18NPipesModule]}); }); - it('should define the token DEPRECATED_PLURAL_FN', - inject( - [DEPRECATED_PLURAL_FN], - (injectedGetPluralCase?: (locale: string, value: number | string) => Plural) => { - expect(injectedGetPluralCase).toEqual(getPluralCase); - })); - }); -} + it('should define the token DEPRECATED_PLURAL_FN', + inject( + [DEPRECATED_PLURAL_FN], + (injectedGetPluralCase?: (locale: string, value: number | string) => Plural) => { + expect(injectedGetPluralCase).toEqual(getPluralCase); + })); +}); diff --git a/packages/common/test/directives/ng_component_outlet_spec.ts b/packages/common/test/directives/ng_component_outlet_spec.ts index 39f0b3d317..4b59d8b4d1 100644 --- a/packages/common/test/directives/ng_component_outlet_spec.ts +++ b/packages/common/test/directives/ng_component_outlet_spec.ts @@ -8,206 +8,211 @@ import {CommonModule} from '@angular/common'; import {NgComponentOutlet} from '@angular/common/src/directives/ng_component_outlet'; -import {Compiler, Component, ComponentRef, Inject, InjectionToken, Injector, NO_ERRORS_SCHEMA, NgModule, NgModuleFactory, Optional, QueryList, StaticProvider, TemplateRef, Type, ViewChild, ViewChildren, ViewContainerRef} from '@angular/core'; -import {TestBed, async, fakeAsync} from '@angular/core/testing'; +import {Compiler, Component, ComponentRef, Inject, InjectionToken, Injector, NO_ERRORS_SCHEMA, NgModule, NgModuleFactory, Optional, QueryList, TemplateRef, Type, ViewChild, ViewChildren, ViewContainerRef} from '@angular/core'; +import {TestBed, async} from '@angular/core/testing'; import {expect} from '@angular/platform-browser/testing/src/matchers'; +import {fixmeIvy} from '@angular/private/testing'; -{ - describe('insert/remove', () => { +describe('insert/remove', () => { - beforeEach(() => { TestBed.configureTestingModule({imports: [TestModule]}); }); + beforeEach(() => { TestBed.configureTestingModule({imports: [TestModule]}); }); - it('should do nothing if component is null', async(() => { - const template = ``; - TestBed.overrideComponent(TestComponent, {set: {template: template}}); - let fixture = TestBed.createComponent(TestComponent); + it('should do nothing if component is null', async(() => { + const template = ``; + TestBed.overrideComponent(TestComponent, {set: {template: template}}); + let fixture = TestBed.createComponent(TestComponent); - fixture.componentInstance.currentComponent = null; - fixture.detectChanges(); + fixture.componentInstance.currentComponent = null; + fixture.detectChanges(); - expect(fixture.nativeElement).toHaveText(''); - })); + expect(fixture.nativeElement).toHaveText(''); + })); - it('should insert content specified by a component', async(() => { - let fixture = TestBed.createComponent(TestComponent); + it('should insert content specified by a component', async(() => { + let fixture = TestBed.createComponent(TestComponent); - fixture.detectChanges(); - expect(fixture.nativeElement).toHaveText(''); + fixture.detectChanges(); + expect(fixture.nativeElement).toHaveText(''); - fixture.componentInstance.currentComponent = InjectedComponent; + fixture.componentInstance.currentComponent = InjectedComponent; - fixture.detectChanges(); - expect(fixture.nativeElement).toHaveText('foo'); - })); + fixture.detectChanges(); + expect(fixture.nativeElement).toHaveText('foo'); + })); - it('should emit a ComponentRef once a component was created', async(() => { - let fixture = TestBed.createComponent(TestComponent); + it('should emit a ComponentRef once a component was created', async(() => { + let fixture = TestBed.createComponent(TestComponent); - fixture.detectChanges(); - expect(fixture.nativeElement).toHaveText(''); + fixture.detectChanges(); + expect(fixture.nativeElement).toHaveText(''); - fixture.componentInstance.cmpRef = null; - fixture.componentInstance.currentComponent = InjectedComponent; + fixture.componentInstance.cmpRef = null; + fixture.componentInstance.currentComponent = InjectedComponent; - fixture.detectChanges(); - expect(fixture.nativeElement).toHaveText('foo'); - expect(fixture.componentInstance.cmpRef).toBeAnInstanceOf(ComponentRef); - expect(fixture.componentInstance.cmpRef !.instance).toBeAnInstanceOf(InjectedComponent); - })); + fixture.detectChanges(); + expect(fixture.nativeElement).toHaveText('foo'); + expect(fixture.componentInstance.cmpRef).toBeAnInstanceOf(ComponentRef); + expect(fixture.componentInstance.cmpRef !.instance).toBeAnInstanceOf(InjectedComponent); + })); - it('should clear view if component becomes null', async(() => { - let fixture = TestBed.createComponent(TestComponent); + it('should clear view if component becomes null', async(() => { + let fixture = TestBed.createComponent(TestComponent); - fixture.detectChanges(); - expect(fixture.nativeElement).toHaveText(''); + fixture.detectChanges(); + expect(fixture.nativeElement).toHaveText(''); - fixture.componentInstance.currentComponent = InjectedComponent; + fixture.componentInstance.currentComponent = InjectedComponent; - fixture.detectChanges(); - expect(fixture.nativeElement).toHaveText('foo'); + fixture.detectChanges(); + expect(fixture.nativeElement).toHaveText('foo'); - fixture.componentInstance.currentComponent = null; + fixture.componentInstance.currentComponent = null; - fixture.detectChanges(); - expect(fixture.nativeElement).toHaveText(''); - })); + fixture.detectChanges(); + expect(fixture.nativeElement).toHaveText(''); + })); - it('should swap content if component changes', async(() => { - let fixture = TestBed.createComponent(TestComponent); + it('should swap content if component changes', async(() => { + let fixture = TestBed.createComponent(TestComponent); - fixture.detectChanges(); - expect(fixture.nativeElement).toHaveText(''); + fixture.detectChanges(); + expect(fixture.nativeElement).toHaveText(''); - fixture.componentInstance.currentComponent = InjectedComponent; + fixture.componentInstance.currentComponent = InjectedComponent; - fixture.detectChanges(); - expect(fixture.nativeElement).toHaveText('foo'); + fixture.detectChanges(); + expect(fixture.nativeElement).toHaveText('foo'); - fixture.componentInstance.currentComponent = InjectedComponentAgain; + fixture.componentInstance.currentComponent = InjectedComponentAgain; - fixture.detectChanges(); - expect(fixture.nativeElement).toHaveText('bar'); - })); + fixture.detectChanges(); + expect(fixture.nativeElement).toHaveText('bar'); + })); - it('should use the injector, if one supplied', async(() => { - let fixture = TestBed.createComponent(TestComponent); + fixmeIvy('ComponentFactoryResolver not resolved with supplied injector') && + it('should use the injector, if one supplied', async(() => { + let fixture = TestBed.createComponent(TestComponent); - const uniqueValue = {}; - fixture.componentInstance.currentComponent = InjectedComponent; - fixture.componentInstance.injector = Injector.create( - [{provide: TEST_TOKEN, useValue: uniqueValue}], fixture.componentRef.injector); + const uniqueValue = {}; + fixture.componentInstance.currentComponent = InjectedComponent; + fixture.componentInstance.injector = Injector.create( + [{provide: TEST_TOKEN, useValue: uniqueValue}], fixture.componentRef.injector); - fixture.detectChanges(); - let cmpRef: ComponentRef = fixture.componentInstance.cmpRef !; - expect(cmpRef).toBeAnInstanceOf(ComponentRef); - expect(cmpRef.instance).toBeAnInstanceOf(InjectedComponent); - expect(cmpRef.instance.testToken).toBe(uniqueValue); + fixture.detectChanges(); + let cmpRef: ComponentRef = fixture.componentInstance.cmpRef !; + expect(cmpRef).toBeAnInstanceOf(ComponentRef); + expect(cmpRef.instance).toBeAnInstanceOf(InjectedComponent); + expect(cmpRef.instance.testToken).toBe(uniqueValue); - })); + })); - it('should resolve a with injector', async(() => { - let fixture = TestBed.createComponent(TestComponent); + it('should resolve a with injector', async(() => { + let fixture = TestBed.createComponent(TestComponent); - fixture.componentInstance.cmpRef = null; - fixture.componentInstance.currentComponent = InjectedComponent; - fixture.detectChanges(); - let cmpRef: ComponentRef = fixture.componentInstance.cmpRef !; - expect(cmpRef).toBeAnInstanceOf(ComponentRef); - expect(cmpRef.instance).toBeAnInstanceOf(InjectedComponent); - expect(cmpRef.instance.testToken).toBeNull(); - })); + fixture.componentInstance.cmpRef = null; + fixture.componentInstance.currentComponent = InjectedComponent; + fixture.detectChanges(); + let cmpRef: ComponentRef = fixture.componentInstance.cmpRef !; + expect(cmpRef).toBeAnInstanceOf(ComponentRef); + expect(cmpRef.instance).toBeAnInstanceOf(InjectedComponent); + expect(cmpRef.instance.testToken).toBeNull(); + })); - it('should render projectable nodes, if supplied', async(() => { - const template = `projected foo${TEST_CMP_TEMPLATE}`; - TestBed.overrideComponent(TestComponent, {set: {template: template}}) - .configureTestingModule({schemas: [NO_ERRORS_SCHEMA]}); + fixmeIvy('can not pass projectable nodes') && + it('should render projectable nodes, if supplied', async(() => { + const template = `projected foo${TEST_CMP_TEMPLATE}`; + TestBed.overrideComponent(TestComponent, {set: {template: template}}) + .configureTestingModule({schemas: [NO_ERRORS_SCHEMA]}); - TestBed - .overrideComponent(InjectedComponent, {set: {template: ``}}) - .configureTestingModule({schemas: [NO_ERRORS_SCHEMA]}); + TestBed + .overrideComponent(InjectedComponent, {set: {template: ``}}) + .configureTestingModule({schemas: [NO_ERRORS_SCHEMA]}); - let fixture = TestBed.createComponent(TestComponent); + let fixture = TestBed.createComponent(TestComponent); - fixture.detectChanges(); - expect(fixture.nativeElement).toHaveText(''); + fixture.detectChanges(); + expect(fixture.nativeElement).toHaveText(''); - fixture.componentInstance.currentComponent = InjectedComponent; - fixture.componentInstance.projectables = - [fixture.componentInstance.vcRef - .createEmbeddedView(fixture.componentInstance.tplRefs.first) - .rootNodes]; + fixture.componentInstance.currentComponent = InjectedComponent; + fixture.componentInstance.projectables = + [fixture.componentInstance.vcRef + .createEmbeddedView(fixture.componentInstance.tplRefs.first) + .rootNodes]; - fixture.detectChanges(); - expect(fixture.nativeElement).toHaveText('projected foo'); - })); + fixture.detectChanges(); + expect(fixture.nativeElement).toHaveText('projected foo'); + })); - it('should resolve components from other modules, if supplied', async(() => { - const compiler = TestBed.get(Compiler) as Compiler; - let fixture = TestBed.createComponent(TestComponent); + fixmeIvy('Runtime compiler is not loaded') && + it('should resolve components from other modules, if supplied', async(() => { + const compiler = TestBed.get(Compiler) as Compiler; + let fixture = TestBed.createComponent(TestComponent); - fixture.detectChanges(); - expect(fixture.nativeElement).toHaveText(''); + fixture.detectChanges(); + expect(fixture.nativeElement).toHaveText(''); - fixture.componentInstance.module = compiler.compileModuleSync(TestModule2); - fixture.componentInstance.currentComponent = Module2InjectedComponent; + fixture.componentInstance.module = compiler.compileModuleSync(TestModule2); + fixture.componentInstance.currentComponent = Module2InjectedComponent; - fixture.detectChanges(); - expect(fixture.nativeElement).toHaveText('baz'); - })); + fixture.detectChanges(); + expect(fixture.nativeElement).toHaveText('baz'); + })); - it('should clean up moduleRef, if supplied', async(() => { - let destroyed = false; - const compiler = TestBed.get(Compiler) as Compiler; - const fixture = TestBed.createComponent(TestComponent); - fixture.componentInstance.module = compiler.compileModuleSync(TestModule2); - fixture.componentInstance.currentComponent = Module2InjectedComponent; - fixture.detectChanges(); + fixmeIvy('Runtime compiler is not loaded') && + it('should clean up moduleRef, if supplied', async(() => { + let destroyed = false; + const compiler = TestBed.get(Compiler) as Compiler; + const fixture = TestBed.createComponent(TestComponent); + fixture.componentInstance.module = compiler.compileModuleSync(TestModule2); + fixture.componentInstance.currentComponent = Module2InjectedComponent; + fixture.detectChanges(); - const moduleRef = fixture.componentInstance.ngComponentOutlet['_moduleRef'] !; - spyOn(moduleRef, 'destroy').and.callThrough(); + const moduleRef = fixture.componentInstance.ngComponentOutlet['_moduleRef'] !; + spyOn(moduleRef, 'destroy').and.callThrough(); - expect(moduleRef.destroy).not.toHaveBeenCalled(); - fixture.destroy(); - expect(moduleRef.destroy).toHaveBeenCalled(); - })); + expect(moduleRef.destroy).not.toHaveBeenCalled(); + fixture.destroy(); + expect(moduleRef.destroy).toHaveBeenCalled(); + })); - it('should not re-create moduleRef when it didn\'t actually change', async(() => { - const compiler = TestBed.get(Compiler) as Compiler; - const fixture = TestBed.createComponent(TestComponent); + fixmeIvy('Runtime compiler is not loaded') && + it('should not re-create moduleRef when it didn\'t actually change', async(() => { + const compiler = TestBed.get(Compiler) as Compiler; + const fixture = TestBed.createComponent(TestComponent); - fixture.componentInstance.module = compiler.compileModuleSync(TestModule2); - fixture.componentInstance.currentComponent = Module2InjectedComponent; - fixture.detectChanges(); - expect(fixture.nativeElement).toHaveText('baz'); - const moduleRef = fixture.componentInstance.ngComponentOutlet['_moduleRef']; + fixture.componentInstance.module = compiler.compileModuleSync(TestModule2); + fixture.componentInstance.currentComponent = Module2InjectedComponent; + fixture.detectChanges(); + expect(fixture.nativeElement).toHaveText('baz'); + const moduleRef = fixture.componentInstance.ngComponentOutlet['_moduleRef']; - fixture.componentInstance.currentComponent = Module2InjectedComponent2; - fixture.detectChanges(); + fixture.componentInstance.currentComponent = Module2InjectedComponent2; + fixture.detectChanges(); - expect(fixture.nativeElement).toHaveText('baz2'); - expect(moduleRef).toBe(fixture.componentInstance.ngComponentOutlet['_moduleRef']); - })); + expect(fixture.nativeElement).toHaveText('baz2'); + expect(moduleRef).toBe(fixture.componentInstance.ngComponentOutlet['_moduleRef']); + })); - it('should re-create moduleRef when changed', async(() => { - const compiler = TestBed.get(Compiler) as Compiler; - const fixture = TestBed.createComponent(TestComponent); - fixture.componentInstance.module = compiler.compileModuleSync(TestModule2); - fixture.componentInstance.currentComponent = Module2InjectedComponent; - fixture.detectChanges(); + fixmeIvy('Runtime compiler is not loaded') && + it('should re-create moduleRef when changed', async(() => { + const compiler = TestBed.get(Compiler) as Compiler; + const fixture = TestBed.createComponent(TestComponent); + fixture.componentInstance.module = compiler.compileModuleSync(TestModule2); + fixture.componentInstance.currentComponent = Module2InjectedComponent; + fixture.detectChanges(); - expect(fixture.nativeElement).toHaveText('baz'); + expect(fixture.nativeElement).toHaveText('baz'); - fixture.componentInstance.module = compiler.compileModuleSync(TestModule3); - fixture.componentInstance.currentComponent = Module3InjectedComponent; - fixture.detectChanges(); + fixture.componentInstance.module = compiler.compileModuleSync(TestModule3); + fixture.componentInstance.currentComponent = Module3InjectedComponent; + fixture.detectChanges(); - expect(fixture.nativeElement).toHaveText('bat'); - })); - }); -} + expect(fixture.nativeElement).toHaveText('bat'); + })); +}); const TEST_TOKEN = new InjectionToken('TestToken'); @Component({selector: 'injected-component', template: 'foo'}) diff --git a/packages/common/test/directives/ng_template_outlet_spec.ts b/packages/common/test/directives/ng_template_outlet_spec.ts index 99dae02116..dc380a7808 100644 --- a/packages/common/test/directives/ng_template_outlet_spec.ts +++ b/packages/common/test/directives/ng_template_outlet_spec.ts @@ -10,205 +10,202 @@ import {CommonModule} from '@angular/common'; import {Component, ContentChildren, Directive, Injectable, NO_ERRORS_SCHEMA, OnDestroy, QueryList, TemplateRef} from '@angular/core'; import {ComponentFixture, TestBed, async} from '@angular/core/testing'; import {expect} from '@angular/platform-browser/testing/src/matchers'; +import {fixmeIvy} from '@angular/private/testing'; -{ - describe('NgTemplateOutlet', () => { - let fixture: ComponentFixture; +fixmeIvy('expr.visitExpression is not a function - fixed by #26968') && describe('NgTemplateOutlet', () => { + let fixture: ComponentFixture; - function setTplRef(value: any): void { fixture.componentInstance.currentTplRef = value; } + function setTplRef(value: any): void { fixture.componentInstance.currentTplRef = value; } - function detectChangesAndExpectText(text: string): void { - fixture.detectChanges(); - expect(fixture.debugElement.nativeElement).toHaveText(text); - } + function detectChangesAndExpectText(text: string): void { + fixture.detectChanges(); + expect(fixture.debugElement.nativeElement).toHaveText(text); + } - afterEach(() => { fixture = null as any; }); + afterEach(() => { fixture = null as any; }); - beforeEach(() => { - TestBed.configureTestingModule({ - declarations: [TestComponent, CaptureTplRefs, DestroyableCmpt], - imports: [CommonModule], - providers: [DestroyedSpyService] - }); - }); - - // https://github.com/angular/angular/issues/14778 - it('should accept the component as the context', async(() => { - const template = `` + - `{{context.foo}}`; - - fixture = createTestComponent(template); - detectChangesAndExpectText('bar'); - })); - - it('should do nothing if templateRef is `null`', async(() => { - const template = ``; - fixture = createTestComponent(template); - detectChangesAndExpectText(''); - })); - - it('should insert content specified by TemplateRef', async(() => { - const template = `foo` + - ``; - fixture = createTestComponent(template); - detectChangesAndExpectText('foo'); - })); - - it('should clear content if TemplateRef becomes `null`', async(() => { - const template = `foo` + - ``; - fixture = createTestComponent(template); - fixture.detectChanges(); - const refs = fixture.debugElement.children[0].references !['refs']; - - setTplRef(refs.tplRefs.first); - detectChangesAndExpectText('foo'); - - setTplRef(null); - detectChangesAndExpectText(''); - })); - - it('should swap content if TemplateRef changes', async(() => { - const template = - `foobar` + - ``; - fixture = createTestComponent(template); - - fixture.detectChanges(); - const refs = fixture.debugElement.children[0].references !['refs']; - - setTplRef(refs.tplRefs.first); - detectChangesAndExpectText('foo'); - - setTplRef(refs.tplRefs.last); - detectChangesAndExpectText('bar'); - })); - - it('should display template if context is `null`', async(() => { - const template = `foo` + - ``; - fixture = createTestComponent(template); - detectChangesAndExpectText('foo'); - })); - - it('should reflect initial context and changes', async(() => { - const template = `{{foo}}` + - ``; - fixture = createTestComponent(template); - - fixture.detectChanges(); - detectChangesAndExpectText('bar'); - - fixture.componentInstance.context.foo = 'alter-bar'; - detectChangesAndExpectText('alter-bar'); - })); - - it('should reflect user defined `$implicit` property in the context', async(() => { - const template = `{{ctx.foo}}` + - ``; - fixture = createTestComponent(template); - fixture.componentInstance.context = {$implicit: {foo: 'bra'}}; - detectChangesAndExpectText('bra'); - })); - - it('should reflect context re-binding', async(() => { - const template = - `{{shawshank}}` + - ``; - fixture = createTestComponent(template); - - fixture.componentInstance.context = {shawshank: 'brooks'}; - detectChangesAndExpectText('brooks'); - - fixture.componentInstance.context = {shawshank: 'was here'}; - detectChangesAndExpectText('was here'); - })); - - it('should update but not destroy embedded view when context values change', () => { - const template = - `:{{foo}}` + - ``; - - fixture = createTestComponent(template); - const spyService = fixture.debugElement.injector.get(DestroyedSpyService); - - detectChangesAndExpectText('Content to destroy:bar'); - expect(spyService.destroyed).toBeFalsy(); - - fixture.componentInstance.value = 'baz'; - detectChangesAndExpectText('Content to destroy:baz'); - expect(spyService.destroyed).toBeFalsy(); - }); - - it('should recreate embedded view when context shape changes', () => { - const template = - `:{{foo}}` + - ``; - - fixture = createTestComponent(template); - const spyService = fixture.debugElement.injector.get(DestroyedSpyService); - - detectChangesAndExpectText('Content to destroy:bar'); - expect(spyService.destroyed).toBeFalsy(); - - fixture.componentInstance.context = {foo: 'baz', other: true}; - detectChangesAndExpectText('Content to destroy:baz'); - expect(spyService.destroyed).toBeTruthy(); - }); - - it('should destroy embedded view when context value changes and templateRef becomes undefined', - () => { - const template = - `:{{foo}}` + - ``; - - fixture = createTestComponent(template); - const spyService = fixture.debugElement.injector.get(DestroyedSpyService); - - detectChangesAndExpectText('Content to destroy:bar'); - expect(spyService.destroyed).toBeFalsy(); - - fixture.componentInstance.value = 'baz'; - detectChangesAndExpectText(''); - expect(spyService.destroyed).toBeTruthy(); - }); - - it('should not try to update null / undefined context when context changes but template stays the same', - () => { - const template = `{{foo}}` + - ``; - - fixture = createTestComponent(template); - detectChangesAndExpectText(''); - - fixture.componentInstance.value = 'baz'; - detectChangesAndExpectText(''); - }); - - it('should not try to update null / undefined context when template changes', () => { - const template = `{{foo}}` + - `{{foo}}` + - ``; - - fixture = createTestComponent(template); - detectChangesAndExpectText(''); - - fixture.componentInstance.value = 'baz'; - detectChangesAndExpectText(''); - }); - - it('should not try to update context on undefined view', () => { - const template = `{{foo}}` + - ``; - - fixture = createTestComponent(template); - detectChangesAndExpectText(''); - - fixture.componentInstance.value = 'baz'; - detectChangesAndExpectText(''); + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [TestComponent, CaptureTplRefs, DestroyableCmpt], + imports: [CommonModule], + providers: [DestroyedSpyService] }); }); -} + + // https://github.com/angular/angular/issues/14778 + it('should accept the component as the context', async(() => { + const template = `` + + `{{context.foo}}`; + + fixture = createTestComponent(template); + detectChangesAndExpectText('bar'); + })); + + it('should do nothing if templateRef is `null`', async(() => { + const template = ``; + fixture = createTestComponent(template); + detectChangesAndExpectText(''); + })); + + it('should insert content specified by TemplateRef', async(() => { + const template = `foo` + + ``; + fixture = createTestComponent(template); + detectChangesAndExpectText('foo'); + })); + + it('should clear content if TemplateRef becomes `null`', async(() => { + const template = `foo` + + ``; + fixture = createTestComponent(template); + fixture.detectChanges(); + const refs = fixture.debugElement.children[0].references !['refs']; + + setTplRef(refs.tplRefs.first); + detectChangesAndExpectText('foo'); + + setTplRef(null); + detectChangesAndExpectText(''); + })); + + it('should swap content if TemplateRef changes', async(() => { + const template = + `foobar` + + ``; + fixture = createTestComponent(template); + + fixture.detectChanges(); + const refs = fixture.debugElement.children[0].references !['refs']; + + setTplRef(refs.tplRefs.first); + detectChangesAndExpectText('foo'); + + setTplRef(refs.tplRefs.last); + detectChangesAndExpectText('bar'); + })); + + it('should display template if context is `null`', async(() => { + const template = `foo` + + ``; + fixture = createTestComponent(template); + detectChangesAndExpectText('foo'); + })); + + it('should reflect initial context and changes', async(() => { + const template = `{{foo}}` + + ``; + fixture = createTestComponent(template); + + fixture.detectChanges(); + detectChangesAndExpectText('bar'); + + fixture.componentInstance.context.foo = 'alter-bar'; + detectChangesAndExpectText('alter-bar'); + })); + + it('should reflect user defined `$implicit` property in the context', async(() => { + const template = `{{ctx.foo}}` + + ``; + fixture = createTestComponent(template); + fixture.componentInstance.context = {$implicit: {foo: 'bra'}}; + detectChangesAndExpectText('bra'); + })); + + it('should reflect context re-binding', async(() => { + const template = `{{shawshank}}` + + ``; + fixture = createTestComponent(template); + + fixture.componentInstance.context = {shawshank: 'brooks'}; + detectChangesAndExpectText('brooks'); + + fixture.componentInstance.context = {shawshank: 'was here'}; + detectChangesAndExpectText('was here'); + })); + + it('should update but not destroy embedded view when context values change', () => { + const template = + `:{{foo}}` + + ``; + + fixture = createTestComponent(template); + const spyService = fixture.debugElement.injector.get(DestroyedSpyService); + + detectChangesAndExpectText('Content to destroy:bar'); + expect(spyService.destroyed).toBeFalsy(); + + fixture.componentInstance.value = 'baz'; + detectChangesAndExpectText('Content to destroy:baz'); + expect(spyService.destroyed).toBeFalsy(); + }); + + it('should recreate embedded view when context shape changes', () => { + const template = + `:{{foo}}` + + ``; + + fixture = createTestComponent(template); + const spyService = fixture.debugElement.injector.get(DestroyedSpyService); + + detectChangesAndExpectText('Content to destroy:bar'); + expect(spyService.destroyed).toBeFalsy(); + + fixture.componentInstance.context = {foo: 'baz', other: true}; + detectChangesAndExpectText('Content to destroy:baz'); + expect(spyService.destroyed).toBeTruthy(); + }); + + it('should destroy embedded view when context value changes and templateRef becomes undefined', () => { + const template = + `:{{foo}}` + + ``; + + fixture = createTestComponent(template); + const spyService = fixture.debugElement.injector.get(DestroyedSpyService); + + detectChangesAndExpectText('Content to destroy:bar'); + expect(spyService.destroyed).toBeFalsy(); + + fixture.componentInstance.value = 'baz'; + detectChangesAndExpectText(''); + expect(spyService.destroyed).toBeTruthy(); + }); + + it('should not try to update null / undefined context when context changes but template stays the same', + () => { + const template = `{{foo}}` + + ``; + + fixture = createTestComponent(template); + detectChangesAndExpectText(''); + + fixture.componentInstance.value = 'baz'; + detectChangesAndExpectText(''); + }); + + it('should not try to update null / undefined context when template changes', () => { + const template = `{{foo}}` + + `{{foo}}` + + ``; + + fixture = createTestComponent(template); + detectChangesAndExpectText(''); + + fixture.componentInstance.value = 'baz'; + detectChangesAndExpectText(''); + }); + + it('should not try to update context on undefined view', () => { + const template = `{{foo}}` + + ``; + + fixture = createTestComponent(template); + detectChangesAndExpectText(''); + + fixture.componentInstance.value = 'baz'; + detectChangesAndExpectText(''); + }); +}); @Injectable() class DestroyedSpyService { diff --git a/packages/common/test/i18n/localization_spec.ts b/packages/common/test/i18n/localization_spec.ts index 8eba92fb2c..d247d808d7 100644 --- a/packages/common/test/i18n/localization_spec.ts +++ b/packages/common/test/i18n/localization_spec.ts @@ -12,8 +12,8 @@ import localeZgh from '@angular/common/locales/zgh'; import localeFr from '@angular/common/locales/fr'; import {LOCALE_ID} from '@angular/core'; import {TestBed, inject} from '@angular/core/testing'; -import {NgLocaleLocalization, NgLocalization, getPluralCategory, DEPRECATED_PLURAL_FN, getPluralCase} from '../../src/i18n/localization'; -import {Plural} from '../../src/i18n/locale_data_api'; +import {NgLocaleLocalization, NgLocalization, getPluralCategory, DEPRECATED_PLURAL_FN, getPluralCase} from '@angular/common/src/i18n/localization'; +import {Plural} from '@angular/common'; import {registerLocaleData} from '../../src/i18n/locale_data'; { diff --git a/packages/common/test/location/location_spec.ts b/packages/common/test/location/location_spec.ts index 7d1fe22ebc..5f1a250a3e 100644 --- a/packages/common/test/location/location_spec.ts +++ b/packages/common/test/location/location_spec.ts @@ -6,37 +6,35 @@ * found in the LICENSE file at https://angular.io/license */ -import {Location} from '../../src/location/location'; +import {Location} from '@angular/common'; -{ - const baseUrl = '/base'; +const baseUrl = '/base'; - describe('Location Class', () => { - describe('stripTrailingSlash', () => { - it('should strip single character slash', () => { - const input = '/'; - expect(Location.stripTrailingSlash(input)).toBe(''); - }); +describe('Location Class', () => { + describe('stripTrailingSlash', () => { + it('should strip single character slash', () => { + const input = '/'; + expect(Location.stripTrailingSlash(input)).toBe(''); + }); - it('should normalize strip a trailing slash', () => { - const input = baseUrl + '/'; - expect(Location.stripTrailingSlash(input)).toBe(baseUrl); - }); + it('should normalize strip a trailing slash', () => { + const input = baseUrl + '/'; + expect(Location.stripTrailingSlash(input)).toBe(baseUrl); + }); - it('should ignore query params when stripping a slash', () => { - const input = baseUrl + '/?param=1'; - expect(Location.stripTrailingSlash(input)).toBe(baseUrl + '?param=1'); - }); + it('should ignore query params when stripping a slash', () => { + const input = baseUrl + '/?param=1'; + expect(Location.stripTrailingSlash(input)).toBe(baseUrl + '?param=1'); + }); - it('should not remove slashes inside query params', () => { - const input = baseUrl + '?test/?=3'; - expect(Location.stripTrailingSlash(input)).toBe(input); - }); + it('should not remove slashes inside query params', () => { + const input = baseUrl + '?test/?=3'; + expect(Location.stripTrailingSlash(input)).toBe(input); + }); - it('should not remove slashes after a pound sign', () => { - const input = baseUrl + '#test/?=3'; - expect(Location.stripTrailingSlash(input)).toBe(input); - }); + it('should not remove slashes after a pound sign', () => { + const input = baseUrl + '#test/?=3'; + expect(Location.stripTrailingSlash(input)).toBe(input); }); }); -} \ No newline at end of file +}); \ No newline at end of file diff --git a/packages/common/test/pipes/keyvalue_pipe_spec.ts b/packages/common/test/pipes/keyvalue_pipe_spec.ts index 484531dd9e..e9f1c53bfc 100644 --- a/packages/common/test/pipes/keyvalue_pipe_spec.ts +++ b/packages/common/test/pipes/keyvalue_pipe_spec.ts @@ -7,13 +7,8 @@ */ import {KeyValuePipe} from '@angular/common'; -import {EventEmitter, KeyValueDiffers, WrappedValue, ɵdefaultKeyValueDiffers as defaultKeyValueDiffers} from '@angular/core'; -import {AsyncTestCompleter, beforeEach, describe, expect, inject, it} from '@angular/core/testing/src/testing_internal'; -import {getDOM} from '@angular/platform-browser/src/dom/dom_adapter'; -import {browserDetection} from '@angular/platform-browser/testing/src/browser_util'; - -import {defaultComparator} from '../../src/pipes/keyvalue_pipe'; -import {SpyChangeDetectorRef} from '../spies'; +import {defaultComparator} from '@angular/common/src/pipes/keyvalue_pipe'; +import {ɵdefaultKeyValueDiffers as defaultKeyValueDiffers} from '@angular/core'; describe('KeyValuePipe', () => { it('should return null when given null', () => {