<!doctype html>
<meta charset=utf-8>
<html>
  <head>
    <title>Test exponentialRampToValue with end time in the past</title>
    <script src=/resources/testharness.js></script>
    <script src=/resources/testharnessreport.js></script>
    <script src="/webaudio/resources/audit-util.js"></script>
    <script src="/webaudio/resources/audit.js"></script>
    <script src="retrospective-test.js"></script>
  </head>
  <body>
    <script>
      let audit = Audit.createTaskRunner();

      audit.define(
          {
            label: 'test',
            description: 'Test exponentialRampToValue with end time in the past'
          },
          (task, should) => {
            let {context, source, test, reference} = setupRetrospectiveGraph();

            // Suspend the context at this frame so we can synchronously set up
            // automations.
            const suspendFrame = 128;

            context.suspend(suspendFrame / context.sampleRate)
                .then(() => {
                  // Call setTargetAtTime with a time in the past
                  test.gain.exponentialRampToValueAtTime(
                      0.1, 0.5 * context.currentTime);
                  test.gain.exponentialRampToValueAtTime(0.9, 1.0);

                  reference.gain.exponentialRampToValueAtTime(
                      0.1, context.currentTime);
                  reference.gain.exponentialRampToValueAtTime(0.9, 1.0);
                })
                .then(() => context.resume());

            source.start();

            context.startRendering()
                .then(resultBuffer => {
                  let testValue = resultBuffer.getChannelData(0);
                  let referenceValue = resultBuffer.getChannelData(1);

                  // Until the suspendFrame, both should be exactly equal to 1.
                  should(
                      testValue.slice(0, suspendFrame),
                      `Test[0:${suspendFrame - 1}]`)
                      .beConstantValueOf(1);
                  should(
                      referenceValue.slice(0, suspendFrame),
                      `Reference[0:${suspendFrame - 1}]`)
                      .beConstantValueOf(1);

                  // After the suspendFrame, both should be equal (and not
                  // constant)
                  should(
                      testValue.slice(suspendFrame), `Test[${suspendFrame}:]`)
                      .beEqualToArray(referenceValue.slice(suspendFrame));
                })
                .then(() => task.done());
          });

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