<!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 src=/resources/testdriver.js></script>
<script src=/resources/testdriver-vendor.js></script>
<script src=permission-helper.js></script>
<script>
  promise_test(async () => {
  await setMediaPermission();
  const stream = await navigator.mediaDevices.getUserMedia({video: true, audio:true})
  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", () => {
    throw new Error("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");

}, "Tests that a MediaStream constructor follows the algorithm set in the spec");
</script>
</body>
</html>
