<!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://w3c.github.io/mediacapture-main/getusermedia.html#idl-def-MediaStream">
<link rel="help" href="http://w3c.github.io/mediacapture-main/getusermedia.html#widl-MediaStream-id">
<link rel="help" href="http://w3c.github.io/mediacapture-main/getusermedia.html#mediastream">
<link rel="help" href="http://w3c.github.io/mediacapture-main/getusermedia.html#event-mediastreamtrack-ended">
<link rel="help" href="http://w3c.github.io/mediacapture-main/getusermedia.html#widl-MediaStreamTrack-stop-void">
<link rel="help" href="http://w3c.github.io/mediacapture-main/getusermedia.html#widl-MediaStreamTrack-clone-MediaStreamTrack">
</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>
let t = async_test("Tests that a MediaStream constructor follows the algorithm set in the spec");
t.step(() => {
  navigator.mediaDevices.getUserMedia({video: true, audio:true})
    .then(t.step_func(stream => {
      let stream1 = new MediaStream();
      assert_not_equals(stream.id, stream1.id, "Two different MediaStreams have different ids");
      let stream2 = new MediaStream(stream);
      assert_not_equals(stream.id, stream2.id, "A MediaStream constructed from another has a different id");
      let audioTrack1 = stream.getAudioTracks()[0];
      let videoTrack = stream.getVideoTracks()[0];
      assert_equals(audioTrack1, stream2.getAudioTracks()[0], "A MediaStream constructed from another shares the same audio track");
      assert_equals(videoTrack, stream2.getVideoTracks()[0], "A MediaStream constructed from another shares the same video track");
      let stream4 = new MediaStream([audioTrack1]);
      assert_equals(stream4.getTrackById(audioTrack1.id), audioTrack1, "a non-ended track gets added via the MediaStream constructor");

      let audioTrack2 = audioTrack1.clone();
      audioTrack2.addEventListener("ended", t.unreached_func("ended event should not be fired by MediaStreamTrack.stop()."));
      audioTrack2.stop();
      assert_equals(audioTrack2.readyState, "ended", "a stopped track is marked ended synchronously");

      let stream3 = new MediaStream([audioTrack2, videoTrack]);
      assert_equals(stream3.getTrackById(audioTrack2.id), audioTrack2, "an ended track gets 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");

      let stream5 = new MediaStream([audioTrack2]);
      assert_equals(stream5.getTrackById(audioTrack2.id), audioTrack2, "an ended track gets added via the MediaStream constructor");
      assert_false(stream5.active, "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 active attribute set to false");

      audioTrack1.stop();
      assert_equals(audioTrack1.readyState, "ended",
        "Stopping audioTrack1 marks it ended synchronously");

      videoTrack.stop();
      assert_equals(videoTrack.readyState, "ended",
        "Stopping videoTrack marks it ended synchronously");

      assert_false(stream.active,
        "The original MediaStream is marked inactive synchronously");
      assert_false(stream1.active,
        "MediaStream 1 is marked inactive synchronously");
      assert_false(stream2.active,
        "MediaStream 2 is marked inactive synchronously");
      assert_false(stream3.active,
        "MediaStream 3 is marked inactive synchronously");
      assert_false(stream4.active,
        "MediaStream 4 is marked inactive synchronously");

      // Use a timeout to detect a misfire of the ended event.
      t.step_timeout(t.step_func_done());
    })
  );
});
</script>
</body>
</html>
