<!DOCTYPE html>
<html>

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

<body>
  <script>
    description('Test input handling behavior of ChannelMergerNode.');
    window.jsTestIsAsync = true;

    var audit = Audit.createTaskRunner();

    // Task: Check if an inactive input renders a silent mono channel in the
    // output.
    audit.defineTask('silent-channel', function (done) {
      testMergerInput({
        numberOfChannels: 6,
        
        // Create a mono source buffer filled with '1'.
        testBufferChannelCount: 1,

        // Connect the output of source into the 4th input of merger.
        mergerInputIndex: 3,

        // All channels should contain 0, except channel 4 which should be 1.
        expected: [0, 0, 0, 1, 0, 0],
      }, done);
    });


    // Task: Check if a stereo input is being down-mixed to mono channel
    // correctly based on the mixing rule.
    audit.defineTask('stereo-down-mixing', function (done) {
      testMergerInput({
        numberOfChannels: 6,
        
        // Create a stereo buffer filled with '1' and '2' for left and right
        // channels respectively.
        testBufferChannelCount: 2,

        // Connect the output of source into the 1st input of merger.
        mergerInputIndex: undefined,

        // The result of summed and down-mixed stereo audio should be 1.5.
        // (= 1 * 0.5 + 2 * 0.5)
        expected: [1.5, 0, 0, 0, 0, 0],
      }, done);
    });


    // Task: Check if 3-channel input gets processed by the 'discrete' mixing
    // rule.
    audit.defineTask('undefined-channel-layout', function (done) {
      testMergerInput({
        numberOfChannels: 6,
        
        // Create a 3-channel buffer filled with '1', '2', and '3' respectively.
        testBufferChannelCount: 3,

        // Connect the output of source into the 1st input of merger.
        mergerInputIndex: undefined,

        // The result of summed stereo audio should be 1 because 3-channel is
        // not a canonical layout, so the input channel 2 and 3 should be 
        // dropped by 'discrete' mixing rule.
        expected: [1, 0, 0, 0, 0, 0],
      }, done);
    });


    // Task: Merging two inputs into a single stereo stream.
    audit.defineTask('merging-to-stereo', function (done) {

      // For this test, the number of channel should be 2.
      var context = new OfflineAudioContext(2, 128, 44100);
      var merger = context.createChannelMerger();
      var source1 = context.createBufferSource();
      var source2 = context.createBufferSource();

      // Create a DC offset buffer (mono) filled with 1 and assign it to BS
      // nodes.
      var positiveDCOffset = createConstantBuffer(context, 128, 1);
      var negativeDCOffset = createConstantBuffer(context, 128, -1);
      source1.buffer = positiveDCOffset;
      source2.buffer = negativeDCOffset;

      // Connect: BS#1 => merger_input#0, BS#2 => Inverter => merger_input#1
      source1.connect(merger, 0, 0);
      source2.connect(merger, 0, 1);
      merger.connect(context.destination);
      source1.start();
      source2.start();

      context.startRendering().then(function (buffer) {
        
        // Channel#0 = 1, Channel#1 = -1
        Should('Channel #0', buffer.getChannelData(0)).beConstantValueOf(1);
        Should('Channel #1', buffer.getChannelData(1)).beConstantValueOf(-1);

        done();
      });
    });


    audit.defineTask('finish', function (done) {
      finishJSTest();
      done();
    });

    audit.runTasks(
      'silent-channel',
      'stereo-down-mixing',
      'undefined-channel-layout',
      'merging-to-stereo',
      'finish'
    );

    successfullyParsed = true;
  </script>
</body>

</html>
