<!doctype html>
<meta charset=utf-8>
<title>RTCTrackEvent constructor</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
  'use strict';

  // Test is based on the following editor draft:
  // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html

  /*
    5.7.  RTCTrackEvent
      [Constructor(DOMString type, RTCTrackEventInit eventInitDict)]
      interface RTCTrackEvent : Event {
        readonly attribute RTCRtpReceiver           receiver;
        readonly attribute MediaStreamTrack         track;
        [SameObject]
        readonly attribute FrozenArray<MediaStream> streams;
        readonly attribute RTCRtpTransceiver        transceiver;
      };

      dictionary RTCTrackEventInit : EventInit {
        required RTCRtpReceiver        receiver;
        required MediaStreamTrack      track;
                 sequence<MediaStream> streams = [];
        required RTCRtpTransceiver     transceiver;
      };
   */

  test(t => {
    const pc = new RTCPeerConnection();
    const transceiver = pc.addTransceiver('audio');
    const { receiver } = transceiver;
    const { track } = receiver;

    const trackEvent = new RTCTrackEvent('track', {
      receiver, track, transceiver
    });

    assert_equals(trackEvent.receiver, receiver);
    assert_equals(trackEvent.track, track);
    assert_array_equals(trackEvent.streams, []);
    assert_equals(trackEvent.streams, trackEvent.streams, '[SameObject]');
    assert_equals(trackEvent.transceiver, transceiver);

    assert_equals(trackEvent.type, 'track');
    assert_false(trackEvent.bubbles);
    assert_false(trackEvent.cancelable);

  }, `new RTCTrackEvent() with valid receiver, track, transceiver should succeed`);

  test(t => {
    const pc = new RTCPeerConnection();
    const transceiver = pc.addTransceiver('audio');
    const { receiver } = transceiver;
    const { track } = receiver;

    const stream = new MediaStream([track]);

    const trackEvent = new RTCTrackEvent('track', {
      receiver, track, transceiver,
      streams: [stream]
    });

    assert_equals(trackEvent.receiver, receiver);
    assert_equals(trackEvent.track, track);
    assert_array_equals(trackEvent.streams, [stream]);
    assert_equals(trackEvent.transceiver, transceiver);

  }, `new RTCTrackEvent() with valid receiver, track, streams, transceiver should succeed`);

  test(t => {
    const pc = new RTCPeerConnection();
    const transceiver = pc.addTransceiver('audio');
    const { receiver } = transceiver;
    const { track } = receiver;

    const stream1 = new MediaStream([track]);
    const stream2 = new MediaStream([track]);

    const trackEvent = new RTCTrackEvent('track', {
      receiver, track, transceiver,
      streams: [stream1, stream2]
    });

    assert_equals(trackEvent.receiver, receiver);
    assert_equals(trackEvent.track, track);
    assert_array_equals(trackEvent.streams, [stream1, stream2]);
    assert_equals(trackEvent.transceiver, transceiver);

  }, `new RTCTrackEvent() with valid receiver, track, multiple streams, transceiver should succeed`);

  test(t => {
    const pc = new RTCPeerConnection();
    const transceiver = pc.addTransceiver('audio');
    const receiver = pc.addTransceiver('audio').receiver;
    const track =  pc.addTransceiver('audio').receiver.track;

    const stream = new MediaStream();

    const trackEvent = new RTCTrackEvent('track', {
      receiver, track, transceiver,
      streams: [stream]
    });

    assert_equals(trackEvent.receiver, receiver);
    assert_equals(trackEvent.track, track);
    assert_array_equals(trackEvent.streams, [stream]);
    assert_equals(trackEvent.transceiver, transceiver);

  }, `new RTCTrackEvent() with unrelated receiver, track, streams, transceiver should succeed`);

  test(t => {
    const pc = new RTCPeerConnection();
    const transceiver = pc.addTransceiver('audio');
    const { receiver } = transceiver;
    const { track } = receiver;

    assert_throws_js(TypeError, () =>
      new RTCTrackEvent('track', {
        receiver, track
      }));

  }, `new RTCTrackEvent() with no transceiver should throw TypeError`);

  test(t => {
    const pc = new RTCPeerConnection();
    const transceiver = pc.addTransceiver('audio');
    const { receiver } = transceiver;

    assert_throws_js(TypeError, () =>
      new RTCTrackEvent('track', {
        receiver, transceiver
      }));

  }, `new RTCTrackEvent() with no track should throw TypeError`);

  test(t => {
    const pc = new RTCPeerConnection();
    const transceiver = pc.addTransceiver('audio');
    const { receiver } = transceiver;
    const { track } = receiver;

    assert_throws_js(TypeError, () =>
      new RTCTrackEvent('track', {
        track, transceiver
      }));

  }, `new RTCTrackEvent() with no receiver should throw TypeError`);

  /*
    Coverage Report
      Interface tests are counted as 1 trivial test

      Tested         1
      Total          1
   */
</script>
