test(ivy): enable more of @angular/core tests on node and in a browser (#27572)
PR Close #27572
This commit is contained in:
		
							parent
							
								
									54e4bdb842
								
							
						
					
					
						commit
						2182be48c4
					
				| @ -66,49 +66,48 @@ const DEFAULT_COMPONENT_ID = '1'; | ||||
|     } | ||||
| 
 | ||||
|     describe('fakeAsync testing', () => { | ||||
|       fixmeIvy('unknown').it( | ||||
|           'should only require one flushMicrotasks call to kick off animation callbacks', | ||||
|           fakeAsync(() => { | ||||
|             @Component({ | ||||
|               selector: 'cmp', | ||||
|               template: ` | ||||
|       it('should only require one flushMicrotasks call to kick off animation callbacks', | ||||
|          fakeAsync(() => { | ||||
|            @Component({ | ||||
|              selector: 'cmp', | ||||
|              template: ` | ||||
|             <div [@myAnimation]="exp" (@myAnimation.start)="cb('start')" (@myAnimation.done)="cb('done')"></div> | ||||
|           `,
 | ||||
|               animations: [trigger( | ||||
|                   'myAnimation', | ||||
|                   [transition('* => on, * => off', [animate(1000, style({opacity: 1}))])])] | ||||
|             }) | ||||
|             class Cmp { | ||||
|               exp: any = false; | ||||
|               status: string = ''; | ||||
|               cb(status: string) { this.status = status; } | ||||
|             } | ||||
|              animations: [trigger( | ||||
|                  'myAnimation', | ||||
|                  [transition('* => on, * => off', [animate(1000, style({opacity: 1}))])])] | ||||
|            }) | ||||
|            class Cmp { | ||||
|              exp: any = false; | ||||
|              status: string = ''; | ||||
|              cb(status: string) { this.status = status; } | ||||
|            } | ||||
| 
 | ||||
|             TestBed.configureTestingModule({declarations: [Cmp]}); | ||||
|             const fixture = TestBed.createComponent(Cmp); | ||||
|             const cmp = fixture.componentInstance; | ||||
|             cmp.exp = 'on'; | ||||
|             fixture.detectChanges(); | ||||
|             expect(cmp.status).toEqual(''); | ||||
|            TestBed.configureTestingModule({declarations: [Cmp]}); | ||||
|            const fixture = TestBed.createComponent(Cmp); | ||||
|            const cmp = fixture.componentInstance; | ||||
|            cmp.exp = 'on'; | ||||
|            fixture.detectChanges(); | ||||
|            expect(cmp.status).toEqual(''); | ||||
| 
 | ||||
|             flushMicrotasks(); | ||||
|             expect(cmp.status).toEqual('start'); | ||||
|            flushMicrotasks(); | ||||
|            expect(cmp.status).toEqual('start'); | ||||
| 
 | ||||
|             let player = MockAnimationDriver.log.pop() !; | ||||
|             player.finish(); | ||||
|             expect(cmp.status).toEqual('done'); | ||||
|            let player = MockAnimationDriver.log.pop() !; | ||||
|            player.finish(); | ||||
|            expect(cmp.status).toEqual('done'); | ||||
| 
 | ||||
|             cmp.status = ''; | ||||
|             cmp.exp = 'off'; | ||||
|             fixture.detectChanges(); | ||||
|             expect(cmp.status).toEqual(''); | ||||
|            cmp.status = ''; | ||||
|            cmp.exp = 'off'; | ||||
|            fixture.detectChanges(); | ||||
|            expect(cmp.status).toEqual(''); | ||||
| 
 | ||||
|             player = MockAnimationDriver.log.pop() !; | ||||
|             player.finish(); | ||||
|             expect(cmp.status).toEqual(''); | ||||
|             flushMicrotasks(); | ||||
|             expect(cmp.status).toEqual('done'); | ||||
|           })); | ||||
|            player = MockAnimationDriver.log.pop() !; | ||||
|            player.finish(); | ||||
|            expect(cmp.status).toEqual(''); | ||||
|            flushMicrotasks(); | ||||
|            expect(cmp.status).toEqual('done'); | ||||
|          })); | ||||
| 
 | ||||
|       fixmeIvy('unknown').it( | ||||
|           'should always run .start callbacks before .done callbacks even for noop animations', | ||||
| @ -459,123 +458,120 @@ const DEFAULT_COMPONENT_ID = '1'; | ||||
|         expect(player.duration).toEqual(1234); | ||||
|       }); | ||||
| 
 | ||||
|       fixmeIvy('unknown').it( | ||||
|           'should always cancel the previous transition if a follow-up transition is not matched', | ||||
|           fakeAsync(() => { | ||||
|             @Component({ | ||||
|               selector: 'if-cmp', | ||||
|               template: ` | ||||
|       it('should always cancel the previous transition if a follow-up transition is not matched', | ||||
|          fakeAsync(() => { | ||||
|            @Component({ | ||||
|              selector: 'if-cmp', | ||||
|              template: ` | ||||
|           <div [@myAnimation]="exp" (@myAnimation.start)="callback($event)" (@myAnimation.done)="callback($event)"></div> | ||||
|         `,
 | ||||
|               animations: [trigger( | ||||
|                   'myAnimation', | ||||
|                   [transition( | ||||
|                       'a => b', | ||||
|                       [style({'opacity': '0'}), animate(500, style({'opacity': '1'}))])])], | ||||
|             }) | ||||
|             class Cmp { | ||||
|               exp: any; | ||||
|               startEvent: any; | ||||
|               doneEvent: any; | ||||
|              animations: [trigger( | ||||
|                  'myAnimation', | ||||
|                  [transition( | ||||
|                      'a => b', [style({'opacity': '0'}), animate(500, style({'opacity': '1'}))])])], | ||||
|            }) | ||||
|            class Cmp { | ||||
|              exp: any; | ||||
|              startEvent: any; | ||||
|              doneEvent: any; | ||||
| 
 | ||||
|               callback(event: any) { | ||||
|                 if (event.phaseName == 'done') { | ||||
|                   this.doneEvent = event; | ||||
|                 } else { | ||||
|                   this.startEvent = event; | ||||
|                 } | ||||
|               } | ||||
|             } | ||||
|              callback(event: any) { | ||||
|                if (event.phaseName == 'done') { | ||||
|                  this.doneEvent = event; | ||||
|                } else { | ||||
|                  this.startEvent = event; | ||||
|                } | ||||
|              } | ||||
|            } | ||||
| 
 | ||||
|             TestBed.configureTestingModule({declarations: [Cmp]}); | ||||
|            TestBed.configureTestingModule({declarations: [Cmp]}); | ||||
| 
 | ||||
|             const engine = TestBed.get(ɵAnimationEngine); | ||||
|             const fixture = TestBed.createComponent(Cmp); | ||||
|             const cmp = fixture.componentInstance; | ||||
|            const engine = TestBed.get(ɵAnimationEngine); | ||||
|            const fixture = TestBed.createComponent(Cmp); | ||||
|            const cmp = fixture.componentInstance; | ||||
| 
 | ||||
|             cmp.exp = 'a'; | ||||
|             fixture.detectChanges(); | ||||
|             engine.flush(); | ||||
|             expect(getLog().length).toEqual(0); | ||||
|             expect(engine.players.length).toEqual(0); | ||||
|            cmp.exp = 'a'; | ||||
|            fixture.detectChanges(); | ||||
|            engine.flush(); | ||||
|            expect(getLog().length).toEqual(0); | ||||
|            expect(engine.players.length).toEqual(0); | ||||
| 
 | ||||
|             flushMicrotasks(); | ||||
|             expect(cmp.startEvent.toState).toEqual('a'); | ||||
|             expect(cmp.startEvent.totalTime).toEqual(0); | ||||
|             expect(cmp.startEvent.toState).toEqual('a'); | ||||
|             expect(cmp.startEvent.totalTime).toEqual(0); | ||||
|             resetLog(); | ||||
|            flushMicrotasks(); | ||||
|            expect(cmp.startEvent.toState).toEqual('a'); | ||||
|            expect(cmp.startEvent.totalTime).toEqual(0); | ||||
|            expect(cmp.startEvent.toState).toEqual('a'); | ||||
|            expect(cmp.startEvent.totalTime).toEqual(0); | ||||
|            resetLog(); | ||||
| 
 | ||||
|             cmp.exp = 'b'; | ||||
|             fixture.detectChanges(); | ||||
|             engine.flush(); | ||||
|            cmp.exp = 'b'; | ||||
|            fixture.detectChanges(); | ||||
|            engine.flush(); | ||||
| 
 | ||||
|             const players = getLog(); | ||||
|             expect(players.length).toEqual(1); | ||||
|             expect(engine.players.length).toEqual(1); | ||||
|            const players = getLog(); | ||||
|            expect(players.length).toEqual(1); | ||||
|            expect(engine.players.length).toEqual(1); | ||||
| 
 | ||||
|             flushMicrotasks(); | ||||
|             expect(cmp.startEvent.toState).toEqual('b'); | ||||
|             expect(cmp.startEvent.totalTime).toEqual(500); | ||||
|             expect(cmp.startEvent.toState).toEqual('b'); | ||||
|             expect(cmp.startEvent.totalTime).toEqual(500); | ||||
|             resetLog(); | ||||
|            flushMicrotasks(); | ||||
|            expect(cmp.startEvent.toState).toEqual('b'); | ||||
|            expect(cmp.startEvent.totalTime).toEqual(500); | ||||
|            expect(cmp.startEvent.toState).toEqual('b'); | ||||
|            expect(cmp.startEvent.totalTime).toEqual(500); | ||||
|            resetLog(); | ||||
| 
 | ||||
|             let completed = false; | ||||
|             players[0].onDone(() => completed = true); | ||||
|            let completed = false; | ||||
|            players[0].onDone(() => completed = true); | ||||
| 
 | ||||
|             cmp.exp = 'c'; | ||||
|             fixture.detectChanges(); | ||||
|             engine.flush(); | ||||
|            cmp.exp = 'c'; | ||||
|            fixture.detectChanges(); | ||||
|            engine.flush(); | ||||
| 
 | ||||
|             expect(engine.players.length).toEqual(0); | ||||
|             expect(getLog().length).toEqual(0); | ||||
|            expect(engine.players.length).toEqual(0); | ||||
|            expect(getLog().length).toEqual(0); | ||||
| 
 | ||||
|             flushMicrotasks(); | ||||
|             expect(cmp.startEvent.toState).toEqual('c'); | ||||
|             expect(cmp.startEvent.totalTime).toEqual(0); | ||||
|             expect(cmp.startEvent.toState).toEqual('c'); | ||||
|             expect(cmp.startEvent.totalTime).toEqual(0); | ||||
|            flushMicrotasks(); | ||||
|            expect(cmp.startEvent.toState).toEqual('c'); | ||||
|            expect(cmp.startEvent.totalTime).toEqual(0); | ||||
|            expect(cmp.startEvent.toState).toEqual('c'); | ||||
|            expect(cmp.startEvent.totalTime).toEqual(0); | ||||
| 
 | ||||
|             expect(completed).toBe(true); | ||||
|           })); | ||||
|            expect(completed).toBe(true); | ||||
|          })); | ||||
| 
 | ||||
|       fixmeIvy('unknown').it( | ||||
|           'should always fire inner callbacks even if no animation is fired when a view is inserted', | ||||
|           fakeAsync(() => { | ||||
|             @Component({ | ||||
|               selector: 'if-cmp', | ||||
|               template: ` | ||||
|       it('should always fire inner callbacks even if no animation is fired when a view is inserted', | ||||
|          fakeAsync(() => { | ||||
|            @Component({ | ||||
|              selector: 'if-cmp', | ||||
|              template: ` | ||||
|           <div *ngIf="exp"> | ||||
|             <div @myAnimation (@myAnimation.start)="track($event)" (@myAnimation.done)="track($event)"></div> | ||||
|           </div> | ||||
|         `,
 | ||||
|               animations: [ | ||||
|                 trigger('myAnimation', []), | ||||
|               ] | ||||
|             }) | ||||
|             class Cmp { | ||||
|               exp: any = false; | ||||
|               log: string[] = []; | ||||
|               track(event: any) { this.log.push(`${event.triggerName}-${event.phaseName}`); } | ||||
|             } | ||||
|              animations: [ | ||||
|                trigger('myAnimation', []), | ||||
|              ] | ||||
|            }) | ||||
|            class Cmp { | ||||
|              exp: any = false; | ||||
|              log: string[] = []; | ||||
|              track(event: any) { this.log.push(`${event.triggerName}-${event.phaseName}`); } | ||||
|            } | ||||
| 
 | ||||
|             TestBed.configureTestingModule({declarations: [Cmp]}); | ||||
|            TestBed.configureTestingModule({declarations: [Cmp]}); | ||||
| 
 | ||||
|             const engine = TestBed.get(ɵAnimationEngine); | ||||
|             const fixture = TestBed.createComponent(Cmp); | ||||
|             const cmp = fixture.componentInstance; | ||||
|             fixture.detectChanges(); | ||||
|             flushMicrotasks(); | ||||
|            const engine = TestBed.get(ɵAnimationEngine); | ||||
|            const fixture = TestBed.createComponent(Cmp); | ||||
|            const cmp = fixture.componentInstance; | ||||
|            fixture.detectChanges(); | ||||
|            flushMicrotasks(); | ||||
| 
 | ||||
|             expect(cmp.log).toEqual([]); | ||||
|            expect(cmp.log).toEqual([]); | ||||
| 
 | ||||
|             cmp.exp = true; | ||||
|             fixture.detectChanges(); | ||||
|             flushMicrotasks(); | ||||
|            cmp.exp = true; | ||||
|            fixture.detectChanges(); | ||||
|            flushMicrotasks(); | ||||
| 
 | ||||
|             expect(cmp.log).toEqual(['myAnimation-start', 'myAnimation-done']); | ||||
|           })); | ||||
|            expect(cmp.log).toEqual(['myAnimation-start', 'myAnimation-done']); | ||||
|          })); | ||||
| 
 | ||||
|       fixmeIvy('unknown').it( | ||||
|           'should only turn a view removal as into `void` state transition', () => { | ||||
| @ -2546,133 +2542,131 @@ const DEFAULT_COMPONENT_ID = '1'; | ||||
|             expect(cmp.event.toState).toEqual('b'); | ||||
|           })); | ||||
| 
 | ||||
|       fixmeIvy('unknown').it( | ||||
|           'should handle callbacks for multiple triggers running simultaneously', fakeAsync(() => { | ||||
|             @Component({ | ||||
|               selector: 'if-cmp', | ||||
|               template: ` | ||||
|       it('should handle callbacks for multiple triggers running simultaneously', fakeAsync(() => { | ||||
|            @Component({ | ||||
|              selector: 'if-cmp', | ||||
|              template: ` | ||||
|           <div [@ani1]="exp1" (@ani1.done)="callback1($event)"></div> | ||||
|           <div [@ani2]="exp2" (@ani2.done)="callback2($event)"></div> | ||||
|         `,
 | ||||
|               animations: [ | ||||
|                 trigger( | ||||
|                     'ani1', | ||||
|                     [ | ||||
|                       transition( | ||||
|                           '* => a', | ||||
|                           [style({'opacity': '0'}), animate(999, style({'opacity': '1'}))]), | ||||
|                     ]), | ||||
|                 trigger( | ||||
|                     'ani2', | ||||
|                     [ | ||||
|                       transition( | ||||
|                           '* => b', | ||||
|                           [style({'width': '0px'}), animate(999, style({'width': '100px'}))]), | ||||
|                     ]) | ||||
|               ], | ||||
|             }) | ||||
|             class Cmp { | ||||
|               exp1: any = false; | ||||
|               exp2: any = false; | ||||
|               // TODO(issue/24571): remove '!'.
 | ||||
|               event1 !: AnimationEvent; | ||||
|               // TODO(issue/24571): remove '!'.
 | ||||
|               event2 !: AnimationEvent; | ||||
|               // tslint:disable:semicolon
 | ||||
|               callback1 = (event: any) => { this.event1 = event; }; | ||||
|               // tslint:disable:semicolon
 | ||||
|               callback2 = (event: any) => { this.event2 = event; }; | ||||
|             } | ||||
|              animations: [ | ||||
|                trigger( | ||||
|                    'ani1', | ||||
|                    [ | ||||
|                      transition( | ||||
|                          '* => a', | ||||
|                          [style({'opacity': '0'}), animate(999, style({'opacity': '1'}))]), | ||||
|                    ]), | ||||
|                trigger( | ||||
|                    'ani2', | ||||
|                    [ | ||||
|                      transition( | ||||
|                          '* => b', | ||||
|                          [style({'width': '0px'}), animate(999, style({'width': '100px'}))]), | ||||
|                    ]) | ||||
|              ], | ||||
|            }) | ||||
|            class Cmp { | ||||
|              exp1: any = false; | ||||
|              exp2: any = false; | ||||
|              // TODO(issue/24571): remove '!'.
 | ||||
|              event1 !: AnimationEvent; | ||||
|              // TODO(issue/24571): remove '!'.
 | ||||
|              event2 !: AnimationEvent; | ||||
|              // tslint:disable:semicolon
 | ||||
|              callback1 = (event: any) => { this.event1 = event; }; | ||||
|              // tslint:disable:semicolon
 | ||||
|              callback2 = (event: any) => { this.event2 = event; }; | ||||
|            } | ||||
| 
 | ||||
|             TestBed.configureTestingModule({declarations: [Cmp]}); | ||||
|            TestBed.configureTestingModule({declarations: [Cmp]}); | ||||
| 
 | ||||
|             const engine = TestBed.get(ɵAnimationEngine); | ||||
|             const fixture = TestBed.createComponent(Cmp); | ||||
|             const cmp = fixture.componentInstance; | ||||
|            const engine = TestBed.get(ɵAnimationEngine); | ||||
|            const fixture = TestBed.createComponent(Cmp); | ||||
|            const cmp = fixture.componentInstance; | ||||
| 
 | ||||
|             cmp.exp1 = 'a'; | ||||
|             cmp.exp2 = 'b'; | ||||
|             fixture.detectChanges(); | ||||
|             engine.flush(); | ||||
|            cmp.exp1 = 'a'; | ||||
|            cmp.exp2 = 'b'; | ||||
|            fixture.detectChanges(); | ||||
|            engine.flush(); | ||||
| 
 | ||||
|             expect(cmp.event1).toBeFalsy(); | ||||
|             expect(cmp.event2).toBeFalsy(); | ||||
|            expect(cmp.event1).toBeFalsy(); | ||||
|            expect(cmp.event2).toBeFalsy(); | ||||
| 
 | ||||
|             const player1 = engine.players[0]; | ||||
|             const player2 = engine.players[1]; | ||||
|            const player1 = engine.players[0]; | ||||
|            const player2 = engine.players[1]; | ||||
| 
 | ||||
|             player1.finish(); | ||||
|             player2.finish(); | ||||
|             expect(cmp.event1).toBeFalsy(); | ||||
|             expect(cmp.event2).toBeFalsy(); | ||||
|            player1.finish(); | ||||
|            player2.finish(); | ||||
|            expect(cmp.event1).toBeFalsy(); | ||||
|            expect(cmp.event2).toBeFalsy(); | ||||
| 
 | ||||
|             flushMicrotasks(); | ||||
|             expect(cmp.event1.triggerName).toBeTruthy('ani1'); | ||||
|             expect(cmp.event2.triggerName).toBeTruthy('ani2'); | ||||
|           })); | ||||
|            flushMicrotasks(); | ||||
|            expect(cmp.event1.triggerName).toBeTruthy('ani1'); | ||||
|            expect(cmp.event2.triggerName).toBeTruthy('ani2'); | ||||
|          })); | ||||
| 
 | ||||
|       fixmeIvy('unknown').it( | ||||
|           'should handle callbacks for multiple triggers running simultaneously on the same element', | ||||
|           fakeAsync(() => { | ||||
|             @Component({ | ||||
|               selector: 'if-cmp', | ||||
|               template: ` | ||||
|       it('should handle callbacks for multiple triggers running simultaneously on the same element', | ||||
|          fakeAsync(() => { | ||||
|            @Component({ | ||||
|              selector: 'if-cmp', | ||||
|              template: ` | ||||
|           <div [@ani1]="exp1" (@ani1.done)="callback1($event)" [@ani2]="exp2" (@ani2.done)="callback2($event)"></div> | ||||
|         `,
 | ||||
|               animations: [ | ||||
|                 trigger( | ||||
|                     'ani1', | ||||
|                     [ | ||||
|                       transition( | ||||
|                           '* => a', | ||||
|                           [style({'opacity': '0'}), animate(999, style({'opacity': '1'}))]), | ||||
|                     ]), | ||||
|                 trigger( | ||||
|                     'ani2', | ||||
|                     [ | ||||
|                       transition( | ||||
|                           '* => b', | ||||
|                           [style({'width': '0px'}), animate(999, style({'width': '100px'}))]), | ||||
|                     ]) | ||||
|               ], | ||||
|             }) | ||||
|             class Cmp { | ||||
|               exp1: any = false; | ||||
|               exp2: any = false; | ||||
|               // TODO(issue/24571): remove '!'.
 | ||||
|               event1 !: AnimationEvent; | ||||
|               // TODO(issue/24571): remove '!'.
 | ||||
|               event2 !: AnimationEvent; | ||||
|               callback1 = (event: any) => { this.event1 = event; }; | ||||
|               callback2 = (event: any) => { this.event2 = event; }; | ||||
|             } | ||||
|              animations: [ | ||||
|                trigger( | ||||
|                    'ani1', | ||||
|                    [ | ||||
|                      transition( | ||||
|                          '* => a', | ||||
|                          [style({'opacity': '0'}), animate(999, style({'opacity': '1'}))]), | ||||
|                    ]), | ||||
|                trigger( | ||||
|                    'ani2', | ||||
|                    [ | ||||
|                      transition( | ||||
|                          '* => b', | ||||
|                          [style({'width': '0px'}), animate(999, style({'width': '100px'}))]), | ||||
|                    ]) | ||||
|              ], | ||||
|            }) | ||||
|            class Cmp { | ||||
|              exp1: any = false; | ||||
|              exp2: any = false; | ||||
|              // TODO(issue/24571): remove '!'.
 | ||||
|              event1 !: AnimationEvent; | ||||
|              // TODO(issue/24571): remove '!'.
 | ||||
|              event2 !: AnimationEvent; | ||||
|              callback1 = (event: any) => { this.event1 = event; }; | ||||
|              callback2 = (event: any) => { this.event2 = event; }; | ||||
|            } | ||||
| 
 | ||||
|             TestBed.configureTestingModule({declarations: [Cmp]}); | ||||
|            TestBed.configureTestingModule({declarations: [Cmp]}); | ||||
| 
 | ||||
|             const engine = TestBed.get(ɵAnimationEngine); | ||||
|             const fixture = TestBed.createComponent(Cmp); | ||||
|             const cmp = fixture.componentInstance; | ||||
|            const engine = TestBed.get(ɵAnimationEngine); | ||||
|            const fixture = TestBed.createComponent(Cmp); | ||||
|            const cmp = fixture.componentInstance; | ||||
| 
 | ||||
|             cmp.exp1 = 'a'; | ||||
|             cmp.exp2 = 'b'; | ||||
|             fixture.detectChanges(); | ||||
|             engine.flush(); | ||||
|            cmp.exp1 = 'a'; | ||||
|            cmp.exp2 = 'b'; | ||||
|            fixture.detectChanges(); | ||||
|            engine.flush(); | ||||
| 
 | ||||
|             expect(cmp.event1).toBeFalsy(); | ||||
|             expect(cmp.event2).toBeFalsy(); | ||||
|            expect(cmp.event1).toBeFalsy(); | ||||
|            expect(cmp.event2).toBeFalsy(); | ||||
| 
 | ||||
|             const player1 = engine.players[0]; | ||||
|             const player2 = engine.players[1]; | ||||
|            const player1 = engine.players[0]; | ||||
|            const player2 = engine.players[1]; | ||||
| 
 | ||||
|             player1.finish(); | ||||
|             player2.finish(); | ||||
|             expect(cmp.event1).toBeFalsy(); | ||||
|             expect(cmp.event2).toBeFalsy(); | ||||
|            player1.finish(); | ||||
|            player2.finish(); | ||||
|            expect(cmp.event1).toBeFalsy(); | ||||
|            expect(cmp.event2).toBeFalsy(); | ||||
| 
 | ||||
|             flushMicrotasks(); | ||||
|             expect(cmp.event1.triggerName).toBeTruthy('ani1'); | ||||
|             expect(cmp.event2.triggerName).toBeTruthy('ani2'); | ||||
|           })); | ||||
|            flushMicrotasks(); | ||||
|            expect(cmp.event1.triggerName).toBeTruthy('ani1'); | ||||
|            expect(cmp.event2.triggerName).toBeTruthy('ani2'); | ||||
|          })); | ||||
| 
 | ||||
|       it('should handle a leave animation for multiple triggers even if not all triggers have their own leave transition specified', | ||||
|          fakeAsync(() => { | ||||
| @ -2810,46 +2804,45 @@ const DEFAULT_COMPONENT_ID = '1'; | ||||
|             expect(cmp.log).toEqual(['start => b', 'done => b']); | ||||
|           })); | ||||
| 
 | ||||
|       fixmeIvy('unknown').it( | ||||
|           'should fire callback events for leave animations even if there is no leave transition', | ||||
|           fakeAsync(() => { | ||||
|             @Component({ | ||||
|               selector: 'my-cmp', | ||||
|               template: ` | ||||
|       it('should fire callback events for leave animations even if there is no leave transition', | ||||
|          fakeAsync(() => { | ||||
|            @Component({ | ||||
|              selector: 'my-cmp', | ||||
|              template: ` | ||||
|               <div *ngIf="exp" @myAnimation (@myAnimation.start)="callback($event)" (@myAnimation.done)="callback($event)"></div> | ||||
|             `,
 | ||||
|               animations: [trigger('myAnimation', [])] | ||||
|             }) | ||||
|             class Cmp { | ||||
|               exp: boolean = false; | ||||
|               log: any[] = []; | ||||
|               callback = (event: any) => { | ||||
|                 const state = event.toState || '_default_'; | ||||
|                 this.log.push(`${event.phaseName} => ${state}`); | ||||
|               } | ||||
|             } | ||||
|              animations: [trigger('myAnimation', [])] | ||||
|            }) | ||||
|            class Cmp { | ||||
|              exp: boolean = false; | ||||
|              log: any[] = []; | ||||
|              callback = (event: any) => { | ||||
|                const state = event.toState || '_default_'; | ||||
|                this.log.push(`${event.phaseName} => ${state}`); | ||||
|              } | ||||
|            } | ||||
| 
 | ||||
|             TestBed.configureTestingModule({ | ||||
|               providers: [{provide: AnimationDriver, useClass: NoopAnimationDriver}], | ||||
|               declarations: [Cmp] | ||||
|             }); | ||||
|            TestBed.configureTestingModule({ | ||||
|              providers: [{provide: AnimationDriver, useClass: NoopAnimationDriver}], | ||||
|              declarations: [Cmp] | ||||
|            }); | ||||
| 
 | ||||
|             const fixture = TestBed.createComponent(Cmp); | ||||
|             const cmp = fixture.componentInstance; | ||||
|            const fixture = TestBed.createComponent(Cmp); | ||||
|            const cmp = fixture.componentInstance; | ||||
| 
 | ||||
|             cmp.exp = true; | ||||
|             fixture.detectChanges(); | ||||
|             flushMicrotasks(); | ||||
|             expect(cmp.log).toEqual(['start => _default_', 'done => _default_']); | ||||
|            cmp.exp = true; | ||||
|            fixture.detectChanges(); | ||||
|            flushMicrotasks(); | ||||
|            expect(cmp.log).toEqual(['start => _default_', 'done => _default_']); | ||||
| 
 | ||||
|             cmp.log = []; | ||||
|            cmp.log = []; | ||||
| 
 | ||||
|             cmp.exp = false; | ||||
|             fixture.detectChanges(); | ||||
|             flushMicrotasks(); | ||||
|            cmp.exp = false; | ||||
|            fixture.detectChanges(); | ||||
|            flushMicrotasks(); | ||||
| 
 | ||||
|             expect(cmp.log).toEqual(['start => void', 'done => void']); | ||||
|           })); | ||||
|            expect(cmp.log).toEqual(['start => void', 'done => void']); | ||||
|          })); | ||||
| 
 | ||||
|       fixmeIvy('unknown').it( | ||||
|           'should fire callbacks on a sub animation once it starts and finishes', fakeAsync(() => { | ||||
| @ -3285,60 +3278,59 @@ const DEFAULT_COMPONENT_ID = '1'; | ||||
|           expect(parent.childElementCount).toEqual(0); | ||||
|         }); | ||||
| 
 | ||||
|         fixmeIvy('unknown').it( | ||||
|             'should properly resolve animation event listeners when disabled', fakeAsync(() => { | ||||
|               @Component({ | ||||
|                 selector: 'if-cmp', | ||||
|                 template: ` | ||||
|         it('should properly resolve animation event listeners when disabled', fakeAsync(() => { | ||||
|              @Component({ | ||||
|                selector: 'if-cmp', | ||||
|                template: ` | ||||
|               <div [@.disabled]="disableExp"> | ||||
|                 <div [@myAnimation]="exp" (@myAnimation.start)="startEvent=$event" (@myAnimation.done)="doneEvent=$event"></div> | ||||
|               </div> | ||||
|             `,
 | ||||
|                 animations: [ | ||||
|                   trigger( | ||||
|                       'myAnimation', | ||||
|                       [ | ||||
|                         transition( | ||||
|                             '* => 1, * => 2', | ||||
|                             [style({opacity: 0}), animate(9876, style({opacity: 1}))]), | ||||
|                       ]), | ||||
|                 ] | ||||
|               }) | ||||
|               class Cmp { | ||||
|                 disableExp = false; | ||||
|                 exp = ''; | ||||
|                 // TODO(issue/24571): remove '!'.
 | ||||
|                 startEvent !: AnimationEvent; | ||||
|                 // TODO(issue/24571): remove '!'.
 | ||||
|                 doneEvent !: AnimationEvent; | ||||
|               } | ||||
|                animations: [ | ||||
|                  trigger( | ||||
|                      'myAnimation', | ||||
|                      [ | ||||
|                        transition( | ||||
|                            '* => 1, * => 2', | ||||
|                            [style({opacity: 0}), animate(9876, style({opacity: 1}))]), | ||||
|                      ]), | ||||
|                ] | ||||
|              }) | ||||
|              class Cmp { | ||||
|                disableExp = false; | ||||
|                exp = ''; | ||||
|                // TODO(issue/24571): remove '!'.
 | ||||
|                startEvent !: AnimationEvent; | ||||
|                // TODO(issue/24571): remove '!'.
 | ||||
|                doneEvent !: AnimationEvent; | ||||
|              } | ||||
| 
 | ||||
|               TestBed.configureTestingModule({declarations: [Cmp]}); | ||||
|              TestBed.configureTestingModule({declarations: [Cmp]}); | ||||
| 
 | ||||
|               const fixture = TestBed.createComponent(Cmp); | ||||
|               const cmp = fixture.componentInstance; | ||||
|               cmp.disableExp = true; | ||||
|               fixture.detectChanges(); | ||||
|               resetLog(); | ||||
|               expect(cmp.startEvent).toBeFalsy(); | ||||
|               expect(cmp.doneEvent).toBeFalsy(); | ||||
|              const fixture = TestBed.createComponent(Cmp); | ||||
|              const cmp = fixture.componentInstance; | ||||
|              cmp.disableExp = true; | ||||
|              fixture.detectChanges(); | ||||
|              resetLog(); | ||||
|              expect(cmp.startEvent).toBeFalsy(); | ||||
|              expect(cmp.doneEvent).toBeFalsy(); | ||||
| 
 | ||||
|               cmp.exp = '1'; | ||||
|               fixture.detectChanges(); | ||||
|               flushMicrotasks(); | ||||
|               expect(cmp.startEvent.totalTime).toEqual(9876); | ||||
|               expect(cmp.startEvent.disabled).toBeTruthy(); | ||||
|               expect(cmp.doneEvent.totalTime).toEqual(9876); | ||||
|               expect(cmp.doneEvent.disabled).toBeTruthy(); | ||||
|              cmp.exp = '1'; | ||||
|              fixture.detectChanges(); | ||||
|              flushMicrotasks(); | ||||
|              expect(cmp.startEvent.totalTime).toEqual(9876); | ||||
|              expect(cmp.startEvent.disabled).toBeTruthy(); | ||||
|              expect(cmp.doneEvent.totalTime).toEqual(9876); | ||||
|              expect(cmp.doneEvent.disabled).toBeTruthy(); | ||||
| 
 | ||||
|               cmp.exp = '2'; | ||||
|               cmp.disableExp = false; | ||||
|               fixture.detectChanges(); | ||||
|               flushMicrotasks(); | ||||
|               expect(cmp.startEvent.totalTime).toEqual(9876); | ||||
|               expect(cmp.startEvent.disabled).toBeFalsy(); | ||||
|               // the done event isn't fired because it's an actual animation
 | ||||
|             })); | ||||
|              cmp.exp = '2'; | ||||
|              cmp.disableExp = false; | ||||
|              fixture.detectChanges(); | ||||
|              flushMicrotasks(); | ||||
|              expect(cmp.startEvent.totalTime).toEqual(9876); | ||||
|              expect(cmp.startEvent.disabled).toBeFalsy(); | ||||
|              // the done event isn't fired because it's an actual animation
 | ||||
|            })); | ||||
| 
 | ||||
|         it('should work when there are no animations on the component handling the disable/enable flag', | ||||
|            () => { | ||||
| @ -3429,76 +3421,75 @@ const DEFAULT_COMPONENT_ID = '1'; | ||||
|               expect(getLog().length).toEqual(0); | ||||
|             }); | ||||
| 
 | ||||
|         fixmeIvy('unknown').it( | ||||
|             'should respect parent/sub animations when the respective area in the DOM is disabled', | ||||
|             fakeAsync(() => { | ||||
|               @Component({ | ||||
|                 selector: 'parent-cmp', | ||||
|                 animations: [ | ||||
|                   trigger( | ||||
|                       'parent', | ||||
|                       [ | ||||
|                         transition( | ||||
|                             '* => empty', | ||||
|                             [ | ||||
|                               style({opacity: 0}), | ||||
|                               query( | ||||
|                                   '@child', | ||||
|                                   [ | ||||
|                                     animateChild(), | ||||
|                                   ]), | ||||
|                               animate('1s', style({opacity: 1})), | ||||
|                             ]), | ||||
|                       ]), | ||||
|                   trigger( | ||||
|                       'child', | ||||
|                       [ | ||||
|                         transition( | ||||
|                             ':leave', | ||||
|                             [ | ||||
|                               animate('1s', style({opacity: 0})), | ||||
|                             ]), | ||||
|                       ]), | ||||
|                 ], | ||||
|                 template: ` | ||||
|         it('should respect parent/sub animations when the respective area in the DOM is disabled', | ||||
|            fakeAsync(() => { | ||||
|              @Component({ | ||||
|                selector: 'parent-cmp', | ||||
|                animations: [ | ||||
|                  trigger( | ||||
|                      'parent', | ||||
|                      [ | ||||
|                        transition( | ||||
|                            '* => empty', | ||||
|                            [ | ||||
|                              style({opacity: 0}), | ||||
|                              query( | ||||
|                                  '@child', | ||||
|                                  [ | ||||
|                                    animateChild(), | ||||
|                                  ]), | ||||
|                              animate('1s', style({opacity: 1})), | ||||
|                            ]), | ||||
|                      ]), | ||||
|                  trigger( | ||||
|                      'child', | ||||
|                      [ | ||||
|                        transition( | ||||
|                            ':leave', | ||||
|                            [ | ||||
|                              animate('1s', style({opacity: 0})), | ||||
|                            ]), | ||||
|                      ]), | ||||
|                ], | ||||
|                template: ` | ||||
|               <div [@.disabled]="disableExp" #container> | ||||
|                 <div [@parent]="exp" (@parent.done)="onDone($event)"> | ||||
|                   <div class="item" *ngFor="let item of items" @child (@child.done)="onDone($event)"></div> | ||||
|                 </div> | ||||
|               </div> | ||||
|                 ` | ||||
|               }) | ||||
|               class Cmp { | ||||
|                 @ViewChild('container') public container: any; | ||||
|              }) | ||||
|              class Cmp { | ||||
|                @ViewChild('container') public container: any; | ||||
| 
 | ||||
|                 disableExp = false; | ||||
|                 exp = ''; | ||||
|                 items: any[] = []; | ||||
|                 doneLog: any[] = []; | ||||
|                disableExp = false; | ||||
|                exp = ''; | ||||
|                items: any[] = []; | ||||
|                doneLog: any[] = []; | ||||
| 
 | ||||
|                 onDone(event: any) { this.doneLog.push(event); } | ||||
|               } | ||||
|                onDone(event: any) { this.doneLog.push(event); } | ||||
|              } | ||||
| 
 | ||||
|               TestBed.configureTestingModule({declarations: [Cmp]}); | ||||
|               const engine = TestBed.get(ɵAnimationEngine); | ||||
|               const fixture = TestBed.createComponent(Cmp); | ||||
|               const cmp = fixture.componentInstance; | ||||
|               cmp.disableExp = true; | ||||
|               cmp.items = [0, 1, 2, 3, 4]; | ||||
|               fixture.detectChanges(); | ||||
|               flushMicrotasks(); | ||||
|              TestBed.configureTestingModule({declarations: [Cmp]}); | ||||
|              const engine = TestBed.get(ɵAnimationEngine); | ||||
|              const fixture = TestBed.createComponent(Cmp); | ||||
|              const cmp = fixture.componentInstance; | ||||
|              cmp.disableExp = true; | ||||
|              cmp.items = [0, 1, 2, 3, 4]; | ||||
|              fixture.detectChanges(); | ||||
|              flushMicrotasks(); | ||||
| 
 | ||||
|               cmp.exp = 'empty'; | ||||
|               cmp.items = []; | ||||
|               cmp.doneLog = []; | ||||
|               fixture.detectChanges(); | ||||
|               flushMicrotasks(); | ||||
|              cmp.exp = 'empty'; | ||||
|              cmp.items = []; | ||||
|              cmp.doneLog = []; | ||||
|              fixture.detectChanges(); | ||||
|              flushMicrotasks(); | ||||
| 
 | ||||
|               const elms = cmp.container.nativeElement.querySelectorAll('.item'); | ||||
|               expect(elms.length).toEqual(0); | ||||
|              const elms = cmp.container.nativeElement.querySelectorAll('.item'); | ||||
|              expect(elms.length).toEqual(0); | ||||
| 
 | ||||
|               expect(cmp.doneLog.length).toEqual(6); | ||||
|             })); | ||||
|              expect(cmp.doneLog.length).toEqual(6); | ||||
|            })); | ||||
|       }); | ||||
|     }); | ||||
| 
 | ||||
