@ -8,7 +8,7 @@
|
||||
|
||||
import {NgZone} from '@angular/core';
|
||||
import {withModule} from '@angular/core/testing/src/test_bed';
|
||||
import {AsyncTestCompleter, MockNgZone, beforeEach, describe, expect, inject, it} from '@angular/core/testing/src/testing_internal';
|
||||
import {AsyncTestCompleter, beforeEach, describe, expect, inject, it, MockNgZone} from '@angular/core/testing/src/testing_internal';
|
||||
import {MessageBus} from '@angular/platform-webworker/src/web_workers/shared/message_bus';
|
||||
|
||||
import {createConnectedMessageBus} from './message_bus_util';
|
||||
@ -20,7 +20,9 @@ import {createConnectedMessageBus} from './message_bus_util';
|
||||
describe('MessageBus', () => {
|
||||
let bus: MessageBus;
|
||||
|
||||
beforeEach(() => { bus = createConnectedMessageBus(); });
|
||||
beforeEach(() => {
|
||||
bus = createConnectedMessageBus();
|
||||
});
|
||||
|
||||
it('should pass messages in the same channel from sink to source',
|
||||
inject([AsyncTestCompleter], (async: AsyncTestCompleter) => {
|
||||
@ -115,7 +117,9 @@ import {createConnectedMessageBus} from './message_bus_util';
|
||||
* Flushes pending messages and then runs the given function.
|
||||
*/
|
||||
// TODO(mlaval): timeout is fragile, test to be rewritten
|
||||
function flushMessages(fn: () => void) { setTimeout(fn, 50); }
|
||||
function flushMessages(fn: () => void) {
|
||||
setTimeout(fn, 50);
|
||||
}
|
||||
|
||||
it('should buffer messages and wait for the zone to exit before sending',
|
||||
withModule({providers: [{provide: NgZone, useClass: MockNgZone}]})
|
||||
@ -126,7 +130,11 @@ import {createConnectedMessageBus} from './message_bus_util';
|
||||
setup(true, zone);
|
||||
|
||||
let wasCalled = false;
|
||||
bus.from(CHANNEL).subscribe({next: (message: any) => { wasCalled = true; }});
|
||||
bus.from(CHANNEL).subscribe({
|
||||
next: (message: any) => {
|
||||
wasCalled = true;
|
||||
}
|
||||
});
|
||||
bus.to(CHANNEL).emit('hi');
|
||||
|
||||
|
||||
@ -148,7 +156,11 @@ import {createConnectedMessageBus} from './message_bus_util';
|
||||
setup(false, zone);
|
||||
|
||||
let wasCalled = false;
|
||||
bus.from(CHANNEL).subscribe({next: (message: any) => { wasCalled = true; }});
|
||||
bus.from(CHANNEL).subscribe({
|
||||
next: (message: any) => {
|
||||
wasCalled = true;
|
||||
}
|
||||
});
|
||||
bus.to(CHANNEL).emit('hi');
|
||||
|
||||
flushMessages(() => {
|
||||
|
@ -24,7 +24,7 @@ export function createConnectedMessageBus(): MessageBus {
|
||||
|
||||
class MockPostMessage {
|
||||
// TODO(issue/24571): remove '!'.
|
||||
private _listener !: EventListener;
|
||||
private _listener!: EventListener;
|
||||
|
||||
addEventListener(type: string, listener: EventListener, useCapture?: boolean): void {
|
||||
if (type === 'message') {
|
||||
@ -32,5 +32,7 @@ class MockPostMessage {
|
||||
}
|
||||
}
|
||||
|
||||
postMessage(data: any, transfer?: [Transferable]): void { this._listener(<any>{data: data}); }
|
||||
postMessage(data: any, transfer?: [Transferable]): void {
|
||||
this._listener(<any>{data: data});
|
||||
}
|
||||
}
|
||||
|
@ -11,14 +11,18 @@ import {EventEmitter} from '@angular/core';
|
||||
export class MockEventEmitter<T> extends EventEmitter<T> {
|
||||
private _nextFns: Function[] = [];
|
||||
|
||||
constructor() { super(); }
|
||||
constructor() {
|
||||
super();
|
||||
}
|
||||
|
||||
subscribe(generator: any): any {
|
||||
this._nextFns.push(generator.next);
|
||||
return new MockDisposable();
|
||||
}
|
||||
|
||||
emit(value: any) { this._nextFns.forEach(fn => fn(value)); }
|
||||
emit(value: any) {
|
||||
this._nextFns.forEach(fn => fn(value));
|
||||
}
|
||||
}
|
||||
|
||||
class MockDisposable {
|
||||
|
@ -11,7 +11,9 @@ import {RenderStore} from '@angular/platform-webworker/src/web_workers/shared/re
|
||||
{
|
||||
describe('RenderStoreSpec', () => {
|
||||
let store: RenderStore;
|
||||
beforeEach(() => { store = new RenderStore(); });
|
||||
beforeEach(() => {
|
||||
store = new RenderStore();
|
||||
});
|
||||
|
||||
it('should allocate ids', () => {
|
||||
expect(store.allocateId()).toBe(0);
|
||||
@ -31,6 +33,5 @@ import {RenderStore} from '@angular/platform-webworker/src/web_workers/shared/re
|
||||
store.store(obj, id);
|
||||
expect(store.deserialize(id)).toBe(obj);
|
||||
});
|
||||
|
||||
});
|
||||
}
|
||||
|
@ -44,12 +44,14 @@ export function expectBrokerCall(
|
||||
broker.spy('runOnService').and.callFake((args: UiArguments, returnType: Type<any>) => {
|
||||
expect(args.method).toEqual(methodName);
|
||||
if (vals != null) {
|
||||
expect(args.args !.length).toEqual(vals.length);
|
||||
vals.forEach((v, i) => { expect(v).toEqual(args.args ![i].value); });
|
||||
expect(args.args!.length).toEqual(vals.length);
|
||||
vals.forEach((v, i) => {
|
||||
expect(v).toEqual(args.args![i].value);
|
||||
});
|
||||
}
|
||||
let promise: Promise<any>|void = null !;
|
||||
let promise: Promise<any>|void = null!;
|
||||
if (handler != null) {
|
||||
const givenValues = args.args !.map((arg) => arg.value);
|
||||
const givenValues = args.args!.map((arg) => arg.value);
|
||||
if (givenValues.length > 0) {
|
||||
promise = handler(givenValues);
|
||||
} else {
|
||||
@ -116,16 +118,22 @@ export class MockMessageBusSink implements MessageBusSink {
|
||||
* Runs syncronously, and does not support running within the zone.
|
||||
*/
|
||||
export class MockMessageBus extends MessageBus {
|
||||
constructor(public sink: MockMessageBusSink, public source: MockMessageBusSource) { super(); }
|
||||
constructor(public sink: MockMessageBusSink, public source: MockMessageBusSource) {
|
||||
super();
|
||||
}
|
||||
|
||||
initChannel(channel: string, runInZone = true) {
|
||||
this.sink.initChannel(channel, runInZone);
|
||||
this.source.initChannel(channel, runInZone);
|
||||
}
|
||||
|
||||
to(channel: string): MockEventEmitter<any> { return this.sink.to(channel); }
|
||||
to(channel: string): MockEventEmitter<any> {
|
||||
return this.sink.to(channel);
|
||||
}
|
||||
|
||||
from(channel: string): MockEventEmitter<any> { return this.source.from(channel); }
|
||||
from(channel: string): MockEventEmitter<any> {
|
||||
return this.source.from(channel);
|
||||
}
|
||||
|
||||
attachToZone(zone: NgZone) {}
|
||||
}
|
||||
@ -133,6 +141,10 @@ export class MockMessageBus extends MessageBus {
|
||||
export const _ClientMessageBrokerFactory: {new (a: any, b: any): ClientMessageBrokerFactory} =
|
||||
ClientMessageBrokerFactory;
|
||||
export class MockMessageBrokerFactory extends _ClientMessageBrokerFactory {
|
||||
constructor(private _messageBroker: ClientMessageBroker) { super(null !, null !); }
|
||||
createMessageBroker(channel: string, runInZone = true) { return this._messageBroker; }
|
||||
constructor(private _messageBroker: ClientMessageBroker) {
|
||||
super(null!, null!);
|
||||
}
|
||||
createMessageBroker(channel: string, runInZone = true) {
|
||||
return this._messageBroker;
|
||||
}
|
||||
}
|
||||
|
@ -12,14 +12,14 @@ import {MessageBus} from '@angular/platform-webworker/src/web_workers/shared/mes
|
||||
import {LocationType, SerializerTypes} from '@angular/platform-webworker/src/web_workers/shared/serializer';
|
||||
import {WebWorkerPlatformLocation} from '@angular/platform-webworker/src/web_workers/worker/platform_location';
|
||||
|
||||
import {MockMessageBrokerFactory, createPairedMessageBuses, expectBrokerCall} from '../shared/web_worker_test_util';
|
||||
import {createPairedMessageBuses, expectBrokerCall, MockMessageBrokerFactory} from '../shared/web_worker_test_util';
|
||||
|
||||
import {SpyMessageBroker} from './spies';
|
||||
|
||||
{
|
||||
describe('WebWorkerPlatformLocation', () => {
|
||||
let uiBus: MessageBus = null !;
|
||||
let workerBus: MessageBus = null !;
|
||||
let uiBus: MessageBus = null!;
|
||||
let workerBus: MessageBus = null!;
|
||||
let broker: any = null;
|
||||
|
||||
const TEST_LOCATION = new LocationType(
|
||||
@ -29,17 +29,17 @@ import {SpyMessageBroker} from './spies';
|
||||
|
||||
function createWebWorkerPlatformLocation(loc: LocationType): WebWorkerPlatformLocation {
|
||||
broker.spy('runOnService')
|
||||
.and.callFake((args: UiArguments, returnType: Type<any>| SerializerTypes) => {
|
||||
.and.callFake((args: UiArguments, returnType: Type<any>|SerializerTypes) => {
|
||||
if (args.method === 'getLocation') {
|
||||
return Promise.resolve(loc);
|
||||
}
|
||||
});
|
||||
const factory = new MockMessageBrokerFactory(broker);
|
||||
return new WebWorkerPlatformLocation(factory, workerBus, null !);
|
||||
return new WebWorkerPlatformLocation(factory, workerBus, null!);
|
||||
}
|
||||
|
||||
function testPushOrReplaceState(pushState: boolean) {
|
||||
const platformLocation = createWebWorkerPlatformLocation(null !);
|
||||
const platformLocation = createWebWorkerPlatformLocation(null!);
|
||||
const TITLE = 'foo';
|
||||
const URL = 'http://www.example.com/foo';
|
||||
expectBrokerCall(broker, pushState ? 'pushState' : 'replaceState', [null, TITLE, URL]);
|
||||
@ -60,18 +60,18 @@ import {SpyMessageBroker} from './spies';
|
||||
});
|
||||
|
||||
it('should throw if getBaseHrefFromDOM is called', () => {
|
||||
const platformLocation = createWebWorkerPlatformLocation(null !);
|
||||
const platformLocation = createWebWorkerPlatformLocation(null!);
|
||||
expect(() => platformLocation.getBaseHrefFromDOM()).toThrowError();
|
||||
});
|
||||
|
||||
it('should get location on init', () => {
|
||||
const platformLocation = createWebWorkerPlatformLocation(null !);
|
||||
const platformLocation = createWebWorkerPlatformLocation(null!);
|
||||
expectBrokerCall(broker, 'getLocation');
|
||||
(platformLocation as any).init();
|
||||
});
|
||||
|
||||
it('should throw if set pathname is called before init finishes', () => {
|
||||
const platformLocation = createWebWorkerPlatformLocation(null !);
|
||||
const platformLocation = createWebWorkerPlatformLocation(null!);
|
||||
(platformLocation as any).init();
|
||||
expect(() => platformLocation.pathname = 'TEST').toThrowError();
|
||||
});
|
||||
@ -86,8 +86,12 @@ import {SpyMessageBroker} from './spies';
|
||||
});
|
||||
});
|
||||
|
||||
it('should send pushState to render thread', () => { testPushOrReplaceState(true); });
|
||||
it('should send pushState to render thread', () => {
|
||||
testPushOrReplaceState(true);
|
||||
});
|
||||
|
||||
it('should send replaceState to render thread', () => { testPushOrReplaceState(false); });
|
||||
it('should send replaceState to render thread', () => {
|
||||
testPushOrReplaceState(false);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
@ -7,7 +7,7 @@
|
||||
*/
|
||||
|
||||
import {ɵgetDOM as getDOM} from '@angular/common';
|
||||
import {Component, ComponentRef, Renderer2, RendererFactory2, RendererType2, destroyPlatform} from '@angular/core';
|
||||
import {Component, ComponentRef, destroyPlatform, Renderer2, RendererFactory2, RendererType2} from '@angular/core';
|
||||
import {TestBed} from '@angular/core/testing';
|
||||
import {platformBrowserDynamicTesting} from '@angular/platform-browser-dynamic/testing';
|
||||
import {DomRendererFactory2} from '@angular/platform-browser/src/dom/dom_renderer';
|
||||
@ -22,7 +22,7 @@ import {MessageBasedRenderer2} from '@angular/platform-webworker/src/web_workers
|
||||
import {WebWorkerRendererFactory2} from '@angular/platform-webworker/src/web_workers/worker/renderer';
|
||||
import {modifiedInIvy} from '@angular/private/testing';
|
||||
|
||||
import {PairedMessageBuses, createPairedMessageBuses} from '../shared/web_worker_test_util';
|
||||
import {createPairedMessageBuses, PairedMessageBuses} from '../shared/web_worker_test_util';
|
||||
|
||||
let lastCreatedRenderer: Renderer2;
|
||||
|
||||
@ -58,7 +58,7 @@ let lastCreatedRenderer: Renderer2;
|
||||
const domRendererFactory = uiInjector.get(RendererFactory2);
|
||||
|
||||
// Worker side
|
||||
lastCreatedRenderer = null !;
|
||||
lastCreatedRenderer = null!;
|
||||
|
||||
wwRenderStore = new RenderStore();
|
||||
|
||||
@ -69,9 +69,8 @@ let lastCreatedRenderer: Renderer2;
|
||||
{provide: RenderStore, useValue: wwRenderStore},
|
||||
{
|
||||
provide: RendererFactory2,
|
||||
useFactory:
|
||||
(wwSerializer: Serializer) => createWebWorkerRendererFactory2(
|
||||
wwSerializer, uiSerializer, domRendererFactory, uiRenderStore, wwRenderStore),
|
||||
useFactory: (wwSerializer: Serializer) => createWebWorkerRendererFactory2(
|
||||
wwSerializer, uiSerializer, domRendererFactory, uiRenderStore, wwRenderStore),
|
||||
deps: [Serializer],
|
||||
},
|
||||
],
|
||||
@ -79,7 +78,7 @@ let lastCreatedRenderer: Renderer2;
|
||||
});
|
||||
|
||||
function getRenderElement(workerEl: any): any {
|
||||
const id = wwRenderStore.serialize(workerEl) !;
|
||||
const id = wwRenderStore.serialize(workerEl)!;
|
||||
return uiRenderStore.deserialize(id);
|
||||
}
|
||||
|
||||
|
@ -10,5 +10,7 @@ import {SpyObject} from '@angular/core/testing/src/testing_internal';
|
||||
import {ClientMessageBroker} from '@angular/platform-webworker/src/web_workers/shared/client_message_broker';
|
||||
|
||||
export class SpyMessageBroker extends SpyObject {
|
||||
constructor() { super(ClientMessageBroker); }
|
||||
constructor() {
|
||||
super(ClientMessageBroker);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user