<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/webxr_util.js"></script>
<script src="resources/webxr_test_constants_single_view.js"></script>
<script src="../../webxr/resources/webxr_test_asserts.js"></script>

<script>
let testName = "Test XRFrame.getJointPose where the hand has one missing joint pose";

let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE_WITH_HAND_TRACKING;

let testFunction = function(session, fakeDeviceController, t, sessionObjects) {

  let input_source = fakeDeviceController.simulateInputSourceConnection({
    handedness: "none",
    targetRayMode: "tracked-pointer",
    pointerOrigin: VALID_POINTER_TRANSFORM,
    profiles: [],
    handJoints: HAND_JOINTS_WITH_ONE_INVALID,
  });

  return session.requestReferenceSpace('local')
    .then((referenceSpace) => new Promise((resolve) => {

      function onFrame(time, xrFrame) {
        assert_not_equals(session.inputSources.length, 0);
        let hand = session.inputSources[0].hand
        assert_not_equals(hand, null);
        assert_equals(hand.size, JOINT_COUNT);

        let wristJointSpace = hand.get("wrist");
        assert_not_equals(wristJointSpace, null);
        assert_equals(xrFrame.getJointPose(wristJointSpace, referenceSpace), null);

        let pinkyTipJointSpace = hand.get("pinky-finger-tip");
        assert_not_equals(pinkyTipJointSpace, null);
        assert_equals(xrFrame.getJointPose(pinkyTipJointSpace, referenceSpace), null);

        resolve();
      }
      session.requestAnimationFrame(onFrame);
  }));
};

xr_session_promise_test(
  testName, testFunction, fakeDeviceInitParams, 'immersive-vr', { optionalFeatures: ["hand-tracking"] });

</script>
