import test from 'node:test'; import assert from 'node:assert/strict'; import { getPointerInputMode, rememberPointerInputMode, shouldUseHandPointer } from '../vr180player/xr/input-mode.js'; test('getPointerInputMode detects WebXR hand sources', () => { assert.equal(getPointerInputMode({ hand: {} }), 'hand'); assert.equal(getPointerInputMode({ profiles: ['generic-hand-tracking'] }), 'hand'); assert.equal(getPointerInputMode({ profiles: ['Oculus-Hand'] }), 'hand'); }); test('getPointerInputMode detects controller sources', () => { assert.equal(getPointerInputMode({ gamepad: {} }), 'controller'); assert.equal(getPointerInputMode({ targetRayMode: 'tracked-pointer' }), 'controller'); }); test('getPointerInputMode returns null for unknown or gaze-like sources', () => { assert.equal(getPointerInputMode(null), null); assert.equal(getPointerInputMode(undefined), null); assert.equal(getPointerInputMode({ profiles: ['generic-trigger'] }), null); assert.equal(getPointerInputMode({ targetRayMode: 'gaze' }), null); }); test('rememberPointerInputMode reads input sources from supported event shapes', () => { const fromNestedInputSource = {}; rememberPointerInputMode(fromNestedInputSource, { data: { inputSource: { hand: {} } } }, 'controller'); assert.equal(fromNestedInputSource.pointerInputMode, 'hand'); const fromDirectInputSource = {}; rememberPointerInputMode(fromDirectInputSource, { inputSource: { gamepad: {} } }, 'hand'); assert.equal(fromDirectInputSource.pointerInputMode, 'controller'); const fromDataSource = {}; rememberPointerInputMode(fromDataSource, { data: { targetRayMode: 'tracked-pointer' } }, 'hand'); assert.equal(fromDataSource.pointerInputMode, 'controller'); }); test('rememberPointerInputMode keeps fallback mode when the event is ambiguous', () => { const inputSource = { pointerInputMode: 'hand' }; rememberPointerInputMode(inputSource, { data: { targetRayMode: 'gaze' } }, 'controller'); assert.equal(inputSource.pointerInputMode, 'controller'); }); test('rememberPointerInputMode stores the input source on controller userData', () => { const inputSource = { controller: { userData: { existing: true } } }; rememberPointerInputMode(inputSource, { data: { inputSource: { hand: {} } } }, 'controller'); assert.equal(inputSource.pointerInputMode, 'hand'); assert.equal(inputSource.controller.userData.existing, true); assert.equal(inputSource.controller.userData.vrwpInputSource, inputSource); }); test('shouldUseHandPointer only enables the hand ray for remembered hand mode', () => { assert.equal(shouldUseHandPointer({ pointerInputMode: 'hand' }), true); assert.equal(shouldUseHandPointer({ pointerInputMode: 'controller' }), false); assert.equal(shouldUseHandPointer({}), false); assert.equal(shouldUseHandPointer(undefined), false); });