<!doctype html>
<html>
<head>
<title>MediaStream constructor algorithm</title>
<link rel="author" title="Dominique Hazael-Massieux" href="mailto:dom@w3.org"/>
<link rel="help" href="http://dev.w3.org/2011/webrtc/editor/getusermedia.html#idl-def-MediaStream">
<link rel="help" href="http://dev.w3.org/2011/webrtc/editor/getusermedia.html#widl-MediaStream-id">
<link rel="help" href="http://dev.w3.org/2011/webrtc/editor/getusermedia.html#mediastream">
<link rel="help" href="http://dev.w3.org/2011/webrtc/editor/getusermedia.html#event-mediastream-ended">
<link rel="help" href="http://dev.w3.org/2011/webrtc/editor/getusermedia.html#widl-MediaStreamTrack-stop-void">
<link rel="help" href="http://dev.w3.org/2011/webrtc/editor/getusermedia.html#widl-MediaStreamTrack-clone-MediaStreamTrack">
<link rel='stylesheet' href='/resources/testharness.css' media='all'/>
</head>
<body>
<p class="instructions">When prompted, accept to share your video and audio stream.</p>
<h1 class="instructions">Description</h1>
<p class="instructions">This test checks that the MediaStream constructor
follows the algorithm set in the spec.</p>

<div id='log'></div>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src="/common/vendor-prefix.js" data-prefixed-objects='[{"ancestors":["navigator"], "name":"getUserMedia"},{"ancestors":["window"], "name":"MediaStream"}]'></script>
<script>
var t = async_test("Tests that a MediaStream constructor follows the algorithm set in the spec", {timeout: 10000});
t.step(function() {
  navigator.getUserMedia({video: true, audio:true}, t.step_func(function (stream) {
    var stream1 = new MediaStream();
    assert_not_equals(stream.id, stream1.id, "Two different MediaStreams have different ids");
    var stream2 = new MediaStream(stream);
    assert_not_equals(stream.id, stream2.id, "A MediaStream constructed from another have different ids");
    var audioTrack1 = stream.getAudioTracks()[0];
    var videoTrack = stream.getVideoTracks()[0];
    assert_equals(audioTrack1, stream2.getAudioTracks()[0], "A MediaStream constructed from another share the same audio track");
    assert_equals(videoTrack, stream2.getVideoTracks()[0], "A MediaStream constructed from another share the same video track");
    var stream4 = new MediaStream([audioTrack1]);
    assert_equals(stream4.getTrackById(audioTrack1.id), audioTrack1, "a non-ended track gets added via the MediaStream constructor");

    var audioTrack2 = audioTrack1.clone();
    audioTrack2.addEventListener("ended", t.step_func(function () {
      var stream3 = new MediaStream([audioTrack2, videoTrack]);
      assert_equals(stream3.getTrackById(audioTrack2.id), null, "an ended track doesn't get added via the MediaStream constructor");
      assert_equals(stream3.getTrackById(videoTrack.id), videoTrack, "a non-ended track gets added via the MediaStream constructor even if the previous track was ended");
      var stream5 = new MediaStream([audioTrack2]);
     assert_true(stream5.ended, "a MediaStream created using the MediaStream() constructor whose arguments are lists of MediaStreamTrack objects that are all ended, the MediaStream object MUST be created with its ended attribute set to true");
      t.done();
    }), false);
    audioTrack2.stop();
  }), function(error) {});
});
</script>
</body>
</html>
