<!doctype html>
<html>
  <head>
    <title>Test DelayNode Delay</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>
  </head>

  <body>
    <script>
      let audit = Audit.createTaskRunner();

      audit.define(
          {label: 'test0', description: 'Test delay of 3 frames'},
          async (task, should) => {
            // Only need a few outputs samples.  The sample rate is arbitrary.
            const context =
                new OfflineAudioContext(1, RENDER_QUANTUM_FRAMES, 8192);
            let src;
            let delay;

            should(
                () => {
                  src = new ConstantSourceNode(context);
                  delay = new DelayNode(context);
                },
                'Creating ConstantSourceNode(context) and DelayNode(context)')
                .notThrow();

            // The number of frames to delay for the DelayNode.  Should be a
            // whole number, but is otherwise arbitrary.
            const delayFrames = 3;

            should(() => {
              delay.delayTime.value = delayFrames / context.sampleRate;
            }, `Setting delayTime to ${delayFrames} frames`).notThrow();

            src.connect(delay).connect(context.destination);

            src.start();

            let buffer = await context.startRendering();
            let output = buffer.getChannelData(0);

            // Verify output was delayed the correct number of frames.
            should(output.slice(0, delayFrames), `output[0:${delayFrames - 1}]`)
                .beConstantValueOf(0);
            should(
                output.slice(delayFrames),
                `output[${delayFrames}:${output.length - 1}]`)
                .beConstantValueOf(1);

            task.done();
          });

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