| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  | import {Class, Component, EventEmitter, Testability, provide} from '@angular/core'; | 
					
						
							|  |  |  | import {AsyncTestCompleter, describe, expect, inject, it} from '@angular/core/testing/testing_internal'; | 
					
						
							|  |  |  | import {UpgradeAdapter} from '@angular/upgrade'; | 
					
						
							|  |  |  | import * as angular from '@angular/upgrade/src/angular_js'; | 
					
						
							| 
									
										
										
										
											2015-08-05 10:32:14 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | export function main() { | 
					
						
							| 
									
										
										
										
											2015-10-12 21:32:41 -07:00
										 |  |  |   describe('adapter: ng1 to ng2', () => { | 
					
						
							| 
									
										
										
										
											2015-08-06 13:19:29 -07:00
										 |  |  |     it('should have angular 1 loaded', () => expect(angular.version.major).toBe(1)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-09 14:53:04 -07:00
										 |  |  |     it('should instantiate ng2 in ng1 template and project content', | 
					
						
							| 
									
										
										
										
											2016-06-09 11:04:15 -07:00
										 |  |  |        inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2015-10-12 21:32:41 -07:00
										 |  |  |          var ng1Module = angular.module('ng1', []); | 
					
						
							|  |  |  |          var Ng2 = Component({selector: 'ng2', template: `{{ 'NG2' }}(<ng-content></ng-content>)`}) | 
					
						
							| 
									
										
										
										
											2015-09-23 09:56:38 -07:00
										 |  |  |                        .Class({constructor: function() {}}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |          var element = | 
					
						
							|  |  |  |              html('<div>{{ \'ng1[\' }}<ng2>~{{ \'ng-content\' }}~</ng2>{{ \']\' }}</div>'); | 
					
						
							| 
									
										
										
										
											2015-08-06 13:19:29 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-12 21:32:41 -07:00
										 |  |  |          var adapter: UpgradeAdapter = new UpgradeAdapter(); | 
					
						
							|  |  |  |          ng1Module.directive('ng2', adapter.downgradeNg2Component(Ng2)); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |          adapter.bootstrap(element, ['ng1']).ready((ref) => { | 
					
						
							|  |  |  |            expect(document.body.textContent).toEqual('ng1[NG2(~ng-content~)]'); | 
					
						
							|  |  |  |            ref.dispose(); | 
					
						
							|  |  |  |            async.done(); | 
					
						
							|  |  |  |          }); | 
					
						
							| 
									
										
										
										
											2015-08-06 13:19:29 -07:00
										 |  |  |        })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-09 21:31:42 -07:00
										 |  |  |     it('should instantiate ng1 in ng2 template and project content', | 
					
						
							| 
									
										
										
										
											2016-06-09 11:04:15 -07:00
										 |  |  |        inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2015-10-12 21:32:41 -07:00
										 |  |  |          var adapter: UpgradeAdapter = new UpgradeAdapter(); | 
					
						
							|  |  |  |          var ng1Module = angular.module('ng1', []); | 
					
						
							| 
									
										
										
										
											2015-09-23 09:56:38 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-12 21:32:41 -07:00
										 |  |  |          var Ng2 = Component({ | 
					
						
							|  |  |  |                      selector: 'ng2', | 
					
						
							|  |  |  |                      template: `{{ 'ng2(' }}<ng1>{{'transclude'}}</ng1>{{ ')' }}`, | 
					
						
							|  |  |  |                      directives: [adapter.upgradeNg1Component('ng1')] | 
					
						
							|  |  |  |                    }).Class({constructor: function() {}}); | 
					
						
							| 
									
										
										
										
											2015-09-23 09:56:38 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-12 21:32:41 -07:00
										 |  |  |          ng1Module.directive('ng1', () => { | 
					
						
							| 
									
										
										
										
											2015-10-09 21:31:42 -07:00
										 |  |  |            return {transclude: true, template: '{{ "ng1" }}(<ng-transclude></ng-transclude>)'}; | 
					
						
							|  |  |  |          }); | 
					
						
							| 
									
										
										
										
											2015-10-12 21:32:41 -07:00
										 |  |  |          ng1Module.directive('ng2', adapter.downgradeNg2Component(Ng2)); | 
					
						
							| 
									
										
										
										
											2015-09-23 09:56:38 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |          var element = html('<div>{{\'ng1(\'}}<ng2></ng2>{{\')\'}}</div>'); | 
					
						
							| 
									
										
										
										
											2015-08-06 13:19:29 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |          adapter.bootstrap(element, ['ng1']).ready((ref) => { | 
					
						
							|  |  |  |            expect(document.body.textContent).toEqual('ng1(ng2(ng1(transclude)))'); | 
					
						
							|  |  |  |            ref.dispose(); | 
					
						
							|  |  |  |            async.done(); | 
					
						
							|  |  |  |          }); | 
					
						
							| 
									
										
										
										
											2015-08-06 13:19:29 -07:00
										 |  |  |        })); | 
					
						
							| 
									
										
										
										
											2015-09-30 15:42:02 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     describe('scope/component change-detection', () => { | 
					
						
							| 
									
										
										
										
											2015-10-05 16:02:21 -07:00
										 |  |  |       it('should interleave scope and component expressions', | 
					
						
							| 
									
										
										
										
											2016-06-09 11:04:15 -07:00
										 |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2015-10-12 21:32:41 -07:00
										 |  |  |            var ng1Module = angular.module('ng1', []); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:45:15 -07:00
										 |  |  |            var log: any[] /** TODO #9100 */ = []; | 
					
						
							|  |  |  |            var l = function(value: any /** TODO #9100 */) { | 
					
						
							| 
									
										
										
										
											2015-09-30 15:42:02 -07:00
										 |  |  |              log.push(value); | 
					
						
							|  |  |  |              return value + ';'; | 
					
						
							|  |  |  |            }; | 
					
						
							| 
									
										
										
										
											2015-10-12 21:32:41 -07:00
										 |  |  |            var adapter: UpgradeAdapter = new UpgradeAdapter(); | 
					
						
							| 
									
										
										
										
											2015-09-30 15:42:02 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            ng1Module.directive('ng1a', () => { return {template: '{{ l(\'ng1a\') }}'}; }); | 
					
						
							|  |  |  |            ng1Module.directive('ng1b', () => { return {template: '{{ l(\'ng1b\') }}'}; }); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:45:15 -07:00
										 |  |  |            ng1Module.run(($rootScope: any /** TODO #9100 */) => { | 
					
						
							| 
									
										
										
										
											2015-09-30 15:42:02 -07:00
										 |  |  |              $rootScope.l = l; | 
					
						
							|  |  |  |              $rootScope.reset = () => log.length = 0; | 
					
						
							|  |  |  |            }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-12 21:32:41 -07:00
										 |  |  |            var Ng2 = | 
					
						
							|  |  |  |                Component({ | 
					
						
							|  |  |  |                  selector: 'ng2', | 
					
						
							|  |  |  |                  template: `{{l('2A')}}<ng1a></ng1a>{{l('2B')}}<ng1b></ng1b>{{l('2C')}}`, | 
					
						
							|  |  |  |                  directives: | 
					
						
							|  |  |  |                      [adapter.upgradeNg1Component('ng1a'), adapter.upgradeNg1Component('ng1b')] | 
					
						
							|  |  |  |                }).Class({constructor: function() { this.l = l; }}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            ng1Module.directive('ng2', adapter.downgradeNg2Component(Ng2)); | 
					
						
							| 
									
										
										
										
											2015-09-30 15:42:02 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            var element = | 
					
						
							|  |  |  |                html('<div>{{reset(); l(\'1A\');}}<ng2>{{l(\'1B\')}}</ng2>{{l(\'1C\')}}</div>'); | 
					
						
							|  |  |  |            adapter.bootstrap(element, ['ng1']).ready((ref) => { | 
					
						
							|  |  |  |              expect(document.body.textContent).toEqual('1A;2A;ng1a;2B;ng1b;2C;1C;'); | 
					
						
							|  |  |  |              // https://github.com/angular/angular.js/issues/12983
 | 
					
						
							|  |  |  |              expect(log).toEqual(['1A', '1B', '1C', '2A', '2B', '2C', 'ng1a', 'ng1b']); | 
					
						
							|  |  |  |              ref.dispose(); | 
					
						
							|  |  |  |              async.done(); | 
					
						
							|  |  |  |            }); | 
					
						
							| 
									
										
										
										
											2015-09-30 15:42:02 -07:00
										 |  |  |          })); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2015-10-01 13:14:59 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-11 11:18:11 -07:00
										 |  |  |     describe('downgrade ng2 component', () => { | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should bind properties, events', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2015-10-12 21:32:41 -07:00
										 |  |  |            var adapter: UpgradeAdapter = new UpgradeAdapter(); | 
					
						
							|  |  |  |            var ng1Module = angular.module('ng1', []); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 15:45:15 -07:00
										 |  |  |            ng1Module.run(($rootScope: any /** TODO #9100 */) => { | 
					
						
							| 
									
										
										
										
											2015-10-01 13:14:59 -07:00
										 |  |  |              $rootScope.dataA = 'A'; | 
					
						
							|  |  |  |              $rootScope.dataB = 'B'; | 
					
						
							|  |  |  |              $rootScope.modelA = 'initModelA'; | 
					
						
							|  |  |  |              $rootScope.modelB = 'initModelB'; | 
					
						
							|  |  |  |              $rootScope.eventA = '?'; | 
					
						
							|  |  |  |              $rootScope.eventB = '?'; | 
					
						
							|  |  |  |            }); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            var Ng2 = Component({ | 
					
						
							|  |  |  |                        selector: 'ng2', | 
					
						
							|  |  |  |                        inputs: | 
					
						
							|  |  |  |                            ['literal', 'interpolate', 'oneWayA', 'oneWayB', 'twoWayA', 'twoWayB'], | 
					
						
							|  |  |  |                        outputs: [ | 
					
						
							|  |  |  |                          'eventA', 'eventB', 'twoWayAEmitter: twoWayAChange', | 
					
						
							|  |  |  |                          'twoWayBEmitter: twoWayBChange' | 
					
						
							|  |  |  |                        ], | 
					
						
							|  |  |  |                        template: 'ignore: {{ignore}}; ' + | 
					
						
							|  |  |  |                            'literal: {{literal}}; interpolate: {{interpolate}}; ' + | 
					
						
							|  |  |  |                            'oneWayA: {{oneWayA}}; oneWayB: {{oneWayB}}; ' + | 
					
						
							|  |  |  |                            'twoWayA: {{twoWayA}}; twoWayB: {{twoWayB}}; ({{ngOnChangesCount}})' | 
					
						
							|  |  |  |                      }).Class({ | 
					
						
							|  |  |  |              constructor: function() { | 
					
						
							|  |  |  |                this.ngOnChangesCount = 0; | 
					
						
							|  |  |  |                this.ignore = '-'; | 
					
						
							|  |  |  |                this.literal = '?'; | 
					
						
							|  |  |  |                this.interpolate = '?'; | 
					
						
							|  |  |  |                this.oneWayA = '?'; | 
					
						
							|  |  |  |                this.oneWayB = '?'; | 
					
						
							|  |  |  |                this.twoWayA = '?'; | 
					
						
							|  |  |  |                this.twoWayB = '?'; | 
					
						
							|  |  |  |                this.eventA = new EventEmitter(); | 
					
						
							|  |  |  |                this.eventB = new EventEmitter(); | 
					
						
							|  |  |  |                this.twoWayAEmitter = new EventEmitter(); | 
					
						
							|  |  |  |                this.twoWayBEmitter = new EventEmitter(); | 
					
						
							|  |  |  |              }, | 
					
						
							|  |  |  |              ngOnChanges: function(changes: any /** TODO #9100 */) { | 
					
						
							|  |  |  |                var assert = (prop: any /** TODO #9100 */, value: any /** TODO #9100 */) => { | 
					
						
							|  |  |  |                  if (this[prop] != value) { | 
					
						
							|  |  |  |                    throw new Error(`Expected: '${prop}' to be '${value}' but was '${this[prop]}'`); | 
					
						
							|  |  |  |                  } | 
					
						
							|  |  |  |                }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                var assertChange = (prop: any /** TODO #9100 */, value: any /** TODO #9100 */) => { | 
					
						
							|  |  |  |                  assert(prop, value); | 
					
						
							|  |  |  |                  if (!changes[prop]) { | 
					
						
							|  |  |  |                    throw new Error(`Changes record for '${prop}' not found.`); | 
					
						
							|  |  |  |                  } | 
					
						
							|  |  |  |                  var actValue = changes[prop].currentValue; | 
					
						
							|  |  |  |                  if (actValue != value) { | 
					
						
							|  |  |  |                    throw new Error( | 
					
						
							|  |  |  |                        `Expected changes record for'${prop}' to be '${value}' but was '${actValue}'`); | 
					
						
							|  |  |  |                  } | 
					
						
							|  |  |  |                }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                switch (this.ngOnChangesCount++) { | 
					
						
							|  |  |  |                  case 0: | 
					
						
							|  |  |  |                    assert('ignore', '-'); | 
					
						
							|  |  |  |                    assertChange('literal', 'Text'); | 
					
						
							|  |  |  |                    assertChange('interpolate', 'Hello world'); | 
					
						
							|  |  |  |                    assertChange('oneWayA', 'A'); | 
					
						
							|  |  |  |                    assertChange('oneWayB', 'B'); | 
					
						
							|  |  |  |                    assertChange('twoWayA', 'initModelA'); | 
					
						
							|  |  |  |                    assertChange('twoWayB', 'initModelB'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                    this.twoWayAEmitter.emit('newA'); | 
					
						
							|  |  |  |                    this.twoWayBEmitter.emit('newB'); | 
					
						
							|  |  |  |                    this.eventA.emit('aFired'); | 
					
						
							|  |  |  |                    this.eventB.emit('bFired'); | 
					
						
							|  |  |  |                    break; | 
					
						
							|  |  |  |                  case 1: | 
					
						
							|  |  |  |                    assertChange('twoWayA', 'newA'); | 
					
						
							|  |  |  |                    break; | 
					
						
							|  |  |  |                  case 2: | 
					
						
							|  |  |  |                    assertChange('twoWayB', 'newB'); | 
					
						
							|  |  |  |                    break; | 
					
						
							|  |  |  |                  default: | 
					
						
							|  |  |  |                    throw new Error('Called too many times! ' + JSON.stringify(changes)); | 
					
						
							|  |  |  |                } | 
					
						
							|  |  |  |              } | 
					
						
							|  |  |  |            }); | 
					
						
							| 
									
										
										
										
											2015-10-12 21:32:41 -07:00
										 |  |  |            ng1Module.directive('ng2', adapter.downgradeNg2Component(Ng2)); | 
					
						
							| 
									
										
										
										
											2015-10-01 13:14:59 -07:00
										 |  |  |            var element = html(`<div>
 | 
					
						
							|  |  |  |               <ng2 literal="Text" interpolate="Hello {{'world'}}" | 
					
						
							|  |  |  |                    bind-one-way-a="dataA" [one-way-b]="dataB" | 
					
						
							|  |  |  |                    bindon-two-way-a="modelA" [(two-way-b)]="modelB" | 
					
						
							|  |  |  |                    on-event-a='eventA=$event' (event-b)="eventB=$event"></ng2> | 
					
						
							|  |  |  |               | modelA: {{modelA}}; modelB: {{modelB}}; eventA: {{eventA}}; eventB: {{eventB}}; | 
					
						
							|  |  |  |               </div>`);
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            adapter.bootstrap(element, ['ng1']).ready((ref) => { | 
					
						
							|  |  |  |              expect(multiTrim(document.body.textContent)) | 
					
						
							|  |  |  |                  .toEqual( | 
					
						
							|  |  |  |                      'ignore: -; ' + | 
					
						
							|  |  |  |                      'literal: Text; interpolate: Hello world; ' + | 
					
						
							|  |  |  |                      'oneWayA: A; oneWayB: B; twoWayA: newA; twoWayB: newB; (2) | ' + | 
					
						
							|  |  |  |                      'modelA: newA; modelB: newB; eventA: aFired; eventB: bFired;') | 
					
						
							|  |  |  |              ref.dispose(); | 
					
						
							|  |  |  |              async.done(); | 
					
						
							|  |  |  |            }); | 
					
						
							| 
									
										
										
										
											2015-10-01 13:14:59 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |          })); | 
					
						
							| 
									
										
										
										
											2016-01-13 16:35:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |       it('should properly run cleanup when ng1 directive is destroyed', | 
					
						
							| 
									
										
										
										
											2016-06-09 11:04:15 -07:00
										 |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-01-13 16:35:48 +02:00
										 |  |  |            var adapter: UpgradeAdapter = new UpgradeAdapter(); | 
					
						
							|  |  |  |            var ng1Module = angular.module('ng1', []); | 
					
						
							|  |  |  |            var onDestroyed: EventEmitter<string> = new EventEmitter<string>(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            ng1Module.directive('ng1', () => { | 
					
						
							|  |  |  |              return { | 
					
						
							|  |  |  |                template: '<div ng-if="!destroyIt"><ng2></ng2></div>', | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                controller: function( | 
					
						
							|  |  |  |                    $rootScope: any /** TODO #9100 */, $timeout: any /** TODO #9100 */) { | 
					
						
							| 
									
										
										
										
											2016-01-13 16:35:48 +02:00
										 |  |  |                  $timeout(function() { $rootScope.destroyIt = true; }); | 
					
						
							|  |  |  |                } | 
					
						
							|  |  |  |              }; | 
					
						
							|  |  |  |            }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            var Ng2 = Component({selector: 'ng2', template: 'test'}).Class({ | 
					
						
							|  |  |  |              constructor: function() {}, | 
					
						
							|  |  |  |              ngOnDestroy: function() { onDestroyed.emit('destroyed'); } | 
					
						
							|  |  |  |            }); | 
					
						
							| 
									
										
										
										
											2016-01-13 16:35:48 +02:00
										 |  |  |            ng1Module.directive('ng2', adapter.downgradeNg2Component(Ng2)); | 
					
						
							|  |  |  |            var element = html('<ng1></ng1>'); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            adapter.bootstrap(element, ['ng1']).ready((ref) => {onDestroyed.subscribe(() => { | 
					
						
							|  |  |  |                                                        ref.dispose(); | 
					
						
							|  |  |  |                                                        async.done(); | 
					
						
							|  |  |  |                                                      })}); | 
					
						
							| 
									
										
										
										
											2016-01-13 16:35:48 +02:00
										 |  |  |          })); | 
					
						
							| 
									
										
										
										
											2016-05-17 15:55:53 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should fallback to the root ng2.injector when compiled outside the dom', | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							|  |  |  |            var adapter: UpgradeAdapter = new UpgradeAdapter(); | 
					
						
							|  |  |  |            var ng1Module = angular.module('ng1', []); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            ng1Module.directive('ng1', [ | 
					
						
							|  |  |  |              '$compile', | 
					
						
							|  |  |  |              ($compile: any /** TODO #9100 */) => { | 
					
						
							|  |  |  |                return { | 
					
						
							|  |  |  |                  link: function( | 
					
						
							|  |  |  |                      $scope: any /** TODO #9100 */, $element: any /** TODO #9100 */, | 
					
						
							|  |  |  |                      $attrs: any /** TODO #9100 */) { | 
					
						
							|  |  |  |                    var compiled = $compile('<ng2></ng2>'); | 
					
						
							|  |  |  |                    var template = compiled($scope); | 
					
						
							|  |  |  |                    $element.append(template); | 
					
						
							|  |  |  |                  } | 
					
						
							|  |  |  |                }; | 
					
						
							|  |  |  |              } | 
					
						
							|  |  |  |            ]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            var Ng2 = | 
					
						
							|  |  |  |                Component({selector: 'ng2', template: 'test'}).Class({constructor: function() {}}); | 
					
						
							|  |  |  |            ng1Module.directive('ng2', adapter.downgradeNg2Component(Ng2)); | 
					
						
							|  |  |  |            var element = html('<ng1></ng1>'); | 
					
						
							|  |  |  |            adapter.bootstrap(element, ['ng1']).ready((ref) => { | 
					
						
							|  |  |  |              expect(multiTrim(document.body.textContent)).toEqual('test'); | 
					
						
							|  |  |  |              ref.dispose(); | 
					
						
							|  |  |  |              async.done(); | 
					
						
							|  |  |  |            }); | 
					
						
							|  |  |  |          })); | 
					
						
							| 
									
										
										
										
											2015-10-01 13:14:59 -07:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2015-10-04 09:33:20 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-11 11:18:11 -07:00
										 |  |  |     describe('upgrade ng1 component', () => { | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should bind properties, events', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2015-10-12 21:32:41 -07:00
										 |  |  |            var adapter = new UpgradeAdapter(); | 
					
						
							|  |  |  |            var ng1Module = angular.module('ng1', []); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-04 09:33:20 -07:00
										 |  |  |            var ng1 = function() { | 
					
						
							|  |  |  |              return { | 
					
						
							|  |  |  |                template: 'Hello {{fullName}}; A: {{dataA}}; B: {{dataB}}; | ', | 
					
						
							| 
									
										
										
										
											2015-10-11 11:18:11 -07:00
										 |  |  |                scope: {fullName: '@', modelA: '=dataA', modelB: '=dataB', event: '&'}, | 
					
						
							| 
									
										
										
										
											2016-06-08 15:45:15 -07:00
										 |  |  |                link: function(scope: any /** TODO #9100 */) { | 
					
						
							|  |  |  |                  scope.$watch('dataB', (v: any /** TODO #9100 */) => { | 
					
						
							| 
									
										
										
										
											2015-10-11 11:18:11 -07:00
										 |  |  |                    if (v == 'Savkin') { | 
					
						
							|  |  |  |                      scope.dataB = 'SAVKIN'; | 
					
						
							|  |  |  |                      scope.event('WORKS'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-16 15:47:48 +08:00
										 |  |  |                      // Should not update because [model-a] is uni directional
 | 
					
						
							| 
									
										
										
										
											2015-10-11 11:18:11 -07:00
										 |  |  |                      scope.dataA = 'VICTOR'; | 
					
						
							| 
									
										
										
										
											2015-10-04 09:33:20 -07:00
										 |  |  |                    } | 
					
						
							| 
									
										
										
										
											2015-10-11 11:18:11 -07:00
										 |  |  |                  }) | 
					
						
							|  |  |  |                } | 
					
						
							|  |  |  |              }; | 
					
						
							| 
									
										
										
										
											2015-10-04 09:33:20 -07:00
										 |  |  |            }; | 
					
						
							| 
									
										
										
										
											2015-10-12 21:32:41 -07:00
										 |  |  |            ng1Module.directive('ng1', ng1); | 
					
						
							|  |  |  |            var Ng2 = | 
					
						
							|  |  |  |                Component({ | 
					
						
							|  |  |  |                  selector: 'ng2', | 
					
						
							|  |  |  |                  template: | 
					
						
							| 
									
										
										
										
											2015-11-23 16:02:19 -08:00
										 |  |  |                      '<ng1 fullName="{{last}}, {{first}}" [modelA]="first" [(modelB)]="last" ' + | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                      '(event)="event=$event"></ng1>' + | 
					
						
							|  |  |  |                      '<ng1 fullName="{{\'TEST\'}}" modelA="First" modelB="Last"></ng1>' + | 
					
						
							|  |  |  |                      '{{event}}-{{last}}, {{first}}', | 
					
						
							| 
									
										
										
										
											2015-10-12 21:32:41 -07:00
										 |  |  |                  directives: [adapter.upgradeNg1Component('ng1')] | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                }).Class({ | 
					
						
							|  |  |  |                  constructor: function() { | 
					
						
							|  |  |  |                    this.first = 'Victor'; | 
					
						
							|  |  |  |                    this.last = 'Savkin'; | 
					
						
							|  |  |  |                    this.event = '?'; | 
					
						
							|  |  |  |                  } | 
					
						
							|  |  |  |                }); | 
					
						
							| 
									
										
										
										
											2015-10-12 21:32:41 -07:00
										 |  |  |            ng1Module.directive('ng2', adapter.downgradeNg2Component(Ng2)); | 
					
						
							| 
									
										
										
										
											2015-10-04 09:33:20 -07:00
										 |  |  |            var element = html(`<div><ng2></ng2></div>`); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            adapter.bootstrap(element, ['ng1']).ready((ref) => { | 
					
						
							|  |  |  |              // we need to do setTimeout, because the EventEmitter uses setTimeout to schedule
 | 
					
						
							|  |  |  |              // events, and so without this we would not see the events processed.
 | 
					
						
							|  |  |  |              setTimeout(() => { | 
					
						
							|  |  |  |                expect(multiTrim(document.body.textContent)) | 
					
						
							|  |  |  |                    .toEqual( | 
					
						
							|  |  |  |                        'Hello SAVKIN, Victor; A: VICTOR; B: SAVKIN; | Hello TEST; A: First; B: Last; | WORKS-SAVKIN, Victor'); | 
					
						
							|  |  |  |                ref.dispose(); | 
					
						
							|  |  |  |                async.done(); | 
					
						
							|  |  |  |              }, 0); | 
					
						
							|  |  |  |            }); | 
					
						
							|  |  |  |          })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should bind properties, events in controller when bindToController is not used', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							|  |  |  |            var adapter = new UpgradeAdapter(); | 
					
						
							|  |  |  |            var ng1Module = angular.module('ng1', []); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            var ng1 = function() { | 
					
						
							|  |  |  |              return { | 
					
						
							|  |  |  |                restrict: 'E', | 
					
						
							|  |  |  |                template: '{{someText}} - Length: {{data.length}}', | 
					
						
							|  |  |  |                scope: {data: '='}, | 
					
						
							|  |  |  |                controller: function($scope: any /** TODO #9100 */) { | 
					
						
							|  |  |  |                  $scope.someText = 'ng1 - Data: ' + $scope.data; | 
					
						
							|  |  |  |                } | 
					
						
							|  |  |  |              }; | 
					
						
							|  |  |  |            }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            ng1Module.directive('ng1', ng1); | 
					
						
							|  |  |  |            var Ng2 = | 
					
						
							|  |  |  |                Component({ | 
					
						
							|  |  |  |                  selector: 'ng2', | 
					
						
							|  |  |  |                  template: | 
					
						
							|  |  |  |                      '{{someText}} - Length: {{dataList.length}} | <ng1 [(data)]="dataList"></ng1>', | 
					
						
							|  |  |  |                  directives: [adapter.upgradeNg1Component('ng1')], | 
					
						
							|  |  |  |                }).Class({ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                  constructor: function() { | 
					
						
							|  |  |  |                    this.dataList = [1, 2, 3]; | 
					
						
							|  |  |  |                    this.someText = 'ng2' | 
					
						
							|  |  |  |                  } | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |                }); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            ng1Module.directive('ng2', adapter.downgradeNg2Component(Ng2)); | 
					
						
							|  |  |  |            var element = html(`<div><ng2></ng2></div>`); | 
					
						
							|  |  |  |            adapter.bootstrap(element, ['ng1']).ready((ref) => { | 
					
						
							|  |  |  |              // we need to do setTimeout, because the EventEmitter uses setTimeout to schedule
 | 
					
						
							|  |  |  |              // events, and so without this we would not see the events processed.
 | 
					
						
							|  |  |  |              setTimeout(() => { | 
					
						
							|  |  |  |                expect(multiTrim(document.body.textContent)) | 
					
						
							|  |  |  |                    .toEqual('ng2 - Length: 3 | ng1 - Data: 1,2,3 - Length: 3'); | 
					
						
							|  |  |  |                ref.dispose(); | 
					
						
							|  |  |  |                async.done(); | 
					
						
							|  |  |  |              }, 0); | 
					
						
							|  |  |  |            }); | 
					
						
							| 
									
										
										
										
											2015-10-12 21:32:41 -07:00
										 |  |  |          })); | 
					
						
							| 
									
										
										
										
											2015-10-11 11:18:11 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should bind properties, events in link function', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							|  |  |  |            var adapter = new UpgradeAdapter(); | 
					
						
							|  |  |  |            var ng1Module = angular.module('ng1', []); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            var ng1 = function() { | 
					
						
							|  |  |  |              return { | 
					
						
							|  |  |  |                restrict: 'E', | 
					
						
							|  |  |  |                template: '{{someText}} - Length: {{data.length}}', | 
					
						
							|  |  |  |                scope: {data: '='}, | 
					
						
							|  |  |  |                link: function($scope: any /** TODO #9100 */) { | 
					
						
							|  |  |  |                  $scope.someText = 'ng1 - Data: ' + $scope.data; | 
					
						
							|  |  |  |                } | 
					
						
							|  |  |  |              }; | 
					
						
							|  |  |  |            }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            ng1Module.directive('ng1', ng1); | 
					
						
							|  |  |  |            var Ng2 = | 
					
						
							|  |  |  |                Component({ | 
					
						
							|  |  |  |                  selector: 'ng2', | 
					
						
							|  |  |  |                  template: | 
					
						
							|  |  |  |                      '{{someText}} - Length: {{dataList.length}} | <ng1 [(data)]="dataList"></ng1>', | 
					
						
							|  |  |  |                  directives: [adapter.upgradeNg1Component('ng1')], | 
					
						
							|  |  |  |                }).Class({ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                  constructor: function() { | 
					
						
							|  |  |  |                    this.dataList = [1, 2, 3]; | 
					
						
							|  |  |  |                    this.someText = 'ng2' | 
					
						
							|  |  |  |                  } | 
					
						
							|  |  |  |                }); | 
					
						
							|  |  |  |            ng1Module.directive('ng2', adapter.downgradeNg2Component(Ng2)); | 
					
						
							|  |  |  |            var element = html(`<div><ng2></ng2></div>`); | 
					
						
							|  |  |  |            adapter.bootstrap(element, ['ng1']).ready((ref) => { | 
					
						
							|  |  |  |              // we need to do setTimeout, because the EventEmitter uses setTimeout to schedule
 | 
					
						
							|  |  |  |              // events, and so without this we would not see the events processed.
 | 
					
						
							|  |  |  |              setTimeout(() => { | 
					
						
							|  |  |  |                expect(multiTrim(document.body.textContent)) | 
					
						
							|  |  |  |                    .toEqual('ng2 - Length: 3 | ng1 - Data: 1,2,3 - Length: 3'); | 
					
						
							|  |  |  |                ref.dispose(); | 
					
						
							|  |  |  |                async.done(); | 
					
						
							|  |  |  |              }, 0); | 
					
						
							|  |  |  |            }); | 
					
						
							|  |  |  |          })); | 
					
						
							| 
									
										
										
										
											2016-05-17 14:53:59 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-11 11:18:11 -07:00
										 |  |  |       it('should support templateUrl fetched from $httpBackend', | 
					
						
							| 
									
										
										
										
											2016-06-09 11:04:15 -07:00
										 |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2015-10-11 11:18:11 -07:00
										 |  |  |            var adapter = new UpgradeAdapter(); | 
					
						
							|  |  |  |            var ng1Module = angular.module('ng1', []); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            ng1Module.value( | 
					
						
							|  |  |  |                '$httpBackend', (method: any /** TODO #9100 */, url: any /** TODO #9100 */, | 
					
						
							|  |  |  |                                 post: any /** TODO #9100 */, | 
					
						
							|  |  |  |                                 cbFn: any /** TODO #9100 */) => { cbFn(200, `${method}:${url}`); }); | 
					
						
							| 
									
										
										
										
											2015-10-11 11:18:11 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |            var ng1 = function() { return {templateUrl: 'url.html'}; }; | 
					
						
							|  |  |  |            ng1Module.directive('ng1', ng1); | 
					
						
							|  |  |  |            var Ng2 = Component({ | 
					
						
							|  |  |  |                        selector: 'ng2', | 
					
						
							|  |  |  |                        template: '<ng1></ng1>', | 
					
						
							|  |  |  |                        directives: [adapter.upgradeNg1Component('ng1')] | 
					
						
							|  |  |  |                      }).Class({constructor: function() {}}); | 
					
						
							|  |  |  |            ng1Module.directive('ng2', adapter.downgradeNg2Component(Ng2)); | 
					
						
							|  |  |  |            var element = html(`<div><ng2></ng2></div>`); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            adapter.bootstrap(element, ['ng1']).ready((ref) => { | 
					
						
							|  |  |  |              expect(multiTrim(document.body.textContent)).toEqual('GET:url.html'); | 
					
						
							|  |  |  |              ref.dispose(); | 
					
						
							|  |  |  |              async.done(); | 
					
						
							|  |  |  |            }); | 
					
						
							| 
									
										
										
										
											2015-10-11 11:18:11 -07:00
										 |  |  |          })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-04 19:53:51 -07:00
										 |  |  |       it('should support templateUrl as a function', | 
					
						
							| 
									
										
										
										
											2016-06-09 11:04:15 -07:00
										 |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-06-04 19:53:51 -07:00
										 |  |  |            var adapter = new UpgradeAdapter(); | 
					
						
							|  |  |  |            var ng1Module = angular.module('ng1', []); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            ng1Module.value( | 
					
						
							|  |  |  |                '$httpBackend', (method: any /** TODO #9100 */, url: any /** TODO #9100 */, | 
					
						
							|  |  |  |                                 post: any /** TODO #9100 */, | 
					
						
							|  |  |  |                                 cbFn: any /** TODO #9100 */) => { cbFn(200, `${method}:${url}`); }); | 
					
						
							| 
									
										
										
										
											2016-06-04 19:53:51 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            var ng1 = function() { return {templateUrl() { return 'url.html' }}; }; | 
					
						
							| 
									
										
										
										
											2016-06-04 19:53:51 -07:00
										 |  |  |            ng1Module.directive('ng1', ng1); | 
					
						
							|  |  |  |            var Ng2 = Component({ | 
					
						
							|  |  |  |                        selector: 'ng2', | 
					
						
							|  |  |  |                        template: '<ng1></ng1>', | 
					
						
							|  |  |  |                        directives: [adapter.upgradeNg1Component('ng1')] | 
					
						
							|  |  |  |                      }).Class({constructor: function() {}}); | 
					
						
							|  |  |  |            ng1Module.directive('ng2', adapter.downgradeNg2Component(Ng2)); | 
					
						
							|  |  |  |            var element = html(`<div><ng2></ng2></div>`); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            adapter.bootstrap(element, ['ng1']).ready((ref) => { | 
					
						
							|  |  |  |              expect(multiTrim(document.body.textContent)).toEqual('GET:url.html'); | 
					
						
							|  |  |  |              ref.dispose(); | 
					
						
							|  |  |  |              async.done(); | 
					
						
							|  |  |  |            }); | 
					
						
							| 
									
										
										
										
											2016-06-04 19:53:51 -07:00
										 |  |  |          })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should support empty template', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2015-12-10 13:23:47 +01:00
										 |  |  |            var adapter = new UpgradeAdapter(); | 
					
						
							|  |  |  |            var ng1Module = angular.module('ng1', []); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            var ng1 = function() { return {template: ''}; }; | 
					
						
							|  |  |  |            ng1Module.directive('ng1', ng1); | 
					
						
							|  |  |  |            var Ng2 = Component({ | 
					
						
							|  |  |  |                        selector: 'ng2', | 
					
						
							|  |  |  |                        template: '<ng1></ng1>', | 
					
						
							|  |  |  |                        directives: [adapter.upgradeNg1Component('ng1')] | 
					
						
							|  |  |  |                      }).Class({constructor: function() {}}); | 
					
						
							|  |  |  |            ng1Module.directive('ng2', adapter.downgradeNg2Component(Ng2)); | 
					
						
							|  |  |  |            var element = html(`<div><ng2></ng2></div>`); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            adapter.bootstrap(element, ['ng1']).ready((ref) => { | 
					
						
							|  |  |  |              expect(multiTrim(document.body.textContent)).toEqual(''); | 
					
						
							|  |  |  |              ref.dispose(); | 
					
						
							|  |  |  |              async.done(); | 
					
						
							|  |  |  |            }); | 
					
						
							| 
									
										
										
										
											2015-12-10 13:23:47 +01:00
										 |  |  |          })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should support template as a function', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-06-04 19:53:51 -07:00
										 |  |  |            var adapter = new UpgradeAdapter(); | 
					
						
							|  |  |  |            var ng1Module = angular.module('ng1', []); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            var ng1 = function() { return {template() { return '' }}; }; | 
					
						
							| 
									
										
										
										
											2016-06-04 19:53:51 -07:00
										 |  |  |            ng1Module.directive('ng1', ng1); | 
					
						
							|  |  |  |            var Ng2 = Component({ | 
					
						
							|  |  |  |                        selector: 'ng2', | 
					
						
							|  |  |  |                        template: '<ng1></ng1>', | 
					
						
							|  |  |  |                        directives: [adapter.upgradeNg1Component('ng1')] | 
					
						
							|  |  |  |                      }).Class({constructor: function() {}}); | 
					
						
							|  |  |  |            ng1Module.directive('ng2', adapter.downgradeNg2Component(Ng2)); | 
					
						
							|  |  |  |            var element = html(`<div><ng2></ng2></div>`); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            adapter.bootstrap(element, ['ng1']).ready((ref) => { | 
					
						
							|  |  |  |              expect(multiTrim(document.body.textContent)).toEqual(''); | 
					
						
							|  |  |  |              ref.dispose(); | 
					
						
							|  |  |  |              async.done(); | 
					
						
							|  |  |  |            }); | 
					
						
							| 
									
										
										
										
											2016-06-04 19:53:51 -07:00
										 |  |  |          })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-11 11:18:11 -07:00
										 |  |  |       it('should support templateUrl fetched from $templateCache', | 
					
						
							| 
									
										
										
										
											2016-06-09 11:04:15 -07:00
										 |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2015-10-11 11:18:11 -07:00
										 |  |  |            var adapter = new UpgradeAdapter(); | 
					
						
							|  |  |  |            var ng1Module = angular.module('ng1', []); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            ng1Module.run( | 
					
						
							|  |  |  |                ($templateCache: any /** TODO #9100 */) => $templateCache.put('url.html', 'WORKS')); | 
					
						
							| 
									
										
										
										
											2015-10-11 11:18:11 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |            var ng1 = function() { return {templateUrl: 'url.html'}; }; | 
					
						
							|  |  |  |            ng1Module.directive('ng1', ng1); | 
					
						
							|  |  |  |            var Ng2 = Component({ | 
					
						
							|  |  |  |                        selector: 'ng2', | 
					
						
							|  |  |  |                        template: '<ng1></ng1>', | 
					
						
							|  |  |  |                        directives: [adapter.upgradeNg1Component('ng1')] | 
					
						
							|  |  |  |                      }).Class({constructor: function() {}}); | 
					
						
							|  |  |  |            ng1Module.directive('ng2', adapter.downgradeNg2Component(Ng2)); | 
					
						
							|  |  |  |            var element = html(`<div><ng2></ng2></div>`); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            adapter.bootstrap(element, ['ng1']).ready((ref) => { | 
					
						
							|  |  |  |              expect(multiTrim(document.body.textContent)).toEqual('WORKS'); | 
					
						
							|  |  |  |              ref.dispose(); | 
					
						
							|  |  |  |              async.done(); | 
					
						
							|  |  |  |            }); | 
					
						
							| 
									
										
										
										
											2015-10-11 11:18:11 -07:00
										 |  |  |          })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should support controller with controllerAs', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2015-10-11 11:18:11 -07:00
										 |  |  |            var adapter = new UpgradeAdapter(); | 
					
						
							|  |  |  |            var ng1Module = angular.module('ng1', []); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            var ng1 = function() { | 
					
						
							|  |  |  |              return { | 
					
						
							|  |  |  |                scope: true, | 
					
						
							|  |  |  |                template: | 
					
						
							|  |  |  |                    '{{ctl.scope}}; {{ctl.isClass}}; {{ctl.hasElement}}; {{ctl.isPublished()}}', | 
					
						
							|  |  |  |                controllerAs: 'ctl', | 
					
						
							|  |  |  |                controller: Class({ | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                  constructor: function( | 
					
						
							|  |  |  |                      $scope: any /** TODO #9100 */, $element: any /** TODO #9100 */) { | 
					
						
							| 
									
										
										
										
											2015-10-11 11:18:11 -07:00
										 |  |  |                    (<any>this).verifyIAmAClass(); | 
					
						
							|  |  |  |                    this.scope = $scope.$parent.$parent == $scope.$root ? 'scope' : 'wrong-scope'; | 
					
						
							|  |  |  |                    this.hasElement = $element[0].nodeName; | 
					
						
							|  |  |  |                    this.$element = $element; | 
					
						
							|  |  |  |                  }, | 
					
						
							|  |  |  |                  verifyIAmAClass: function() { this.isClass = 'isClass'; }, | 
					
						
							|  |  |  |                  isPublished: function() { | 
					
						
							|  |  |  |                    return this.$element.controller('ng1') == this ? 'published' : 'not-published'; | 
					
						
							|  |  |  |                  } | 
					
						
							|  |  |  |                }) | 
					
						
							|  |  |  |              }; | 
					
						
							|  |  |  |            }; | 
					
						
							|  |  |  |            ng1Module.directive('ng1', ng1); | 
					
						
							|  |  |  |            var Ng2 = Component({ | 
					
						
							|  |  |  |                        selector: 'ng2', | 
					
						
							|  |  |  |                        template: '<ng1></ng1>', | 
					
						
							|  |  |  |                        directives: [adapter.upgradeNg1Component('ng1')] | 
					
						
							|  |  |  |                      }).Class({constructor: function() {}}); | 
					
						
							|  |  |  |            ng1Module.directive('ng2', adapter.downgradeNg2Component(Ng2)); | 
					
						
							|  |  |  |            var element = html(`<div><ng2></ng2></div>`); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            adapter.bootstrap(element, ['ng1']).ready((ref) => { | 
					
						
							|  |  |  |              expect(multiTrim(document.body.textContent)).toEqual('scope; isClass; NG1; published'); | 
					
						
							|  |  |  |              ref.dispose(); | 
					
						
							|  |  |  |              async.done(); | 
					
						
							|  |  |  |            }); | 
					
						
							| 
									
										
										
										
											2015-10-11 11:18:11 -07:00
										 |  |  |          })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should support bindToController', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2015-10-11 11:18:11 -07:00
										 |  |  |            var adapter = new UpgradeAdapter(); | 
					
						
							|  |  |  |            var ng1Module = angular.module('ng1', []); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            var ng1 = function() { | 
					
						
							|  |  |  |              return { | 
					
						
							|  |  |  |                scope: {title: '@'}, | 
					
						
							| 
									
										
										
										
											2015-10-28 08:59:19 +01:00
										 |  |  |                bindToController: true, | 
					
						
							|  |  |  |                template: '{{ctl.title}}', | 
					
						
							| 
									
										
										
										
											2015-10-11 11:18:11 -07:00
										 |  |  |                controllerAs: 'ctl', | 
					
						
							|  |  |  |                controller: Class({constructor: function() {}}) | 
					
						
							|  |  |  |              }; | 
					
						
							|  |  |  |            }; | 
					
						
							|  |  |  |            ng1Module.directive('ng1', ng1); | 
					
						
							|  |  |  |            var Ng2 = Component({ | 
					
						
							|  |  |  |                        selector: 'ng2', | 
					
						
							|  |  |  |                        template: '<ng1 title="WORKS"></ng1>', | 
					
						
							|  |  |  |                        directives: [adapter.upgradeNg1Component('ng1')] | 
					
						
							| 
									
										
										
										
											2015-11-13 18:55:40 +01:00
										 |  |  |                      }).Class({constructor: function() {}}); | 
					
						
							|  |  |  |            ng1Module.directive('ng2', adapter.downgradeNg2Component(Ng2)); | 
					
						
							|  |  |  |            var element = html(`<div><ng2></ng2></div>`); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            adapter.bootstrap(element, ['ng1']).ready((ref) => { | 
					
						
							|  |  |  |              expect(multiTrim(document.body.textContent)).toEqual('WORKS'); | 
					
						
							|  |  |  |              ref.dispose(); | 
					
						
							|  |  |  |              async.done(); | 
					
						
							|  |  |  |            }); | 
					
						
							| 
									
										
										
										
											2015-11-13 18:55:40 +01:00
										 |  |  |          })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should support bindToController with bindings', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2015-11-13 18:55:40 +01:00
										 |  |  |            var adapter = new UpgradeAdapter(); | 
					
						
							|  |  |  |            var ng1Module = angular.module('ng1', []); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            var ng1 = function() { | 
					
						
							|  |  |  |              return { | 
					
						
							|  |  |  |                scope: {}, | 
					
						
							|  |  |  |                bindToController: {title: '@'}, | 
					
						
							|  |  |  |                template: '{{ctl.title}}', | 
					
						
							|  |  |  |                controllerAs: 'ctl', | 
					
						
							|  |  |  |                controller: Class({constructor: function() {}}) | 
					
						
							|  |  |  |              }; | 
					
						
							|  |  |  |            }; | 
					
						
							|  |  |  |            ng1Module.directive('ng1', ng1); | 
					
						
							|  |  |  |            var Ng2 = Component({ | 
					
						
							|  |  |  |                        selector: 'ng2', | 
					
						
							|  |  |  |                        template: '<ng1 title="WORKS"></ng1>', | 
					
						
							|  |  |  |                        directives: [adapter.upgradeNg1Component('ng1')] | 
					
						
							| 
									
										
										
										
											2015-10-11 11:18:11 -07:00
										 |  |  |                      }).Class({constructor: function() {}}); | 
					
						
							|  |  |  |            ng1Module.directive('ng2', adapter.downgradeNg2Component(Ng2)); | 
					
						
							|  |  |  |            var element = html(`<div><ng2></ng2></div>`); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            adapter.bootstrap(element, ['ng1']).ready((ref) => { | 
					
						
							|  |  |  |              expect(multiTrim(document.body.textContent)).toEqual('WORKS'); | 
					
						
							|  |  |  |              ref.dispose(); | 
					
						
							|  |  |  |              async.done(); | 
					
						
							|  |  |  |            }); | 
					
						
							| 
									
										
										
										
											2015-10-11 11:18:11 -07:00
										 |  |  |          })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should support single require in linking fn', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2015-10-11 11:18:11 -07:00
										 |  |  |            var adapter = new UpgradeAdapter(); | 
					
						
							|  |  |  |            var ng1Module = angular.module('ng1', []); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 15:45:15 -07:00
										 |  |  |            var ng1 = function($rootScope: any /** TODO #9100 */) { | 
					
						
							| 
									
										
										
										
											2015-10-11 11:18:11 -07:00
										 |  |  |              return { | 
					
						
							|  |  |  |                scope: {title: '@'}, | 
					
						
							| 
									
										
										
										
											2015-10-28 08:59:19 +01:00
										 |  |  |                bindToController: true, | 
					
						
							|  |  |  |                template: '{{ctl.status}}', | 
					
						
							| 
									
										
										
										
											2015-10-11 11:18:11 -07:00
										 |  |  |                require: 'ng1', | 
					
						
							| 
									
										
										
										
											2015-10-13 15:10:20 -07:00
										 |  |  |                controllerAs: 'ctrl', | 
					
						
							| 
									
										
										
										
											2015-10-11 11:18:11 -07:00
										 |  |  |                controller: Class({constructor: function() { this.status = 'WORKS'; }}), | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                link: function( | 
					
						
							|  |  |  |                    scope: any /** TODO #9100 */, element: any /** TODO #9100 */, | 
					
						
							|  |  |  |                    attrs: any /** TODO #9100 */, linkController: any /** TODO #9100 */) { | 
					
						
							| 
									
										
										
										
											2015-10-11 11:18:11 -07:00
										 |  |  |                  expect(scope.$root).toEqual($rootScope); | 
					
						
							|  |  |  |                  expect(element[0].nodeName).toEqual('NG1'); | 
					
						
							|  |  |  |                  expect(linkController.status).toEqual('WORKS'); | 
					
						
							|  |  |  |                  scope.ctl = linkController; | 
					
						
							|  |  |  |                } | 
					
						
							|  |  |  |              }; | 
					
						
							|  |  |  |            }; | 
					
						
							|  |  |  |            ng1Module.directive('ng1', ng1); | 
					
						
							|  |  |  |            var Ng2 = Component({ | 
					
						
							|  |  |  |                        selector: 'ng2', | 
					
						
							|  |  |  |                        template: '<ng1></ng1>', | 
					
						
							|  |  |  |                        directives: [adapter.upgradeNg1Component('ng1')] | 
					
						
							|  |  |  |                      }).Class({constructor: function() {}}); | 
					
						
							|  |  |  |            ng1Module.directive('ng2', adapter.downgradeNg2Component(Ng2)); | 
					
						
							|  |  |  |            var element = html(`<div><ng2></ng2></div>`); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            adapter.bootstrap(element, ['ng1']).ready((ref) => { | 
					
						
							|  |  |  |              expect(multiTrim(document.body.textContent)).toEqual('WORKS'); | 
					
						
							|  |  |  |              ref.dispose(); | 
					
						
							|  |  |  |              async.done(); | 
					
						
							|  |  |  |            }); | 
					
						
							| 
									
										
										
										
											2015-10-11 11:18:11 -07:00
										 |  |  |          })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should support array require in linking fn', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2015-10-11 11:18:11 -07:00
										 |  |  |            var adapter = new UpgradeAdapter(); | 
					
						
							|  |  |  |            var ng1Module = angular.module('ng1', []); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            var parent = function() { | 
					
						
							|  |  |  |              return {controller: Class({constructor: function() { this.parent = 'PARENT'; }})}; | 
					
						
							|  |  |  |            }; | 
					
						
							|  |  |  |            var ng1 = function() { | 
					
						
							|  |  |  |              return { | 
					
						
							|  |  |  |                scope: {title: '@'}, | 
					
						
							| 
									
										
										
										
											2015-10-28 08:59:19 +01:00
										 |  |  |                bindToController: true, | 
					
						
							|  |  |  |                template: '{{parent.parent}}:{{ng1.status}}', | 
					
						
							| 
									
										
										
										
											2015-10-11 11:18:11 -07:00
										 |  |  |                require: ['ng1', '^parent', '?^^notFound'], | 
					
						
							| 
									
										
										
										
											2015-10-13 15:10:20 -07:00
										 |  |  |                controllerAs: 'ctrl', | 
					
						
							| 
									
										
										
										
											2015-10-11 11:18:11 -07:00
										 |  |  |                controller: Class({constructor: function() { this.status = 'WORKS'; }}), | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                link: function( | 
					
						
							|  |  |  |                    scope: any /** TODO #9100 */, element: any /** TODO #9100 */, | 
					
						
							|  |  |  |                    attrs: any /** TODO #9100 */, linkControllers: any /** TODO #9100 */) { | 
					
						
							| 
									
										
										
										
											2015-10-11 11:18:11 -07:00
										 |  |  |                  expect(linkControllers[0].status).toEqual('WORKS'); | 
					
						
							|  |  |  |                  expect(linkControllers[1].parent).toEqual('PARENT'); | 
					
						
							|  |  |  |                  expect(linkControllers[2]).toBe(undefined); | 
					
						
							|  |  |  |                  scope.ng1 = linkControllers[0]; | 
					
						
							|  |  |  |                  scope.parent = linkControllers[1]; | 
					
						
							|  |  |  |                } | 
					
						
							|  |  |  |              }; | 
					
						
							|  |  |  |            }; | 
					
						
							|  |  |  |            ng1Module.directive('parent', parent); | 
					
						
							|  |  |  |            ng1Module.directive('ng1', ng1); | 
					
						
							|  |  |  |            var Ng2 = Component({ | 
					
						
							|  |  |  |                        selector: 'ng2', | 
					
						
							|  |  |  |                        template: '<ng1></ng1>', | 
					
						
							|  |  |  |                        directives: [adapter.upgradeNg1Component('ng1')] | 
					
						
							|  |  |  |                      }).Class({constructor: function() {}}); | 
					
						
							|  |  |  |            ng1Module.directive('ng2', adapter.downgradeNg2Component(Ng2)); | 
					
						
							|  |  |  |            var element = html(`<div><parent><ng2></ng2></parent></div>`); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            adapter.bootstrap(element, ['ng1']).ready((ref) => { | 
					
						
							|  |  |  |              expect(multiTrim(document.body.textContent)).toEqual('PARENT:WORKS'); | 
					
						
							|  |  |  |              ref.dispose(); | 
					
						
							|  |  |  |              async.done(); | 
					
						
							|  |  |  |            }); | 
					
						
							| 
									
										
										
										
											2015-10-11 11:18:11 -07:00
										 |  |  |          })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should call $onInit of components', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-03-14 07:51:04 +01:00
										 |  |  |            var adapter = new UpgradeAdapter(); | 
					
						
							|  |  |  |            var ng1Module = angular.module('ng1', []); | 
					
						
							|  |  |  |            var valueToFind = '$onInit'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            var ng1 = { | 
					
						
							|  |  |  |              bindings: {}, | 
					
						
							|  |  |  |              template: '{{$ctrl.value}}', | 
					
						
							|  |  |  |              controller: Class( | 
					
						
							|  |  |  |                  {constructor: function() {}, $onInit: function() { this.value = valueToFind; }}) | 
					
						
							|  |  |  |            }; | 
					
						
							|  |  |  |            ng1Module.component('ng1', ng1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            var Ng2 = Component({ | 
					
						
							|  |  |  |                        selector: 'ng2', | 
					
						
							|  |  |  |                        template: '<ng1></ng1>', | 
					
						
							|  |  |  |                        directives: [adapter.upgradeNg1Component('ng1')] | 
					
						
							|  |  |  |                      }).Class({constructor: function() {}}); | 
					
						
							|  |  |  |            ng1Module.directive('ng2', adapter.downgradeNg2Component(Ng2)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            var element = html(`<div><ng2></ng2></div>`); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            adapter.bootstrap(element, ['ng1']).ready((ref) => { | 
					
						
							|  |  |  |              expect(multiTrim(document.body.textContent)).toEqual(valueToFind); | 
					
						
							|  |  |  |              ref.dispose(); | 
					
						
							|  |  |  |              async.done(); | 
					
						
							|  |  |  |            }); | 
					
						
							| 
									
										
										
										
											2016-03-14 07:51:04 +01:00
										 |  |  |          })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should bind input properties (<) of components', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-03-14 07:51:04 +01:00
										 |  |  |            var adapter = new UpgradeAdapter(); | 
					
						
							|  |  |  |            var ng1Module = angular.module('ng1', []); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            var ng1 = { | 
					
						
							|  |  |  |              bindings: {personProfile: '<'}, | 
					
						
							|  |  |  |              template: 'Hello {{$ctrl.personProfile.firstName}} {{$ctrl.personProfile.lastName}}', | 
					
						
							|  |  |  |              controller: Class({constructor: function() {}}) | 
					
						
							|  |  |  |            }; | 
					
						
							|  |  |  |            ng1Module.component('ng1', ng1); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            var Ng2 = Component({ | 
					
						
							|  |  |  |                        selector: 'ng2', | 
					
						
							|  |  |  |                        template: '<ng1 [personProfile]="goku"></ng1>', | 
					
						
							|  |  |  |                        directives: [adapter.upgradeNg1Component('ng1')] | 
					
						
							|  |  |  |                      }).Class({ | 
					
						
							|  |  |  |              constructor: function() { this.goku = {firstName: 'GOKU', lastName: 'SAN'}; } | 
					
						
							|  |  |  |            }); | 
					
						
							| 
									
										
										
										
											2016-03-14 07:51:04 +01:00
										 |  |  |            ng1Module.directive('ng2', adapter.downgradeNg2Component(Ng2)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            var element = html(`<div><ng2></ng2></div>`); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            adapter.bootstrap(element, ['ng1']).ready((ref) => { | 
					
						
							|  |  |  |              expect(multiTrim(document.body.textContent)).toEqual(`Hello GOKU SAN`); | 
					
						
							|  |  |  |              ref.dispose(); | 
					
						
							|  |  |  |              async.done(); | 
					
						
							|  |  |  |            }); | 
					
						
							| 
									
										
										
										
											2016-03-14 07:51:04 +01:00
										 |  |  |          })); | 
					
						
							| 
									
										
										
										
											2016-06-01 15:58:40 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should support ng2 > ng1 > ng2', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-06-01 15:58:40 -07:00
										 |  |  |            var adapter = new UpgradeAdapter(); | 
					
						
							|  |  |  |            var ng1Module = angular.module('ng1', []); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            var ng1 = { | 
					
						
							|  |  |  |              template: 'ng1(<ng2b></ng2b>)', | 
					
						
							|  |  |  |            }; | 
					
						
							|  |  |  |            ng1Module.component('ng1', ng1); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            var Ng2a = Component({ | 
					
						
							|  |  |  |                         selector: 'ng2a', | 
					
						
							|  |  |  |                         template: 'ng2a(<ng1></ng1>)', | 
					
						
							|  |  |  |                         directives: [adapter.upgradeNg1Component('ng1')] | 
					
						
							|  |  |  |                       }).Class({constructor: function() {}}); | 
					
						
							| 
									
										
										
										
											2016-06-01 15:58:40 -07:00
										 |  |  |            ng1Module.directive('ng2a', adapter.downgradeNg2Component(Ng2a)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            var Ng2b = Component({selector: 'ng2b', template: 'ng2b', directives: []}).Class({ | 
					
						
							|  |  |  |              constructor: function() {} | 
					
						
							|  |  |  |            }); | 
					
						
							| 
									
										
										
										
											2016-06-01 15:58:40 -07:00
										 |  |  |            ng1Module.directive('ng2b', adapter.downgradeNg2Component(Ng2b)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            var element = html(`<div><ng2a></ng2a></div>`); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            adapter.bootstrap(element, ['ng1']).ready((ref) => { | 
					
						
							|  |  |  |              expect(multiTrim(document.body.textContent)).toEqual('ng2a(ng1(ng2b))'); | 
					
						
							|  |  |  |              async.done(); | 
					
						
							|  |  |  |            }); | 
					
						
							| 
									
										
										
										
											2016-06-01 15:58:40 -07:00
										 |  |  |          })); | 
					
						
							| 
									
										
										
										
											2015-10-12 21:32:41 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-15 12:04:19 -07:00
										 |  |  |     describe('injection', () => { | 
					
						
							|  |  |  |       function SomeToken() {} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should export ng2 instance to ng1', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2015-10-15 12:04:19 -07:00
										 |  |  |            var adapter = new UpgradeAdapter(); | 
					
						
							|  |  |  |            var module = angular.module('myExample', []); | 
					
						
							| 
									
										
										
										
											2016-06-02 17:30:40 -07:00
										 |  |  |            adapter.addProvider({provide: SomeToken, useValue: 'correct_value'}); | 
					
						
							| 
									
										
										
										
											2015-10-15 12:04:19 -07:00
										 |  |  |            module.factory('someToken', adapter.downgradeNg2Provider(SomeToken)); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            adapter.bootstrap(html('<div>'), ['myExample']).ready((ref) => { | 
					
						
							|  |  |  |              expect(ref.ng1Injector.get('someToken')).toBe('correct_value'); | 
					
						
							|  |  |  |              ref.dispose(); | 
					
						
							|  |  |  |              async.done(); | 
					
						
							|  |  |  |            }); | 
					
						
							| 
									
										
										
										
											2015-10-15 12:04:19 -07:00
										 |  |  |          })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should export ng1 instance to ng2', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2015-10-15 12:04:19 -07:00
										 |  |  |            var adapter = new UpgradeAdapter(); | 
					
						
							|  |  |  |            var module = angular.module('myExample', []); | 
					
						
							|  |  |  |            module.value('testValue', 'secreteToken'); | 
					
						
							|  |  |  |            adapter.upgradeNg1Provider('testValue'); | 
					
						
							|  |  |  |            adapter.upgradeNg1Provider('testValue', {asToken: 'testToken'}); | 
					
						
							|  |  |  |            adapter.upgradeNg1Provider('testValue', {asToken: String}); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            adapter.bootstrap(html('<div>'), ['myExample']).ready((ref) => { | 
					
						
							|  |  |  |              expect(ref.ng2Injector.get('testValue')).toBe('secreteToken'); | 
					
						
							|  |  |  |              expect(ref.ng2Injector.get(String)).toBe('secreteToken'); | 
					
						
							|  |  |  |              expect(ref.ng2Injector.get('testToken')).toBe('secreteToken'); | 
					
						
							|  |  |  |              ref.dispose(); | 
					
						
							|  |  |  |              async.done(); | 
					
						
							|  |  |  |            }); | 
					
						
							| 
									
										
										
										
											2015-10-15 12:04:19 -07:00
										 |  |  |          })); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-14 14:36:41 -07:00
										 |  |  |     describe('testability', () => { | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should handle deferred bootstrap', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-03-14 14:36:41 -07:00
										 |  |  |            var adapter: UpgradeAdapter = new UpgradeAdapter(); | 
					
						
							|  |  |  |            var ng1Module = angular.module('ng1', []); | 
					
						
							|  |  |  |            var bootstrapResumed: boolean = false; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            var element = html('<div></div>'); | 
					
						
							| 
									
										
										
										
											2016-03-14 14:36:41 -07:00
										 |  |  |            window.name = 'NG_DEFER_BOOTSTRAP!' + window.name; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            adapter.bootstrap(element, ['ng1']).ready((ref) => { | 
					
						
							|  |  |  |              expect(bootstrapResumed).toEqual(true); | 
					
						
							|  |  |  |              ref.dispose(); | 
					
						
							|  |  |  |              async.done(); | 
					
						
							|  |  |  |            }); | 
					
						
							| 
									
										
										
										
											2016-03-14 14:36:41 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |            setTimeout(() => { | 
					
						
							|  |  |  |              bootstrapResumed = true; | 
					
						
							| 
									
										
										
										
											2016-04-28 17:50:03 -07:00
										 |  |  |              (<any>window).angular.resumeBootstrap(); | 
					
						
							| 
									
										
										
										
											2016-03-14 14:36:41 -07:00
										 |  |  |            }, 100); | 
					
						
							|  |  |  |          })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should wait for ng2 testability', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-03-14 14:36:41 -07:00
										 |  |  |            var adapter: UpgradeAdapter = new UpgradeAdapter(); | 
					
						
							|  |  |  |            var ng1Module = angular.module('ng1', []); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            var element = html('<div></div>'); | 
					
						
							|  |  |  |            adapter.bootstrap(element, ['ng1']).ready((ref) => { | 
					
						
							|  |  |  |              var ng2Testability: Testability = ref.ng2Injector.get(Testability); | 
					
						
							|  |  |  |              ng2Testability.increasePendingRequestCount(); | 
					
						
							|  |  |  |              var ng2Stable = false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              angular.getTestability(element).whenStable(function() { | 
					
						
							|  |  |  |                expect(ng2Stable).toEqual(true); | 
					
						
							|  |  |  |                ref.dispose(); | 
					
						
							|  |  |  |                async.done(); | 
					
						
							|  |  |  |              }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              setTimeout(() => { | 
					
						
							|  |  |  |                ng2Stable = true; | 
					
						
							|  |  |  |                ng2Testability.decreasePendingRequestCount(); | 
					
						
							|  |  |  |              }, 100); | 
					
						
							|  |  |  |            }); | 
					
						
							| 
									
										
										
										
											2016-03-14 14:36:41 -07:00
										 |  |  |          })); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-12 21:32:41 -07:00
										 |  |  |     describe('examples', () => { | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should verify UpgradeAdapter example', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2015-10-12 21:32:41 -07:00
										 |  |  |            var adapter = new UpgradeAdapter(); | 
					
						
							|  |  |  |            var module = angular.module('myExample', []); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            module.directive('ng1', function() { | 
					
						
							|  |  |  |              return { | 
					
						
							| 
									
										
										
										
											2015-10-11 11:18:11 -07:00
										 |  |  |                scope: {title: '='}, | 
					
						
							| 
									
										
										
										
											2015-10-28 08:59:19 +01:00
										 |  |  |                transclude: true, | 
					
						
							|  |  |  |                template: 'ng1[Hello {{title}}!](<span ng-transclude></span>)' | 
					
						
							| 
									
										
										
										
											2015-10-12 21:32:41 -07:00
										 |  |  |              }; | 
					
						
							| 
									
										
										
										
											2015-10-04 09:33:20 -07:00
										 |  |  |            }); | 
					
						
							| 
									
										
										
										
											2015-10-12 21:32:41 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            var Ng2 = | 
					
						
							|  |  |  |                Component({ | 
					
						
							|  |  |  |                  selector: 'ng2', | 
					
						
							|  |  |  |                  inputs: ['name'], | 
					
						
							|  |  |  |                  template: 'ng2[<ng1 [title]="name">transclude</ng1>](<ng-content></ng-content>)', | 
					
						
							|  |  |  |                  directives: [adapter.upgradeNg1Component('ng1')] | 
					
						
							|  |  |  |                }).Class({constructor: function() {}}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            module.directive('ng2', adapter.downgradeNg2Component(Ng2)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            document.body.innerHTML = '<ng2 name="World">project</ng2>'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            adapter.bootstrap(document.body, ['myExample']).ready((ref) => { | 
					
						
							|  |  |  |              expect(multiTrim(document.body.textContent)) | 
					
						
							|  |  |  |                  .toEqual('ng2[ng1[Hello World!](transclude)](project)'); | 
					
						
							|  |  |  |              ref.dispose(); | 
					
						
							|  |  |  |              async.done(); | 
					
						
							|  |  |  |            }); | 
					
						
							| 
									
										
										
										
											2015-10-04 09:33:20 -07:00
										 |  |  |          })); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2015-08-06 13:19:29 -07:00
										 |  |  |   }); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-01 13:14:59 -07:00
										 |  |  | function multiTrim(text: string): string { | 
					
						
							|  |  |  |   return text.replace(/\n/g, '').replace(/\s\s+/g, ' ').trim(); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-08-06 13:19:29 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | function html(html: string): Element { | 
					
						
							|  |  |  |   var body = document.body; | 
					
						
							|  |  |  |   body.innerHTML = html; | 
					
						
							|  |  |  |   if (body.childNodes.length == 1 && body.firstChild instanceof HTMLElement) | 
					
						
							|  |  |  |     return <Element>body.firstChild; | 
					
						
							|  |  |  |   return body; | 
					
						
							| 
									
										
										
										
											2015-08-05 10:32:14 -07:00
										 |  |  | } |