| @ -3759,20 +3750,19 @@ const DEFAULT_COMPONENT_ID = '1'; | ||||
|                     'Found the synthetic property @myAnimation. Please include either "BrowserAnimationsModule" or "NoopAnimationsModule" in your application.'); | ||||
|           }); | ||||
| 
 | ||||
|       fixmeIvy('unknown').it( | ||||
|           'should throw when using an @prop listener without the animation module', () => { | ||||
|             @Component({template: `<div (@myAnimation.start)="a = true"></div>`}) | ||||
|             class Cmp { | ||||
|               a: any; | ||||
|             } | ||||
|       it('should throw when using an @prop listener without the animation module', () => { | ||||
|         @Component({template: `<div (@myAnimation.start)="a = true"></div>`}) | ||||
|         class Cmp { | ||||
|           a: any; | ||||
|         } | ||||
| 
 | ||||
|             TestBed.configureTestingModule({declarations: [Cmp]}); | ||||
|         TestBed.configureTestingModule({declarations: [Cmp]}); | ||||
| 
 | ||||
|             expect(() => TestBed.createComponent(Cmp)) | ||||
|                 .toThrowError( | ||||
|                     'Found the synthetic listener @myAnimation.start. Please include either "BrowserAnimationsModule" or "NoopAnimationsModule" in your application.'); | ||||
|         expect(() => TestBed.createComponent(Cmp)) | ||||
|             .toThrowError( | ||||
|                 'Found the synthetic listener @myAnimation.start. Please include either "BrowserAnimationsModule" or "NoopAnimationsModule" in your application.'); | ||||
| 
 | ||||
|           }); | ||||
|       }); | ||||
|     }); | ||||
|   }); | ||||
| })(); | ||||
|  | ||||
| @ -2635,59 +2635,58 @@ import {HostListener} from '../../src/metadata/directives'; | ||||
|             expect(p3.element.classList.contains('page2')).toBe(true); | ||||
|           }); | ||||
| 
 | ||||
