test(ivy): add tests for projection on inline-templates (#29041)

PR Close #29041
This commit is contained in:
Pete Bacon Darwin 2019-03-07 08:31:31 +00:00 committed by Kara Erickson
parent f535f31d78
commit 809452b921
1 changed files with 112 additions and 1 deletions

View File

@ -6,7 +6,7 @@
* found in the LICENSE file at https://angular.io/license
*/
import {Component} from '@angular/core';
import {Component, Directive} from '@angular/core';
import {TestBed} from '@angular/core/testing';
import {expect} from '@angular/platform-browser/testing/src/matchers';
@ -56,4 +56,115 @@ describe('projection', () => {
fixture.detectChanges();
expect(fixture.nativeElement).toHaveText('6|7|8|');
});
describe('on inline templates (e.g. *ngIf)', () => {
it('should work when matching the element name', () => {
let divDirectives = 0;
@Component({selector: 'selector-proj', template: '<ng-content select="div"></ng-content>'})
class SelectedNgContentComp {
}
@Directive({selector: 'div'})
class DivDirective {
constructor() { divDirectives++; }
}
@Component({
selector: 'main-selector',
template: '<selector-proj><div x="true" *ngIf="true">Hello world!</div></selector-proj>'
})
class SelectorMainComp {
}
TestBed.configureTestingModule(
{declarations: [DivDirective, SelectedNgContentComp, SelectorMainComp]});
const fixture = TestBed.createComponent<SelectorMainComp>(SelectorMainComp);
fixture.detectChanges();
expect(fixture.nativeElement).toHaveText('Hello world!');
expect(divDirectives).toEqual(1);
});
it('should work when matching attributes', () => {
let xDirectives = 0;
@Component({selector: 'selector-proj', template: '<ng-content select="[x]"></ng-content>'})
class SelectedNgContentComp {
}
@Directive({selector: '[x]'})
class XDirective {
constructor() { xDirectives++; }
}
@Component({
selector: 'main-selector',
template: '<selector-proj><div x="true" *ngIf="true">Hello world!</div></selector-proj>'
})
class SelectorMainComp {
}
TestBed.configureTestingModule(
{declarations: [XDirective, SelectedNgContentComp, SelectorMainComp]});
const fixture = TestBed.createComponent<SelectorMainComp>(SelectorMainComp);
fixture.detectChanges();
expect(fixture.nativeElement).toHaveText('Hello world!');
expect(xDirectives).toEqual(1);
});
it('should work when matching classes', () => {
let xDirectives = 0;
@Component({selector: 'selector-proj', template: '<ng-content select=".x"></ng-content>'})
class SelectedNgContentComp {
}
@Directive({selector: '.x'})
class XDirective {
constructor() { xDirectives++; }
}
@Component({
selector: 'main-selector',
template: '<selector-proj><div class="x" *ngIf="true">Hello world!</div></selector-proj>'
})
class SelectorMainComp {
}
TestBed.configureTestingModule(
{declarations: [XDirective, SelectedNgContentComp, SelectorMainComp]});
const fixture = TestBed.createComponent<SelectorMainComp>(SelectorMainComp);
fixture.detectChanges();
expect(fixture.nativeElement).toHaveText('Hello world!');
expect(xDirectives).toEqual(1);
});
it('should ignore synthesized attributes (e.g. ngTrackBy)', () => {
@Component(
{selector: 'selector-proj', template: '<ng-content select="[ngTrackBy]"></ng-content>'})
class SelectedNgContentComp {
}
@Component({
selector: 'main-selector',
template:
'inline(<selector-proj><div *ngFor="let item of items trackBy getItemId">{{item.name}}</div></selector-proj>)' +
'ng-template(<selector-proj><ng-template ngFor [ngForOf]="items" let-item ngTrackBy="getItemId"><div>{{item.name}}</div></ng-template></selector-proj>)'
})
class SelectorMainComp {
items = [
{id: 1, name: 'one'},
{id: 2, name: 'two'},
{id: 3, name: 'three'},
];
getItemId(item: {id: number}) { return item.id; }
}
TestBed.configureTestingModule({declarations: [SelectedNgContentComp, SelectorMainComp]});
const fixture = TestBed.createComponent<SelectorMainComp>(SelectorMainComp);
fixture.detectChanges();
expect(fixture.nativeElement).toHaveText('inline()ng-template(onetwothree)');
});
});
});