<!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_js, or false if no
// exception should be thrown.
const testArgs = {
  // No argument or equivalent.
  '': false,
  'null': false,
  'undefined': false,
  '{}': false,

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

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

for (const arg in testArgs) {
  const expr = 'new RTCPeerConnection(' + arg + ')';
  test(function() {
    const throws = testArgs[arg];
    if (throws) {
      assert_throws_js(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>
