test: move remaining fixmeIvy to test level (#27354)

Moves all of the remaning `describe`-level fixme instances to the `it` level.

PR Close #27354
This commit is contained in:
Kristiyan Kostadinov 2018-11-29 23:34:28 +01:00 committed by Igor Minar
parent 36e7bf1b7b
commit 23bc8edf24
11 changed files with 1566 additions and 1451 deletions

View File

@ -84,7 +84,7 @@ class NestedAsyncTimeoutComp {
} }
{ {
fixmeIvy('unknown') && describe('ComponentFixture', () => { describe('ComponentFixture', () => {
beforeEach(async(() => { beforeEach(async(() => {
TestBed.configureTestingModule({ TestBed.configureTestingModule({
declarations: [ declarations: [
@ -94,7 +94,7 @@ class NestedAsyncTimeoutComp {
}); });
})); }));
it('should auto detect changes if autoDetectChanges is called', () => { fixmeIvy('unknown') && it('should auto detect changes if autoDetectChanges is called', () => {
const componentFixture = TestBed.createComponent(AutoDetectComp); const componentFixture = TestBed.createComponent(AutoDetectComp);
expect(componentFixture.ngZone).not.toBeNull(); expect(componentFixture.ngZone).not.toBeNull();
@ -108,6 +108,7 @@ class NestedAsyncTimeoutComp {
expect(componentFixture.nativeElement).toHaveText('11'); expect(componentFixture.nativeElement).toHaveText('11');
}); });
fixmeIvy('unknown') &&
it('should auto detect changes if ComponentFixtureAutoDetect is provided as true', it('should auto detect changes if ComponentFixtureAutoDetect is provided as true',
withModule({providers: [{provide: ComponentFixtureAutoDetect, useValue: true}]}, () => { withModule({providers: [{provide: ComponentFixtureAutoDetect, useValue: true}]}, () => {
@ -120,6 +121,7 @@ class NestedAsyncTimeoutComp {
expect(componentFixture.nativeElement).toHaveText('11'); expect(componentFixture.nativeElement).toHaveText('11');
})); }));
fixmeIvy('unknown') &&
it('should signal through whenStable when the fixture is stable (autoDetectChanges)', it('should signal through whenStable when the fixture is stable (autoDetectChanges)',
async(() => { async(() => {
const componentFixture = TestBed.createComponent(AsyncComp); const componentFixture = TestBed.createComponent(AsyncComp);
@ -139,6 +141,7 @@ class NestedAsyncTimeoutComp {
}); });
})); }));
fixmeIvy('unknown') &&
it('should signal through isStable when the fixture is stable (no autoDetectChanges)', it('should signal through isStable when the fixture is stable (no autoDetectChanges)',
async(() => { async(() => {
const componentFixture = TestBed.createComponent(AsyncComp); const componentFixture = TestBed.createComponent(AsyncComp);
@ -159,6 +162,7 @@ class NestedAsyncTimeoutComp {
}); });
})); }));
fixmeIvy('unknown') &&
it('should wait for macroTask(setTimeout) while checking for whenStable ' + it('should wait for macroTask(setTimeout) while checking for whenStable ' +
'(autoDetectChanges)', '(autoDetectChanges)',
async(() => { async(() => {
@ -179,6 +183,7 @@ class NestedAsyncTimeoutComp {
}); });
})); }));
fixmeIvy('unknown') &&
it('should wait for macroTask(setTimeout) while checking for whenStable ' + it('should wait for macroTask(setTimeout) while checking for whenStable ' +
'(no autoDetectChanges)', '(no autoDetectChanges)',
async(() => { async(() => {
@ -201,6 +206,7 @@ class NestedAsyncTimeoutComp {
}); });
})); }));
fixmeIvy('unknown') &&
it('should wait for nested macroTasks(setTimeout) while checking for whenStable ' + it('should wait for nested macroTasks(setTimeout) while checking for whenStable ' +
'(autoDetectChanges)', '(autoDetectChanges)',
async(() => { async(() => {
@ -223,6 +229,7 @@ class NestedAsyncTimeoutComp {
}); });
})); }));
fixmeIvy('unknown') &&
it('should wait for nested macroTasks(setTimeout) while checking for whenStable ' + it('should wait for nested macroTasks(setTimeout) while checking for whenStable ' +
'(no autoDetectChanges)', '(no autoDetectChanges)',
async(() => { async(() => {
@ -245,7 +252,9 @@ class NestedAsyncTimeoutComp {
}); });
})); }));
it('should stabilize after async task in change detection (autoDetectChanges)', async(() => { fixmeIvy('unknown') &&
it('should stabilize after async task in change detection (autoDetectChanges)',
async(() => {
const componentFixture = TestBed.createComponent(AsyncChangeComp); const componentFixture = TestBed.createComponent(AsyncChangeComp);
@ -261,7 +270,9 @@ class NestedAsyncTimeoutComp {
}); });
})); }));
it('should stabilize after async task in change detection(no autoDetectChanges)', async(() => { fixmeIvy('unknown') &&
it('should stabilize after async task in change detection(no autoDetectChanges)',
async(() => {
const componentFixture = TestBed.createComponent(AsyncChangeComp); const componentFixture = TestBed.createComponent(AsyncChangeComp);
componentFixture.detectChanges(); componentFixture.detectChanges();
@ -290,7 +301,7 @@ class NestedAsyncTimeoutComp {
{providers: [{provide: ComponentFixtureNoNgZone, useValue: true}]}); {providers: [{provide: ComponentFixtureNoNgZone, useValue: true}]});
}); });
it('calling autoDetectChanges raises an error', () => { fixmeIvy('unknown') && it('calling autoDetectChanges raises an error', () => {
const componentFixture = TestBed.createComponent(SimpleComp); const componentFixture = TestBed.createComponent(SimpleComp);
expect(() => { expect(() => {
@ -298,6 +309,7 @@ class NestedAsyncTimeoutComp {
}).toThrowError(/Cannot call autoDetectChanges when ComponentFixtureNoNgZone is set/); }).toThrowError(/Cannot call autoDetectChanges when ComponentFixtureNoNgZone is set/);
}); });
fixmeIvy('unknown') &&
it('should instantiate a component with valid DOM', async(() => { it('should instantiate a component with valid DOM', async(() => {
const componentFixture = TestBed.createComponent(SimpleComp); const componentFixture = TestBed.createComponent(SimpleComp);
@ -307,7 +319,7 @@ class NestedAsyncTimeoutComp {
expect(componentFixture.nativeElement).toHaveText('Original Simple'); expect(componentFixture.nativeElement).toHaveText('Original Simple');
})); }));
it('should allow changing members of the component', async(() => { fixmeIvy('unknown') && it('should allow changing members of the component', async(() => {
const componentFixture = TestBed.createComponent(MyIfComp); const componentFixture = TestBed.createComponent(MyIfComp);

View File

@ -169,7 +169,7 @@ class TestApp {
} }
{ {
fixmeIvy('unknown') && describe('debug element', () => { describe('debug element', () => {
let fixture: ComponentFixture<any>; let fixture: ComponentFixture<any>;
beforeEach(async(() => { beforeEach(async(() => {
@ -192,13 +192,13 @@ class TestApp {
}); });
})); }));
it('should list all child nodes', () => { fixmeIvy('unknown') && it('should list all child nodes', () => {
fixture = TestBed.createComponent(ParentComp); fixture = TestBed.createComponent(ParentComp);
fixture.detectChanges(); fixture.detectChanges();
expect(fixture.debugElement.childNodes.length).toEqual(3); expect(fixture.debugElement.childNodes.length).toEqual(3);
}); });
it('should list all component child elements', () => { fixmeIvy('unknown') && it('should list all component child elements', () => {
fixture = TestBed.createComponent(ParentComp); fixture = TestBed.createComponent(ParentComp);
fixture.detectChanges(); fixture.detectChanges();
const childEls = fixture.debugElement.children; const childEls = fixture.debugElement.children;
@ -225,7 +225,7 @@ class TestApp {
expect(getDOM().hasClass(childNested[0].nativeElement, 'childnested')).toBe(true); expect(getDOM().hasClass(childNested[0].nativeElement, 'childnested')).toBe(true);
}); });
it('should list conditional component child elements', () => { fixmeIvy('unknown') && it('should list conditional component child elements', () => {
fixture = TestBed.createComponent(ConditionalParentComp); fixture = TestBed.createComponent(ConditionalParentComp);
fixture.detectChanges(); fixture.detectChanges();
@ -246,7 +246,7 @@ class TestApp {
expect(conditionalContentComp.children.length).toEqual(1); expect(conditionalContentComp.children.length).toEqual(1);
}); });
it('should list child elements within viewports', () => { fixmeIvy('unknown') && it('should list child elements within viewports', () => {
fixture = TestBed.createComponent(UsingFor); fixture = TestBed.createComponent(UsingFor);
fixture.detectChanges(); fixture.detectChanges();
@ -259,7 +259,7 @@ class TestApp {
expect(list.children.length).toEqual(3); expect(list.children.length).toEqual(3);
}); });
it('should list element attributes', () => { fixmeIvy('unknown') && it('should list element attributes', () => {
fixture = TestBed.createComponent(TestApp); fixture = TestBed.createComponent(TestApp);
fixture.detectChanges(); fixture.detectChanges();
const bankElem = fixture.debugElement.children[0]; const bankElem = fixture.debugElement.children[0];
@ -268,7 +268,7 @@ class TestApp {
expect(bankElem.attributes['account']).toEqual('4747'); expect(bankElem.attributes['account']).toEqual('4747');
}); });
it('should list element classes', () => { fixmeIvy('unknown') && it('should list element classes', () => {
fixture = TestBed.createComponent(TestApp); fixture = TestBed.createComponent(TestApp);
fixture.detectChanges(); fixture.detectChanges();
const bankElem = fixture.debugElement.children[0]; const bankElem = fixture.debugElement.children[0];
@ -277,7 +277,7 @@ class TestApp {
expect(bankElem.classes['open']).toBe(false); expect(bankElem.classes['open']).toBe(false);
}); });
it('should list element styles', () => { fixmeIvy('unknown') && it('should list element styles', () => {
fixture = TestBed.createComponent(TestApp); fixture = TestBed.createComponent(TestApp);
fixture.detectChanges(); fixture.detectChanges();
const bankElem = fixture.debugElement.children[0]; const bankElem = fixture.debugElement.children[0];
@ -286,7 +286,7 @@ class TestApp {
expect(bankElem.styles['color']).toEqual('red'); expect(bankElem.styles['color']).toEqual('red');
}); });
it('should query child elements by css', () => { fixmeIvy('unknown') && it('should query child elements by css', () => {
fixture = TestBed.createComponent(ParentComp); fixture = TestBed.createComponent(ParentComp);
fixture.detectChanges(); fixture.detectChanges();
@ -296,7 +296,7 @@ class TestApp {
expect(getDOM().hasClass(childTestEls[0].nativeElement, 'child-comp-class')).toBe(true); expect(getDOM().hasClass(childTestEls[0].nativeElement, 'child-comp-class')).toBe(true);
}); });
it('should query child elements by directive', () => { fixmeIvy('unknown') && it('should query child elements by directive', () => {
fixture = TestBed.createComponent(ParentComp); fixture = TestBed.createComponent(ParentComp);
fixture.detectChanges(); fixture.detectChanges();
@ -309,21 +309,21 @@ class TestApp {
expect(getDOM().hasClass(childTestEls[3].nativeElement, 'childnested')).toBe(true); expect(getDOM().hasClass(childTestEls[3].nativeElement, 'childnested')).toBe(true);
}); });
it('should list providerTokens', () => { fixmeIvy('unknown') && it('should list providerTokens', () => {
fixture = TestBed.createComponent(ParentComp); fixture = TestBed.createComponent(ParentComp);
fixture.detectChanges(); fixture.detectChanges();
expect(fixture.debugElement.providerTokens).toContain(Logger); expect(fixture.debugElement.providerTokens).toContain(Logger);
}); });
it('should list locals', () => { fixmeIvy('unknown') && it('should list locals', () => {
fixture = TestBed.createComponent(LocalsComp); fixture = TestBed.createComponent(LocalsComp);
fixture.detectChanges(); fixture.detectChanges();
expect(fixture.debugElement.children[0].references !['alice']).toBeAnInstanceOf(MyDir); expect(fixture.debugElement.children[0].references !['alice']).toBeAnInstanceOf(MyDir);
}); });
it('should allow injecting from the element injector', () => { fixmeIvy('unknown') && it('should allow injecting from the element injector', () => {
fixture = TestBed.createComponent(ParentComp); fixture = TestBed.createComponent(ParentComp);
fixture.detectChanges(); fixture.detectChanges();
@ -332,7 +332,7 @@ class TestApp {
]); ]);
}); });
it('should list event listeners', () => { fixmeIvy('unknown') && it('should list event listeners', () => {
fixture = TestBed.createComponent(EventsComp); fixture = TestBed.createComponent(EventsComp);
fixture.detectChanges(); fixture.detectChanges();
@ -341,7 +341,7 @@ class TestApp {
}); });
it('should trigger event handlers', () => { fixmeIvy('unknown') && it('should trigger event handlers', () => {
fixture = TestBed.createComponent(EventsComp); fixture = TestBed.createComponent(EventsComp);
fixture.detectChanges(); fixture.detectChanges();

View File

@ -13,7 +13,7 @@ import {Log} from '@angular/core/testing/src/testing_internal';
import {fixmeIvy} from '@angular/private/testing'; import {fixmeIvy} from '@angular/private/testing';
{ {
fixmeIvy('unknown') && describe('directive lifecycle integration spec', () => { describe('directive lifecycle integration spec', () => {
let log: Log; let log: Log;
beforeEach(() => { beforeEach(() => {
@ -31,6 +31,7 @@ import {fixmeIvy} from '@angular/private/testing';
beforeEach(inject([Log], (_log: any) => { log = _log; })); beforeEach(inject([Log], (_log: any) => { log = _log; }));
fixmeIvy('unknown') &&
it('should invoke lifecycle methods ngOnChanges > ngOnInit > ngDoCheck > ngAfterContentChecked', it('should invoke lifecycle methods ngOnChanges > ngOnInit > ngDoCheck > ngAfterContentChecked',
() => { () => {
const fixture = TestBed.createComponent(MyComp5); const fixture = TestBed.createComponent(MyComp5);

View File

@ -18,32 +18,33 @@ const resolvedPromise = Promise.resolve(null);
const ProxyZoneSpec: {assertPresent: () => void} = (Zone as any)['ProxyZoneSpec']; const ProxyZoneSpec: {assertPresent: () => void} = (Zone as any)['ProxyZoneSpec'];
{ {
fixmeIvy('unknown') && describe('fake async', () => { describe('fake async', () => {
it('should run synchronous code', () => { fixmeIvy('unknown') && it('should run synchronous code', () => {
let ran = false; let ran = false;
fakeAsync(() => { ran = true; })(); fakeAsync(() => { ran = true; })();
expect(ran).toEqual(true); expect(ran).toEqual(true);
}); });
it('should pass arguments to the wrapped function', () => { fixmeIvy('unknown') && it('should pass arguments to the wrapped function', () => {
fakeAsync((foo: any /** TODO #9100 */, bar: any /** TODO #9100 */) => { fakeAsync((foo: any /** TODO #9100 */, bar: any /** TODO #9100 */) => {
expect(foo).toEqual('foo'); expect(foo).toEqual('foo');
expect(bar).toEqual('bar'); expect(bar).toEqual('bar');
})('foo', 'bar'); })('foo', 'bar');
}); });
it('should work with inject()', fakeAsync(inject([Parser], (parser: any /** TODO #9100 */) => { fixmeIvy('unknown') && it('should work with inject()',
fakeAsync(inject([Parser], (parser: any /** TODO #9100 */) => {
expect(parser).toBeAnInstanceOf(Parser); expect(parser).toBeAnInstanceOf(Parser);
}))); })));
it('should throw on nested calls', () => { fixmeIvy('unknown') && it('should throw on nested calls', () => {
expect(() => { expect(() => {
fakeAsync(() => { fakeAsync((): any /** TODO #9100 */ => null)(); })(); fakeAsync(() => { fakeAsync((): any /** TODO #9100 */ => null)(); })();
}).toThrowError('fakeAsync() calls can not be nested'); }).toThrowError('fakeAsync() calls can not be nested');
}); });
it('should flush microtasks before returning', () => { fixmeIvy('unknown') && it('should flush microtasks before returning', () => {
let thenRan = false; let thenRan = false;
fakeAsync(() => { resolvedPromise.then(_ => { thenRan = true; }); })(); fakeAsync(() => { resolvedPromise.then(_ => { thenRan = true; }); })();
@ -52,11 +53,11 @@ const ProxyZoneSpec: {assertPresent: () => void} = (Zone as any)['ProxyZoneSpec'
}); });
it('should propagate the return value', fixmeIvy('unknown') && it('should propagate the return value',
() => { expect(fakeAsync(() => 'foo')()).toEqual('foo'); }); () => { expect(fakeAsync(() => 'foo')()).toEqual('foo'); });
describe('Promise', () => { describe('Promise', () => {
it('should run asynchronous code', fakeAsync(() => { fixmeIvy('unknown') && it('should run asynchronous code', fakeAsync(() => {
let thenRan = false; let thenRan = false;
resolvedPromise.then((_) => { thenRan = true; }); resolvedPromise.then((_) => { thenRan = true; });
@ -66,7 +67,7 @@ const ProxyZoneSpec: {assertPresent: () => void} = (Zone as any)['ProxyZoneSpec'
expect(thenRan).toEqual(true); expect(thenRan).toEqual(true);
})); }));
it('should run chained thens', fakeAsync(() => { fixmeIvy('unknown') && it('should run chained thens', fakeAsync(() => {
const log = new Log(); const log = new Log();
resolvedPromise.then((_) => log.add(1)).then((_) => log.add(2)); resolvedPromise.then((_) => log.add(1)).then((_) => log.add(2));
@ -77,7 +78,7 @@ const ProxyZoneSpec: {assertPresent: () => void} = (Zone as any)['ProxyZoneSpec'
expect(log.result()).toEqual('1; 2'); expect(log.result()).toEqual('1; 2');
})); }));
it('should run Promise created in Promise', fakeAsync(() => { fixmeIvy('unknown') && it('should run Promise created in Promise', fakeAsync(() => {
const log = new Log(); const log = new Log();
resolvedPromise.then((_) => { resolvedPromise.then((_) => {
@ -91,6 +92,7 @@ const ProxyZoneSpec: {assertPresent: () => void} = (Zone as any)['ProxyZoneSpec'
expect(log.result()).toEqual('1; 2'); expect(log.result()).toEqual('1; 2');
})); }));
fixmeIvy('unknown') &&
it('should complain if the test throws an exception during async calls', () => { it('should complain if the test throws an exception during async calls', () => {
expect(() => { expect(() => {
fakeAsync(() => { fakeAsync(() => {
@ -100,13 +102,14 @@ const ProxyZoneSpec: {assertPresent: () => void} = (Zone as any)['ProxyZoneSpec'
}).toThrowError(/Uncaught \(in promise\): Error: async/); }).toThrowError(/Uncaught \(in promise\): Error: async/);
}); });
it('should complain if a test throws an exception', () => { fixmeIvy('unknown') && it('should complain if a test throws an exception', () => {
expect(() => { fakeAsync(() => { throw new Error('sync'); })(); }).toThrowError('sync'); expect(() => { fakeAsync(() => { throw new Error('sync'); })(); }).toThrowError('sync');
}); });
}); });
describe('timers', () => { describe('timers', () => {
fixmeIvy('unknown') &&
it('should run queued zero duration timer on zero tick', fakeAsync(() => { it('should run queued zero duration timer on zero tick', fakeAsync(() => {
let ran = false; let ran = false;
setTimeout(() => { ran = true; }, 0); setTimeout(() => { ran = true; }, 0);
@ -118,6 +121,7 @@ const ProxyZoneSpec: {assertPresent: () => void} = (Zone as any)['ProxyZoneSpec'
})); }));
fixmeIvy('unknown') &&
it('should run queued timer after sufficient clock ticks', fakeAsync(() => { it('should run queued timer after sufficient clock ticks', fakeAsync(() => {
let ran = false; let ran = false;
setTimeout(() => { ran = true; }, 10); setTimeout(() => { ran = true; }, 10);
@ -129,7 +133,7 @@ const ProxyZoneSpec: {assertPresent: () => void} = (Zone as any)['ProxyZoneSpec'
expect(ran).toEqual(true); expect(ran).toEqual(true);
})); }));
it('should run queued timer only once', fakeAsync(() => { fixmeIvy('unknown') && it('should run queued timer only once', fakeAsync(() => {
let cycles = 0; let cycles = 0;
setTimeout(() => { cycles++; }, 10); setTimeout(() => { cycles++; }, 10);
@ -143,7 +147,7 @@ const ProxyZoneSpec: {assertPresent: () => void} = (Zone as any)['ProxyZoneSpec'
expect(cycles).toEqual(1); expect(cycles).toEqual(1);
})); }));
it('should not run cancelled timer', fakeAsync(() => { fixmeIvy('unknown') && it('should not run cancelled timer', fakeAsync(() => {
let ran = false; let ran = false;
const id = setTimeout(() => { ran = true; }, 10); const id = setTimeout(() => { ran = true; }, 10);
clearTimeout(id); clearTimeout(id);
@ -152,19 +156,19 @@ const ProxyZoneSpec: {assertPresent: () => void} = (Zone as any)['ProxyZoneSpec'
expect(ran).toEqual(false); expect(ran).toEqual(false);
})); }));
it('should throw an error on dangling timers', () => { fixmeIvy('unknown') && it('should throw an error on dangling timers', () => {
expect(() => { expect(() => {
fakeAsync(() => { setTimeout(() => {}, 10); })(); fakeAsync(() => { setTimeout(() => {}, 10); })();
}).toThrowError('1 timer(s) still in the queue.'); }).toThrowError('1 timer(s) still in the queue.');
}); });
it('should throw an error on dangling periodic timers', () => { fixmeIvy('unknown') && it('should throw an error on dangling periodic timers', () => {
expect(() => { expect(() => {
fakeAsync(() => { setInterval(() => {}, 10); })(); fakeAsync(() => { setInterval(() => {}, 10); })();
}).toThrowError('1 periodic timer(s) still in the queue.'); }).toThrowError('1 periodic timer(s) still in the queue.');
}); });
it('should run periodic timers', fakeAsync(() => { fixmeIvy('unknown') && it('should run periodic timers', fakeAsync(() => {
let cycles = 0; let cycles = 0;
const id = setInterval(() => { cycles++; }, 10); const id = setInterval(() => { cycles++; }, 10);
@ -179,7 +183,7 @@ const ProxyZoneSpec: {assertPresent: () => void} = (Zone as any)['ProxyZoneSpec'
clearInterval(id); clearInterval(id);
})); }));
it('should not run cancelled periodic timer', fakeAsync(() => { fixmeIvy('unknown') && it('should not run cancelled periodic timer', fakeAsync(() => {
let ran = false; let ran = false;
const id = setInterval(() => { ran = true; }, 10); const id = setInterval(() => { ran = true; }, 10);
clearInterval(id); clearInterval(id);
@ -188,6 +192,7 @@ const ProxyZoneSpec: {assertPresent: () => void} = (Zone as any)['ProxyZoneSpec'
expect(ran).toEqual(false); expect(ran).toEqual(false);
})); }));
fixmeIvy('unknown') &&
it('should be able to cancel periodic timers from a callback', fakeAsync(() => { it('should be able to cancel periodic timers from a callback', fakeAsync(() => {
let cycles = 0; let cycles = 0;
let id: any /** TODO #9100 */; let id: any /** TODO #9100 */;
@ -204,7 +209,7 @@ const ProxyZoneSpec: {assertPresent: () => void} = (Zone as any)['ProxyZoneSpec'
expect(cycles).toEqual(1); expect(cycles).toEqual(1);
})); }));
it('should clear periodic timers', fakeAsync(() => { fixmeIvy('unknown') && it('should clear periodic timers', fakeAsync(() => {
let cycles = 0; let cycles = 0;
const id = setInterval(() => { cycles++; }, 10); const id = setInterval(() => { cycles++; }, 10);
@ -222,7 +227,7 @@ const ProxyZoneSpec: {assertPresent: () => void} = (Zone as any)['ProxyZoneSpec'
expect(cycles).toEqual(2); expect(cycles).toEqual(2);
})); }));
it('should process microtasks before timers', fakeAsync(() => { fixmeIvy('unknown') && it('should process microtasks before timers', fakeAsync(() => {
const log = new Log(); const log = new Log();
resolvedPromise.then((_) => log.add('microtask')); resolvedPromise.then((_) => log.add('microtask'));
@ -238,6 +243,7 @@ const ProxyZoneSpec: {assertPresent: () => void} = (Zone as any)['ProxyZoneSpec'
clearInterval(id); clearInterval(id);
})); }));
fixmeIvy('unknown') &&
it('should process micro-tasks created in timers before next timers', fakeAsync(() => { it('should process micro-tasks created in timers before next timers', fakeAsync(() => {
const log = new Log(); const log = new Log();
@ -264,7 +270,7 @@ const ProxyZoneSpec: {assertPresent: () => void} = (Zone as any)['ProxyZoneSpec'
clearInterval(id); clearInterval(id);
})); }));
it('should flush tasks', fakeAsync(() => { fixmeIvy('unknown') && it('should flush tasks', fakeAsync(() => {
let ran = false; let ran = false;
setTimeout(() => { ran = true; }, 10); setTimeout(() => { ran = true; }, 10);
@ -272,7 +278,7 @@ const ProxyZoneSpec: {assertPresent: () => void} = (Zone as any)['ProxyZoneSpec'
expect(ran).toEqual(true); expect(ran).toEqual(true);
})); }));
it('should flush multiple tasks', fakeAsync(() => { fixmeIvy('unknown') && it('should flush multiple tasks', fakeAsync(() => {
let ran = false; let ran = false;
let ran2 = false; let ran2 = false;
setTimeout(() => { ran = true; }, 10); setTimeout(() => { ran = true; }, 10);
@ -285,7 +291,7 @@ const ProxyZoneSpec: {assertPresent: () => void} = (Zone as any)['ProxyZoneSpec'
expect(elapsed).toEqual(30); expect(elapsed).toEqual(30);
})); }));
it('should move periodic tasks', fakeAsync(() => { fixmeIvy('unknown') && it('should move periodic tasks', fakeAsync(() => {
let ran = false; let ran = false;
let count = 0; let count = 0;
setInterval(() => { count++; }, 10); setInterval(() => { count++; }, 10);
@ -302,25 +308,25 @@ const ProxyZoneSpec: {assertPresent: () => void} = (Zone as any)['ProxyZoneSpec'
}); });
describe('outside of the fakeAsync zone', () => { describe('outside of the fakeAsync zone', () => {
it('calling flushMicrotasks should throw', () => { fixmeIvy('unknown') && it('calling flushMicrotasks should throw', () => {
expect(() => { expect(() => {
flushMicrotasks(); flushMicrotasks();
}).toThrowError('The code should be running in the fakeAsync zone to call this function'); }).toThrowError('The code should be running in the fakeAsync zone to call this function');
}); });
it('calling tick should throw', () => { fixmeIvy('unknown') && it('calling tick should throw', () => {
expect(() => { expect(() => {
tick(); tick();
}).toThrowError('The code should be running in the fakeAsync zone to call this function'); }).toThrowError('The code should be running in the fakeAsync zone to call this function');
}); });
it('calling flush should throw', () => { fixmeIvy('unknown') && it('calling flush should throw', () => {
expect(() => { expect(() => {
flush(); flush();
}).toThrowError('The code should be running in the fakeAsync zone to call this function'); }).toThrowError('The code should be running in the fakeAsync zone to call this function');
}); });
it('calling discardPeriodicTasks should throw', () => { fixmeIvy('unknown') && it('calling discardPeriodicTasks should throw', () => {
expect(() => { expect(() => {
discardPeriodicTasks(); discardPeriodicTasks();
}).toThrowError('The code should be running in the fakeAsync zone to call this function'); }).toThrowError('The code should be running in the fakeAsync zone to call this function');
@ -332,7 +338,7 @@ const ProxyZoneSpec: {assertPresent: () => void} = (Zone as any)['ProxyZoneSpec'
let zoneInTest1: Zone; let zoneInTest1: Zone;
beforeEach(fakeAsync(() => { zoneInBeforeEach = Zone.current; })); beforeEach(fakeAsync(() => { zoneInBeforeEach = Zone.current; }));
it('should use the same zone as in beforeEach', fakeAsync(() => { fixmeIvy('unknown') && it('should use the same zone as in beforeEach', fakeAsync(() => {
zoneInTest1 = Zone.current; zoneInTest1 = Zone.current;
expect(zoneInTest1).toBe(zoneInBeforeEach); expect(zoneInTest1).toBe(zoneInBeforeEach);
})); }));
@ -344,7 +350,9 @@ const ProxyZoneSpec: {assertPresent: () => void} = (Zone as any)['ProxyZoneSpec'
afterEach(() => { ProxyZoneSpec.assertPresent(); }); afterEach(() => { ProxyZoneSpec.assertPresent(); });
it('should allow fakeAsync zone to retroactively set a zoneSpec outside of fakeAsync', () => { fixmeIvy('unknown') &&
it('should allow fakeAsync zone to retroactively set a zoneSpec outside of fakeAsync',
() => {
ProxyZoneSpec.assertPresent(); ProxyZoneSpec.assertPresent();
let state: string = 'not run'; let state: string = 'not run';
const testZone = Zone.current.fork({name: 'test-zone'}); const testZone = Zone.current.fork({name: 'test-zone'});

View File

@ -13,11 +13,13 @@ import {expect} from '@angular/platform-browser/testing/src/matchers';
import {fixmeIvy} from '@angular/private/testing'; import {fixmeIvy} from '@angular/private/testing';
{ {
fixmeIvy('unknown') && describe('forwardRef integration', function() { describe('forwardRef integration', function() {
beforeEach(() => { TestBed.configureTestingModule({imports: [Module], declarations: [App]}); }); beforeEach(() => { TestBed.configureTestingModule({imports: [Module], declarations: [App]}); });
fixmeIvy('unknown') &&
it('should instantiate components which are declared using forwardRef', () => { it('should instantiate components which are declared using forwardRef', () => {
const a = TestBed.configureTestingModule({schemas: [NO_ERRORS_SCHEMA]}).createComponent(App); const a =
TestBed.configureTestingModule({schemas: [NO_ERRORS_SCHEMA]}).createComponent(App);
a.detectChanges(); a.detectChanges();
expect(asNativeElements(a.debugElement.children)).toHaveText('frame(lock)'); expect(asNativeElements(a.debugElement.children)).toHaveText('frame(lock)');
expect(TestBed.get(ModuleFrame)).toBeDefined(); expect(TestBed.get(ModuleFrame)).toBeDefined();

View File

@ -16,7 +16,7 @@ import {fixmeIvy} from '@angular/private/testing';
{ {
// ivy fix in https://github.com/angular/angular/pull/26871 // ivy fix in https://github.com/angular/angular/pull/26871
fixmeIvy('FW-514: ngSummary shims not generated by ngtsc') && describe('Jit Summaries', () => { describe('Jit Summaries', () => {
let instances: Map<any, Base>; let instances: Map<any, Base>;
let summaries: () => any[]; let summaries: () => any[];
@ -138,6 +138,7 @@ import {fixmeIvy} from '@angular/private/testing';
afterEach(() => { resetTestEnvironmentWithSummaries(); }); afterEach(() => { resetTestEnvironmentWithSummaries(); });
fixmeIvy('FW-514: ngSummary shims not generated by ngtsc') &&
it('should use directive metadata from summaries', () => { it('should use directive metadata from summaries', () => {
resetTestEnvironmentWithSummaries(summaries); resetTestEnvironmentWithSummaries(summaries);
@ -146,11 +147,13 @@ import {fixmeIvy} from '@angular/private/testing';
} }
TestBed TestBed
.configureTestingModule({providers: [SomeDep], declarations: [TestComp, SomeDirective]}) .configureTestingModule(
{providers: [SomeDep], declarations: [TestComp, SomeDirective]})
.createComponent(TestComp); .createComponent(TestComp);
expectInstanceCreated(SomeDirective); expectInstanceCreated(SomeDirective);
}); });
fixmeIvy('FW-514: ngSummary shims not generated by ngtsc') &&
it('should use pipe metadata from summaries', () => { it('should use pipe metadata from summaries', () => {
resetTestEnvironmentWithSummaries(summaries); resetTestEnvironmentWithSummaries(summaries);
@ -163,6 +166,7 @@ import {fixmeIvy} from '@angular/private/testing';
expectInstanceCreated(SomePipe); expectInstanceCreated(SomePipe);
}); });
fixmeIvy('FW-514: ngSummary shims not generated by ngtsc') &&
it('should use Service metadata from summaries', () => { it('should use Service metadata from summaries', () => {
resetTestEnvironmentWithSummaries(summaries); resetTestEnvironmentWithSummaries(summaries);
@ -173,6 +177,7 @@ import {fixmeIvy} from '@angular/private/testing';
expectInstanceCreated(SomeService); expectInstanceCreated(SomeService);
}); });
fixmeIvy('FW-514: ngSummary shims not generated by ngtsc') &&
it('should use NgModule metadata from summaries', () => { it('should use NgModule metadata from summaries', () => {
resetTestEnvironmentWithSummaries(summaries); resetTestEnvironmentWithSummaries(summaries);
@ -187,6 +192,7 @@ import {fixmeIvy} from '@angular/private/testing';
expectInstanceCreated(SomeService); expectInstanceCreated(SomeService);
}); });
fixmeIvy('FW-514: ngSummary shims not generated by ngtsc') &&
it('should allow to create private components from imported NgModule summaries', () => { it('should allow to create private components from imported NgModule summaries', () => {
resetTestEnvironmentWithSummaries(summaries); resetTestEnvironmentWithSummaries(summaries);
@ -195,11 +201,13 @@ import {fixmeIvy} from '@angular/private/testing';
expectInstanceCreated(SomePrivateComponent); expectInstanceCreated(SomePrivateComponent);
}); });
fixmeIvy('FW-514: ngSummary shims not generated by ngtsc') &&
it('should throw when trying to mock a type with a summary', () => { it('should throw when trying to mock a type with a summary', () => {
resetTestEnvironmentWithSummaries(summaries); resetTestEnvironmentWithSummaries(summaries);
TestBed.resetTestingModule(); TestBed.resetTestingModule();
expect(() => TestBed.overrideComponent(SomePrivateComponent, {add: {}}).compileComponents()) expect(
() => TestBed.overrideComponent(SomePrivateComponent, {add: {}}).compileComponents())
.toThrowError( .toThrowError(
'SomePrivateComponent was AOT compiled, so its metadata cannot be changed.'); 'SomePrivateComponent was AOT compiled, so its metadata cannot be changed.');
TestBed.resetTestingModule(); TestBed.resetTestingModule();
@ -213,11 +221,13 @@ import {fixmeIvy} from '@angular/private/testing';
.toThrowError('SomeModule was AOT compiled, so its metadata cannot be changed.'); .toThrowError('SomeModule was AOT compiled, so its metadata cannot be changed.');
}); });
fixmeIvy('FW-514: ngSummary shims not generated by ngtsc') &&
it('should return stack trace and component data on resetTestingModule when error is thrown', it('should return stack trace and component data on resetTestingModule when error is thrown',
() => { () => {
resetTestEnvironmentWithSummaries(); resetTestEnvironmentWithSummaries();
const fixture = TestBed.configureTestingModule({declarations: [TestCompErrorOnDestroy]}) const fixture =
TestBed.configureTestingModule({declarations: [TestCompErrorOnDestroy]})
.createComponent<TestCompErrorOnDestroy>(TestCompErrorOnDestroy); .createComponent<TestCompErrorOnDestroy>(TestCompErrorOnDestroy);
const expectedError = 'Error from ngOnDestroy'; const expectedError = 'Error from ngOnDestroy';
@ -238,6 +248,7 @@ import {fixmeIvy} from '@angular/private/testing';
.toHaveBeenCalledWith('Error during cleanup of component', expectedObject); .toHaveBeenCalledWith('Error during cleanup of component', expectedObject);
}); });
fixmeIvy('FW-514: ngSummary shims not generated by ngtsc') &&
it('should allow to add summaries via configureTestingModule', () => { it('should allow to add summaries via configureTestingModule', () => {
resetTestEnvironmentWithSummaries(); resetTestEnvironmentWithSummaries();
@ -255,6 +266,7 @@ import {fixmeIvy} from '@angular/private/testing';
expectInstanceCreated(SomeDirective); expectInstanceCreated(SomeDirective);
}); });
fixmeIvy('FW-514: ngSummary shims not generated by ngtsc') &&
it('should allow to override a provider', () => { it('should allow to override a provider', () => {
resetTestEnvironmentWithSummaries(summaries); resetTestEnvironmentWithSummaries(summaries);
@ -268,12 +280,14 @@ import {fixmeIvy} from '@angular/private/testing';
expect(fixture.componentInstance.dep).toBe(overwrittenValue); expect(fixture.componentInstance.dep).toBe(overwrittenValue);
}); });
fixmeIvy('FW-514: ngSummary shims not generated by ngtsc') &&
it('should allow to override a template', () => { it('should allow to override a template', () => {
resetTestEnvironmentWithSummaries(summaries); resetTestEnvironmentWithSummaries(summaries);
TestBed.overrideTemplateUsingTestingModule(SomePublicComponent, 'overwritten'); TestBed.overrideTemplateUsingTestingModule(SomePublicComponent, 'overwritten');
const fixture = TestBed.configureTestingModule({providers: [SomeDep], imports: [SomeModule]}) const fixture =
TestBed.configureTestingModule({providers: [SomeDep], imports: [SomeModule]})
.createComponent(SomePublicComponent); .createComponent(SomePublicComponent);
expectInstanceCreated(SomePublicComponent); expectInstanceCreated(SomePublicComponent);

View File

@ -15,7 +15,7 @@ import {Subject} from 'rxjs';
import {stringify} from '../../src/util'; import {stringify} from '../../src/util';
// FW-670: Internal Error: The name q is already defined in scope // FW-670: Internal Error: The name q is already defined in scope
fixmeIvy('FW-670') && describe('Query API', () => { describe('Query API', () => {
beforeEach(() => TestBed.configureTestingModule({ beforeEach(() => TestBed.configureTestingModule({
declarations: [ declarations: [
@ -54,6 +54,7 @@ fixmeIvy('FW-670') && describe('Query API', () => {
})); }));
describe('querying by directive type', () => { describe('querying by directive type', () => {
fixmeIvy('FW-670: Internal Error: The name q is already defined in scope') &&
it('should contain all direct child directives in the light dom (constructor)', () => { it('should contain all direct child directives in the light dom (constructor)', () => {
const template = '<div text="1"></div>' + const template = '<div text="1"></div>' +
'<needs-query text="2"><div text="3">' + '<needs-query text="2"><div text="3">' +
@ -65,8 +66,10 @@ fixmeIvy('FW-670') && describe('Query API', () => {
expect(asNativeElements(view.debugElement.children)).toHaveText('2|3|'); expect(asNativeElements(view.debugElement.children)).toHaveText('2|3|');
}); });
fixmeIvy('FW-670: Internal Error: The name q is already defined in scope') &&
it('should contain all direct child directives in the content dom', () => { it('should contain all direct child directives in the content dom', () => {
const template = '<needs-content-children #q><div text="foo"></div></needs-content-children>'; const template =
'<needs-content-children #q><div text="foo"></div></needs-content-children>';
const view = createTestCmpAndDetectChanges(MyComp0, template); const view = createTestCmpAndDetectChanges(MyComp0, template);
const q = view.debugElement.children[0].references !['q']; const q = view.debugElement.children[0].references !['q'];
@ -75,6 +78,7 @@ fixmeIvy('FW-670') && describe('Query API', () => {
expect(q.numberOfChildrenAfterContentInit).toEqual(1); expect(q.numberOfChildrenAfterContentInit).toEqual(1);
}); });
fixmeIvy('FW-670: Internal Error: The name q is already defined in scope') &&
it('should contain the first content child', () => { it('should contain the first content child', () => {
const template = const template =
'<needs-content-child #q><div *ngIf="shouldShow" text="foo"></div></needs-content-child>'; '<needs-content-child #q><div *ngIf="shouldShow" text="foo"></div></needs-content-child>';
@ -87,10 +91,12 @@ fixmeIvy('FW-670') && describe('Query API', () => {
view.componentInstance.shouldShow = false; view.componentInstance.shouldShow = false;
view.detectChanges(); view.detectChanges();
expect(q.logs).toEqual([ expect(q.logs).toEqual([
['setter', 'foo'], ['init', 'foo'], ['check', 'foo'], ['setter', null], ['check', null] ['setter', 'foo'], ['init', 'foo'], ['check', 'foo'], ['setter', null],
['check', null]
]); ]);
}); });
fixmeIvy('FW-670: Internal Error: The name q is already defined in scope') &&
it('should contain the first content child when target is on <ng-template> with embedded view (issue #16568)', it('should contain the first content child when target is on <ng-template> with embedded view (issue #16568)',
() => { () => {
const template = const template =
@ -105,6 +111,7 @@ fixmeIvy('FW-670') && describe('Query API', () => {
expect(directive.child.text).toEqual('foo'); expect(directive.child.text).toEqual('foo');
}); });
fixmeIvy('FW-670: Internal Error: The name q is already defined in scope') &&
it('should contain the first view child', () => { it('should contain the first view child', () => {
const template = '<needs-view-child #q></needs-view-child>'; const template = '<needs-view-child #q></needs-view-child>';
const view = createTestCmpAndDetectChanges(MyComp0, template); const view = createTestCmpAndDetectChanges(MyComp0, template);
@ -115,10 +122,12 @@ fixmeIvy('FW-670') && describe('Query API', () => {
q.shouldShow = false; q.shouldShow = false;
view.detectChanges(); view.detectChanges();
expect(q.logs).toEqual([ expect(q.logs).toEqual([
['setter', 'foo'], ['init', 'foo'], ['check', 'foo'], ['setter', null], ['check', null] ['setter', 'foo'], ['init', 'foo'], ['check', 'foo'], ['setter', null],
['check', null]
]); ]);
}); });
fixmeIvy('FW-670: Internal Error: The name q is already defined in scope') &&
it('should set static view and content children already after the constructor call', () => { it('should set static view and content children already after the constructor call', () => {
const template = const template =
'<needs-static-content-view-child #q><div text="contentFoo"></div></needs-static-content-view-child>'; '<needs-static-content-view-child #q><div text="contentFoo"></div></needs-static-content-view-child>';
@ -132,6 +141,7 @@ fixmeIvy('FW-670') && describe('Query API', () => {
expect(q.viewChild.text).toEqual('viewFoo'); expect(q.viewChild.text).toEqual('viewFoo');
}); });
fixmeIvy('FW-670: Internal Error: The name q is already defined in scope') &&
it('should contain the first view child across embedded views', () => { it('should contain the first view child across embedded views', () => {
TestBed.overrideComponent( TestBed.overrideComponent(
MyComp0, {set: {template: '<needs-view-child #q></needs-view-child>'}}); MyComp0, {set: {template: '<needs-view-child #q></needs-view-child>'}});
@ -160,6 +170,7 @@ fixmeIvy('FW-670') && describe('Query API', () => {
expect(q.logs).toEqual([['setter', null], ['check', null]]); expect(q.logs).toEqual([['setter', null], ['check', null]]);
}); });
fixmeIvy('FW-670: Internal Error: The name q is already defined in scope') &&
it('should contain all directives in the light dom when descendants flag is used', () => { it('should contain all directives in the light dom when descendants flag is used', () => {
const template = '<div text="1"></div>' + const template = '<div text="1"></div>' +
'<needs-query-desc text="2"><div text="3">' + '<needs-query-desc text="2"><div text="3">' +
@ -171,6 +182,7 @@ fixmeIvy('FW-670') && describe('Query API', () => {
expect(asNativeElements(view.debugElement.children)).toHaveText('2|3|4|'); expect(asNativeElements(view.debugElement.children)).toHaveText('2|3|4|');
}); });
fixmeIvy('FW-670: Internal Error: The name q is already defined in scope') &&
it('should contain all directives in the light dom', () => { it('should contain all directives in the light dom', () => {
const template = '<div text="1"></div>' + const template = '<div text="1"></div>' +
'<needs-query text="2"><div text="3"></div></needs-query>' + '<needs-query text="2"><div text="3"></div></needs-query>' +
@ -180,6 +192,7 @@ fixmeIvy('FW-670') && describe('Query API', () => {
expect(asNativeElements(view.debugElement.children)).toHaveText('2|3|'); expect(asNativeElements(view.debugElement.children)).toHaveText('2|3|');
}); });
fixmeIvy('FW-670: Internal Error: The name q is already defined in scope') &&
it('should reflect dynamically inserted directives', () => { it('should reflect dynamically inserted directives', () => {
const template = '<div text="1"></div>' + const template = '<div text="1"></div>' +
'<needs-query text="2"><div *ngIf="shouldShow" [text]="\'3\'"></div></needs-query>' + '<needs-query text="2"><div *ngIf="shouldShow" [text]="\'3\'"></div></needs-query>' +
@ -192,6 +205,7 @@ fixmeIvy('FW-670') && describe('Query API', () => {
expect(asNativeElements(view.debugElement.children)).toHaveText('2|3|'); expect(asNativeElements(view.debugElement.children)).toHaveText('2|3|');
}); });
fixmeIvy('FW-670: Internal Error: The name q is already defined in scope') &&
it('should be cleanly destroyed when a query crosses view boundaries', () => { it('should be cleanly destroyed when a query crosses view boundaries', () => {
const template = '<div text="1"></div>' + const template = '<div text="1"></div>' +
'<needs-query text="2"><div *ngIf="shouldShow" [text]="\'3\'"></div></needs-query>' + '<needs-query text="2"><div *ngIf="shouldShow" [text]="\'3\'"></div></needs-query>' +
@ -203,6 +217,7 @@ fixmeIvy('FW-670') && describe('Query API', () => {
view.destroy(); view.destroy();
}); });
fixmeIvy('FW-670: Internal Error: The name q is already defined in scope') &&
it('should reflect moved directives', () => { it('should reflect moved directives', () => {
const template = '<div text="1"></div>' + const template = '<div text="1"></div>' +
'<needs-query text="2"><div *ngFor="let i of list" [text]="i"></div></needs-query>' + '<needs-query text="2"><div *ngFor="let i of list" [text]="i"></div></needs-query>' +
@ -215,6 +230,7 @@ fixmeIvy('FW-670') && describe('Query API', () => {
expect(asNativeElements(view.debugElement.children)).toHaveText('2|3d|2d|'); expect(asNativeElements(view.debugElement.children)).toHaveText('2|3d|2d|');
}); });
fixmeIvy('FW-670: Internal Error: The name q is already defined in scope') &&
it('should throw with descriptive error when query selectors are not present', () => { it('should throw with descriptive error when query selectors are not present', () => {
TestBed.configureTestingModule({declarations: [MyCompBroken0, HasNullQueryCondition]}); TestBed.configureTestingModule({declarations: [MyCompBroken0, HasNullQueryCondition]});
const template = '<has-null-query-condition></has-null-query-condition>'; const template = '<has-null-query-condition></has-null-query-condition>';
@ -226,27 +242,33 @@ fixmeIvy('FW-670') && describe('Query API', () => {
}); });
describe('query for TemplateRef', () => { describe('query for TemplateRef', () => {
fixmeIvy('FW-670: Internal Error: The name q is already defined in scope') &&
it('should find TemplateRefs in the light and shadow dom', () => { it('should find TemplateRefs in the light and shadow dom', () => {
const template = '<needs-tpl><ng-template><div>light</div></ng-template></needs-tpl>'; const template = '<needs-tpl><ng-template><div>light</div></ng-template></needs-tpl>';
const view = createTestCmpAndDetectChanges(MyComp0, template); const view = createTestCmpAndDetectChanges(MyComp0, template);
const needsTpl: NeedsTpl = view.debugElement.children[0].injector.get(NeedsTpl); const needsTpl: NeedsTpl = view.debugElement.children[0].injector.get(NeedsTpl);
expect(needsTpl.vc.createEmbeddedView(needsTpl.query.first).rootNodes[0]).toHaveText('light'); expect(needsTpl.vc.createEmbeddedView(needsTpl.query.first).rootNodes[0])
.toHaveText('light');
expect(needsTpl.vc.createEmbeddedView(needsTpl.viewQuery.first).rootNodes[0]) expect(needsTpl.vc.createEmbeddedView(needsTpl.viewQuery.first).rootNodes[0])
.toHaveText('shadow'); .toHaveText('shadow');
}); });
fixmeIvy('FW-670: Internal Error: The name q is already defined in scope') &&
it('should find named TemplateRefs', () => { it('should find named TemplateRefs', () => {
const template = const template =
'<needs-named-tpl><ng-template #tpl><div>light</div></ng-template></needs-named-tpl>'; '<needs-named-tpl><ng-template #tpl><div>light</div></ng-template></needs-named-tpl>';
const view = createTestCmpAndDetectChanges(MyComp0, template); const view = createTestCmpAndDetectChanges(MyComp0, template);
const needsTpl: NeedsNamedTpl = view.debugElement.children[0].injector.get(NeedsNamedTpl); const needsTpl: NeedsNamedTpl = view.debugElement.children[0].injector.get(NeedsNamedTpl);
expect(needsTpl.vc.createEmbeddedView(needsTpl.contentTpl).rootNodes[0]).toHaveText('light'); expect(needsTpl.vc.createEmbeddedView(needsTpl.contentTpl).rootNodes[0])
expect(needsTpl.vc.createEmbeddedView(needsTpl.viewTpl).rootNodes[0]).toHaveText('shadow'); .toHaveText('light');
expect(needsTpl.vc.createEmbeddedView(needsTpl.viewTpl).rootNodes[0])
.toHaveText('shadow');
}); });
}); });
describe('read a different token', () => { describe('read a different token', () => {
fixmeIvy('FW-670: Internal Error: The name q is already defined in scope') &&
it('should contain all content children', () => { it('should contain all content children', () => {
const template = const template =
'<needs-content-children-read #q text="ca"><div #q text="cb"></div></needs-content-children-read>'; '<needs-content-children-read #q text="ca"><div #q text="cb"></div></needs-content-children-read>';
@ -254,9 +276,12 @@ fixmeIvy('FW-670') && describe('Query API', () => {
const comp: NeedsContentChildrenWithRead = const comp: NeedsContentChildrenWithRead =
view.debugElement.children[0].injector.get(NeedsContentChildrenWithRead); view.debugElement.children[0].injector.get(NeedsContentChildrenWithRead);
expect(comp.textDirChildren.map(textDirective => textDirective.text)).toEqual(['ca', 'cb']); expect(comp.textDirChildren.map(textDirective => textDirective.text)).toEqual([
'ca', 'cb'
]);
}); });
fixmeIvy('FW-670: Internal Error: The name q is already defined in scope') &&
it('should contain the first content child', () => { it('should contain the first content child', () => {
const template = const template =
'<needs-content-child-read><div #q text="ca"></div></needs-content-child-read>'; '<needs-content-child-read><div #q text="ca"></div></needs-content-child-read>';
@ -267,6 +292,7 @@ fixmeIvy('FW-670') && describe('Query API', () => {
expect(comp.textDirChild.text).toEqual('ca'); expect(comp.textDirChild.text).toEqual('ca');
}); });
fixmeIvy('FW-670: Internal Error: The name q is already defined in scope') &&
it('should contain the first descendant content child', () => { it('should contain the first descendant content child', () => {
const template = '<needs-content-child-read>' + const template = '<needs-content-child-read>' +
'<div dir><div #q text="ca"></div></div>' + '<div dir><div #q text="ca"></div></div>' +
@ -278,6 +304,7 @@ fixmeIvy('FW-670') && describe('Query API', () => {
expect(comp.textDirChild.text).toEqual('ca'); expect(comp.textDirChild.text).toEqual('ca');
}); });
fixmeIvy('FW-670: Internal Error: The name q is already defined in scope') &&
it('should contain the first descendant content child templateRef', () => { it('should contain the first descendant content child templateRef', () => {
const template = '<needs-content-child-template-ref-app>' + const template = '<needs-content-child-template-ref-app>' +
'</needs-content-child-template-ref-app>'; '</needs-content-child-template-ref-app>';
@ -300,6 +327,7 @@ fixmeIvy('FW-670') && describe('Query API', () => {
expect(view.nativeElement).toHaveText('OUTER'); expect(view.nativeElement).toHaveText('OUTER');
}); });
fixmeIvy('FW-670: Internal Error: The name q is already defined in scope') &&
it('should contain the first view child', () => { it('should contain the first view child', () => {
const template = '<needs-view-child-read></needs-view-child-read>'; const template = '<needs-view-child-read></needs-view-child-read>';
const view = createTestCmpAndDetectChanges(MyComp0, template); const view = createTestCmpAndDetectChanges(MyComp0, template);
@ -309,15 +337,19 @@ fixmeIvy('FW-670') && describe('Query API', () => {
expect(comp.textDirChild.text).toEqual('va'); expect(comp.textDirChild.text).toEqual('va');
}); });
fixmeIvy('FW-670: Internal Error: The name q is already defined in scope') &&
it('should contain all child directives in the view', () => { it('should contain all child directives in the view', () => {
const template = '<needs-view-children-read></needs-view-children-read>'; const template = '<needs-view-children-read></needs-view-children-read>';
const view = createTestCmpAndDetectChanges(MyComp0, template); const view = createTestCmpAndDetectChanges(MyComp0, template);
const comp: NeedsViewChildrenWithRead = const comp: NeedsViewChildrenWithRead =
view.debugElement.children[0].injector.get(NeedsViewChildrenWithRead); view.debugElement.children[0].injector.get(NeedsViewChildrenWithRead);
expect(comp.textDirChildren.map(textDirective => textDirective.text)).toEqual(['va', 'vb']); expect(comp.textDirChildren.map(textDirective => textDirective.text)).toEqual([
'va', 'vb'
]);
}); });
fixmeIvy('FW-670: Internal Error: The name q is already defined in scope') &&
it('should support reading a ViewContainer', () => { it('should support reading a ViewContainer', () => {
const template = const template =
'<needs-viewcontainer-read><ng-template>hello</ng-template></needs-viewcontainer-read>'; '<needs-viewcontainer-read><ng-template>hello</ng-template></needs-viewcontainer-read>';
@ -331,6 +363,7 @@ fixmeIvy('FW-670') && describe('Query API', () => {
}); });
describe('changes', () => { describe('changes', () => {
fixmeIvy('FW-670: Internal Error: The name q is already defined in scope') &&
it('should notify query on change', async(() => { it('should notify query on change', async(() => {
const template = '<needs-query #q>' + const template = '<needs-query #q>' +
'<div text="1"></div>' + '<div text="1"></div>' +
@ -351,9 +384,11 @@ fixmeIvy('FW-670') && describe('Query API', () => {
view.detectChanges(); view.detectChanges();
})); }));
fixmeIvy('FW-670: Internal Error: The name q is already defined in scope') &&
it('should correctly clean-up when destroyed together with the directives it is querying', it('should correctly clean-up when destroyed together with the directives it is querying',
() => { () => {
const template = '<needs-query #q *ngIf="shouldShow"><div text="foo"></div></needs-query>'; const template =
'<needs-query #q *ngIf="shouldShow"><div text="foo"></div></needs-query>';
const view = createTestCmpAndDetectChanges(MyComp0, template); const view = createTestCmpAndDetectChanges(MyComp0, template);
view.componentInstance.shouldShow = true; view.componentInstance.shouldShow = true;
view.detectChanges(); view.detectChanges();
@ -382,6 +417,7 @@ fixmeIvy('FW-670') && describe('Query API', () => {
}); });
describe('querying by var binding', () => { describe('querying by var binding', () => {
fixmeIvy('FW-670: Internal Error: The name q is already defined in scope') &&
it('should contain all the child directives in the light dom with the given var binding', it('should contain all the child directives in the light dom with the given var binding',
() => { () => {
const template = '<needs-query-by-ref-binding #q>' + const template = '<needs-query-by-ref-binding #q>' +
@ -396,6 +432,7 @@ fixmeIvy('FW-670') && describe('Query API', () => {
expect(q.query.last.text).toEqual('2d'); expect(q.query.last.text).toEqual('2d');
}); });
fixmeIvy('FW-670: Internal Error: The name q is already defined in scope') &&
it('should support querying by multiple var bindings', () => { it('should support querying by multiple var bindings', () => {
const template = '<needs-query-by-ref-bindings #q>' + const template = '<needs-query-by-ref-bindings #q>' +
'<div text="one" #textLabel1="textDir"></div>' + '<div text="one" #textLabel1="textDir"></div>' +
@ -408,6 +445,7 @@ fixmeIvy('FW-670') && describe('Query API', () => {
expect(q.query.last.text).toEqual('two'); expect(q.query.last.text).toEqual('two');
}); });
fixmeIvy('FW-670: Internal Error: The name q is already defined in scope') &&
it('should support dynamically inserted directives', () => { it('should support dynamically inserted directives', () => {
const template = '<needs-query-by-ref-binding #q>' + const template = '<needs-query-by-ref-binding #q>' +
'<div *ngFor="let item of list" [text]="item" #textLabel="textDir"></div>' + '<div *ngFor="let item of list" [text]="item" #textLabel="textDir"></div>' +
@ -422,6 +460,7 @@ fixmeIvy('FW-670') && describe('Query API', () => {
expect(q.query.last.text).toEqual('1d'); expect(q.query.last.text).toEqual('1d');
}); });
fixmeIvy('FW-670: Internal Error: The name q is already defined in scope') &&
it('should contain all the elements in the light dom with the given var binding', () => { it('should contain all the elements in the light dom with the given var binding', () => {
const template = '<needs-query-by-ref-binding #q>' + const template = '<needs-query-by-ref-binding #q>' +
'<div *ngFor="let item of list">' + '<div *ngFor="let item of list">' +
@ -437,6 +476,7 @@ fixmeIvy('FW-670') && describe('Query API', () => {
expect(q.query.last.nativeElement).toHaveText('2d'); expect(q.query.last.nativeElement).toHaveText('2d');
}); });
fixmeIvy('FW-670: Internal Error: The name q is already defined in scope') &&
it('should contain all the elements in the light dom even if they get projected', () => { it('should contain all the elements in the light dom even if they get projected', () => {
const template = '<needs-query-and-project #q>' + const template = '<needs-query-and-project #q>' +
'<div text="hello"></div><div text="world"></div>' + '<div text="hello"></div><div text="world"></div>' +
@ -446,6 +486,7 @@ fixmeIvy('FW-670') && describe('Query API', () => {
expect(asNativeElements(view.debugElement.children)).toHaveText('hello|world|'); expect(asNativeElements(view.debugElement.children)).toHaveText('hello|world|');
}); });
fixmeIvy('FW-670: Internal Error: The name q is already defined in scope') &&
it('should support querying the view by using a view query', () => { it('should support querying the view by using a view query', () => {
const template = '<needs-view-query-by-ref-binding #q></needs-view-query-by-ref-binding>'; const template = '<needs-view-query-by-ref-binding #q></needs-view-query-by-ref-binding>';
const view = createTestCmpAndDetectChanges(MyComp0, template); const view = createTestCmpAndDetectChanges(MyComp0, template);
@ -454,6 +495,7 @@ fixmeIvy('FW-670') && describe('Query API', () => {
expect(q.query.first.nativeElement).toHaveText('text'); expect(q.query.first.nativeElement).toHaveText('text');
}); });
fixmeIvy('FW-670: Internal Error: The name q is already defined in scope') &&
it('should contain all child directives in the view dom', () => { it('should contain all child directives in the view dom', () => {
const template = '<needs-view-children #q></needs-view-children>'; const template = '<needs-view-children #q></needs-view-children>';
const view = createTestCmpAndDetectChanges(MyComp0, template); const view = createTestCmpAndDetectChanges(MyComp0, template);
@ -464,6 +506,7 @@ fixmeIvy('FW-670') && describe('Query API', () => {
}); });
describe('querying in the view', () => { describe('querying in the view', () => {
fixmeIvy('FW-670: Internal Error: The name q is already defined in scope') &&
it('should contain all the elements in the view with that have the given directive', () => { it('should contain all the elements in the view with that have the given directive', () => {
const template = '<needs-view-query #q><div text="ignoreme"></div></needs-view-query>'; const template = '<needs-view-query #q><div text="ignoreme"></div></needs-view-query>';
const view = createTestCmpAndDetectChanges(MyComp0, template); const view = createTestCmpAndDetectChanges(MyComp0, template);
@ -471,6 +514,7 @@ fixmeIvy('FW-670') && describe('Query API', () => {
expect(q.query.map((d: TextDirective) => d.text)).toEqual(['1', '2', '3', '4']); expect(q.query.map((d: TextDirective) => d.text)).toEqual(['1', '2', '3', '4']);
}); });
fixmeIvy('FW-670: Internal Error: The name q is already defined in scope') &&
it('should not include directive present on the host element', () => { it('should not include directive present on the host element', () => {
const template = '<needs-view-query #q text="self"></needs-view-query>'; const template = '<needs-view-query #q text="self"></needs-view-query>';
const view = createTestCmpAndDetectChanges(MyComp0, template); const view = createTestCmpAndDetectChanges(MyComp0, template);
@ -478,6 +522,7 @@ fixmeIvy('FW-670') && describe('Query API', () => {
expect(q.query.map((d: TextDirective) => d.text)).toEqual(['1', '2', '3', '4']); expect(q.query.map((d: TextDirective) => d.text)).toEqual(['1', '2', '3', '4']);
}); });
fixmeIvy('FW-670: Internal Error: The name q is already defined in scope') &&
it('should reflect changes in the component', () => { it('should reflect changes in the component', () => {
const template = '<needs-view-query-if #q></needs-view-query-if>'; const template = '<needs-view-query-if #q></needs-view-query-if>';
const view = createTestCmpAndDetectChanges(MyComp0, template); const view = createTestCmpAndDetectChanges(MyComp0, template);
@ -490,6 +535,7 @@ fixmeIvy('FW-670') && describe('Query API', () => {
expect(q.query.first.text).toEqual('1'); expect(q.query.first.text).toEqual('1');
}); });
fixmeIvy('FW-670: Internal Error: The name q is already defined in scope') &&
it('should not be affected by other changes in the component', () => { it('should not be affected by other changes in the component', () => {
const template = '<needs-view-query-nested-if #q></needs-view-query-nested-if>'; const template = '<needs-view-query-nested-if #q></needs-view-query-nested-if>';
const view = createTestCmpAndDetectChanges(MyComp0, template); const view = createTestCmpAndDetectChanges(MyComp0, template);
@ -504,6 +550,7 @@ fixmeIvy('FW-670') && describe('Query API', () => {
expect(q.query.first.text).toEqual('1'); expect(q.query.first.text).toEqual('1');
}); });
fixmeIvy('FW-670: Internal Error: The name q is already defined in scope') &&
it('should maintain directives in pre-order depth-first DOM order after dynamic insertion', it('should maintain directives in pre-order depth-first DOM order after dynamic insertion',
() => { () => {
const template = '<needs-view-query-order #q></needs-view-query-order>'; const template = '<needs-view-query-order #q></needs-view-query-order>';
@ -517,11 +564,13 @@ fixmeIvy('FW-670') && describe('Query API', () => {
expect(q.query.map((d: TextDirective) => d.text)).toEqual(['1', '-3', '2', '4']); expect(q.query.map((d: TextDirective) => d.text)).toEqual(['1', '-3', '2', '4']);
}); });
fixmeIvy('FW-670: Internal Error: The name q is already defined in scope') &&
it('should maintain directives in pre-order depth-first DOM order after dynamic insertion', it('should maintain directives in pre-order depth-first DOM order after dynamic insertion',
() => { () => {
const template = '<needs-view-query-order-with-p #q></needs-view-query-order-with-p>'; const template = '<needs-view-query-order-with-p #q></needs-view-query-order-with-p>';
const view = createTestCmpAndDetectChanges(MyComp0, template); const view = createTestCmpAndDetectChanges(MyComp0, template);
const q: NeedsViewQueryOrderWithParent = view.debugElement.children[0].references !['q']; const q: NeedsViewQueryOrderWithParent =
view.debugElement.children[0].references !['q'];
expect(q.query.map((d: TextDirective) => d.text)).toEqual(['1', '2', '3', '4']); expect(q.query.map((d: TextDirective) => d.text)).toEqual(['1', '2', '3', '4']);
q.list = ['-3', '2']; q.list = ['-3', '2'];
@ -529,6 +578,7 @@ fixmeIvy('FW-670') && describe('Query API', () => {
expect(q.query.map((d: TextDirective) => d.text)).toEqual(['1', '-3', '2', '4']); expect(q.query.map((d: TextDirective) => d.text)).toEqual(['1', '-3', '2', '4']);
}); });
fixmeIvy('FW-670: Internal Error: The name q is already defined in scope') &&
it('should handle long ngFor cycles', () => { it('should handle long ngFor cycles', () => {
const template = '<needs-view-query-order #q></needs-view-query-order>'; const template = '<needs-view-query-order #q></needs-view-query-order>';
const view = createTestCmpAndDetectChanges(MyComp0, template); const view = createTestCmpAndDetectChanges(MyComp0, template);
@ -551,6 +601,7 @@ fixmeIvy('FW-670') && describe('Query API', () => {
} }
}); });
fixmeIvy('FW-670: Internal Error: The name q is already defined in scope') &&
it('should support more than three queries', () => { it('should support more than three queries', () => {
const template = '<needs-four-queries #q><div text="1"></div></needs-four-queries>'; const template = '<needs-four-queries #q><div text="1"></div></needs-four-queries>';
const view = createTestCmpAndDetectChanges(MyComp0, template); const view = createTestCmpAndDetectChanges(MyComp0, template);
@ -563,6 +614,7 @@ fixmeIvy('FW-670') && describe('Query API', () => {
}); });
describe('query over moved templates', () => { describe('query over moved templates', () => {
fixmeIvy('FW-670: Internal Error: The name q is already defined in scope') &&
it('should include manually projected templates in queries', () => { it('should include manually projected templates in queries', () => {
const template = const template =
'<manual-projecting #q><ng-template><div text="1"></div></ng-template></manual-projecting>'; '<manual-projecting #q><ng-template><div text="1"></div></ng-template></manual-projecting>';
@ -594,6 +646,7 @@ fixmeIvy('FW-670') && describe('Query API', () => {
// for // for
// performance // performance
// reasons. // reasons.
fixmeIvy('FW-670: Internal Error: The name q is already defined in scope') &&
it('should not affected queries for projected templates if views are detached or moved', () => { it('should not affected queries for projected templates if views are detached or moved', () => {
const template = const template =
'<manual-projecting #q><ng-template let-x="x"><div [text]="x"></div></ng-template></manual-projecting>'; '<manual-projecting #q><ng-template let-x="x"><div [text]="x"></div></ng-template></manual-projecting>';
@ -619,6 +672,7 @@ fixmeIvy('FW-670') && describe('Query API', () => {
expect(q.query.map((d: TextDirective) => d.text)).toEqual(['1', '2']); expect(q.query.map((d: TextDirective) => d.text)).toEqual(['1', '2']);
}); });
fixmeIvy('FW-670: Internal Error: The name q is already defined in scope') &&
it('should remove manually projected templates if their parent view is destroyed', () => { it('should remove manually projected templates if their parent view is destroyed', () => {
const template = ` const template = `
<manual-projecting #q><ng-template #tpl><div text="1"></div></ng-template></manual-projecting> <manual-projecting #q><ng-template #tpl><div text="1"></div></ng-template></manual-projecting>
@ -638,6 +692,7 @@ fixmeIvy('FW-670') && describe('Query API', () => {
expect(q.query.length).toBe(0); expect(q.query.length).toBe(0);
}); });
fixmeIvy('FW-670: Internal Error: The name q is already defined in scope') &&
it('should not throw if a content template is queried and created in the view during change detection', it('should not throw if a content template is queried and created in the view during change detection',
() => { () => {
@Component( @Component(

View File

@ -14,7 +14,7 @@ import {fixmeIvy} from '@angular/private/testing';
{ {
if (ivyEnabled) { if (ivyEnabled) {
fixmeIvy('unknown') && describe('ivy', () => { declareTests(); }); describe('ivy', () => { declareTests(); });
} else { } else {
describe('jit', () => { declareTests({useJit: true}); }); describe('jit', () => { declareTests({useJit: true}); });
describe('no jit', () => { declareTests({useJit: false}); }); describe('no jit', () => { declareTests({useJit: false}); });
@ -52,7 +52,7 @@ function declareTests(config?: {useJit: boolean}) {
afterEach(() => { getDOM().log = originalLog; }); afterEach(() => { getDOM().log = originalLog; });
describe('events', () => { describe('events', () => {
it('should disallow binding to attr.on*', () => { fixmeIvy('unknown') && it('should disallow binding to attr.on*', () => {
const template = `<div [attr.onclick]="ctxProp"></div>`; const template = `<div [attr.onclick]="ctxProp"></div>`;
TestBed.overrideComponent(SecuredComponent, {set: {template}}); TestBed.overrideComponent(SecuredComponent, {set: {template}});
@ -61,7 +61,7 @@ function declareTests(config?: {useJit: boolean}) {
/Binding to event attribute 'onclick' is disallowed for security reasons, please use \(click\)=.../); /Binding to event attribute 'onclick' is disallowed for security reasons, please use \(click\)=.../);
}); });
it('should disallow binding to on* with NO_ERRORS_SCHEMA', () => { fixmeIvy('unknown') && it('should disallow binding to on* with NO_ERRORS_SCHEMA', () => {
const template = `<div [onclick]="ctxProp"></div>`; const template = `<div [onclick]="ctxProp"></div>`;
TestBed.overrideComponent(SecuredComponent, {set: {template}}).configureTestingModule({ TestBed.overrideComponent(SecuredComponent, {set: {template}}).configureTestingModule({
schemas: [NO_ERRORS_SCHEMA] schemas: [NO_ERRORS_SCHEMA]
@ -72,6 +72,7 @@ function declareTests(config?: {useJit: boolean}) {
/Binding to event property 'onclick' is disallowed for security reasons, please use \(click\)=.../); /Binding to event property 'onclick' is disallowed for security reasons, please use \(click\)=.../);
}); });
fixmeIvy('unknown') &&
it('should disallow binding to on* unless it is consumed by a directive', () => { it('should disallow binding to on* unless it is consumed by a directive', () => {
const template = `<div [onPrefixedProp]="ctxProp" [onclick]="ctxProp"></div>`; const template = `<div [onPrefixedProp]="ctxProp" [onclick]="ctxProp"></div>`;
TestBed.overrideComponent(SecuredComponent, {set: {template}}).configureTestingModule({ TestBed.overrideComponent(SecuredComponent, {set: {template}}).configureTestingModule({
@ -94,7 +95,7 @@ function declareTests(config?: {useJit: boolean}) {
}); });
describe('safe HTML values', function() { describe('safe HTML values', function() {
it('should not escape values marked as trusted', () => { fixmeIvy('unknown') && it('should not escape values marked as trusted', () => {
const template = `<a [href]="ctxProp">Link Title</a>`; const template = `<a [href]="ctxProp">Link Title</a>`;
TestBed.overrideComponent(SecuredComponent, {set: {template}}); TestBed.overrideComponent(SecuredComponent, {set: {template}});
const fixture = TestBed.createComponent(SecuredComponent); const fixture = TestBed.createComponent(SecuredComponent);
@ -108,7 +109,7 @@ function declareTests(config?: {useJit: boolean}) {
expect(getDOM().getProperty(e, 'href')).toEqual('javascript:alert(1)'); expect(getDOM().getProperty(e, 'href')).toEqual('javascript:alert(1)');
}); });
it('should error when using the wrong trusted value', () => { fixmeIvy('unknown') && it('should error when using the wrong trusted value', () => {
const template = `<a [href]="ctxProp">Link Title</a>`; const template = `<a [href]="ctxProp">Link Title</a>`;
TestBed.overrideComponent(SecuredComponent, {set: {template}}); TestBed.overrideComponent(SecuredComponent, {set: {template}});
const fixture = TestBed.createComponent(SecuredComponent); const fixture = TestBed.createComponent(SecuredComponent);
@ -120,7 +121,7 @@ function declareTests(config?: {useJit: boolean}) {
expect(() => fixture.detectChanges()).toThrowError(/Required a safe URL, got a Script/); expect(() => fixture.detectChanges()).toThrowError(/Required a safe URL, got a Script/);
}); });
it('should warn when using in string interpolation', () => { fixmeIvy('unknown') && it('should warn when using in string interpolation', () => {
const template = `<a href="/foo/{{ctxProp}}">Link Title</a>`; const template = `<a href="/foo/{{ctxProp}}">Link Title</a>`;
TestBed.overrideComponent(SecuredComponent, {set: {template}}); TestBed.overrideComponent(SecuredComponent, {set: {template}});
const fixture = TestBed.createComponent(SecuredComponent); const fixture = TestBed.createComponent(SecuredComponent);
@ -153,7 +154,7 @@ function declareTests(config?: {useJit: boolean}) {
expect(value).toEqual('unsafe:javascript:alert(1)'); expect(value).toEqual('unsafe:javascript:alert(1)');
} }
it('should escape unsafe properties', () => { fixmeIvy('unknown') && it('should escape unsafe properties', () => {
const template = `<a [href]="ctxProp">Link Title</a>`; const template = `<a [href]="ctxProp">Link Title</a>`;
TestBed.overrideComponent(SecuredComponent, {set: {template}}); TestBed.overrideComponent(SecuredComponent, {set: {template}});
const fixture = TestBed.createComponent(SecuredComponent); const fixture = TestBed.createComponent(SecuredComponent);
@ -161,7 +162,7 @@ function declareTests(config?: {useJit: boolean}) {
checkEscapeOfHrefProperty(fixture, false); checkEscapeOfHrefProperty(fixture, false);
}); });
it('should escape unsafe attributes', () => { fixmeIvy('unknown') && it('should escape unsafe attributes', () => {
const template = `<a [attr.href]="ctxProp">Link Title</a>`; const template = `<a [attr.href]="ctxProp">Link Title</a>`;
TestBed.overrideComponent(SecuredComponent, {set: {template}}); TestBed.overrideComponent(SecuredComponent, {set: {template}});
const fixture = TestBed.createComponent(SecuredComponent); const fixture = TestBed.createComponent(SecuredComponent);
@ -169,6 +170,7 @@ function declareTests(config?: {useJit: boolean}) {
checkEscapeOfHrefProperty(fixture, true); checkEscapeOfHrefProperty(fixture, true);
}); });
fixmeIvy('unknown') &&
it('should escape unsafe properties if they are used in host bindings', () => { it('should escape unsafe properties if they are used in host bindings', () => {
@Directive({selector: '[dirHref]'}) @Directive({selector: '[dirHref]'})
class HrefDirective { class HrefDirective {
@ -185,6 +187,7 @@ function declareTests(config?: {useJit: boolean}) {
checkEscapeOfHrefProperty(fixture, false); checkEscapeOfHrefProperty(fixture, false);
}); });
fixmeIvy('unknown') &&
it('should escape unsafe attributes if they are used in host bindings', () => { it('should escape unsafe attributes if they are used in host bindings', () => {
@Directive({selector: '[dirHref]'}) @Directive({selector: '[dirHref]'})
class HrefDirective { class HrefDirective {
@ -201,7 +204,7 @@ function declareTests(config?: {useJit: boolean}) {
checkEscapeOfHrefProperty(fixture, true); checkEscapeOfHrefProperty(fixture, true);
}); });
it('should escape unsafe style values', () => { fixmeIvy('unknown') && it('should escape unsafe style values', () => {
const template = `<div [style.background]="ctxProp">Text</div>`; const template = `<div [style.background]="ctxProp">Text</div>`;
TestBed.overrideComponent(SecuredComponent, {set: {template}}); TestBed.overrideComponent(SecuredComponent, {set: {template}});
const fixture = TestBed.createComponent(SecuredComponent); const fixture = TestBed.createComponent(SecuredComponent);
@ -221,7 +224,7 @@ function declareTests(config?: {useJit: boolean}) {
expect(getDOM().getStyle(e, 'background')).not.toContain('javascript'); expect(getDOM().getStyle(e, 'background')).not.toContain('javascript');
}); });
it('should escape unsafe SVG attributes', () => { fixmeIvy('unknown') && it('should escape unsafe SVG attributes', () => {
const template = `<svg:circle [xlink:href]="ctxProp">Text</svg:circle>`; const template = `<svg:circle [xlink:href]="ctxProp">Text</svg:circle>`;
TestBed.overrideComponent(SecuredComponent, {set: {template}}); TestBed.overrideComponent(SecuredComponent, {set: {template}});
@ -229,7 +232,7 @@ function declareTests(config?: {useJit: boolean}) {
.toThrowError(/Can't bind to 'xlink:href'/); .toThrowError(/Can't bind to 'xlink:href'/);
}); });
it('should escape unsafe HTML values', () => { fixmeIvy('unknown') && it('should escape unsafe HTML values', () => {
const template = `<div [innerHTML]="ctxProp">Text</div>`; const template = `<div [innerHTML]="ctxProp">Text</div>`;
TestBed.overrideComponent(SecuredComponent, {set: {template}}); TestBed.overrideComponent(SecuredComponent, {set: {template}});
const fixture = TestBed.createComponent(SecuredComponent); const fixture = TestBed.createComponent(SecuredComponent);

View File

@ -16,7 +16,7 @@ import {TestBed, fakeAsync, tick} from '@angular/core/testing';
import {fixmeIvy} from '@angular/private/testing'; import {fixmeIvy} from '@angular/private/testing';
{ {
fixmeIvy('unknown') && describe('jit source mapping', () => { describe('jit source mapping', () => {
let jitSpy: jasmine.Spy; let jitSpy: jasmine.Spy;
let resourceLoader: MockResourceLoader; let resourceLoader: MockResourceLoader;
@ -102,27 +102,29 @@ import {fixmeIvy} from '@angular/private/testing';
function declareTests( function declareTests(
{ngUrl, templateDecorator}: {ngUrl, templateDecorator}:
{ngUrl: string, templateDecorator: (template: string) => { [key: string]: any }}) { {ngUrl: string, templateDecorator: (template: string) => { [key: string]: any }}) {
fixmeIvy('unknown') &&
it('should use the right source url in html parse errors', fakeAsync(() => { it('should use the right source url in html parse errors', fakeAsync(() => {
@Component({...templateDecorator('<div>\n </error>')}) @Component({...templateDecorator('<div>\n </error>')})
class MyComp { class MyComp {
} }
expect(() => compileAndCreateComponent(MyComp)) expect(() => compileAndCreateComponent(MyComp))
.toThrowError( .toThrowError(new RegExp(
new RegExp(`Template parse errors[\\s\\S]*${ngUrl.replace('$', '\\$')}@1:2`)); `Template parse errors[\\s\\S]*${ngUrl.replace('$', '\\$')}@1:2`));
})); }));
fixmeIvy('unknown') &&
it('should use the right source url in template parse errors', fakeAsync(() => { it('should use the right source url in template parse errors', fakeAsync(() => {
@Component({...templateDecorator('<div>\n <div unknown="{{ctxProp}}"></div>')}) @Component({...templateDecorator('<div>\n <div unknown="{{ctxProp}}"></div>')})
class MyComp { class MyComp {
} }
expect(() => compileAndCreateComponent(MyComp)) expect(() => compileAndCreateComponent(MyComp))
.toThrowError( .toThrowError(new RegExp(
new RegExp(`Template parse errors[\\s\\S]*${ngUrl.replace('$', '\\$')}@1:7`)); `Template parse errors[\\s\\S]*${ngUrl.replace('$', '\\$')}@1:7`));
})); }));
it('should create a sourceMap for templates', fakeAsync(() => { fixmeIvy('unknown') && it('should create a sourceMap for templates', fakeAsync(() => {
const template = `Hello World!`; const template = `Hello World!`;
@Component({...templateDecorator(template)}) @Component({...templateDecorator(template)})
@ -131,7 +133,8 @@ import {fixmeIvy} from '@angular/private/testing';
compileAndCreateComponent(MyComp); compileAndCreateComponent(MyComp);
const sourceMap = getSourceMap('ng:///DynamicTestModule/MyComp.ngfactory.js'); const sourceMap =
getSourceMap('ng:///DynamicTestModule/MyComp.ngfactory.js');
expect(sourceMap.sources).toEqual([ expect(sourceMap.sources).toEqual([
'ng:///DynamicTestModule/MyComp.ngfactory.js', ngUrl 'ng:///DynamicTestModule/MyComp.ngfactory.js', ngUrl
]); ]);
@ -139,6 +142,7 @@ import {fixmeIvy} from '@angular/private/testing';
})); }));
fixmeIvy('unknown') &&
it('should report source location for di errors', fakeAsync(() => { it('should report source location for di errors', fakeAsync(() => {
const template = `<div>\n <div someDir></div></div>`; const template = `<div>\n <div someDir></div></div>`;
@ -166,6 +170,7 @@ import {fixmeIvy} from '@angular/private/testing';
}); });
})); }));
fixmeIvy('unknown') &&
it('should report di errors with multiple elements and directives', fakeAsync(() => { it('should report di errors with multiple elements and directives', fakeAsync(() => {
const template = `<div someDir></div><div someDir="throw"></div>`; const template = `<div someDir></div><div someDir="throw"></div>`;
@ -197,6 +202,7 @@ import {fixmeIvy} from '@angular/private/testing';
}); });
})); }));
fixmeIvy('unknown') &&
it('should report source location for binding errors', fakeAsync(() => { it('should report source location for binding errors', fakeAsync(() => {
const template = `<div>\n <span [title]="createError()"></span></div>`; const template = `<div>\n <span [title]="createError()"></span></div>`;
@ -227,6 +233,7 @@ import {fixmeIvy} from '@angular/private/testing';
}); });
})); }));
fixmeIvy('unknown') &&
it('should report source location for event errors', fakeAsync(() => { it('should report source location for event errors', fakeAsync(() => {
const template = `<div>\n <span (click)="createError()"></span></div>`; const template = `<div>\n <span (click)="createError()"></span></div>`;

View File

@ -1564,7 +1564,7 @@ describe('ViewContainerRef', () => {
}); });
}); });
fixmeIvy(`Hooks don't run`) && describe('life cycle hooks', () => { describe('life cycle hooks', () => {
// Angular 5 reference: https://stackblitz.com/edit/lifecycle-hooks-vcref // Angular 5 reference: https://stackblitz.com/edit/lifecycle-hooks-vcref
const log: string[] = []; const log: string[] = [];
@ -1608,6 +1608,7 @@ describe('ViewContainerRef', () => {
}); });
} }
fixmeIvy(`Hooks don't run`) &&
it('should call all hooks in correct order when creating with createEmbeddedView', () => { it('should call all hooks in correct order when creating with createEmbeddedView', () => {
function SomeComponent_Template_0(rf: RenderFlags, ctx: any) { function SomeComponent_Template_0(rf: RenderFlags, ctx: any) {
if (rf & RenderFlags.Create) { if (rf & RenderFlags.Create) {
@ -1637,7 +1638,8 @@ describe('ViewContainerRef', () => {
template: (rf: RenderFlags, cmp: SomeComponent) => { template: (rf: RenderFlags, cmp: SomeComponent) => {
if (rf & RenderFlags.Create) { if (rf & RenderFlags.Create) {
template( template(
0, SomeComponent_Template_0, 1, 1, null, [], ['foo', ''], templateRefExtractor); 0, SomeComponent_Template_0, 1, 1, null, [], ['foo', ''],
templateRefExtractor);
element(2, 'hooks', ['vcref', '']); element(2, 'hooks', ['vcref', '']);
element(3, 'hooks'); element(3, 'hooks');
} }
@ -1670,7 +1672,8 @@ describe('ViewContainerRef', () => {
]); ]);
log.length = 0; log.length = 0;
directiveInstance !.vcref.createEmbeddedView(directiveInstance !.tplRef, fixture.component); directiveInstance !.vcref.createEmbeddedView(
directiveInstance !.tplRef, fixture.component);
expect(fixture.html).toEqual('<hooks vcref="">A</hooks><hooks></hooks><hooks>B</hooks>'); expect(fixture.html).toEqual('<hooks vcref="">A</hooks><hooks></hooks><hooks>B</hooks>');
expect(log).toEqual([]); expect(log).toEqual([]);
@ -1679,15 +1682,17 @@ describe('ViewContainerRef', () => {
expect(fixture.html).toEqual('<hooks vcref="">A</hooks><hooks>C</hooks><hooks>B</hooks>'); expect(fixture.html).toEqual('<hooks vcref="">A</hooks><hooks>C</hooks><hooks>B</hooks>');
expect(log).toEqual([ expect(log).toEqual([
'doCheck-A', 'doCheck-B', 'onChanges-C', 'onInit-C', 'doCheck-C', 'afterContentInit-C', 'doCheck-A', 'doCheck-B', 'onChanges-C', 'onInit-C', 'doCheck-C', 'afterContentInit-C',
'afterContentChecked-C', 'afterViewInit-C', 'afterViewChecked-C', 'afterContentChecked-A', 'afterContentChecked-C', 'afterViewInit-C', 'afterViewChecked-C',
'afterContentChecked-B', 'afterViewChecked-A', 'afterViewChecked-B' 'afterContentChecked-A', 'afterContentChecked-B', 'afterViewChecked-A',
'afterViewChecked-B'
]); ]);
log.length = 0; log.length = 0;
fixture.update(); fixture.update();
expect(log).toEqual([ expect(log).toEqual([
'doCheck-A', 'doCheck-B', 'doCheck-C', 'afterContentChecked-C', 'afterViewChecked-C', 'doCheck-A', 'doCheck-B', 'doCheck-C', 'afterContentChecked-C', 'afterViewChecked-C',
'afterContentChecked-A', 'afterContentChecked-B', 'afterViewChecked-A', 'afterViewChecked-B' 'afterContentChecked-A', 'afterContentChecked-B', 'afterViewChecked-A',
'afterViewChecked-B'
]); ]);
log.length = 0; log.length = 0;
@ -1703,18 +1708,20 @@ describe('ViewContainerRef', () => {
fixture.update(); fixture.update();
expect(log).toEqual([ expect(log).toEqual([
'doCheck-A', 'doCheck-B', 'doCheck-C', 'afterContentChecked-C', 'afterViewChecked-C', 'doCheck-A', 'doCheck-B', 'doCheck-C', 'afterContentChecked-C', 'afterViewChecked-C',
'afterContentChecked-A', 'afterContentChecked-B', 'afterViewChecked-A', 'afterViewChecked-B' 'afterContentChecked-A', 'afterContentChecked-B', 'afterViewChecked-A',
'afterViewChecked-B'
]); ]);
log.length = 0; log.length = 0;
directiveInstance !.vcref.remove(0); directiveInstance !.vcref.remove(0);
fixture.update(); fixture.update();
expect(log).toEqual([ expect(log).toEqual([
'onDestroy-C', 'doCheck-A', 'doCheck-B', 'afterContentChecked-A', 'afterContentChecked-B', 'onDestroy-C', 'doCheck-A', 'doCheck-B', 'afterContentChecked-A',
'afterViewChecked-A', 'afterViewChecked-B' 'afterContentChecked-B', 'afterViewChecked-A', 'afterViewChecked-B'
]); ]);
}); });
fixmeIvy(`Hooks don't run`) &&
it('should call all hooks in correct order when creating with createComponent', () => { it('should call all hooks in correct order when creating with createComponent', () => {
@Component({ @Component({
template: ` template: `
@ -1773,15 +1780,17 @@ describe('ViewContainerRef', () => {
expect(fixture.html).toEqual('<hooks vcref="">A</hooks><hooks>D</hooks><hooks>B</hooks>'); expect(fixture.html).toEqual('<hooks vcref="">A</hooks><hooks>D</hooks><hooks>B</hooks>');
expect(log).toEqual([ expect(log).toEqual([
'doCheck-A', 'doCheck-B', 'onChanges-D', 'onInit-D', 'doCheck-D', 'afterContentInit-D', 'doCheck-A', 'doCheck-B', 'onChanges-D', 'onInit-D', 'doCheck-D', 'afterContentInit-D',
'afterContentChecked-D', 'afterViewInit-D', 'afterViewChecked-D', 'afterContentChecked-A', 'afterContentChecked-D', 'afterViewInit-D', 'afterViewChecked-D',
'afterContentChecked-B', 'afterViewChecked-A', 'afterViewChecked-B' 'afterContentChecked-A', 'afterContentChecked-B', 'afterViewChecked-A',
'afterViewChecked-B'
]); ]);
log.length = 0; log.length = 0;
fixture.update(); fixture.update();
expect(log).toEqual([ expect(log).toEqual([
'doCheck-A', 'doCheck-B', 'doCheck-D', 'afterContentChecked-D', 'afterViewChecked-D', 'doCheck-A', 'doCheck-B', 'doCheck-D', 'afterContentChecked-D', 'afterViewChecked-D',
'afterContentChecked-A', 'afterContentChecked-B', 'afterViewChecked-A', 'afterViewChecked-B' 'afterContentChecked-A', 'afterContentChecked-B', 'afterViewChecked-A',
'afterViewChecked-B'
]); ]);
log.length = 0; log.length = 0;
@ -1797,15 +1806,16 @@ describe('ViewContainerRef', () => {
fixture.update(); fixture.update();
expect(log).toEqual([ expect(log).toEqual([
'doCheck-A', 'doCheck-B', 'doCheck-D', 'afterContentChecked-D', 'afterViewChecked-D', 'doCheck-A', 'doCheck-B', 'doCheck-D', 'afterContentChecked-D', 'afterViewChecked-D',
'afterContentChecked-A', 'afterContentChecked-B', 'afterViewChecked-A', 'afterViewChecked-B' 'afterContentChecked-A', 'afterContentChecked-B', 'afterViewChecked-A',
'afterViewChecked-B'
]); ]);
log.length = 0; log.length = 0;
directiveInstance !.vcref.remove(0); directiveInstance !.vcref.remove(0);
fixture.update(); fixture.update();
expect(log).toEqual([ expect(log).toEqual([
'onDestroy-D', 'doCheck-A', 'doCheck-B', 'afterContentChecked-A', 'afterContentChecked-B', 'onDestroy-D', 'doCheck-A', 'doCheck-B', 'afterContentChecked-A',
'afterViewChecked-A', 'afterViewChecked-B' 'afterContentChecked-B', 'afterViewChecked-A', 'afterViewChecked-B'
]); ]);
}); });
}); });

View File

@ -114,10 +114,10 @@ import {fixmeIvy} from '@angular/private/testing';
expect(debugCtx.nodeIndex).toBe(1); expect(debugCtx.nodeIndex).toBe(1);
}); });
fixmeIvy('unknown') && describe('deps', () => { describe('deps', () => {
class Dep {} class Dep {}
it('should inject deps from the same element', () => { fixmeIvy('unknown') && it('should inject deps from the same element', () => {
createAndGetRootNodes(compViewDef([ createAndGetRootNodes(compViewDef([
elementDef(0, NodeFlags.None, null, null, 2, 'span'), elementDef(0, NodeFlags.None, null, null, 2, 'span'),
directiveDef(1, NodeFlags.None, null, 0, Dep, []), directiveDef(1, NodeFlags.None, null, 0, Dep, []),
@ -127,7 +127,7 @@ import {fixmeIvy} from '@angular/private/testing';
expect(instance.dep instanceof Dep).toBeTruthy(); expect(instance.dep instanceof Dep).toBeTruthy();
}); });
it('should inject deps from a parent element', () => { fixmeIvy('unknown') && it('should inject deps from a parent element', () => {
createAndGetRootNodes(compViewDef([ createAndGetRootNodes(compViewDef([
elementDef(0, NodeFlags.None, null, null, 3, 'span'), elementDef(0, NodeFlags.None, null, null, 3, 'span'),
directiveDef(1, NodeFlags.None, null, 0, Dep, []), directiveDef(1, NodeFlags.None, null, 0, Dep, []),
@ -138,7 +138,7 @@ import {fixmeIvy} from '@angular/private/testing';
expect(instance.dep instanceof Dep).toBeTruthy(); expect(instance.dep instanceof Dep).toBeTruthy();
}); });
it('should not inject deps from sibling root elements', () => { fixmeIvy('unknown') && it('should not inject deps from sibling root elements', () => {
const rootElNodes = [ const rootElNodes = [
elementDef(0, NodeFlags.None, null, null, 1, 'span'), elementDef(0, NodeFlags.None, null, null, 1, 'span'),
directiveDef(1, NodeFlags.None, null, 0, Dep, []), directiveDef(1, NodeFlags.None, null, 0, Dep, []),
@ -167,7 +167,7 @@ import {fixmeIvy} from '@angular/private/testing';
' NullInjectorError: No provider for Dep!'); ' NullInjectorError: No provider for Dep!');
}); });
it('should inject from a parent element in a parent view', () => { fixmeIvy('unknown') && it('should inject from a parent element in a parent view', () => {
createAndGetRootNodes(compViewDef([ createAndGetRootNodes(compViewDef([
elementDef( elementDef(
0, NodeFlags.None, null, null, 1, 'div', null, null, null, null, 0, NodeFlags.None, null, null, 1, 'div', null, null, null, null,
@ -181,7 +181,7 @@ import {fixmeIvy} from '@angular/private/testing';
expect(instance.dep instanceof Dep).toBeTruthy(); expect(instance.dep instanceof Dep).toBeTruthy();
}); });
it('should throw for missing dependencies', () => { fixmeIvy('unknown') && it('should throw for missing dependencies', () => {
expect(() => createAndGetRootNodes(compViewDef([ expect(() => createAndGetRootNodes(compViewDef([
elementDef(0, NodeFlags.None, null, null, 1, 'span'), elementDef(0, NodeFlags.None, null, null, 1, 'span'),
directiveDef(1, NodeFlags.None, null, 0, SomeService, ['nonExistingDep']) directiveDef(1, NodeFlags.None, null, 0, SomeService, ['nonExistingDep'])
@ -192,7 +192,7 @@ import {fixmeIvy} from '@angular/private/testing';
' NullInjectorError: No provider for nonExistingDep!'); ' NullInjectorError: No provider for nonExistingDep!');
}); });
it('should use null for optional missing dependencies', () => { fixmeIvy('unknown') && it('should use null for optional missing dependencies', () => {
createAndGetRootNodes(compViewDef([ createAndGetRootNodes(compViewDef([
elementDef(0, NodeFlags.None, null, null, 1, 'span'), elementDef(0, NodeFlags.None, null, null, 1, 'span'),
directiveDef( directiveDef(
@ -202,7 +202,7 @@ import {fixmeIvy} from '@angular/private/testing';
expect(instance.dep).toBe(null); expect(instance.dep).toBe(null);
}); });
it('should skip the current element when using SkipSelf', () => { fixmeIvy('unknown') && it('should skip the current element when using SkipSelf', () => {
createAndGetRootNodes(compViewDef([ createAndGetRootNodes(compViewDef([
elementDef(0, NodeFlags.None, null, null, 4, 'span'), elementDef(0, NodeFlags.None, null, null, 4, 'span'),
providerDef(NodeFlags.TypeValueProvider, null, 'someToken', 'someParentValue', []), providerDef(NodeFlags.TypeValueProvider, null, 'someToken', 'someParentValue', []),
@ -214,6 +214,7 @@ import {fixmeIvy} from '@angular/private/testing';
expect(instance.dep).toBe('someParentValue'); expect(instance.dep).toBe('someParentValue');
}); });
fixmeIvy('unknown') &&
it('should ask the root injector', it('should ask the root injector',
withModule({providers: [{provide: 'rootDep', useValue: 'rootValue'}]}, () => { withModule({providers: [{provide: 'rootDep', useValue: 'rootValue'}]}, () => {
createAndGetRootNodes(compViewDef([ createAndGetRootNodes(compViewDef([
@ -225,7 +226,7 @@ import {fixmeIvy} from '@angular/private/testing';
})); }));
describe('builtin tokens', () => { describe('builtin tokens', () => {
it('should inject ViewContainerRef', () => { fixmeIvy('unknown') && it('should inject ViewContainerRef', () => {
createAndGetRootNodes(compViewDef([ createAndGetRootNodes(compViewDef([
anchorDef(NodeFlags.EmbeddedViews, null, null, 1), anchorDef(NodeFlags.EmbeddedViews, null, null, 1),
directiveDef(1, NodeFlags.None, null, 0, SomeService, [ViewContainerRef]), directiveDef(1, NodeFlags.None, null, 0, SomeService, [ViewContainerRef]),
@ -234,7 +235,7 @@ import {fixmeIvy} from '@angular/private/testing';
expect(instance.dep.createEmbeddedView).toBeTruthy(); expect(instance.dep.createEmbeddedView).toBeTruthy();
}); });
it('should inject TemplateRef', () => { fixmeIvy('unknown') && it('should inject TemplateRef', () => {
createAndGetRootNodes(compViewDef([ createAndGetRootNodes(compViewDef([
anchorDef(NodeFlags.None, null, null, 1, null, compViewDefFactory([anchorDef( anchorDef(NodeFlags.None, null, null, 1, null, compViewDefFactory([anchorDef(
NodeFlags.None, null, null, 0)])), NodeFlags.None, null, null, 0)])),
@ -244,7 +245,7 @@ import {fixmeIvy} from '@angular/private/testing';
expect(instance.dep.createEmbeddedView).toBeTruthy(); expect(instance.dep.createEmbeddedView).toBeTruthy();
}); });
it('should inject ElementRef', () => { fixmeIvy('unknown') && it('should inject ElementRef', () => {
const {view} = createAndGetRootNodes(compViewDef([ const {view} = createAndGetRootNodes(compViewDef([
elementDef(0, NodeFlags.None, null, null, 1, 'span'), elementDef(0, NodeFlags.None, null, null, 1, 'span'),
directiveDef(1, NodeFlags.None, null, 0, SomeService, [ElementRef]), directiveDef(1, NodeFlags.None, null, 0, SomeService, [ElementRef]),
@ -253,7 +254,7 @@ import {fixmeIvy} from '@angular/private/testing';
expect(instance.dep.nativeElement).toBe(asElementData(view, 0).renderElement); expect(instance.dep.nativeElement).toBe(asElementData(view, 0).renderElement);
}); });
it('should inject Injector', () => { fixmeIvy('unknown') && it('should inject Injector', () => {
const {view} = createAndGetRootNodes(compViewDef([ const {view} = createAndGetRootNodes(compViewDef([
elementDef(0, NodeFlags.None, null, null, 1, 'span'), elementDef(0, NodeFlags.None, null, null, 1, 'span'),
directiveDef(1, NodeFlags.None, null, 0, SomeService, [Injector]), directiveDef(1, NodeFlags.None, null, 0, SomeService, [Injector]),
@ -262,6 +263,7 @@ import {fixmeIvy} from '@angular/private/testing';
expect(instance.dep.get(SomeService)).toBe(instance); expect(instance.dep.get(SomeService)).toBe(instance);
}); });
fixmeIvy('unknown') &&
it('should inject ChangeDetectorRef for non component providers', () => { it('should inject ChangeDetectorRef for non component providers', () => {
const {view} = createAndGetRootNodes(compViewDef([ const {view} = createAndGetRootNodes(compViewDef([
elementDef(0, NodeFlags.None, null, null, 1, 'span'), elementDef(0, NodeFlags.None, null, null, 1, 'span'),
@ -271,6 +273,7 @@ import {fixmeIvy} from '@angular/private/testing';
expect(instance.dep._view).toBe(view); expect(instance.dep._view).toBe(view);
}); });
fixmeIvy('unknown') &&
it('should inject ChangeDetectorRef for component providers', () => { it('should inject ChangeDetectorRef for component providers', () => {
const {view, rootNodes} = createAndGetRootNodes(compViewDef([ const {view, rootNodes} = createAndGetRootNodes(compViewDef([
elementDef( elementDef(
@ -285,7 +288,7 @@ import {fixmeIvy} from '@angular/private/testing';
expect(instance.dep._view).toBe(compView); expect(instance.dep._view).toBe(compView);
}); });
it('should inject RendererV1', () => { fixmeIvy('unknown') && it('should inject RendererV1', () => {
createAndGetRootNodes(compViewDef([ createAndGetRootNodes(compViewDef([
elementDef( elementDef(
0, NodeFlags.None, null, null, 1, 'span', null, null, null, null, 0, NodeFlags.None, null, null, 1, 'span', null, null, null, null,
@ -296,7 +299,7 @@ import {fixmeIvy} from '@angular/private/testing';
expect(instance.dep.createElement).toBeTruthy(); expect(instance.dep.createElement).toBeTruthy();
}); });
it('should inject Renderer2', () => { fixmeIvy('unknown') && it('should inject Renderer2', () => {
createAndGetRootNodes(compViewDef([ createAndGetRootNodes(compViewDef([
elementDef( elementDef(
0, NodeFlags.None, null, null, 1, 'span', null, null, null, null, 0, NodeFlags.None, null, null, 1, 'span', null, null, null, null,