c5bbb864f5
资源分页复用完整资源签名以识别同数量类别变化 补充同长度类别变化回归测试
86 lines
2.6 KiB
TypeScript
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,
|
|
});
|
|
});
|
|
});
|