| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  | import { | 
					
						
							|  |  |  |   ddescribe, | 
					
						
							|  |  |  |   describe, | 
					
						
							|  |  |  |   it, | 
					
						
							|  |  |  |   iit, | 
					
						
							|  |  |  |   xit, | 
					
						
							|  |  |  |   expect, | 
					
						
							|  |  |  |   beforeEach, | 
					
						
							|  |  |  |   afterEach, | 
					
						
							|  |  |  |   AsyncTestCompleter, | 
					
						
							|  |  |  |   inject, | 
					
						
							|  |  |  |   browserDetection | 
					
						
							|  |  |  | } from 'angular2/testing_internal'; | 
					
						
							| 
									
										
										
										
											2015-11-05 14:58:24 -08:00
										 |  |  | import {SpyChangeDetectorRef} from '../spies'; | 
					
						
							| 
									
										
										
										
											2015-08-04 11:55:21 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-06 17:34:07 -08:00
										 |  |  | import {isBlank} from 'angular2/src/facade/lang'; | 
					
						
							| 
									
										
										
										
											2015-11-18 15:55:43 -08:00
										 |  |  | import {AsyncPipe} from 'angular2/common'; | 
					
						
							|  |  |  | import {WrappedValue} from 'angular2/core'; | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  | import { | 
					
						
							|  |  |  |   EventEmitter, | 
					
						
							|  |  |  |   ObservableWrapper, | 
					
						
							|  |  |  |   PromiseWrapper, | 
					
						
							|  |  |  |   TimerWrapper | 
					
						
							|  |  |  | } from 'angular2/src/facade/async'; | 
					
						
							| 
									
										
										
										
											2015-11-19 15:09:34 -08:00
										 |  |  | import {DOM} from 'angular2/src/platform/dom/dom_adapter'; | 
					
						
							| 
									
										
										
										
											2016-02-19 11:49:31 -08:00
										 |  |  | import {PromiseCompleter} from 'angular2/src/facade/promise'; | 
					
						
							| 
									
										
										
										
											2015-08-04 11:55:21 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | export function main() { | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |   describe("AsyncPipe", () => { | 
					
						
							| 
									
										
										
										
											2015-08-04 11:55:21 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     describe('Observable', () => { | 
					
						
							|  |  |  |       var emitter; | 
					
						
							|  |  |  |       var pipe; | 
					
						
							|  |  |  |       var ref; | 
					
						
							|  |  |  |       var message = new Object(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       beforeEach(() => { | 
					
						
							|  |  |  |         emitter = new EventEmitter(); | 
					
						
							|  |  |  |         ref = new SpyChangeDetectorRef(); | 
					
						
							|  |  |  |         pipe = new AsyncPipe(ref); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |       describe("transform", () => { | 
					
						
							|  |  |  |         it("should return null when subscribing to an observable", | 
					
						
							| 
									
										
										
										
											2015-08-04 11:55:21 -07:00
										 |  |  |            () => { expect(pipe.transform(emitter)).toBe(null); }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |         it("should return the latest available value wrapped", | 
					
						
							| 
									
										
										
										
											2015-08-04 11:55:21 -07:00
										 |  |  |            inject([AsyncTestCompleter], (async) => { | 
					
						
							|  |  |  |              pipe.transform(emitter); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-15 23:58:59 -08:00
										 |  |  |              ObservableWrapper.callEmit(emitter, message); | 
					
						
							| 
									
										
										
										
											2015-08-04 11:55:21 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |              TimerWrapper.setTimeout(() => { | 
					
						
							|  |  |  |                expect(pipe.transform(emitter)).toEqual(new WrappedValue(message)); | 
					
						
							|  |  |  |                async.done(); | 
					
						
							|  |  |  |              }, 0) | 
					
						
							|  |  |  |            })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |         it("should return same value when nothing has changed since the last call", | 
					
						
							| 
									
										
										
										
											2015-08-04 11:55:21 -07:00
										 |  |  |            inject([AsyncTestCompleter], (async) => { | 
					
						
							|  |  |  |              pipe.transform(emitter); | 
					
						
							| 
									
										
										
										
											2015-11-15 23:58:59 -08:00
										 |  |  |              ObservableWrapper.callEmit(emitter, message); | 
					
						
							| 
									
										
										
										
											2015-08-04 11:55:21 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |              TimerWrapper.setTimeout(() => { | 
					
						
							|  |  |  |                pipe.transform(emitter); | 
					
						
							|  |  |  |                expect(pipe.transform(emitter)).toBe(message); | 
					
						
							|  |  |  |                async.done(); | 
					
						
							|  |  |  |              }, 0) | 
					
						
							|  |  |  |            })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |         it("should dispose of the existing subscription when subscribing to a new observable", | 
					
						
							| 
									
										
										
										
											2015-08-04 11:55:21 -07:00
										 |  |  |            inject([AsyncTestCompleter], (async) => { | 
					
						
							|  |  |  |              pipe.transform(emitter); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              var newEmitter = new EventEmitter(); | 
					
						
							|  |  |  |              expect(pipe.transform(newEmitter)).toBe(null); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              // this should not affect the pipe
 | 
					
						
							| 
									
										
										
										
											2015-11-15 23:58:59 -08:00
										 |  |  |              ObservableWrapper.callEmit(emitter, message); | 
					
						
							| 
									
										
										
										
											2015-08-04 11:55:21 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |              TimerWrapper.setTimeout(() => { | 
					
						
							|  |  |  |                expect(pipe.transform(newEmitter)).toBe(null); | 
					
						
							|  |  |  |                async.done(); | 
					
						
							|  |  |  |              }, 0) | 
					
						
							|  |  |  |            })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |         it("should request a change detection check upon receiving a new value", | 
					
						
							| 
									
										
										
										
											2015-08-04 11:55:21 -07:00
										 |  |  |            inject([AsyncTestCompleter], (async) => { | 
					
						
							|  |  |  |              pipe.transform(emitter); | 
					
						
							| 
									
										
										
										
											2015-11-15 23:58:59 -08:00
										 |  |  |              ObservableWrapper.callEmit(emitter, message); | 
					
						
							| 
									
										
										
										
											2015-08-04 11:55:21 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |              TimerWrapper.setTimeout(() => { | 
					
						
							| 
									
										
										
										
											2015-08-28 10:08:18 -07:00
										 |  |  |                expect(ref.spy('markForCheck')).toHaveBeenCalled(); | 
					
						
							| 
									
										
										
										
											2015-08-04 11:55:21 -07:00
										 |  |  |                async.done(); | 
					
						
							| 
									
										
										
										
											2016-02-25 14:24:17 -08:00
										 |  |  |              }, 10) | 
					
						
							| 
									
										
										
										
											2015-08-04 11:55:21 -07:00
										 |  |  |            })); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |       describe("ngOnDestroy", () => { | 
					
						
							|  |  |  |         it("should do nothing when no subscription", | 
					
						
							| 
									
										
										
										
											2015-11-17 10:09:23 -08:00
										 |  |  |            () => { expect(() => pipe.ngOnDestroy()).not.toThrow(); }); | 
					
						
							| 
									
										
										
										
											2015-08-04 11:55:21 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |         it("should dispose of the existing subscription", inject([AsyncTestCompleter], (async) => { | 
					
						
							| 
									
										
										
										
											2015-08-04 11:55:21 -07:00
										 |  |  |              pipe.transform(emitter); | 
					
						
							| 
									
										
										
										
											2015-11-17 10:09:23 -08:00
										 |  |  |              pipe.ngOnDestroy(); | 
					
						
							| 
									
										
										
										
											2015-08-04 11:55:21 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-15 23:58:59 -08:00
										 |  |  |              ObservableWrapper.callEmit(emitter, message); | 
					
						
							| 
									
										
										
										
											2015-08-04 11:55:21 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |              TimerWrapper.setTimeout(() => { | 
					
						
							|  |  |  |                expect(pipe.transform(emitter)).toBe(null); | 
					
						
							|  |  |  |                async.done(); | 
					
						
							|  |  |  |              }, 0) | 
					
						
							|  |  |  |            })); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |     describe("Promise", () => { | 
					
						
							| 
									
										
										
										
											2015-08-04 11:55:21 -07:00
										 |  |  |       var message = new Object(); | 
					
						
							| 
									
										
										
										
											2016-02-19 11:49:31 -08:00
										 |  |  |       var pipe: AsyncPipe; | 
					
						
							|  |  |  |       var completer: PromiseCompleter<any>; | 
					
						
							|  |  |  |       var ref: SpyChangeDetectorRef; | 
					
						
							| 
									
										
										
										
											2015-08-04 11:55:21 -07:00
										 |  |  |       // adds longer timers for passing tests in IE
 | 
					
						
							| 
									
										
										
										
											2016-02-25 14:24:17 -08:00
										 |  |  |       var timer = (!isBlank(DOM) && browserDetection.isIE) ? 50 : 10; | 
					
						
							| 
									
										
										
										
											2015-08-04 11:55:21 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |       beforeEach(() => { | 
					
						
							|  |  |  |         completer = PromiseWrapper.completer(); | 
					
						
							|  |  |  |         ref = new SpyChangeDetectorRef(); | 
					
						
							| 
									
										
										
										
											2016-02-19 11:49:31 -08:00
										 |  |  |         pipe = new AsyncPipe(<any>ref); | 
					
						
							| 
									
										
										
										
											2015-08-04 11:55:21 -07:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |       describe("transform", () => { | 
					
						
							|  |  |  |         it("should return null when subscribing to a promise", | 
					
						
							| 
									
										
										
										
											2015-08-04 11:55:21 -07:00
										 |  |  |            () => { expect(pipe.transform(completer.promise)).toBe(null); }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |         it("should return the latest available value", inject([AsyncTestCompleter], (async) => { | 
					
						
							| 
									
										
										
										
											2015-08-04 11:55:21 -07:00
										 |  |  |              pipe.transform(completer.promise); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              completer.resolve(message); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              TimerWrapper.setTimeout(() => { | 
					
						
							|  |  |  |                expect(pipe.transform(completer.promise)).toEqual(new WrappedValue(message)); | 
					
						
							|  |  |  |                async.done(); | 
					
						
							|  |  |  |              }, timer) | 
					
						
							|  |  |  |            })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |         it("should return unwrapped value when nothing has changed since the last call", | 
					
						
							| 
									
										
										
										
											2015-08-04 11:55:21 -07:00
										 |  |  |            inject([AsyncTestCompleter], (async) => { | 
					
						
							|  |  |  |              pipe.transform(completer.promise); | 
					
						
							|  |  |  |              completer.resolve(message); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              TimerWrapper.setTimeout(() => { | 
					
						
							|  |  |  |                pipe.transform(completer.promise); | 
					
						
							|  |  |  |                expect(pipe.transform(completer.promise)).toBe(message); | 
					
						
							|  |  |  |                async.done(); | 
					
						
							|  |  |  |              }, timer) | 
					
						
							|  |  |  |            })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |         it("should dispose of the existing subscription when subscribing to a new promise", | 
					
						
							| 
									
										
										
										
											2015-08-04 11:55:21 -07:00
										 |  |  |            inject([AsyncTestCompleter], (async) => { | 
					
						
							|  |  |  |              pipe.transform(completer.promise); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              var newCompleter = PromiseWrapper.completer(); | 
					
						
							|  |  |  |              expect(pipe.transform(newCompleter.promise)).toBe(null); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              // this should not affect the pipe, so it should return WrappedValue
 | 
					
						
							|  |  |  |              completer.resolve(message); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              TimerWrapper.setTimeout(() => { | 
					
						
							|  |  |  |                expect(pipe.transform(newCompleter.promise)).toBe(null); | 
					
						
							|  |  |  |                async.done(); | 
					
						
							|  |  |  |              }, timer) | 
					
						
							|  |  |  |            })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |         it("should request a change detection check upon receiving a new value", | 
					
						
							| 
									
										
										
										
											2015-08-04 11:55:21 -07:00
										 |  |  |            inject([AsyncTestCompleter], (async) => { | 
					
						
							| 
									
										
										
										
											2016-02-25 14:24:17 -08:00
										 |  |  |              var markForCheck = ref.spy('markForCheck'); | 
					
						
							| 
									
										
										
										
											2015-08-04 11:55:21 -07:00
										 |  |  |              pipe.transform(completer.promise); | 
					
						
							|  |  |  |              completer.resolve(message); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              TimerWrapper.setTimeout(() => { | 
					
						
							| 
									
										
										
										
											2016-02-25 14:24:17 -08:00
										 |  |  |                expect(markForCheck).toHaveBeenCalled(); | 
					
						
							| 
									
										
										
										
											2015-08-04 11:55:21 -07:00
										 |  |  |                async.done(); | 
					
						
							|  |  |  |              }, timer) | 
					
						
							|  |  |  |            })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |         describe("ngOnDestroy", () => { | 
					
						
							|  |  |  |           it("should do nothing when no source", | 
					
						
							| 
									
										
										
										
											2015-11-17 10:09:23 -08:00
										 |  |  |              () => { expect(() => pipe.ngOnDestroy()).not.toThrow(); }); | 
					
						
							| 
									
										
										
										
											2015-08-04 11:55:21 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |           it("should dispose of the existing source", inject([AsyncTestCompleter], (async) => { | 
					
						
							| 
									
										
										
										
											2015-08-04 11:55:21 -07:00
										 |  |  |                pipe.transform(completer.promise); | 
					
						
							|  |  |  |                expect(pipe.transform(completer.promise)).toBe(null); | 
					
						
							|  |  |  |                completer.resolve(message) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |                    TimerWrapper.setTimeout(() => { | 
					
						
							|  |  |  |                      expect(pipe.transform(completer.promise)).toEqual(new WrappedValue(message)); | 
					
						
							|  |  |  |                      pipe.ngOnDestroy(); | 
					
						
							|  |  |  |                      expect(pipe.transform(completer.promise)).toBe(null); | 
					
						
							|  |  |  |                      async.done(); | 
					
						
							|  |  |  |                    }, timer); | 
					
						
							| 
									
										
										
										
											2015-08-04 11:55:21 -07:00
										 |  |  |              })); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe('null', () => { | 
					
						
							|  |  |  |       it('should return null when given null', () => { | 
					
						
							|  |  |  |         var pipe = new AsyncPipe(null); | 
					
						
							| 
									
										
										
										
											2016-04-22 15:33:32 -07:00
										 |  |  |         expect(pipe.transform(null)).toEqual(null); | 
					
						
							| 
									
										
										
										
											2015-08-04 11:55:21 -07:00
										 |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe('other types', () => { | 
					
						
							|  |  |  |       it('should throw when given an invalid object', () => { | 
					
						
							|  |  |  |         var pipe = new AsyncPipe(null); | 
					
						
							| 
									
										
										
										
											2016-04-22 15:33:32 -07:00
										 |  |  |         expect(() => pipe.transform(<any>"some bogus object")).toThrowError(); | 
					
						
							| 
									
										
										
										
											2015-08-04 11:55:21 -07:00
										 |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | } |