<!DOCTYPE html>
<html>
  <head>
    <title>
      OfflineAudioContext.startRendering Promise with oncomplete
    </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>
  </head>
  <body>
    <script id="layout-test-code">
      let audit = Audit.createTaskRunner();

      let context;
      let promise;
      let renderedData;
      let promiseData;

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

      function compareData(should) {
        // The spec implies that the same buffer is returned by both oncomplete
        // and the promise. Check that they are identical.

        should(
            renderedData === promiseData,
            'AudioBuffer returned by oncomplete and promise are identical')
            .beTrue();
      }

      function checkResult(task, should, event) {
        renderedData = event.renderedBuffer;
        promise.then(function(result) {
          promiseData = result;
          compareData(should);
          task.done();
        });
      }

      // Create an offline context and verify that both the oncomplete and
      // promise are returned with the same stuff.
      audit.define(
          {
            label: 'test',
            description:
                'OfflineAudioContext.startRendering Promise with oncomplete'
          },
          (task, should) => {
            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.oncomplete = (event) => {
              checkResult(task, should, event);
            };

            promise = context.startRendering();

          });

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