128 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			128 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| 
								 | 
							
								import {
							 | 
						||
| 
								 | 
							
								  ddescribe,
							 | 
						||
| 
								 | 
							
								  describe,
							 | 
						||
| 
								 | 
							
								  it,
							 | 
						||
| 
								 | 
							
								  iit,
							 | 
						||
| 
								 | 
							
								  xit,
							 | 
						||
| 
								 | 
							
								  expect,
							 | 
						||
| 
								 | 
							
								  beforeEach,
							 | 
						||
| 
								 | 
							
								  afterEach,
							 | 
						||
| 
								 | 
							
								  AsyncTestCompleter,
							 | 
						||
| 
								 | 
							
								  inject,
							 | 
						||
| 
								 | 
							
								  proxy,
							 | 
						||
| 
								 | 
							
								  SpyObject
							 | 
						||
| 
								 | 
							
								} from 'angular2/test_lib';
							 | 
						||
| 
								 | 
							
								import {IMPLEMENTS, isBlank} from 'angular2/src/facade/lang';
							 | 
						||
| 
								 | 
							
								import {PromisePipe} from 'angular2/src/change_detection/pipes/promise_pipe';
							 | 
						||
| 
								 | 
							
								import {WrappedValue} from 'angular2/src/change_detection/pipes/pipe';
							 | 
						||
| 
								 | 
							
								import {ChangeDetectorRef} from 'angular2/src/change_detection/change_detector_ref';
							 | 
						||
| 
								 | 
							
								import {PromiseWrapper, TimerWrapper} from 'angular2/src/facade/async';
							 | 
						||
| 
								 | 
							
								import {DOM} from 'angular2/src/dom/dom_adapter';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								export function main() {
							 | 
						||
| 
								 | 
							
								  describe("PromisePipe", () => {
							 | 
						||
| 
								 | 
							
								    var message = new Object();
							 | 
						||
| 
								 | 
							
								    var pipe;
							 | 
						||
| 
								 | 
							
								    var completer;
							 | 
						||
| 
								 | 
							
								    var ref;
							 | 
						||
| 
								 | 
							
								    // adds longer timers for passing tests in IE
							 | 
						||
| 
								 | 
							
								    var timer = (!isBlank(DOM) && DOM.getUserAgent().indexOf("Trident") > -1) ? 50 : 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    beforeEach(() => {
							 | 
						||
| 
								 | 
							
								      completer = PromiseWrapper.completer();
							 | 
						||
| 
								 | 
							
								      ref = new SpyChangeDetectorRef();
							 | 
						||
| 
								 | 
							
								      pipe = new PromisePipe(ref);
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    describe("supports", () => {
							 | 
						||
| 
								 | 
							
								      it("should support promises", () => { expect(pipe.supports(completer.promise)).toBe(true); });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      it("should not support other objects", () => {
							 | 
						||
| 
								 | 
							
								        expect(pipe.supports("string")).toBe(false);
							 | 
						||
| 
								 | 
							
								        expect(pipe.supports(null)).toBe(false);
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    describe("transform", () => {
							 | 
						||
| 
								 | 
							
								      it("should return null when subscribing to a promise",
							 | 
						||
| 
								 | 
							
								         () => { expect(pipe.transform(completer.promise)).toBe(null); });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      it("should return the latest available value", inject([AsyncTestCompleter], (async) => {
							 | 
						||
| 
								 | 
							
								           pipe.transform(completer.promise);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								           completer.resolve(message);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								           TimerWrapper.setTimeout(() => {
							 | 
						||
| 
								 | 
							
								             expect(pipe.transform(completer.promise)).toEqual(new WrappedValue(message));
							 | 
						||
| 
								 | 
							
								             async.done();
							 | 
						||
| 
								 | 
							
								           }, timer)
							 | 
						||
| 
								 | 
							
								         }));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      it("should return unwrapped value when nothing has changed since the last call",
							 | 
						||
| 
								 | 
							
								         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)
							 | 
						||
| 
								 | 
							
								         }));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      it("should dispose of the existing subscription when subscribing to a new promise",
							 | 
						||
| 
								 | 
							
								         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)
							 | 
						||
| 
								 | 
							
								         }));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      it("should request a change detection check upon receiving a new value",
							 | 
						||
| 
								 | 
							
								         inject([AsyncTestCompleter], (async) => {
							 | 
						||
| 
								 | 
							
								           pipe.transform(completer.promise);
							 | 
						||
| 
								 | 
							
								           completer.resolve(message);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								           TimerWrapper.setTimeout(() => {
							 | 
						||
| 
								 | 
							
								             expect(ref.spy('requestCheck')).toHaveBeenCalled();
							 | 
						||
| 
								 | 
							
								             async.done();
							 | 
						||
| 
								 | 
							
								           }, timer)
							 | 
						||
| 
								 | 
							
								         }));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      describe("onDestroy", () => {
							 | 
						||
| 
								 | 
							
								        it("should do nothing when no source",
							 | 
						||
| 
								 | 
							
								           () => { expect(() => pipe.onDestroy()).not.toThrow(); });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        it("should dispose of the existing source", inject([AsyncTestCompleter], (async) => {
							 | 
						||
| 
								 | 
							
								             pipe.transform(completer.promise);
							 | 
						||
| 
								 | 
							
								             expect(pipe.transform(completer.promise)).toBe(null);
							 | 
						||
| 
								 | 
							
								             completer.resolve(message)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                 TimerWrapper.setTimeout(() => {
							 | 
						||
| 
								 | 
							
								                   expect(pipe.transform(completer.promise)).toEqual(new WrappedValue(message));
							 | 
						||
| 
								 | 
							
								                   pipe.onDestroy();
							 | 
						||
| 
								 | 
							
								                   expect(pipe.transform(completer.promise)).toBe(null);
							 | 
						||
| 
								 | 
							
								                   async.done();
							 | 
						||
| 
								 | 
							
								                 }, timer);
							 | 
						||
| 
								 | 
							
								           }));
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@proxy
							 | 
						||
| 
								 | 
							
								@IMPLEMENTS(ChangeDetectorRef)
							 | 
						||
| 
								 | 
							
								class SpyChangeDetectorRef extends SpyObject {
							 | 
						||
| 
								 | 
							
								  constructor() { super(ChangeDetectorRef); }
							 | 
						||
| 
								 | 
							
								  noSuchMethod(m) { return super.noSuchMethod(m) }
							 | 
						||
| 
								 | 
							
								}
							 |