'use strict';

const TestStates = Object.freeze({
  "ShouldSucceedScheduleRAF": 1,
  "ShouldFailScheduleRAF": 2,
  "ShouldSucceedTestDone": 3,
});

const dataUnavailableTestFunction = function(session, controller, t, sessionObjects) {
  let state = TestStates.ShouldSucceedScheduleRAF;
  const isCpuOptimized = session.depthUsage === 'cpu-optimized';

  return session.requestReferenceSpace('viewer').then((viewerSpace) => {
    let done = false;

    const glBinding = new XRWebGLBinding(session, sessionObjects.gl);

    const rafCb = function(time, frame) {
      const pose = frame.getViewerPose(viewerSpace);
      for(const view of pose.views) {
        const depthInformation = isCpuOptimized ? frame.getDepthInformation(view)
                                                : glBinding.getDepthInformation(view);

        if (state == TestStates.ShouldSucceedScheduleRAF
        || state == TestStates.ShouldSucceedTestDone) {
          t.step(() => {
            assert_not_equals(depthInformation, null);
          });
        } else {
          t.step(() => {
            assert_equals(depthInformation, null);
          });
        }
      }

      switch(state) {
        case TestStates.ShouldSucceedScheduleRAF:
          controller.clearDepthSensingData();
          state = TestStates.ShouldFailScheduleRAF;
          session.requestAnimationFrame(rafCb);
          break;
        case TestStates.ShouldFailScheduleRAF:
          controller.setDepthSensingData(DEPTH_SENSING_DATA);
          state = TestStates.ShouldSucceedTestDone;
          session.requestAnimationFrame(rafCb);
          break;
        case TestStates.ShouldSucceedTestDone:
          done = true;
          break;
      }
    };

    session.requestAnimationFrame(rafCb);

    return t.step_wait(() => done);
  });
};
