<!DOCTYPE html>
<html>
  <head>
    <title>
      mediastreamaudiosourcenode.html
    </title>
    <script src="../../imported/w3c/web-platform-tests/resources/testharness.js"></script>
    <script src="../../resources/testharnessreport.js"></script>
    <script src="../resources/audit-util.js"></script>
    <script src="../resources/audit.js"></script>
  </head>
  <body>
    <script id="layout-test-code">
      let audit = Audit.createTaskRunner();

      audit.define(
          {
            label: 'test',
            description: 'Basic tests for MediaStreamAudioSourceNode API'
          },
          (task, should) => {
            should(
                () => {navigator.webkitGetUserMedia(
                    {audio: true},
                    (stream) => {
                      gotStream(stream, should);
                      task.done();
                    },
                    () => {
                      should(false, 'Stream generation')
                          .message('succeeded', 'failed');
                      task.done();
                    })},
                'getUserMedia()')
                .notThrow();
          });

      audit.run();

      function gotStream(stream, should) {
        should(true, '{audio:true} generated stream').message('correctly', '');

        let context = new AudioContext();

        // Create an AudioNode from the stream.
        let mediaStreamSource = context.createMediaStreamSource(stream);

        // Check number of inputs and outputs.
        should(
            mediaStreamSource.numberOfInputs,
            'mediaStreamSource.numberOfInputs')
            .beEqualTo(0);
        should(
            mediaStreamSource.numberOfOutputs,
            'mediaStreamSource.numberOfOutputs')
            .beEqualTo(1);

        // Verify the same object is returned
        let element = mediaStreamSource.mediaStream;
        should(
            element instanceof MediaStream,
            'mediaStreamSource.mediaStream instanceof MediaStream')
            .beTrue();
        should(
            mediaStreamSource.mediaStream === element,
            'mediaStreamSource.mediaStream is same object')
            .beTrue();

        // Try calling connect() method with illegal values.
        should(
            () => mediaStreamSource.connect(0, 0, 0),
            'mediaStreamSource.connect(0, 0, 0)')
            .throw();
        should(
            () => mediaStreamSource.connect(context.destination, 5, 0),
            'mediaStreamSource.connect(context.destination, 5, 0)')
            .throw();
        should(
            () => mediaStreamSource.connect(context.destination, 0, 5),
            'mediaStreamSource.connect(context.destination, 0, 5)')
            .throw();

        // Try calling connect() with proper values.
        should(
            () => mediaStreamSource.connect(context.destination, 0, 0),
            'mediaStreamSource.connect(context.destination, 0, 0)')
            .notThrow();
      }
    </script>
  </body>
</html>
