<!DOCTYPE html>
<title>Test setValueAtTime with startTime in the past</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
function do_test(t, context) {
  var source = context.createBufferSource();
  source.buffer =
    function() {
      var buffer = context.createBuffer(1, 1, context.sampleRate);
      buffer.getChannelData(0)[0] = 1.0;
      return buffer;
    }();
  source.loop = true;
  source.start();

  // Use a ramp of slope 1/sample to measure time.
  // The end value is the extent of exact precision in single precision float.
  const rampEnd = Math.pow(2, 24);
  const rampEndSeconds = rampEnd / context.sampleRate;
  var test = context.createGain();
  test.gain.setValueAtTime(0.0, 0.0);
  test.gain.linearRampToValueAtTime(rampEnd, rampEndSeconds);

  // With a different starting point on the same line, the result should be
  // the same.  |currentTime| may include double precision floating point
  // rounding errors, so round to nearest integer sample to ignore these.
  var scheduledSample = Math.round(context.currentTime * context.sampleRate);
  assert_equals(scheduledSample % 128, 0,
                "currentTime advances in blocks of 128 samples");
  var reference = context.createGain();
  reference.gain.setValueAtTime(scheduledSample, context.currentTime);
  reference.gain.linearRampToValueAtTime(rampEnd, rampEndSeconds);

  source.connect(test);
  source.connect(reference);

  var merger = context.createChannelMerger();
  test.connect(merger, 0, 0);
  reference.connect(merger, 0, 1);

  var processor = context.createScriptProcessor(0, 2, 0);
  merger.connect(processor);
  processor.onaudioprocess =
    t.step_func_done((e) => {
      source.stop();
      processor.onaudioprocess = null;

      var testValue = e.inputBuffer.getChannelData(0)[0];
      var referenceValue = e.inputBuffer.getChannelData(1)[0];

      assert_equals(testValue, referenceValue,
                    "ramp value matches expected");
      assert_greater_than_equal(testValue, scheduledSample,
                                "time does not retreat");
      assert_equals(testValue % 128, 0,
                    "ScriptProcessor blocks align on 128-sample blocks");
    });
}

async_test(function(t) {
  var context = new AudioContext;
  (function waitForTimeAdvance() {
    if (context.currentTime == 0) {
      t.step_timeout(waitForTimeAdvance, 0);
    } else {
      do_test(t, context);
    }
  })();
});
</script>
