<!doctype html>
<html>
  <head>
    <title>
      Test AudioListener.setPosition and AudioListener.setOrientation Errors
    </title>
    <script src="../../imported/w3c/web-platform-tests/resources/testharness.js"></script>
    <script src="../../resources/testharnessreport.js"></script>
    <script src="../resources/audit-util.js"></script>
    <script src="../resources/audit.js"></script>
    <script src="../resources/set-position-vs-curve-test.js"></script>
  </head>
  <body>
    <script id="layout-test-code">
      // Fairly arbitrary rate
      let sampleRate = 16000;

      // For the tests we need to render for at least two render quanta.
      // Otherwise, pretty arbitrary.
      let renderFrames = 256;
      let renderDuration = renderFrames / sampleRate;

      // The curve duration for the test.  Anything less than one render quantum
      // is fine.  Arbitrarily choose something small.
      let curveDurationFrames = 8;
      let curveDuration = curveDurationFrames / sampleRate;

      // When to call setPosition, after the setValueCurve has ended.  Any value
      // after the end of the first render quantum is fine.
      let suspendFrame = 129;

      let audit = Audit.createTaskRunner();

      // Array of tests to do.  Each element of this array is used to create a
      // task to test the entry.
      let tests = [
        // Test |setPosition| against |positionX|, |positionY|, and |positionZ|
        // setValueCurves.  Include test where there's overlap and where there
        // isn't.
        {
          name: 'Listener setPosition X error',
          options: {paramName: 'positionX', curveDuration: renderDuration}
        },
        {
          name: 'Listener setPosition X no error',
          options: {
            paramName: 'positionX',
            curveDuration: curveDuration,
            suspendFrame: suspendFrame
          }
        },
        {
          name: 'Listener setPosition Y error',
          options: {paramName: 'positionY', curveDuration: renderDuration}
        },
        {
          name: 'Listener setPosition Y no error',
          options: {
            paramName: 'positionY',
            curveDuration: curveDuration,
            suspendFrame: suspendFrame
          }
        },
        {
          name: 'Listener setPosition Z error',
          options: {paramName: 'positionZ', curveDuration: renderDuration}
        },
        {
          name: 'Listener setPosition Z no error',
          options: {
            paramName: 'positionZ',
            curveDuration: curveDuration,
            suspendFrame: suspendFrame
          }
        },
        // Now do the same with |setOrientation|, for forward and up vectors.
        {
          name: 'Listener setOrientation forward X error',
          options: {paramName: 'forwardX', curveDuration: renderDuration}
        },
        {
          name: 'Listener setOrientation forward X no error',
          options: {
            paramName: 'forwardX',
            curveDuration: curveDuration,
            suspendFrame: suspendFrame
          }
        },
        {
          name: 'Listener setOrientation forward Y error',
          options: {paramName: 'forwardY', curveDuration: renderDuration}
        },
        {
          name: 'Listener setOrientation forward Y no error',
          options: {
            paramName: 'forwardY',
            curveDuration: curveDuration,
            suspendFrame: suspendFrame
          }
        },
        {
          name: 'Listener setOrientation forward Z error',
          options: {paramName: 'forwardZ', curveDuration: renderDuration}
        },
        {
          name: 'Listener setOrientation forward Z no error',
          options: {
            paramName: 'forwardZ',
            curveDuration: curveDuration,
            suspendFrame: suspendFrame
          }
        },
        {
          name: 'Listener setOrientation up X error',
          options: {paramName: 'upX', curveDuration: renderDuration}
        },
        {
          name: 'Listener setOrientation up X no error',
          options: {
            paramName: 'upX',
            curveDuration: curveDuration,
            suspendFrame: suspendFrame
          }
        },
        {
          name: 'Listener setOrientation up Y error',
          options: {paramName: 'upY', curveDuration: renderDuration}
        },
        {
          name: 'Listener setOrientation up Y no error',
          options: {
            paramName: 'upY',
            curveDuration: curveDuration,
            suspendFrame: suspendFrame
          }
        },
        {
          name: 'Listener setOrientation up Z error',
          options: {paramName: 'upZ', curveDuration: renderDuration}
        },
        {
          name: 'Listener setOrientation up Z no error',
          options: {
            paramName: 'upZ',
            curveDuration: curveDuration,
            suspendFrame: suspendFrame
          }
        },
      ];

      // Create an audit test for each entry in |tests|.
      tests.forEach(test => {
        audit.define(test.name, (task, should) => {
          let context = new OfflineAudioContext(1, renderFrames, sampleRate);
          testPositionSetterVsCurve(
              should, context,
              Object.assign(
                  {testName: test.name, nodeName: 'listener'}, test.options))
              .then(() => task.done());
        });
      });

      audit.run();
    </script>
  </body>
</html>
