<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <script src="/resources/testharness.js"></script>
  <script src="/resources/testharnessreport.js"></script>
  <script>
    function testNode() {
      var context = new AudioContext();
      var buffer = context.createBuffer(1, 2048, context.sampleRate);
      for (var i = 0; i < 2048; ++i) {
        buffer.getChannelData(0)[i] = Math.sin(
          440 * 2 * Math.PI * i / context.sampleRate
        );
      }

      var destination = context.destination;

      var source = context.createBufferSource();

      var analyser = context.createAnalyser();

      source.buffer = buffer;

      source.connect(analyser);
      analyser.connect(destination);

      assert_equals(
        analyser.channelCount,
        2,
        "analyser node has 2 input channels by default"
      );
      assert_equals(
        analyser.channelCountMode,
        "max",
        "Correct channelCountMode for the analyser node"
      );
      assert_equals(
        analyser.channelInterpretation,
        "speakers",
        "Correct channelCountInterpretation for the analyser node"
      );

      assert_equals(
        analyser.fftSize,
        2048,
        "Correct default value for fftSize"
      );
      assert_equals(
        analyser.frequencyBinCount,
        1024,
        "Correct default value for frequencyBinCount"
      );
      assert_throws_dom("INDEX_SIZE_ERR", function() {
        analyser.fftSize = 0;
      });
      assert_throws_dom("INDEX_SIZE_ERR", function() {
        analyser.fftSize = 1;
      });
      assert_throws_dom("INDEX_SIZE_ERR", function() {
        analyser.fftSize = 8;
      });
      assert_throws_dom("INDEX_SIZE_ERR", function() {
        analyser.fftSize = 100;
      }); // non-power of two
      assert_throws_dom("INDEX_SIZE_ERR", function() {
        analyser.fftSize = 2049;
      });
      assert_throws_dom("INDEX_SIZE_ERR", function() {
        analyser.fftSize = 4097;
      });
      assert_throws_dom("INDEX_SIZE_ERR", function() {
        analyser.fftSize = 8193;
      });
      assert_throws_dom("INDEX_SIZE_ERR", function() {
        analyser.fftSize = 16385;
      });
      assert_throws_dom("INDEX_SIZE_ERR", function() {
        analyser.fftSize = 32769;
      });
      assert_throws_dom("INDEX_SIZE_ERR", function() {
        analyser.fftSize = 65536;
      });
      analyser.fftSize = 1024;
      assert_equals(
        analyser.frequencyBinCount,
        512,
        "Correct new value for frequencyBinCount"
      );

      assert_equals(
        analyser.minDecibels,
        -100,
        "Correct default value for minDecibels"
      );
      assert_equals(
        analyser.maxDecibels,
        -30,
        "Correct default value for maxDecibels"
      );
      assert_throws_dom("INDEX_SIZE_ERR", function() {
        analyser.minDecibels = -30;
      });
      assert_throws_dom("INDEX_SIZE_ERR", function() {
        analyser.minDecibels = -29;
      });
      assert_throws_dom("INDEX_SIZE_ERR", function() {
        analyser.maxDecibels = -100;
      });
      assert_throws_dom("INDEX_SIZE_ERR", function() {
        analyser.maxDecibels = -101;
      });

      assert_true(
        Math.abs(analyser.smoothingTimeConstant - 0.8) < 0.001,
        "Correct default value for smoothingTimeConstant"
      );
      assert_throws_dom("INDEX_SIZE_ERR", function() {
        analyser.smoothingTimeConstant = -0.1;
      });
      assert_throws_dom("INDEX_SIZE_ERR", function() {
        analyser.smoothingTimeConstant = 1.1;
      });
      analyser.smoothingTimeConstant = 0;
      analyser.smoothingTimeConstant = 1;
    }

    function testConstructor() {
      var context = new AudioContext();

      var analyser = new AnalyserNode(context);
      assert_equals(
        analyser.channelCount,
        2,
        "analyser node has 2 input channels by default"
      );
      assert_equals(
        analyser.channelCountMode,
        "max",
        "Correct channelCountMode for the analyser node"
      );
      assert_equals(
        analyser.channelInterpretation,
        "speakers",
        "Correct channelCountInterpretation for the analyser node"
      );

      assert_equals(
        analyser.fftSize,
        2048,
        "Correct default value for fftSize"
      );
      assert_equals(
        analyser.frequencyBinCount,
        1024,
        "Correct default value for frequencyBinCount"
      );
      assert_equals(
        analyser.minDecibels,
        -100,
        "Correct default value for minDecibels"
      );
      assert_equals(
        analyser.maxDecibels,
        -30,
        "Correct default value for maxDecibels"
      );
      assert_true(
        Math.abs(analyser.smoothingTimeConstant - 0.8) < 0.001,
        "Correct default value for smoothingTimeConstant"
      );

      assert_throws_dom("INDEX_SIZE_ERR", function() {
        analyser = new AnalyserNode(context, { fftSize: 0 });
      });
      assert_throws_dom("INDEX_SIZE_ERR", function() {
        analyser = new AnalyserNode(context, { fftSize: 1 });
      });
      assert_throws_dom("INDEX_SIZE_ERR", function() {
        analyser = new AnalyserNode(context, { fftSize: 8 });
      });
      assert_throws_dom("INDEX_SIZE_ERR", function() {
        analyser = new AnalyserNode(context, { fftSize: 100 });
      });
      assert_throws_dom("INDEX_SIZE_ERR", function() {
        analyser = new AnalyserNode(context, { fftSize: 2049 });
      });
      assert_throws_dom("INDEX_SIZE_ERR", function() {
        analyser = new AnalyserNode(context, { fftSize: 4097 });
      });
      assert_throws_dom("INDEX_SIZE_ERR", function() {
        analyser = new AnalyserNode(context, { fftSize: 8193 });
      });
      assert_throws_dom("INDEX_SIZE_ERR", function() {
        analyser = new AnalyserNode(context, { fftSize: 16385 });
      });
      assert_throws_dom("INDEX_SIZE_ERR", function() {
        analyser = new AnalyserNode(context, { fftSize: 32769 });
      });
      assert_throws_dom("INDEX_SIZE_ERR", function() {
        analyser = new AnalyserNode(context, { fftSize: 65536 });
      });
      analyser = new AnalyserNode(context, { fftSize: 1024 });
      assert_equals(
        analyser.frequencyBinCount,
        512,
        "Correct new value for frequencyBinCount"
      );

      assert_throws_dom("INDEX_SIZE_ERR", function() {
        analyser = new AnalyserNode(context, { minDecibels: -30 });
      });
      assert_throws_dom("INDEX_SIZE_ERR", function() {
        analyser = new AnalyserNode(context, { minDecibels: -29 });
      });
      assert_throws_dom("INDEX_SIZE_ERR", function() {
        analyser = new AnalyserNode(context, { maxDecibels: -100 });
      });
      assert_throws_dom("INDEX_SIZE_ERR", function() {
        analyser = new AnalyserNode(context, { maxDecibels: -101 });
      });

      assert_throws_dom("INDEX_SIZE_ERR", function() {
        analyser = new AnalyserNode(context, { smoothingTimeConstant: -0.1 });
      });
      assert_throws_dom("INDEX_SIZE_ERR", function() {
        analyser = new AnalyserNode(context, { smoothingTimeConstant: -1.1 });
      });
      analyser = new AnalyserNode(context, { smoothingTimeConstant: 0 });
      analyser = new AnalyserNode(context, { smoothingTimeConstant: 1 });
    }
    test(testNode, "Test AnalyserNode API");
    test(testConstructor, "Test AnalyserNode's ctor API");
  </script>
</head>
</body>
</html>
