mirror of
https://github.com/bilawalsidhu/gods-eye-view.git
synced 2026-11-04 10:24:02 +00:00
A listener could destroy the controller and re-subscribe one still pending in the snapshot, which then ran. Delivery now stops at destruction and a destroyed controller takes no listeners. Adds ordering tests for adds, duplicates and re-adds during delivery, and moves the current-state note after the section intro.
90 lines
2.6 KiB
JavaScript
90 lines
2.6 KiB
JavaScript
import test from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import { MapSourceController } from './controller.js';
|
|
function fixture() {
|
|
return new MapSourceController(
|
|
{
|
|
scene: {
|
|
globe: { show: true },
|
|
requestRender() {},
|
|
frameState: {
|
|
creditDisplay: { addStaticCredit() {}, removeStaticCredit() {} },
|
|
},
|
|
primitives: { add() {}, remove() {} },
|
|
},
|
|
imageryLayers: { add() {}, remove() {} },
|
|
},
|
|
{
|
|
registry: {
|
|
defaultId: 'fixture',
|
|
sources: [
|
|
{
|
|
descriptor: { id: 'fixture', label: 'Fixture', kind: 'imagery' },
|
|
imagery: async () => ({}),
|
|
},
|
|
],
|
|
},
|
|
createImageryLayer: (provider) => ({ provider }),
|
|
},
|
|
);
|
|
}
|
|
test('an unsubscribed owner is skipped in the same map settlement delivery', async () => {
|
|
const controller = fixture();
|
|
const calls = [];
|
|
let detach;
|
|
controller.subscribe(() => {
|
|
calls.push('first');
|
|
detach();
|
|
});
|
|
detach = controller.subscribe(() => calls.push('detached'));
|
|
controller.subscribe(() => calls.push('last'));
|
|
await controller.setStack('fixture');
|
|
assert.deepEqual(calls, ['first', 'last']);
|
|
controller.destroy();
|
|
});
|
|
test('destroying the controller during delivery stops remaining listeners', async () => {
|
|
const controller = fixture();
|
|
const calls = [];
|
|
controller.subscribe(() => {
|
|
calls.push('destroy');
|
|
controller.destroy();
|
|
});
|
|
controller.subscribe(() => calls.push('detached'));
|
|
await controller.setStack('fixture');
|
|
assert.deepEqual(calls, ['destroy']);
|
|
});
|
|
|
|
test('a listener re-added after destroy during delivery is not called', async () => {
|
|
const controller = fixture();
|
|
const calls = [];
|
|
const later = () => calls.push('later');
|
|
controller.subscribe(() => {
|
|
calls.push('destroy');
|
|
controller.destroy();
|
|
controller.subscribe(later);
|
|
});
|
|
controller.subscribe(later);
|
|
await controller.setStack('fixture');
|
|
assert.deepEqual(calls, ['destroy']);
|
|
});
|
|
|
|
test('delivery order: added during delivery waits, duplicates run once, re-added runs', async () => {
|
|
const controller = fixture();
|
|
const calls = [];
|
|
const twice = () => calls.push('twice');
|
|
const readded = () => calls.push('readded');
|
|
let offReadded;
|
|
controller.subscribe(() => {
|
|
calls.push('first');
|
|
controller.subscribe(() => calls.push('added-late'));
|
|
offReadded();
|
|
controller.subscribe(readded);
|
|
});
|
|
controller.subscribe(twice);
|
|
controller.subscribe(twice);
|
|
offReadded = controller.subscribe(readded);
|
|
await controller.setStack('fixture');
|
|
assert.deepEqual(calls, ['first', 'twice', 'readded']);
|
|
controller.destroy();
|
|
});
|