<!doctype html>
<meta charset=utf-8>
<title>RTCError and RTCErrorInit</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="RTCPeerConnection-helper.js"></script>
<script>
'use strict';

test(() => {
  const error = new RTCError({errorDetail:'data-channel-failure'}, 'message');
  assert_equals(error.message, 'message');
  assert_equals(error.errorDetail, 'data-channel-failure');
}, 'RTCError constructor with errorDetail and message');

test(() => {
  const error = new RTCError({errorDetail:'data-channel-failure'});
  assert_equals(error.message, '');
}, 'RTCError constructor\'s message argument is optional');

test(() => {
  assert_throws(new TypeError(), () => {
    new RTCError();
  });
  assert_throws(new TypeError(), () => {
    new RTCError({});  // {errorDetail} is missing.
  });
}, 'RTCError constructor throws TypeError if arguments are missing');

test(() => {
  assert_throws(new TypeError(), () => {
    new RTCError({errorDetail:'invalid-error-detail'}, 'message');
  });
}, 'RTCError constructor throws TypeError if the errorDetail is invalid');

test(() => {
  const error = new RTCError({errorDetail:'data-channel-failure'}, 'message');
  assert_equals(error.name, 'RTCError');
}, 'RTCError.name is \'RTCError\'');

test(() => {
  const error = new RTCError({errorDetail:'data-channel-failure'}, 'message');
  assert_equals(error.code, 0);
}, 'RTCError.code is 0');

test(() => {
  const error = new RTCError({errorDetail:'data-channel-failure'}, 'message');
  assert_throws(new TypeError(), () => {
    error.errorDetail = 'dtls-failure';
  });
}, 'RTCError.errorDetail is readonly.');

test(() => {
  // Infers what are valid RTCErrorInit objects by passing them to the RTCError
  // constructor.
  assert_throws(new TypeError(), () => {
    new RTCError({}, 'message');
  });
  new RTCError({errorDetail:'data-channel-failure'}, 'message');
}, 'RTCErrorInit.errorDetail is the only required attribute');

// All of these are number types (long or unsigned long).
const nullableAttributes = ['sdpLineNumber',
                            'httpRequestStatusCode',
                            'sctpCauseCode',
                            'receivedAlert',
                            'sentAlert'];

nullableAttributes.forEach(attribute => {
  test(() => {
    const error = new RTCError({errorDetail:'data-channel-failure'}, 'message');
    assert_equals(error[attribute], null);
  }, 'RTCError.' + attribute + ' is null by default');

  test(() => {
    const error = new RTCError(
        {errorDetail:'data-channel-failure', [attribute]: 0}, 'message');
    assert_equals(error[attribute], 0);
  }, 'RTCError.' + attribute + ' is settable by constructor');

  test(() => {
    const error = new RTCError({errorDetail:'data-channel-failure'}, 'message');
    assert_throws(new TypeError(), () => {
      error[attribute] = 42;
    });
  }, 'RTCError.' + attribute + ' is readonly');
});

</script>
