<!DOCTYPE html>
<html>
  <head>
    <title>
      Test statechange event
    </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 secondsToRender = 2;
      let sampleRate = 48000;

      let stateChangeCount = 0;
      let context;
      let contextState;

      function checkStateChange(e, should) {
        contextState = e.currentTarget.state;

        switch (stateChangeCount) {
          case 0:
            should(contextState, 'context.state').beEqualTo('running');
            break;
          case 1:
            should(contextState, 'context.state').beEqualTo('closed');
            break;
          default:
            should(stateChangeCount, 'Number of state changes')
                .beLessThanOrEqualTo(2)
        }
        ++stateChangeCount;
      }

      function finalCheck(should) {
        // Final check that we got the right number of state changes and the
        // correct final state.
        should(stateChangeCount, 'stateChangeCount').beEqualTo(2);
        should(context.state, 'After rendering context.state')
            .beEqualTo('closed');
      }

      audit.define(
          {label: 'test', description: 'Signaling of statechange event'},
          (task, should) => {
            // Create an offline context with a source passing through a
            // convolver.  The convolver is just to waste some time.
            context = new OfflineAudioContext(
                1, secondsToRender * sampleRate, sampleRate);
            let buffer = createImpulseBuffer(context, sampleRate);
            let source = context.createBufferSource();
            let conv = context.createConvolver();

            source.buffer = buffer;
            conv.normalize = false;
            conv.buffer = buffer;

            source.connect(conv);
            conv.connect(context.destination);

            source.start();

            context.onstatechange = (event) => checkStateChange(event, should);

            should(context.startRendering(), 'Context rendering').beResolved();

            // Don't want to set an oncomplete for the context and don't want to
            // use the promise because the order of the state change event and
            // resolving the promise is not specified.  Thus, just wait for a
            // bit and then finish the test.  We assume the offline context runs
            // faster than realtime.
            setTimeout(() => {
              finalCheck(should);
              task.done();
            }, secondsToRender * 1000);
          });

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