<!doctype html>
<html>
  <head>
    <title>
      Test Panner.setPosition and Panner.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: 'Panner setPosition X error',
          options: {paramName: 'positionX', curveDuration: renderDuration}
        },
        {
          name: 'Panner setPosition X no error',
          options: {
            paramName: 'positionX',
            curveDuration: curveDuration,
            suspendFrame: suspendFrame
          }
        },
        {
          name: 'Panner setPosition Y error',
          options: {paramName: 'positionY', curveDuration: renderDuration}
        },
        {
          name: 'Panner setPosition Y no error',
          options: {
            paramName: 'positionY',
            curveDuration: curveDuration,
            suspendFrame: suspendFrame
          }
        },
        {
          name: 'Panner setPosition Z error',
          options: {paramName: 'positionZ', curveDuration: renderDuration}
        },
        {
          name: 'Panner setPosition Z no error',
          options: {
            paramName: 'positionZ',
            curveDuration: curveDuration,
            suspendFrame: suspendFrame
          }
        },
        // Now do the same with setOrientation.
        {
          name: 'Panner setOrientation X error',
          options: {paramName: 'orientationX', curveDuration: renderDuration}
        },
        {
          name: 'Panner setOrientation X no error',
          options: {
            paramName: 'orientationX',
            curveDuration: curveDuration,
            suspendFrame: suspendFrame
          }
        },
        {
          name: 'Panner setOrientation Y error',
          options: {paramName: 'orientationY', curveDuration: renderDuration}
        },
        {
          name: 'Panner setOrientation Y no error',
          options: {
            paramName: 'orientationY',
            curveDuration: curveDuration,
            suspendFrame: suspendFrame
          }
        },
        {
          name: 'Panner setOrientation Z error',
          options: {paramName: 'orientationZ', curveDuration: renderDuration}
        },
        {
          name: 'Panner setOrientation Z no error',
          options: {
            paramName: 'orientationZ',
            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: 'panner'}, test.options))
              .then(() => task.done());
        });
      });

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