|       fixmeIvy('unknown').it( | ||||
|           'should emulate leave animation callbacks for all sub elements that have leave triggers within the component', | ||||
|           fakeAsync(() => { | ||||
|             @Component({ | ||||
|               selector: 'ani-cmp', | ||||
|               animations: [ | ||||
|                 trigger('parent', []), trigger('child', []), | ||||
|                 trigger( | ||||
|                     'childWithAnimation', | ||||
|                     [ | ||||
|                       transition( | ||||
|                           ':leave', | ||||
|                           [ | ||||
|                             animate(1000, style({background: 'red'})), | ||||
|                           ]), | ||||
|                     ]) | ||||
|               ], | ||||
|               template: ` | ||||
|       it('should emulate leave animation callbacks for all sub elements that have leave triggers within the component', | ||||
|          fakeAsync(() => { | ||||
|            @Component({ | ||||
|              selector: 'ani-cmp', | ||||
|              animations: [ | ||||
|                trigger('parent', []), trigger('child', []), | ||||
|                trigger( | ||||
|                    'childWithAnimation', | ||||
|                    [ | ||||
|                      transition( | ||||
|                          ':leave', | ||||
|                          [ | ||||
|                            animate(1000, style({background: 'red'})), | ||||
|                          ]), | ||||
|                    ]) | ||||
|              ], | ||||
|              template: ` | ||||
|             <div data-name="p" class="parent" @parent *ngIf="exp" (@parent.start)="callback($event)" (@parent.done)="callback($event)"> | ||||
|               <div data-name="c1" @child (@child.start)="callback($event)" (@child.done)="callback($event)"></div> | ||||
|               <div data-name="c2" @child (@child.start)="callback($event)" (@child.done)="callback($event)"></div> | ||||
|               <div data-name="c3" @childWithAnimation (@childWithAnimation.start)="callback($event)" (@childWithAnimation.done)="callback($event)"></div> | ||||
|             </div> | ||||
|           ` | ||||
|             }) | ||||
|             class Cmp { | ||||
|               // TODO(issue/24571): remove '!'.
 | ||||
|               public exp !: boolean; | ||||
|               public log: string[] = []; | ||||
|               callback(event: any) { | ||||
|                 this.log.push(event.element.getAttribute('data-name') + '-' + event.phaseName); | ||||
|               } | ||||
|             } | ||||
|            }) | ||||
|            class Cmp { | ||||
|              // TODO(issue/24571): remove '!'.
 | ||||
|              public exp !: boolean; | ||||
|              public log: string[] = []; | ||||
|              callback(event: any) { | ||||
|                this.log.push(event.element.getAttribute('data-name') + '-' + event.phaseName); | ||||
|              } | ||||
|            } | ||||
| 
 | ||||
|             TestBed.configureTestingModule({declarations: [Cmp]}); | ||||
|            TestBed.configureTestingModule({declarations: [Cmp]}); | ||||
| 
 | ||||
|             const engine = TestBed.get(ɵAnimationEngine); | ||||
|             const fixture = TestBed.createComponent(Cmp); | ||||
|             const cmp = fixture.componentInstance; | ||||
|            const engine = TestBed.get(ɵAnimationEngine); | ||||
|            const fixture = TestBed.createComponent(Cmp); | ||||
|            const cmp = fixture.componentInstance; | ||||
| 
 | ||||
|             cmp.exp = true; | ||||
|             fixture.detectChanges(); | ||||
|             flushMicrotasks(); | ||||
|             cmp.log = []; | ||||
|            cmp.exp = true; | ||||
|            fixture.detectChanges(); | ||||
|            flushMicrotasks(); | ||||
|            cmp.log = []; | ||||
| 
 | ||||
|             cmp.exp = false; | ||||
|             fixture.detectChanges(); | ||||
|             flushMicrotasks(); | ||||
|             expect(cmp.log).toEqual([ | ||||
|               'c1-start', 'c1-done', 'c2-start', 'c2-done', 'p-start', 'c3-start', 'c3-done', | ||||
|               'p-done' | ||||
|             ]); | ||||
|           })); | ||||
|            cmp.exp = false; | ||||
|            fixture.detectChanges(); | ||||
|            flushMicrotasks(); | ||||
|            expect(cmp.log).toEqual([ | ||||
|              'c1-start', 'c1-done', 'c2-start', 'c2-done', 'p-start', 'c3-start', 'c3-done', | ||||
|              'p-done' | ||||
|            ]); | ||||
|          })); | ||||
| 
 | ||||
|       it('should build, but not run sub triggers when a parent animation is scheduled', () => { | ||||
|         @Component({ | ||||
| @ -2737,24 +2736,23 @@ import {HostListener} from '../../src/metadata/directives'; | ||||
|         expect(engine.players[0].getRealPlayer()).toBe(players[1]); | ||||
|       }); | ||||
| 
 | ||||
|       fixmeIvy('unknown').it( | ||||
|           'should fire and synchronize the start/done callbacks on sub triggers even if they are not allowed to animate within the animation', | ||||
|           fakeAsync(() => { | ||||
|             @Component({ | ||||
|               selector: 'parent-cmp', | ||||
|               animations: [ | ||||
|                 trigger( | ||||
|                     'parent', | ||||
|                     [ | ||||
|                       transition( | ||||
|                           '* => go', | ||||
|                           [ | ||||
|                             style({height: '0px'}), | ||||
|                             animate(1000, style({height: '100px'})), | ||||
|                           ]), | ||||
|                     ]), | ||||
|               ], | ||||
|               template: ` | ||||
|       it('should fire and synchronize the start/done callbacks on sub triggers even if they are not allowed to animate within the animation', | ||||
|          fakeAsync(() => { | ||||
|            @Component({ | ||||
|              selector: 'parent-cmp', | ||||
|              animations: [ | ||||
|                trigger( | ||||
|                    'parent', | ||||
|                    [ | ||||
|                      transition( | ||||
|                          '* => go', | ||||
|                          [ | ||||
|                            style({height: '0px'}), | ||||
|                            animate(1000, style({height: '100px'})), | ||||
|                          ]), | ||||
|                    ]), | ||||
|              ], | ||||
|              template: ` | ||||
|             <div *ngIf="!remove" | ||||
|                  [@parent]="exp" | ||||
|                  (@parent.start)="track($event)" | ||||
| @ -2762,172 +2760,171 @@ import {HostListener} from '../../src/metadata/directives'; | ||||
|                  <child-cmp #child></child-cmp> | ||||
|             </div> | ||||
|           ` | ||||
|             }) | ||||
|             class ParentCmp { | ||||
|               @ViewChild('child') public childCmp: any; | ||||
|            }) | ||||
|            class ParentCmp { | ||||
|              @ViewChild('child') public childCmp: any; | ||||
| 
 | ||||
|               public exp: any; | ||||
|               public log: string[] = []; | ||||
|               public remove = false; | ||||
|              public exp: any; | ||||
|              public log: string[] = []; | ||||
|              public remove = false; | ||||
| 
 | ||||
|               track(event: any) { this.log.push(`${event.triggerName}-${event.phaseName}`); } | ||||
|             } | ||||
|              track(event: any) { this.log.push(`${event.triggerName}-${event.phaseName}`); } | ||||
|            } | ||||
| 
 | ||||
|             @Component({ | ||||
|               selector: 'child-cmp', | ||||
|               animations: [ | ||||
|                 trigger( | ||||
|                     'child', | ||||
|                     [ | ||||
|                       transition( | ||||
|                           '* => go', | ||||
|                           [ | ||||
|                             style({width: '0px'}), | ||||
|                             animate(1000, style({width: '100px'})), | ||||
|                           ]), | ||||
|                     ]), | ||||
|               ], | ||||
|               template: ` | ||||
|            @Component({ | ||||
|              selector: 'child-cmp', | ||||
|              animations: [ | ||||
|                trigger( | ||||
|                    'child', | ||||
|                    [ | ||||
|                      transition( | ||||
|                          '* => go', | ||||
|                          [ | ||||
|                            style({width: '0px'}), | ||||
|                            animate(1000, style({width: '100px'})), | ||||
|                          ]), | ||||
|                    ]), | ||||
|              ], | ||||
|              template: ` | ||||
|             <div [@child]="exp" | ||||
|                  (@child.start)="track($event)" | ||||
|                  (@child.done)="track($event)"></div> | ||||
|           ` | ||||
|             }) | ||||
|             class ChildCmp { | ||||
|               public exp: any; | ||||
|               public log: string[] = []; | ||||
|               track(event: any) { this.log.push(`${event.triggerName}-${event.phaseName}`); } | ||||
|             } | ||||
|            }) | ||||
|            class ChildCmp { | ||||
|              public exp: any; | ||||
|              public log: string[] = []; | ||||
|              track(event: any) { this.log.push(`${event.triggerName}-${event.phaseName}`); } | ||||
|            } | ||||
| 
 | ||||
|             TestBed.configureTestingModule({declarations: [ParentCmp, ChildCmp]}); | ||||
|             const engine = TestBed.get(ɵAnimationEngine); | ||||
|             const fixture = TestBed.createComponent(ParentCmp); | ||||
|             fixture.detectChanges(); | ||||
|             flushMicrotasks(); | ||||
|            TestBed.configureTestingModule({declarations: [ParentCmp, ChildCmp]}); | ||||
|            const engine = TestBed.get(ɵAnimationEngine); | ||||
|            const fixture = TestBed.createComponent(ParentCmp); | ||||
|            fixture.detectChanges(); | ||||
|            flushMicrotasks(); | ||||
| 
 | ||||
|             const cmp = fixture.componentInstance; | ||||
|             const child = cmp.childCmp; | ||||
|            const cmp = fixture.componentInstance; | ||||
|            const child = cmp.childCmp; | ||||
| 
 | ||||
|             expect(cmp.log).toEqual(['parent-start', 'parent-done']); | ||||
|             expect(child.log).toEqual(['child-start', 'child-done']); | ||||
|            expect(cmp.log).toEqual(['parent-start', 'parent-done']); | ||||
|            expect(child.log).toEqual(['child-start', 'child-done']); | ||||
| 
 | ||||
|             cmp.log = []; | ||||
|             child.log = []; | ||||
|             cmp.exp = 'go'; | ||||
|             cmp.childCmp.exp = 'go'; | ||||
|             fixture.detectChanges(); | ||||
|             flushMicrotasks(); | ||||
|            cmp.log = []; | ||||
|            child.log = []; | ||||
|            cmp.exp = 'go'; | ||||
|            cmp.childCmp.exp = 'go'; | ||||
|            fixture.detectChanges(); | ||||
|            flushMicrotasks(); | ||||
| 
 | ||||
|             expect(cmp.log).toEqual(['parent-start']); | ||||
|             expect(child.log).toEqual(['child-start']); | ||||
|            expect(cmp.log).toEqual(['parent-start']); | ||||
|            expect(child.log).toEqual(['child-start']); | ||||
| 
 | ||||
|             const players = engine.players; | ||||
|             expect(players.length).toEqual(1); | ||||
|             players[0].finish(); | ||||
|            const players = engine.players; | ||||
|            expect(players.length).toEqual(1); | ||||
|            players[0].finish(); | ||||
| 
 | ||||
|             expect(cmp.log).toEqual(['parent-start', 'parent-done']); | ||||
|             expect(child.log).toEqual(['child-start', 'child-done']); | ||||
|            expect(cmp.log).toEqual(['parent-start', 'parent-done']); | ||||
|            expect(child.log).toEqual(['child-start', 'child-done']); | ||||
| 
 | ||||
|             cmp.log = []; | ||||
|             child.log = []; | ||||
|             cmp.remove = true; | ||||
|             fixture.detectChanges(); | ||||
|             flushMicrotasks(); | ||||
|            cmp.log = []; | ||||
|            child.log = []; | ||||
|            cmp.remove = true; | ||||
|            fixture.detectChanges(); | ||||
|            flushMicrotasks(); | ||||
| 
 | ||||
|             expect(cmp.log).toEqual(['parent-start', 'parent-done']); | ||||
|             expect(child.log).toEqual(['child-start', 'child-done']); | ||||
|           })); | ||||
|            expect(cmp.log).toEqual(['parent-start', 'parent-done']); | ||||
|            expect(child.log).toEqual(['child-start', 'child-done']); | ||||
|          })); | ||||
| 
 | ||||
|       fixmeIvy('unknown').it( | ||||
|           'should fire and synchronize the start/done callbacks on multiple blocked sub triggers', | ||||
|           fakeAsync(() => { | ||||
|             @Component({ | ||||
|               selector: 'cmp', | ||||
|               animations: [ | ||||
|                 trigger( | ||||
|                     'parent1', | ||||
|                     [ | ||||
|                       transition( | ||||
|                           '* => go, * => go-again', | ||||
|                           [ | ||||
|                             style({opacity: 0}), | ||||
|                             animate('1s', style({opacity: 1})), | ||||
|                           ]), | ||||
|                     ]), | ||||
|                 trigger( | ||||
|                     'parent2', | ||||
|                     [ | ||||
|                       transition( | ||||
|                           '* => go, * => go-again', | ||||
|                           [ | ||||
|                             style({lineHeight: '0px'}), | ||||
|                             animate('1s', style({lineHeight: '10px'})), | ||||
|                           ]), | ||||
|                     ]), | ||||
|                 trigger( | ||||
|                     'child1', | ||||
|                     [ | ||||
|                       transition( | ||||
|                           '* => go, * => go-again', | ||||
|                           [ | ||||
|                             style({width: '0px'}), | ||||
|                             animate('1s', style({width: '100px'})), | ||||
|                           ]), | ||||
|                     ]), | ||||
|                 trigger( | ||||
|                     'child2', | ||||
|                     [ | ||||
|                       transition( | ||||
|                           '* => go, * => go-again', | ||||
|                           [ | ||||
|                             style({height: '0px'}), | ||||
|                             animate('1s', style({height: '100px'})), | ||||
|                           ]), | ||||
|                     ]), | ||||
|               ], | ||||
|               template: ` | ||||
|       it('should fire and synchronize the start/done callbacks on multiple blocked sub triggers', | ||||
|          fakeAsync(() => { | ||||
|            @Component({ | ||||
|              selector: 'cmp', | ||||
|              animations: [ | ||||
|                trigger( | ||||
|                    'parent1', | ||||
|                    [ | ||||
|                      transition( | ||||
|                          '* => go, * => go-again', | ||||
|                          [ | ||||
|                            style({opacity: 0}), | ||||
|                            animate('1s', style({opacity: 1})), | ||||
|                          ]), | ||||
|                    ]), | ||||
|                trigger( | ||||
|                    'parent2', | ||||
|                    [ | ||||
|                      transition( | ||||
|                          '* => go, * => go-again', | ||||
|                          [ | ||||
|                            style({lineHeight: '0px'}), | ||||
|                            animate('1s', style({lineHeight: '10px'})), | ||||
|                          ]), | ||||
|                    ]), | ||||
|                trigger( | ||||
|                    'child1', | ||||
|                    [ | ||||
|                      transition( | ||||
|                          '* => go, * => go-again', | ||||
|                          [ | ||||
|                            style({width: '0px'}), | ||||
|                            animate('1s', style({width: '100px'})), | ||||
|                          ]), | ||||
|                    ]), | ||||
|                trigger( | ||||
|                    'child2', | ||||
|                    [ | ||||
|                      transition( | ||||
|                          '* => go, * => go-again', | ||||
|                          [ | ||||
|                            style({height: '0px'}), | ||||
|                            animate('1s', style({height: '100px'})), | ||||
|                          ]), | ||||
|                    ]), | ||||
|              ], | ||||
|              template: ` | ||||
|                <div [@parent1]="parent1Exp" (@parent1.start)="track($event)" | ||||
|                     [@parent2]="parent2Exp" (@parent2.start)="track($event)"> | ||||
|                  <div [@child1]="child1Exp" (@child1.start)="track($event)" | ||||
|                       [@child2]="child2Exp" (@child2.start)="track($event)"></div> | ||||
|                </div> | ||||
|           ` | ||||
|             }) | ||||
|             class Cmp { | ||||
|               public parent1Exp = ''; | ||||
|               public parent2Exp = ''; | ||||
|               public child1Exp = ''; | ||||
|               public child2Exp = ''; | ||||
|               public log: string[] = []; | ||||
|            }) | ||||
|            class Cmp { | ||||
|              public parent1Exp = ''; | ||||
|              public parent2Exp = ''; | ||||
|              public child1Exp = ''; | ||||
|              public child2Exp = ''; | ||||
|              public log: string[] = []; | ||||
| 
 | ||||
|               track(event: any) { this.log.push(`${event.triggerName}-${event.phaseName}`); } | ||||
|             } | ||||
|              track(event: any) { this.log.push(`${event.triggerName}-${event.phaseName}`); } | ||||
|            } | ||||
| 
 | ||||
|             TestBed.configureTestingModule({declarations: [Cmp]}); | ||||
|             const engine = TestBed.get(ɵAnimationEngine); | ||||
|             const fixture = TestBed.createComponent(Cmp); | ||||
|             fixture.detectChanges(); | ||||
|             flushMicrotasks(); | ||||
|            TestBed.configureTestingModule({declarations: [Cmp]}); | ||||
|            const engine = TestBed.get(ɵAnimationEngine); | ||||
|            const fixture = TestBed.createComponent(Cmp); | ||||
|            fixture.detectChanges(); | ||||
|            flushMicrotasks(); | ||||
| 
 | ||||
|             const cmp = fixture.componentInstance; | ||||
|             cmp.log = []; | ||||
|             cmp.parent1Exp = 'go'; | ||||
|             cmp.parent2Exp = 'go'; | ||||
|             cmp.child1Exp = 'go'; | ||||
|             cmp.child2Exp = 'go'; | ||||
|             fixture.detectChanges(); | ||||
|             flushMicrotasks(); | ||||
|            const cmp = fixture.componentInstance; | ||||
|            cmp.log = []; | ||||
|            cmp.parent1Exp = 'go'; | ||||
|            cmp.parent2Exp = 'go'; | ||||
|            cmp.child1Exp = 'go'; | ||||
|            cmp.child2Exp = 'go'; | ||||
|            fixture.detectChanges(); | ||||
|            flushMicrotasks(); | ||||
| 
 | ||||
|             expect(cmp.log).toEqual( | ||||
|                 ['parent1-start', 'parent2-start', 'child1-start', 'child2-start']); | ||||
|            expect(cmp.log).toEqual( | ||||
|                ['parent1-start', 'parent2-start', 'child1-start', 'child2-start']); | ||||
| 
 | ||||
|             cmp.parent1Exp = 'go-again'; | ||||
|             cmp.parent2Exp = 'go-again'; | ||||
|             cmp.child1Exp = 'go-again'; | ||||
|             cmp.child2Exp = 'go-again'; | ||||
|             fixture.detectChanges(); | ||||
|             flushMicrotasks(); | ||||
|           })); | ||||
|            cmp.parent1Exp = 'go-again'; | ||||
|            cmp.parent2Exp = 'go-again'; | ||||
|            cmp.child1Exp = 'go-again'; | ||||
|            cmp.child2Exp = 'go-again'; | ||||
|            fixture.detectChanges(); | ||||
|            flushMicrotasks(); | ||||
|          })); | ||||
| 
 | ||||
|       it('should stretch the starting keyframe of a child animation queries are issued by the parent', | ||||
|          () => { | ||||
|  | ||||
| @ -78,8 +78,6 @@ const TEST_COMPILER_PROVIDERS: Provider[] = [ | ||||
|   } | ||||
| 
 | ||||
|   describe(`ChangeDetection`, () => { | ||||
|     // On CJS fakeAsync is not supported...
 | ||||
|     if (!getDOM().supportsDOMEvents()) return; | ||||
| 
 | ||||
|     beforeEach(() => { | ||||
|       TestBed.configureCompiler({providers: TEST_COMPILER_PROVIDERS}); | ||||
| @ -1211,16 +1209,16 @@ const TEST_COMPILER_PROVIDERS: Provider[] = [ | ||||
|     }); | ||||
| 
 | ||||
|     describe('mode', () => { | ||||
|       fixmeIvy('unknown').it('Detached', fakeAsync(() => { | ||||
|                                const ctx = createCompFixture('<comp-with-ref></comp-with-ref>'); | ||||
|                                const cmp: CompWithRef = queryDirs(ctx.debugElement, CompWithRef)[0]; | ||||
|                                cmp.value = 'hello'; | ||||
|                                cmp.changeDetectorRef.detach(); | ||||
|       it('Detached', fakeAsync(() => { | ||||
|            const ctx = createCompFixture('<comp-with-ref></comp-with-ref>'); | ||||
|            const cmp: CompWithRef = queryDirs(ctx.debugElement, CompWithRef)[0]; | ||||
|            cmp.value = 'hello'; | ||||
|            cmp.changeDetectorRef.detach(); | ||||
| 
 | ||||
|                                ctx.detectChanges(); | ||||
|            ctx.detectChanges(); | ||||
| 
 | ||||
|                                expect(renderLog.log).toEqual([]); | ||||
|                              })); | ||||
|            expect(renderLog.log).toEqual([]); | ||||
|          })); | ||||
| 
 | ||||
|       it('Detached should disable OnPush', fakeAsync(() => { | ||||
|            const ctx = createCompFixture('<push-cmp [value]="value"></push-cmp>'); | ||||
|  | ||||
| @ -9,7 +9,7 @@ | ||||
| import {ResourceLoader} from '@angular/compiler'; | ||||
| import {CompileMetadataResolver} from '@angular/compiler/src/metadata_resolver'; | ||||
| import {MockResourceLoader} from '@angular/compiler/testing/src/resource_loader_mock'; | ||||
| import {Component, Directive, Injectable, NgModule, OnDestroy, Pipe, Type} from '@angular/core'; | ||||
| import {Component, Directive, Injectable, NgModule, OnDestroy, Pipe} from '@angular/core'; | ||||
| import {TestBed, async, getTestBed} from '@angular/core/testing'; | ||||
| import {expect} from '@angular/platform-browser/testing/src/matchers'; | ||||
| import {fixmeIvy} from '@angular/private/testing'; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user