<!DOCTYPE html>
<html>
  <head>
    <title>
      audionode.html
    </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>
    <div id="description"></div>
    <div id="console"></div>
    <script id="layout-test-code">
      let audit = Audit.createTaskRunner();

      let context = 0;
      let context2 = 0;
      let context3 = 0;

      audit.define(
          {label: 'test', description: 'Basic tests for AudioNode API.'},
          function(task, should) {

            context = new AudioContext();
            window.audioNode = context.createBufferSource();

            // Check input and output numbers of AudioSourceNode.
            should(audioNode.numberOfInputs, 'AudioBufferSource.numberOfInputs')
                .beEqualTo(0);
            should(
                audioNode.numberOfOutputs, 'AudioBufferSource.numberOfOutputs')
                .beEqualTo(1);

            // Check input and output numbers of AudioDestinationNode
            should(
                context.destination.numberOfInputs,
                'AudioContext.destination.numberOfInputs')
                .beEqualTo(1);
            should(
                context.destination.numberOfOutputs,
                'AudioContext.destination.numberOfOutputs')
                .beEqualTo(0);

            // Try calling connect() method with illegal values.
            should(
                () => audioNode.connect(0, 0, 0), 'audioNode.connect(0, 0, 0)')
                .throw(TypeError);
            should(
                () => audioNode.connect(null, 0, 0),
                'audioNode.connect(null, 0, 0)')
                .throw(TypeError);
            should(
                () => audioNode.connect(context.destination, 5, 0),
                'audioNode.connect(context.destination, 5, 0)')
                .throw(DOMException, 'IndexSizeError');
            should(
                () => audioNode.connect(context.destination, 0, 5),
                'audioNode.connect(context.destination, 0, 5)')
                .throw(DOMException, 'IndexSizeError');

            should(
                () => audioNode.connect(context.destination, 0, 0),
                'audioNode.connect(context.destination, 0, 0)')
                .notThrow();

            // Create a new context and try to connect the other context's node
            // to this one.
            context2 = new AudioContext();
            should(
                () => window.audioNode.connect(context2.destination),
                'Connecting a node to a different context')
                .throw(DOMException, 'InvalidAccessError');

            // 3-arg AudioContext doesn't create an offline context anymore.
            should(
                () => context3 = new AudioContext(1, 44100, 44100),
                'context3 = new AudioContext(1, 44100, 44100)')
                .throw(TypeError);

            // Ensure it is an EventTarget
            should(
                audioNode instanceof EventTarget, 'AudioNode is an EventTarget')
                .beTrue();

            task.done();
          });

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