<!DOCTYPE html>
<html>
  <head>
    <title>
      Test the construction of AudioWorkletNode with real-time context
    </title>
    <script src="/resources/testharness.js"></script>
    <script src="/resources/testharnessreport.js"></script>
    <script src="/webaudio/resources/audit.js"></script>
  </head>
  <body>
    <script id="layout-test-code">
      const audit = Audit.createTaskRunner();
      const context = new AudioContext();

      setup(function () {
        context.audioWorklet.addModule(
          'processors/channel-count-processor.js').then(() => audit.run());

        // Test if the output channe count dynamically changes if the input
        // and output is 1.
        audit.define(
            {label: 'Dynamically change the channel count to if unspecified.'},
            (task, should) => {
              // Use arbitrary parameters for the test.
              const buffer = new AudioBuffer({
                numberOfChannels: 17,
                length: 1,
                sampleRate: context.sampleRate,
              });
              const source = new AudioBufferSourceNode(context);
              source.buffer = buffer;

              const node = new AudioWorkletNode(context, 'channel-count', {
                numberOfInputs: 1,
                numberOfOutputs: 1,
              });

              node.port.onmessage = (message) => {
                const expected = message.data;
                should(expected.outputChannel,
                       'The expected output channel count').beEqualTo(17);
                task.done();
              };

              // We need to make an actual connection becasue the channel count
              // change happen when the rendering starts. It is to test if the
              // channel count adapts to the upstream node correctly.
              source.connect(node).connect(context.destination);
              source.start();
            });

        // Test if outputChannelCount is honored as expected even if the input
        // and output is 1.
        audit.define(
            {label: 'Givien outputChannelCount must be honored.'},
            (task, should) => {
              const node = new AudioWorkletNode(
                  context, 'channel-count', {
                    numberOfInputs: 1,
                    numberOfOutputs: 1,
                    outputChannelCount: [2],
                  });

              node.port.onmessage = (message) => {
                const expected = message.data;
                should(expected.outputChannel,
                       'The expected output channel count').beEqualTo(2);
                task.done();
              };

              // We need to make an actual connection becasue the channel count
              // change might happen when the rendering starts. It is to test
              // if the specified channel count is kept correctly.
              node.connect(context.destination);
            });
      });
    </script>
  </body>
</html>
