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

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

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

72 lines
2.0 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import {
createResourceCanvasPageWheelState,
queueResourceCanvasPageWheel,
resetResourceCanvasPageWheel,
takeResourceCanvasPageWheelStep,
} from '../src/view/project-development/resourceCanvasController';
describe('resource canvas page wheel controller', () => {
it('keeps the 20px threshold and converts wheel deltas into page steps', () => {
const state = createResourceCanvasPageWheelState<'document'>();
queueResourceCanvasPageWheel(state, {
deltaY: 10,
deltaMode: 0,
canvasHeight: 600,
maxQueuedSteps: 3,
});
expect(state.pendingStepCount).toBe(0);
queueResourceCanvasPageWheel(state, {
deltaY: 120,
deltaMode: 0,
canvasHeight: 600,
maxQueuedSteps: 3,
});
expect(takeResourceCanvasPageWheelStep(state, 1_000)).toMatchObject({
stepOffset: 1,
waitMs: 0,
});
});
it('reverses and clamps queued steps without leaking the old direction', () => {
const state = createResourceCanvasPageWheelState<'document'>();
queueResourceCanvasPageWheel(state, {
deltaY: 480,
deltaMode: 0,
canvasHeight: 600,
maxQueuedSteps: 2,
});
queueResourceCanvasPageWheel(state, {
deltaY: -120,
deltaMode: 0,
canvasHeight: 600,
maxQueuedSteps: 2,
});
expect(state.pendingStepCount).toBe(-1);
resetResourceCanvasPageWheel(state, 'document');
expect(state).toMatchObject({
activeCategory: 'document',
accumulatedDeltaY: 0,
pendingStepCount: 0,
pendingTimerId: null,
});
});
it('honors the 180ms switch interval for queued steps', () => {
const state = createResourceCanvasPageWheelState<'document'>();
state.pendingStepCount = 1;
state.lastSwitchAt = 900;
expect(takeResourceCanvasPageWheelStep(state, 1_000)).toEqual({
stepOffset: 0,
waitMs: 80,
});
expect(takeResourceCanvasPageWheelStep(state, 1_080)).toEqual({
stepOffset: 1,
waitMs: 0,
});
});
});