<!DOCTYPE html>
<html>
  <head>
    <title>
      OfflineAudioContext.startRendering Promise
    </title>
    <script src="../../imported/w3c/web-platform-tests/resources/testharness.js"></script>
    <script src="../../resources/testharnessreport.js"></script>
    <script src="../resources/audit.js"></script>
  </head>
  <body>
    <script id="layout-test-code">
      let context;
      let promiseData;

      let sampleRate = 48000;
      let renderSeconds = 1;
      let renderFrames = sampleRate * renderSeconds;
      let contextChannels = 2;

      let audit = Audit.createTaskRunner();

      audit.define('reject-promise', (task, should) => {
        // Create a context and verify that calling startRendering more than
        // once causes a rejected promise.
        let context =
            new OfflineAudioContext(contextChannels, renderFrames, sampleRate);
        context.startRendering();
        should(
            context.startRendering(),
            'Promise from calling startRendering twice')
            .beRejected()
            .then(() => task.done());
      });

      audit.define('promise-results', (task, should) => {
        // Create an offline context and verify that buffer returned by the
        // promise matches the expected results.
        context =
            new OfflineAudioContext(contextChannels, renderFrames, sampleRate);

        let buffer =
            context.createBuffer(contextChannels, renderFrames, sampleRate);
        for (let k = 0; k < renderFrames; ++k) {
          buffer.getChannelData(0)[k] = 1;
          buffer.getChannelData(1)[k] = 2;
        }

        let source = context.createBufferSource();
        source.buffer = buffer;
        source.connect(context.destination);
        source.start();

        context.startRendering()
            .then(buffer => {
              return handlePromise(should, buffer);
            })
            .then(() => task.done());
      });

      audit.run();

      function handlePromise(should, renderedData) {
        should(context.state, 'context.state').beEqualTo('closed');
        should(renderedData.numberOfChannels, 'renderedData.numberOfChannels')
            .beEqualTo(contextChannels);
        should(renderedData.length, 'renderedData.length')
            .beEqualTo(renderFrames);

        for (let channel = 0; channel < renderedData.numberOfChannels;
             ++channel) {
          should(
              renderedData.getChannelData(channel), `Output channel ${channel}`)
              .beConstantValueOf(channel + 1);
        }
      }
    </script>
  </body>
</html>
