Tests RTCIceCandidate. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". PASS candidate = new RTCIceCandidate(initializer); did not throw exception. PASS candidate.candidate is "foo" PASS candidate.sdpMid is "bar" PASS candidate.sdpMLineIndex is 6 PASS RTCIceCandidate.prototype.toJSON is defined. PASS Object.getOwnPropertyDescriptor(RTCIceCandidate.prototype, "toJSON").enumerable is true PASS Object.getOwnPropertyDescriptor(RTCIceCandidate.prototype, "toJSON").writable is true PASS Object.getOwnPropertyDescriptor(RTCIceCandidate.prototype, "toJSON").configurable is true PASS RTCIceCandidate.prototype.toJSON.length is 0 PASS RTCIceCandidate.prototype.toJSON.name is "toJSON" PASS Object.getOwnPropertyDescriptor(jsonMap, "candidate").enumerable is true PASS Object.getOwnPropertyDescriptor(jsonMap, "candidate").writable is true PASS Object.getOwnPropertyDescriptor(jsonMap, "candidate").configurable is true PASS childCandidate.toJSON(); threw exception TypeError: Can only call RTCIceCandidate.toJSON on instances of RTCIceCandidate. PASS JSON.stringify(candidate.toJSON()) is "{\"candidate\":\"foo\",\"sdpMLineIndex\":6,\"sdpMid\":\"bar\",\"usernameFragment\":null}" PASS JSON.stringify(candidate.toJSON()) is "{\"candidate\":\"foo\",\"sdpMLineIndex\":6,\"sdpMid\":\"bar\",\"usernameFragment\":null}" PASS JSON.stringify(candidate.toJSON()) is "{\"candidate\":\"foo\",\"sdpMLineIndex\":6,\"sdpMid\":\"bar\",\"usernameFragment\":null}" PASS JSON.stringify(candidate.toJSON()) is "{\"candidate\":\"foo\",\"sdpMLineIndex\":6,\"sdpMid\":\"bar\",\"usernameFragment\":null}" PASS JSON.stringify(candidate.toJSON()) is "{\"candidate\":\"foo\",\"sdpMLineIndex\":6,\"sdpMid\":\"bar\",\"usernameFragment\":null}" Attributes are readonly candidate.candidate = "foo-updated" PASS candidate.candidate is "foo" candidate.sdpMid = "bar-updated" PASS candidate.sdpMid is "bar" candidate.sdpMLineIndex = 7 PASS candidate.sdpMLineIndex is 6 Dictionary argument is mandatory. PASS new RTCIceCandidate(); threw exception TypeError: Not enough arguments. One of the 'sdpMid' or 'sdpMLineIndex' members must be present (and not null or undefined). PASS new RTCIceCandidate({candidate:"foo"}); threw exception TypeError: Candidate must not have both null sdpMid and sdpMLineIndex. PASS new RTCIceCandidate({candidate:"foo", sdpMid: null}); threw exception TypeError: Candidate must not have both null sdpMid and sdpMLineIndex. PASS new RTCIceCandidate({candidate:"foo", sdpMid: undefined}); threw exception TypeError: Candidate must not have both null sdpMid and sdpMLineIndex. PASS new RTCIceCandidate({candidate:"foo", sdpMLineIndex: null}); threw exception TypeError: Candidate must not have both null sdpMid and sdpMLineIndex. PASS new RTCIceCandidate({candidate:"foo", sdpMLineIndex: undefined}); threw exception TypeError: Candidate must not have both null sdpMid and sdpMLineIndex. PASS new RTCIceCandidate({candidate:"foo", sdpMid: null, sdpMLineIndex: null}); threw exception TypeError: Candidate must not have both null sdpMid and sdpMLineIndex. PASS new RTCIceCandidate({candidate:"foo", sdpMid: undefined, sdpMLineIndex: undefined}); threw exception TypeError: Candidate must not have both null sdpMid and sdpMLineIndex. Test that sdpMid or sdpMLineIndex explicitly set to null or undefined, results in a null value. PASS candidate = new RTCIceCandidate({candidate:"foo", sdpMid: null, sdpMLineIndex: 1}); did not throw exception. PASS candidate.sdpMid is null PASS candidate.sdpMLineIndex is 1 PASS candidate = new RTCIceCandidate({candidate:"foo", sdpMid: undefined, sdpMLineIndex: 1}); did not throw exception. PASS candidate.sdpMid is null PASS candidate.sdpMLineIndex is 1 PASS candidate = new RTCIceCandidate({candidate:"foo", sdpMid: "foo", sdpMLineIndex: null}); did not throw exception. PASS candidate.sdpMid is 'foo' PASS candidate.sdpMLineIndex is null PASS candidate = new RTCIceCandidate({candidate:"foo", sdpMid: "foo", sdpMLineIndex: undefined}); did not throw exception. PASS candidate.sdpMid is 'foo' PASS candidate.sdpMLineIndex is null When one of the 'sdpMid' or 'sdpMLineIndex' members is set, the other must be null. PASS candidate = new RTCIceCandidate({candidate:"foo", sdpMid:"bar"}); did not throw exception. PASS candidate.sdpMid is "bar" PASS candidate.sdpMLineIndex is null PASS candidate = new RTCIceCandidate({candidate:"foo", sdpMLineIndex:6}); did not throw exception. PASS candidate.sdpMid is null PASS candidate.sdpMLineIndex is 6 Conversion of sdpMLineIndex to unsigned short, following WebIDL rules without [Clamp] or [EnforceRange] PASS (new RTCIceCandidate({candidate:"foo", sdpMLineIndex:"a"})).sdpMLineIndex is 0 PASS (new RTCIceCandidate({candidate:"foo", sdpMLineIndex:-1})).sdpMLineIndex is 65535 PASS (new RTCIceCandidate({candidate:"foo", sdpMLineIndex:65536})).sdpMLineIndex is 0 PASS (new RTCIceCandidate({candidate:"foo", sdpMLineIndex:65537})).sdpMLineIndex is 1 Some bad input PASS new RTCIceCandidate(5); threw exception TypeError: Type error. PASS new RTCIceCandidate("foobar"); threw exception TypeError: Type error. PASS new RTCIceCandidate(candidate:""); threw exception SyntaxError: Unexpected token ':'. Expected ')' to end an argument list.. PASS successfullyParsed is true TEST COMPLETE