<!doctype html>
<meta charset="utf-8">
<!--
4.8.2 RTCPeerConnectionIceEvent

  The icecandidate event of the RTCPeerConnection uses the RTCPeerConnectionIceEvent interface.

-->
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
/*
RTCPeerConnectionIceEvent

[Constructor(DOMString type, optional RTCPeerConnectionIceEventInit eventInitDict)]

interface RTCPeerConnectionIceEvent : Event {
    readonly attribute RTCIceCandidate? candidate;
    readonly attribute DOMString?       url;
};
 */
test(() => {
  assert_throws_js(TypeError, () => {
    new RTCPeerConnectionIceEvent();
  });
}, "RTCPeerConnectionIceEvent with no arguments throws TypeError");

test(() => {
  const event = new RTCPeerConnectionIceEvent("type");
  /*
  candidate of type RTCIceCandidate, readonly, nullable
  url of type DOMString, readonly, nullable
  */
  assert_equals(event.candidate, null);
  assert_equals(event.url, null);

  /*
  Firing an RTCPeerConnectionIceEvent event named e with an RTCIceCandidate
  candidate means that an event with the name e, which does not bubble
  (except where otherwise stated) and is not cancelable
  (except where otherwise stated),
  */
  assert_false(event.bubbles);
  assert_false(event.cancelable);

}, "RTCPeerConnectionIceEvent with no eventInitDict (default)");

test(() => {
  const event = new RTCPeerConnectionIceEvent("type", {});

  /*
  candidate of type RTCIceCandidate, readonly, nullable
  url of type DOMString, readonly, nullable
  */
  assert_equals(event.candidate, null);
  assert_equals(event.url, null);

  /*
  Firing an RTCPeerConnectionIceEvent event named e with an RTCIceCandidate
  candidate means that an event with the name e, which does not bubble
  (except where otherwise stated) and is not cancelable
  (except where otherwise stated),
  */
  assert_false(event.bubbles);
  assert_false(event.cancelable);

}, "RTCPeerConnectionIceEvent with empty object as eventInitDict (default)");

test(() => {
  const event = new RTCPeerConnectionIceEvent("type", {
    candidate: null
  });
  assert_equals(event.candidate, null);
}, "RTCPeerConnectionIceEvent.candidate is null when constructed with { candidate: null }");

test(() => {
  const event = new RTCPeerConnectionIceEvent("type", {
    candidate: undefined
  });
  assert_equals(event.candidate, null);
}, "RTCPeerConnectionIceEvent.candidate is null when constructed with { candidate: undefined }");


/*

4.8.1 RTCIceCandidate Interface

The RTCIceCandidate() constructor takes a dictionary argument, candidateInitDict,
whose content is used to initialize the new RTCIceCandidate object. When run, if
both the sdpMid and sdpMLineIndex dictionary members are null, throw a TypeError.
*/
const candidate = "";
const sdpMid = "sdpMid";
const sdpMLineIndex = 1;
const usernameFragment = "";
const url = "foo.bar";

test(() => {
  const iceCandidate = new RTCIceCandidate({ candidate, sdpMid, sdpMLineIndex, usernameFragment });
  const event = new RTCPeerConnectionIceEvent("type", {
    candidate: iceCandidate,
    url,
  });

  assert_equals(event.candidate, iceCandidate);
  assert_false(event.bubbles);
  assert_false(event.cancelable);
}, "RTCPeerConnectionIceEvent with RTCIceCandidate");

test(() => {
  const plain = { candidate, sdpMid, sdpMLineIndex, usernameFragment };
  assert_throws_js(TypeError, () => new RTCPeerConnectionIceEvent("type", { candidate: plain }));
}, "RTCPeerConnectionIceEvent with non RTCIceCandidate object throws");

test(() => {
  const event = new RTCPeerConnectionIceEvent("type", {
    candidate: null,
    bubbles: true,
    cancelable: true,
  });

  assert_true(event.bubbles);
  assert_true(event.cancelable);
}, "RTCPeerConnectionIceEvent bubbles and cancelable");

</script>
