86 lines
2.3 KiB
TypeScript
86 lines
2.3 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
|
|
import {
|
|
applyChildMotionWarmupCompletion,
|
|
CHILD_MOTION_CENTER_X,
|
|
CHILD_MOTION_WARMUP_STEPS,
|
|
createEmptyChildMotionCalibration,
|
|
getChildMotionWarmupStep,
|
|
isAvatarOnWarmupTarget,
|
|
resolveNextChildMotionWarmupStep,
|
|
} from './childMotionWarmupModel';
|
|
|
|
describe('childMotionWarmupModel', () => {
|
|
it('keeps the confirmed warmup order as a strict state chain', () => {
|
|
expect(CHILD_MOTION_WARMUP_STEPS.map((step) => step.id)).toEqual([
|
|
'center_arrive',
|
|
'wave_greeting',
|
|
'warmup_intro',
|
|
'move_left',
|
|
'return_center_1',
|
|
'move_right',
|
|
'return_center_2',
|
|
'wave_left_hand',
|
|
'wave_right_hand',
|
|
'jump_once',
|
|
'warmup_finish',
|
|
'level_select',
|
|
'play_placeholder',
|
|
]);
|
|
expect(resolveNextChildMotionWarmupStep('center_arrive')).toBe(
|
|
'wave_greeting',
|
|
);
|
|
expect(resolveNextChildMotionWarmupStep('level_select')).toBe(
|
|
'play_placeholder',
|
|
);
|
|
});
|
|
|
|
it('checks position completion against the active green ring target', () => {
|
|
expect(
|
|
isAvatarOnWarmupTarget(
|
|
getChildMotionWarmupStep('center_arrive'),
|
|
CHILD_MOTION_CENTER_X,
|
|
),
|
|
).toBe(true);
|
|
expect(
|
|
isAvatarOnWarmupTarget(getChildMotionWarmupStep('move_left'), 0.66),
|
|
).toBe(false);
|
|
});
|
|
|
|
it('records session-only calibration values from completed steps', () => {
|
|
const empty = createEmptyChildMotionCalibration();
|
|
const withLeft = applyChildMotionWarmupCompletion('move_left', empty, {
|
|
type: 'position',
|
|
avatarX: 0.34,
|
|
});
|
|
const withRight = applyChildMotionWarmupCompletion('move_right', withLeft, {
|
|
type: 'position',
|
|
avatarX: 0.66,
|
|
});
|
|
const withLeftHand = applyChildMotionWarmupCompletion(
|
|
'wave_left_hand',
|
|
withRight,
|
|
{
|
|
type: 'left-hand',
|
|
path: [
|
|
{ x: 0.3, y: 0.4 },
|
|
{ x: 0.34, y: 0.32 },
|
|
],
|
|
},
|
|
);
|
|
const completed = applyChildMotionWarmupCompletion(
|
|
'jump_once',
|
|
withLeftHand,
|
|
{
|
|
type: 'jump',
|
|
jumpSpace: 0.14,
|
|
},
|
|
);
|
|
|
|
expect(completed.leftBoundary).toBeCloseTo(0.16);
|
|
expect(completed.rightBoundary).toBeCloseTo(0.16);
|
|
expect(completed.leftHandPath).toHaveLength(2);
|
|
expect(completed.jumpSpace).toBe(0.14);
|
|
});
|
|
});
|