5bcaca7233
统一主画布与子画布的可见渲染层和 viewport 状态管理。 将子画布改为固定视口加无限平移 world,并保证首次 fit 的可读比例。 补充转场、滚轮、viewport 和资源画本回归测试,更新技术方案文档。
73 lines
2.0 KiB
TypeScript
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([]);
|
|
});
|
|
});
|