Files
Genarrative/apps/ai-game-creator-shell/tests/resourceBookController.test.ts
T
suzmii 5bcaca7233 重构资源画本画布与转场状态
统一主画布与子画布的可见渲染层和 viewport 状态管理。

将子画布改为固定视口加无限平移 world,并保证首次 fit 的可读比例。

补充转场、滚轮、viewport 和资源画本回归测试,更新技术方案文档。
2026-09-05 09:10:56 +08:00

73 lines
2.0 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import {
createResourceBookTransitionController,
type ResourceBookTransitionClock,
} from '../src/view/project-development/resourceBookController';
function createClock() {
let nextId = 1;
const timers = new Map<number, () => void>();
const frames = new Map<number, () => void>();
const clock: ResourceBookTransitionClock = {
setTimeout(callback) {
const id = nextId++;
timers.set(id, callback);
return id;
},
clearTimeout(id) {
timers.delete(id);
},
requestAnimationFrame(callback) {
const id = nextId++;
frames.set(id, callback);
return id;
},
cancelAnimationFrame(id) {
frames.delete(id);
},
};
return {
clock,
runTimer() {
const callback = timers.values().next().value as (() => void) | undefined;
if (callback) {
callback();
}
},
runFrame() {
const callback = frames.values().next().value as (() => void) | undefined;
if (callback) {
callback();
}
},
};
}
describe('resource book transition controller', () => {
it('invalidates delayed callbacks when a newer transition begins', () => {
const fake = createClock();
const controller = createResourceBookTransitionController(fake.clock);
const firstToken = controller.begin();
const calls: number[] = [];
controller.schedule((token) => calls.push(token), 320, firstToken);
const secondToken = controller.begin();
fake.runTimer();
expect(calls).toEqual([]);
expect(controller.isCurrent(secondToken)).toBe(true);
});
it('cancels a pending frame on disposal', () => {
const fake = createClock();
const controller = createResourceBookTransitionController(fake.clock);
const token = controller.begin();
const calls: number[] = [];
controller.requestFrame((frameToken) => calls.push(frameToken), token);
controller.dispose();
fake.runFrame();
expect(calls).toEqual([]);
});
});