Files
Genarrative/apps/ai-game-creator-shell/tests/resourceCanvasController.test.ts
T
suzmii c5bbb864f5 修复资源分页类别缓存回归
资源分页复用完整资源签名以识别同数量类别变化

补充同长度类别变化回归测试
2026-09-07 16:26:08 +08:00

86 lines
2.6 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import {
createResourceCanvasPageCategorySignature,
createResourceCanvasPageWheelState,
queueResourceCanvasPageWheel,
resetResourceCanvasPageWheel,
takeResourceCanvasPageWheelStep,
} from '../src/view/project-development/resourceCanvasController';
describe('resource canvas page wheel controller', () => {
it('invalidates page categories for same-count category changes without reacting to resource order', () => {
const original = [{ category: 'document' }, { category: 'art' }];
const reordered = [...original].reverse();
const changed = [{ category: 'document' }, { category: 'audio' }];
expect(createResourceCanvasPageCategorySignature(reordered)).toBe(
createResourceCanvasPageCategorySignature(original),
);
expect(createResourceCanvasPageCategorySignature(changed)).not.toBe(
createResourceCanvasPageCategorySignature(original),
);
});
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,
});
});
});