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); }); });