inject([AsyncTestCompleter], (async) => { var completerA: PromiseCompleter<any>; var completerB: PromiseCompleter<any>; macroTask(() => { _zone.run(() => { completerA = PromiseWrapper.completer(); completerB = PromiseWrapper.completer(); completerA.promise.then(_log.fn('a then')); completerB.promise.then(_log.fn('b then')); _log.add('run start'); }); }); macroTask(() => { _zone.run(() => { completerA.resolve(null); }); }, 20); macroTask(() => { _zone.run(() => { completerB.resolve(null); }); }, 500); macroTask(() => { expect(_log.result()) .toEqual( // First VM turn 'onTurnStart; run start; onTurnDone; ' + // Second VM turn 'onTurnStart; a then; onTurnDone; ' + // Third VM turn 'onTurnStart; b then; onTurnDone'); async.done(); }, resultTimer); }), testTimeout);
inject([AsyncTestCompleter], (async) => { var a: PromiseCompleter<string>; var b: PromiseCompleter<string>; macroTask(() => { _zone.run(() => { a = PromiseWrapper.completer(); b = PromiseWrapper.completer(); _log.add('run start'); a.promise.then(_log.fn('a then')); b.promise.then(_log.fn('b then')); }); }); macroTask(() => { _zone.run(() => { a.resolve('a'); b.resolve('b'); }); }); macroTask(() => { expect(_log.result()) .toEqual( 'onTurnStart; run start; onTurnDone; onTurnStart; a then; b then; onTurnDone'); async.done(); }, resultTimer); }), testTimeout);
inject([AsyncTestCompleter], (async) => { var a: PromiseCompleter<string>; var b: PromiseCompleter<string>; runNgZoneNoLog(() => { macroTask(() => { a = PromiseWrapper.completer(); b = PromiseWrapper.completer(); _log.add('run start'); a.promise.then(_log.fn('a then')); b.promise.then(_log.fn('b then')); }); }); runNgZoneNoLog(() => { macroTask(() => { a.resolve('a'); b.resolve('b'); }); }); macroTask(() => { expect(_log.result()) .toEqual( 'onUnstable; run start; onMicrotaskEmpty; onStable; onUnstable; a then; b then; onMicrotaskEmpty; onStable'); async.done(); }, resultTimer); }), testTimeout);
inject([AsyncTestCompleter], (async) => { var completerA: PromiseCompleter<any>; var completerB: PromiseCompleter<any>; runNgZoneNoLog(() => { macroTask(() => { completerA = PromiseWrapper.completer(); completerB = PromiseWrapper.completer(); completerA.promise.then(_log.fn('a then')); completerB.promise.then(_log.fn('b then')); _log.add('run start'); }); }); runNgZoneNoLog(() => { macroTask(() => { completerA.resolve(null); }, 10); }); runNgZoneNoLog(() => { macroTask(() => { completerB.resolve(null); }, 20); }); macroTask(() => { expect(_log.result()) .toEqual( // First VM turn 'onUnstable; run start; onMicrotaskEmpty; onStable; ' + // Second VM turn 'onUnstable; a then; onMicrotaskEmpty; onStable; ' + // Third VM turn 'onUnstable; b then; onMicrotaskEmpty; onStable'); async.done(); }, resultTimer); }), testTimeout);
complete(response: string) { if (isBlank(response)) { this.completer.reject(`Failed to load ${this.url}`, null); } else { this.completer.resolve(response); } }
inject([AsyncTestCompleter], (async) => { var completer: PromiseCompleter<any>; macroTask( () => { _zone.runOutsideAngular(() => { completer = PromiseWrapper.completer(); }); }); macroTask( () => { _zone.run(() => { completer.promise.then(_log.fn('executedMicrotask')); }); }); macroTask(() => { _zone.runOutsideAngular(() => { _log.add('scheduling a microtask'); completer.resolve(null); }); }); macroTask(() => { expect(_log.result()) .toEqual( // First VM turn => setup Promise then 'onTurnStart; onTurnDone; ' + // Second VM turn (outside of anguler) 'scheduling a microtask; ' + // Third VM Turn => execute the microtask (inside angular) 'onTurnStart; executedMicrotask; onTurnDone'); async.done(); }, resultTimer); }), testTimeout);
inject([AsyncTestCompleter], (async) => { var completer: PromiseCompleter<any>; macroTask(() => { NgZone.assertNotInAngularZone(); completer = PromiseWrapper.completer(); }); runNgZoneNoLog(() => { macroTask(() => { NgZone.assertInAngularZone(); completer.promise.then(_log.fn('executedMicrotask')); }); }); macroTask(() => { NgZone.assertNotInAngularZone(); _log.add('scheduling a microtask'); completer.resolve(null); }); macroTask(() => { expect(_log.result()) .toEqual( // First VM turn => setup Promise then 'onUnstable; onMicrotaskEmpty; onStable; ' + // Second VM turn (outside of angular) 'scheduling a microtask; onUnstable; ' + // Third VM Turn => execute the microtask (inside angular) // No onUnstable; because we don't own the task which started the turn. 'executedMicrotask; onMicrotaskEmpty; onStable'); async.done(); }, resultTimer); }), testTimeout);
get(url: string): Promise<string> { var completer: PromiseCompleter < string >= PromiseWrapper.completer(); var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.responseType = 'text'; xhr.onload = function() { // responseText is the old-school way of retrieving response (supported by IE8 & 9) // response/responseType properties were introduced in XHR Level2 spec (supported by IE10) var response = isPresent(xhr.response) ? xhr.response : xhr.responseText; // normalize IE9 bug (http://bugs.jquery.com/ticket/1450) var status = xhr.status === 1223 ? 204 : xhr.status; // fix status code when it is 0 (0 status is undocumented). // Occurs when accessing file resources or on Android 4.1 stock browser // while retrieving files from application cache. if (status === 0) { status = response ? 200 : 0; } if (200 <= status && status <= 300) { completer.resolve(response); } else { completer.reject(`Failed to load ${url}`, null); } }; xhr.onerror = function() { completer.reject(`Failed to load ${url}`, null); }; xhr.send(); return completer.promise; }
ObservableWrapper.subscribe<string>(eventBus, (ev) => { if (ev.startsWith('deactivate')) { completer.resolve(true); fixture.detectChanges(); expect(fixture.debugElement.nativeElement).toHaveText('parent {deactivate cmp}'); } });
xhr.onload = function() { // responseText is the old-school way of retrieving response (supported by IE8 & 9) // response/responseType properties were introduced in XHR Level2 spec (supported by IE10) var response = isPresent(xhr.response) ? xhr.response : xhr.responseText; // normalize IE9 bug (http://bugs.jquery.com/ticket/1450) var status = xhr.status === 1223 ? 204 : xhr.status; // fix status code when it is 0 (0 status is undocumented). // Occurs when accessing file resources or on Android 4.1 stock browser // while retrieving files from application cache. if (status === 0) { status = response ? 200 : 0; } if (200 <= status && status <= 300) { completer.resolve(response); } else { completer.reject(`Failed to load ${url}`, null); } };