<!doctype html>
<html>
  <head>
    <title>
      Test Panner.setPosition and Panner.setOrientation Errors
    </title>
    <script src="../../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>
