<!DOCTYPE html>
<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
<html>
    <head>
        <title>MediaSource.addSourceBuffer() test cases</title>
        <script src="/resources/testharness.js"></script>
        <script src="/resources/testharnessreport.js"></script>
        <script src="mediasource-util.js"></script>
    </head>
    <body>
        <div id="log"></div>
        <script>
          mediasource_test(function(test, mediaElement, mediaSource)
          {
              mediaSource.endOfStream();
              assert_throws_dom("InvalidStateError",
                          function() { mediaSource.addSourceBuffer(MediaSourceUtil.AUDIO_VIDEO_TYPE); },
                          "addSourceBuffer() threw an exception when in 'ended' state.");
              test.done();
          }, "Test addSourceBuffer() in 'ended' state.");

          mediasource_test(function(test, mediaElement, mediaSource)
          {
              assert_throws_js(TypeError,
                          function() { mediaSource.addSourceBuffer(""); },
                          "addSourceBuffer() threw an exception when passed an empty string.");
              test.done();
          }, "Test addSourceBuffer() with empty type");

          mediasource_test(function(test, mediaElement, mediaSource)
          {
              assert_throws_dom("NotSupportedError",
                          function() { mediaSource.addSourceBuffer(null); },
                          "addSourceBuffer() threw an exception when passed null.");
              test.done();
          }, "Test addSourceBuffer() with null");

          mediasource_test(function(test, mediaElement, mediaSource)
          {
              assert_throws_dom("NotSupportedError",
                          function() { mediaSource.addSourceBuffer("invalidType"); },
                          "addSourceBuffer() threw an exception for an unsupported type.");
              test.done();
          }, "Test addSourceBuffer() with unsupported type");

          mediasource_test(function(test, mediaElement, mediaSource)
          {
              var mimetype = 'video/webm;codecs="vp8,vorbis"';

              assert_true(MediaSource.isTypeSupported(mimetype), mimetype + " is supported");

              var sourceBuffer = mediaSource.addSourceBuffer(mimetype);
              assert_true(sourceBuffer != null, "New SourceBuffer returned");
              assert_equals(mediaSource.sourceBuffers[0], sourceBuffer, "SourceBuffer is in mediaSource.sourceBuffers");
              assert_equals(mediaSource.activeSourceBuffers.length, 0, "SourceBuffer is not in mediaSource.activeSourceBuffers");
              test.done();
          }, "Test addSourceBuffer() with Vorbis and VP8");

          mediasource_test(function(test, mediaElement, mediaSource)
          {
              var videoMimetype = 'video/webm;codecs="vp8"';
              var audioMimetype = 'audio/webm;codecs="vorbis"';

              assert_true(MediaSource.isTypeSupported(videoMimetype), videoMimetype + " is supported");
              assert_true(MediaSource.isTypeSupported(audioMimetype), audioMimetype + " is supported");

              var sourceBufferA = mediaSource.addSourceBuffer(videoMimetype);
              var sourceBufferB = mediaSource.addSourceBuffer(audioMimetype);
              assert_equals(mediaSource.sourceBuffers[0], sourceBufferA, "sourceBufferA is in mediaSource.sourceBuffers");
              assert_equals(mediaSource.activeSourceBuffers.length, 0, "SourceBufferA is not in mediaSource.activeSourceBuffers");
              assert_equals(mediaSource.sourceBuffers[1], sourceBufferB, "sourceBufferB is in mediaSource.sourceBuffers");
              assert_equals(mediaSource.activeSourceBuffers.length, 0, "SourceBufferB is not in mediaSource.activeSourceBuffers");
              test.done();
          }, "Test addSourceBuffer() with Vorbis and VP8 in separate SourceBuffers");

          mediasource_test(function(test, mediaElement, mediaSource)
          {
              var mimetype = MediaSourceUtil.VIDEO_ONLY_TYPE;

              assert_true(MediaSource.isTypeSupported(mimetype), mimetype + " is supported");

              var sourceBuffer = mediaSource.addSourceBuffer(mimetype);
              assert_true(sourceBuffer != null, "New SourceBuffer returned");
              assert_equals(mediaSource.sourceBuffers[0], sourceBuffer, "SourceBuffer is in mediaSource.sourceBuffers");
              assert_equals(mediaSource.activeSourceBuffers.length, 0, "SourceBuffer is not in mediaSource.activeSourceBuffers");
              test.done();
          }, "Test addSourceBuffer() video only");

          mediasource_test(function(test, mediaElement, mediaSource)
          {
              var mimetype = MediaSourceUtil.AUDIO_ONLY_TYPE;

              assert_true(MediaSource.isTypeSupported(mimetype), mimetype + " is supported");

              var sourceBuffer = mediaSource.addSourceBuffer(mimetype);
              assert_true(sourceBuffer != null, "New SourceBuffer returned");
              assert_equals(mediaSource.sourceBuffers[0], sourceBuffer, "SourceBuffer is in mediaSource.sourceBuffers");
              assert_equals(mediaSource.activeSourceBuffers.length, 0, "SourceBuffer is not in mediaSource.activeSourceBuffers");
              test.done();
          }, "Test addSourceBuffer() audio only");

          mediasource_test(function(test, mediaElement, mediaSource)
          {
              var mimetype = 'video/mp4;codecs="avc1.4D4001,mp4a.40.2"';

              assert_true(MediaSource.isTypeSupported(mimetype), mimetype + " is supported");

              var sourceBuffer = mediaSource.addSourceBuffer(mimetype);
              assert_true(sourceBuffer != null, "New SourceBuffer returned");
              assert_equals(mediaSource.sourceBuffers[0], sourceBuffer, "SourceBuffer is in mediaSource.sourceBuffers");
              assert_equals(mediaSource.activeSourceBuffers.length, 0, "SourceBuffer is not in mediaSource.activeSourceBuffers");
              test.done();
          }, "Test addSourceBuffer() with AAC and H.264");

          mediasource_test(function(test, mediaElement, mediaSource)
          {
              var videoMimetype = 'video/mp4;codecs="avc1.4D4001"';
              var audioMimetype = 'audio/mp4;codecs="mp4a.40.2"';

              assert_true(MediaSource.isTypeSupported(videoMimetype), videoMimetype + " is supported");
              assert_true(MediaSource.isTypeSupported(audioMimetype), audioMimetype + " is supported");

              var sourceBufferA = mediaSource.addSourceBuffer(videoMimetype);
              var sourceBufferB = mediaSource.addSourceBuffer(audioMimetype);
              assert_equals(mediaSource.sourceBuffers[0], sourceBufferA, "sourceBufferA is in mediaSource.sourceBuffers");
              assert_equals(mediaSource.activeSourceBuffers.length, 0, "SourceBufferA is not in mediaSource.activeSourceBuffers");
              assert_equals(mediaSource.sourceBuffers[1], sourceBufferB, "sourceBufferB is in mediaSource.sourceBuffers");
              assert_equals(mediaSource.activeSourceBuffers.length, 0, "SourceBufferB is not in mediaSource.activeSourceBuffers");
              test.done();
          }, "Test addSourceBuffer() with AAC and H.264 in separate SourceBuffers");
        </script>
    </body>
</html>
