<!doctype html>
<meta charset=utf-8>
<title>RTCPeerConnection constructor</title>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script>
test(function() {
  assert_equals(RTCPeerConnection.length, 0);
}, 'RTCPeerConnection.length');

// These are used for string and number dictionary members to see if they are
// being accessed at all.
const toStringThrows = { toString: function() { throw new Error; } };
const toNumberThrows = Symbol();

// Test the first argument of the constructor. The key is the argument itself,
// and the value is the first argument for assert_throws, or false if no
// exception should be thrown.
const testArgs = {
  // No argument or equivalent.
  '': false,
  'null': false,
  'undefined': false,
  '{}': false,

  // certificates
  '{ certificates: null }': new TypeError,
  '{ certificates: undefined }': false,
  '{ certificates: [] }': false,
  '{ certificates: [null] }': new TypeError,
  '{ certificates: [undefined] }': new TypeError,

  // iceCandidatePoolSize
  '{ iceCandidatePoolSize: toNumberThrows }': new TypeError,
}

for (const arg in testArgs) {
  const expr = 'new RTCPeerConnection(' + arg + ')';
  test(function() {
    const throws = testArgs[arg];
    if (throws) {
      assert_throws(throws, function() {
        eval(expr);
      });
    } else {
      eval(expr);
    }
  }, expr);
}

// The initial values of attributes of RTCPeerConnection.
const initialState = {
  'localDescription': null,
  'currentLocalDescription': null,
  'pendingLocalDescription': null,
  'remoteDescription': null,
  'currentRemoteDescription': null,
  'pendingRemoteDescription': null,
  'signalingState': 'stable',
  'iceGatheringState': 'new',
  'iceConnectionState': 'new',
  'connectionState': 'new',
  'canTrickleIceCandidates': null,
  // TODO: defaultIceServers
};

for (const attr in initialState) {
  test(function() {
    // Use one RTCPeerConnection instance for all initial value tests.
    if (!window.pc) {
      window.pc = new RTCPeerConnection;
    }
    assert_equals(window.pc[attr], initialState[attr]);
  }, attr + ' initial value');
}
</script>
