<!doctype html>
<html>
  <head>
    <script src="../resources/js-test.js"></script>
    <script src="resources/compatibility.js"></script>
    <script src="resources/audio-testing.js"></script>
  </head>

  <body>
    <script>
      description('Test OfflineAudioContext.resume() and OfflineAudioContext.suspend() with the timed sequence.');
      window.jsTestIsAsync = true;

      var context;

      // The sample rate is multiple of the rendering quantum, so suspension
      // times fall in to the render quantum boundary.
      var renderQuantum = 128;

      var sampleRate = renderQuantum * 100;
      var renderDuration = 2;

      // These numbers are in an arbitrary order, but not randomly generated in
      // runtime to avoid moving pieces. However, it is safe to arrange them
      // in a random order in runtime.
      //
      // Also these numbers are multiple of 0.25, so they are supposed to fall
      // in the render quantum boundary for easier and more intuitive
      // verification.
      var suspendTimes = [0.25, 0.75, 1.0, 0.5, 1.25, 0.0, 1.75];

      // Sorted ascending suspend time is our expected result.
      var expectedSuspendTimes = suspendTimes.slice(0).sort(function (a, b) {
        return a - b;
      });

      var actualSuspendTimes = [];

      context = new OfflineAudioContext(1, sampleRate * renderDuration, sampleRate);

      for (var i = 0; i < suspendTimes.length; i++) {

        // Schedule suspends in a random time order, but the actual suspend
        // must happen in ascending time order.
        scheduleSuspend(i, suspendTimes[i]);

      }

      function scheduleSuspend(index, suspendTime) {
        testPassed('Scheduling suspend #' + index + ' at ' + suspendTime + ' second(s).');
        context.suspend(suspendTime).then(function () {
          actualSuspendTimes.push(suspendTime);
          context.resume();
        })
      }

      function verifyResult() {

        for (var i = 0; i < actualSuspendTimes.length; i++) {
          var scheduledOrder = suspendTimes.indexOf(actualSuspendTimes[i]);
          var expectedOrder = expectedSuspendTimes.indexOf(actualSuspendTimes[i]);

          if (i === expectedOrder) {
            testPassed('The resolution order of suspend #' + scheduledOrder +
              ' is ' + i + ' at ' + suspendTimes[scheduledOrder].toFixed(2) +
              ' second(s).');
          }
        }
      }

      context.startRendering().then(verifyResult).then(finishJSTest);

      successfullyParsed = true;
    </script>

  </body>
</html>
