diff --git a/modules/@angular/upgrade/test/dynamic/upgrade_spec.ts b/modules/@angular/upgrade/test/dynamic/upgrade_spec.ts
index f5d58ee899..1db48add84 100644
--- a/modules/@angular/upgrade/test/dynamic/upgrade_spec.ts
+++ b/modules/@angular/upgrade/test/dynamic/upgrade_spec.ts
@@ -535,6 +535,39 @@ export function main() {
});
}));
+ it('should correctly project structural directives', async(() => {
+ @Component({selector: 'ng2', template: 'ng2-{{ itemId }}()'})
+ class Ng2Component {
+ @Input() itemId: string;
+ }
+
+ @NgModule({imports: [BrowserModule], declarations: [Ng2Component]})
+ class Ng2Module {
+ }
+
+ const adapter: UpgradeAdapter = new UpgradeAdapter(Ng2Module);
+ const ng1Module = angular.module('ng1', [])
+ .directive('ng2', adapter.downgradeNg2Component(Ng2Component))
+ .run(($rootScope: angular.IRootScopeService) => {
+ $rootScope['items'] = [
+ {id: 'a', subitems: [1, 2, 3]}, {id: 'b', subitems: [4, 5, 6]},
+ {id: 'c', subitems: [7, 8, 9]}
+ ];
+ });
+
+ const element = html(`
+
+ {{ subitem }}
+
+ `);
+
+ adapter.bootstrap(element, [ng1Module.name]).ready(ref => {
+ expect(multiTrim(document.body.textContent))
+ .toBe('ng2-a( 123 )ng2-b( 456 )ng2-c( 789 )');
+ ref.dispose();
+ });
+ }));
+
it('should allow attribute selectors for components in ng2', async(() => {
const adapter: UpgradeAdapter = new UpgradeAdapter(forwardRef(() => MyNg2Module));
const ng1Module = angular.module('myExample', []);
diff --git a/modules/@angular/upgrade/test/static/integration/content_projection_spec.ts b/modules/@angular/upgrade/test/static/integration/content_projection_spec.ts
index 441a4d4a86..57ec145902 100644
--- a/modules/@angular/upgrade/test/static/integration/content_projection_spec.ts
+++ b/modules/@angular/upgrade/test/static/integration/content_projection_spec.ts
@@ -6,14 +6,14 @@
* found in the LICENSE file at https://angular.io/license
*/
-import {Component, Directive, ElementRef, Injector, NgModule, destroyPlatform} from '@angular/core';
+import {Component, Directive, ElementRef, Injector, Input, NgModule, destroyPlatform} from '@angular/core';
import {async} from '@angular/core/testing';
import {BrowserModule} from '@angular/platform-browser';
import {platformBrowserDynamic} from '@angular/platform-browser-dynamic';
import * as angular from '@angular/upgrade/src/common/angular1';
import {UpgradeComponent, UpgradeModule, downgradeComponent} from '@angular/upgrade/static';
-import {bootstrap, html} from '../test_helpers';
+import {bootstrap, html, multiTrim} from '../test_helpers';
export function main() {
describe('content projection', () => {
@@ -57,6 +57,44 @@ export function main() {
});
}));
+ it('should correctly project structural directives', async(() => {
+ @Component({selector: 'ng2', template: 'ng2-{{ itemId }}()'})
+ class Ng2Component {
+ @Input() itemId: string;
+ }
+
+ @NgModule({
+ imports: [BrowserModule, UpgradeModule],
+ declarations: [Ng2Component],
+ entryComponents: [Ng2Component]
+ })
+ class Ng2Module {
+ ngDoBootstrap() {}
+ }
+
+ const ng1Module =
+ angular.module('ng1', [])
+ .directive(
+ 'ng2', downgradeComponent({component: Ng2Component, inputs: ['itemId']}))
+ .run(($rootScope: angular.IRootScopeService) => {
+ $rootScope['items'] = [
+ {id: 'a', subitems: [1, 2, 3]}, {id: 'b', subitems: [4, 5, 6]},
+ {id: 'c', subitems: [7, 8, 9]}
+ ];
+ });
+
+ const element = html(`
+
+ {{ subitem }}
+
+ `);
+
+ bootstrap(platformBrowserDynamic(), Ng2Module, element, ng1Module).then(upgrade => {
+ expect(multiTrim(document.body.textContent))
+ .toBe('ng2-a( 123 )ng2-b( 456 )ng2-c( 789 )');
+ });
+ }));
+
it('should instantiate ng1 in ng2 template and project content', async(() => {
@Component({