<!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.js"></script>
<canvas id="webgl-canvas"></canvas>

<script>
let testName = "XRSession attributes meet [SameObject] requirement";

let testFunction = function(session, fakeDeviceController, t) {
  return new Promise((resolve) => {
    let input_source = fakeDeviceController.simulateInputSourceConnection({
      handedness: "right",
      targetRayMode: "tracked-pointer",
      pointerOrigin: VALID_POINTER_TRANSFORM,
      gripOrigin: VALID_GRIP_TRANSFORM,
      profiles: ["foo", "bar"]
    });

    session.requestAnimationFrame((time, xrFrame) => {
      let renderState = session.renderState;
      let sources = session.inputSources;

      t.step(() => {
        assert_not_equals(renderState, null, "renderState must not be null.");
        assert_not_equals(sources, null, "inputSources must not be null.");

        // Make sure [SameObject] attributes actually have the same object
        // returned each time they are accessed.
        assert_equals(renderState, session.renderState,
          "XRSession.renderState returns the same object.");
        assert_equals(sources, session.inputSources,
          "XRSession.inputSources returns the same object.");
      });

      session.requestAnimationFrame((time, xrFrame) => {
        t.step(() => {
          // Make sure the attributes still return the same object on the next
          // frame.
          assert_equals(renderState, session.renderState,
            "XRSession.renderState returns the same object.");
          assert_equals(sources, session.inputSources,
            "XRSession.inputSources returns the same object.");
        });

        // Even though changing handedness on the input source should cause that
        // source to be re-created, it should not cause the entire
        // XRInputSourceArray object on XRSession to be re-created.
        input_source.setHandedness("left");
        session.requestAnimationFrame((time, xrFrame) => {
          t.step(() => {
            assert_equals(renderState, session.renderState,
              "XRSession.renderState returns the same object.");
            assert_equals(sources, session.inputSources,
              "XRSession.inputSources returns the same object.");
          });
          resolve();
        });
      });
    });
  });
};

xr_session_promise_test(
  testName, testFunction, TRACKED_IMMERSIVE_DEVICE, 'immersive-vr');
</script>
