From 8930f60a4bc1857acd1a83c12a4d46b00b968841 Mon Sep 17 00:00:00 2001 From: Andrew Kushnir Date: Thu, 31 Jan 2019 09:50:43 -0800 Subject: [PATCH] refactor(ivy): create an Ivy version of tree-shakable providers test (#28477) Due to the fact that the test in 'ng_module_integration_spec.ts' relied on internal VE data structures (the '_def' field) to verify the state and the structure has changed in Ivy, this commit adds an Ivy version of the same test. PR Close #28477 --- .../test/linker/ng_module_integration_spec.ts | 34 +++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/packages/core/test/linker/ng_module_integration_spec.ts b/packages/core/test/linker/ng_module_integration_spec.ts index bbc3bdc15b..c82c0ae413 100644 --- a/packages/core/test/linker/ng_module_integration_spec.ts +++ b/packages/core/test/linker/ng_module_integration_spec.ts @@ -14,7 +14,7 @@ import {NgModuleData} from '@angular/core/src/view/types'; import {tokenKey} from '@angular/core/src/view/util'; import {ComponentFixture, TestBed, inject} from '@angular/core/testing'; import {expect} from '@angular/platform-browser/testing/src/matchers'; -import {fixmeIvy, modifiedInIvy, obsoleteInIvy} from '@angular/private/testing'; +import {fixmeIvy, modifiedInIvy, obsoleteInIvy, onlyInIvy} from '@angular/private/testing'; import {InternalNgModuleRef, NgModuleFactory} from '../../src/linker/ng_module_factory'; import {clearModulesForTest} from '../../src/linker/ng_module_factory_loader'; @@ -1316,7 +1316,7 @@ function declareTests(config?: {useJit: boolean}) { }); describe('tree shakable providers', () => { - fixmeIvy('FW-794: NgModuleDefinition not exposed on NgModuleData') + modifiedInIvy('Ivy and VE have different internal fields to access providers') .it('definition should not persist across NgModuleRef instances', () => { @NgModule() class SomeModule { @@ -1347,6 +1347,36 @@ function declareTests(config?: {useJit: boolean}) { (ngModuleRef2 as NgModuleData)._def.providersByKey[tokenKey(Bar)]; expect(providerDef2).toBeUndefined(); }); + + onlyInIvy(`Ivy and VE have different internal fields to access providers`) + .it('definition should not persist across NgModuleRef instances', () => { + @NgModule() + class SomeModule { + } + + class Bar { + static ngInjectableDef: InjectableDef = defineInjectable({ + factory: () => new Bar(), + providedIn: SomeModule, + }); + } + + const factory = createModuleFactory(SomeModule); + const ngModuleRef1 = factory.create(null); + + // Inject a tree shakeable provider token. + ngModuleRef1.injector.get(Bar); + + // Tree Shakeable provider definition should be available. + const providerDef1 = (ngModuleRef1 as any)._r3Injector.records.get(Bar); + expect(providerDef1).not.toBeUndefined(); + + // Instantiate the same module. The tree shakeable provider definition should not be + // present. + const ngModuleRef2 = factory.create(null); + const providerDef2 = (ngModuleRef2 as any)._r3Injector.records.get(Bar); + expect(providerDef2).toBeUndefined(); + }); }); }); });