maplibre-gl
Version:
BSD licensed community fork of mapbox-gl, a WebGL interactive maps library
75 lines (66 loc) • 2.61 kB
text/typescript
import {describe, test, expect, vi} from 'vitest';
import {Actor} from './actor.ts';
import {Dispatcher} from './dispatcher.ts';
import {workerFactory} from './web_worker.ts';
import {WorkerPool} from './worker_pool.ts';
describe('Dispatcher', () => {
test('requests and releases workers from pool', async () => {
const workers = [await workerFactory(), await workerFactory()];
const mapId = 1;
const releaseCalled = [];
const workerPool = {
acquire () {
return Promise.resolve(workers);
},
release (id) {
releaseCalled.push(id);
}
} as any as WorkerPool;
const dispatcher = new Dispatcher(workerPool, mapId);
await dispatcher.actorsPromise;
expect(dispatcher.actors.map((actor) => actor.target)).toEqual(workers);
dispatcher.remove();
expect(dispatcher.actors).toHaveLength(0);
expect(releaseCalled).toEqual([mapId]);
});
test('reuse workers till map is disposed', async () => {
let workers = null;
const mapId = 1;
const releaseCalled = [];
const workerPool = {
async acquire () {
workers ||= [await workerFactory(), await workerFactory()];
return workers;
},
release (id) {
releaseCalled.push(id);
workers = null;
}
} as any as WorkerPool;
let dispatcher = new Dispatcher(workerPool, mapId);
await dispatcher.actorsPromise;
expect(dispatcher.actors.map((actor) => actor.target)).toEqual(workers);
dispatcher.remove(false);
expect(dispatcher.actors).toHaveLength(0);
expect(releaseCalled).toHaveLength(0);
dispatcher = new Dispatcher(workerPool, mapId);
await dispatcher.actorsPromise;
expect(dispatcher.actors.map((actor) => actor.target)).toEqual(workers);
dispatcher.remove(true);
expect(dispatcher.actors).toHaveLength(0);
expect(releaseCalled).toEqual([mapId]);
});
test('remove destroys actors', async () => {
const actorsRemoved = [];
const mapId = 1;
vi.spyOn(Actor.prototype, 'remove').mockImplementation(() => {
actorsRemoved.push(this);
});
WorkerPool.workerCount = 4;
const workerPool = new WorkerPool();
const dispatcher = new Dispatcher(workerPool, mapId);
await dispatcher.actorsPromise;
dispatcher.remove();
expect(actorsRemoved).toHaveLength(4);
});
});