<!doctype html>
<meta charset=utf-8>
<title>DOMException constructor</title>
<link rel=help href="https://heycam.github.io/webidl/#es-DOMException-constructor-object">
<link rel=help href="https://people.mozilla.org/~jorendorff/es6-draft.html#sec-error.prototype.message">
<link rel=help href="https://people.mozilla.org/~jorendorff/es6-draft.html#sec-error.prototype.name">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id="log"></div>
<script>
test(function() {
  var ex = new DOMException();
  assert_equals(ex.name, "Error",
                "Not passing a name should end up with 'Error' as the name");
  assert_equals(ex.message, "",
                "Not passing a message should end up with empty string as the message");
}, 'new DOMException()');

test(function() {
  var ex = new DOMException();
  assert_false(ex.hasOwnProperty("name"),
               "The name property should be inherited");
  assert_false(ex.hasOwnProperty("message"),
               "The message property should be inherited");
}, 'new DOMException(): own-ness');

test(function() {
  var ex = new DOMException(null);
  assert_equals(ex.name, "Error",
                "Not passing a name should end up with 'Error' as the name");
  assert_equals(ex.message, "null",
                "Passing null as message should end up with stringified 'null' as the message");
}, 'new DOMException(null)');

test(function() {
  var ex = new DOMException(undefined);
  assert_equals(ex.name, "Error",
                "Not passing a name should end up with 'Error' as the name");
  assert_equals(ex.message, "",
                "Not passing a message should end up with empty string as the message");
}, 'new DOMException(undefined)');

test(function() {
  var ex = new DOMException(undefined);
  assert_false(ex.hasOwnProperty("name"),
               "The name property should be inherited");
  assert_false(ex.hasOwnProperty("message"),
               "The message property should be inherited");
}, 'new DOMException(undefined): own-ness');

test(function() {
  var ex = new DOMException("foo");
  assert_equals(ex.name, "Error",
                "Not passing a name should still end up with 'Error' as the name");
  assert_equals(ex.message, "foo", "Should be using passed-in message");
}, 'new DOMException("foo")');

test(function() {
  var ex = new DOMException("foo");
  assert_false(ex.hasOwnProperty("name"),
               "The name property should be inherited");
  assert_true(ex.hasOwnProperty("message"),
              "The message property should be own");
}, 'new DOMException("foo"): own-ness');

test(function() {
  var ex = new DOMException("bar", undefined);
  assert_equals(ex.name, "Error",
                "Passing undefined for name should end up with 'Error' as the name");
  assert_equals(ex.message, "bar", "Should still be using passed-in message");
}, 'new DOMException("bar", undefined)');

test(function() {
  var ex = new DOMException("bar", "NotSupportedError");
  assert_equals(ex.name, "NotSupportedError", "Should be using the passed-in name");
  assert_equals(ex.message, "bar", "Should still be using passed-in message");
  assert_equals(ex.code, DOMException.NOT_SUPPORTED_ERR,
                "Should have the right exception code");
}, 'new DOMException("bar", "NotSupportedError")');

test(function() {
  var ex = new DOMException("bar", "NotSupportedError");
  assert_true(ex.hasOwnProperty("name"),
              "The name property should be own");
  assert_true(ex.hasOwnProperty("message"),
              "The message property should be own");
}, 'new DOMException("bar", "NotSupportedError"): own-ness');

test(function() {
  var ex = new DOMException("bar", "foo");
  assert_equals(ex.name, "foo", "Should be using the passed-in name");
  assert_equals(ex.message, "bar", "Should still be using passed-in message");
  assert_equals(ex.code, 0,
                "Should have 0 for code for a name not in the exception names table");
}, 'new DOMException("bar", "foo")');

[
  {name: "IndexSizeError", code: 1},
  {name: "HierarchyRequestError", code: 3},
  {name: "WrongDocumentError", code: 4},
  {name: "InvalidCharacterError", code: 5},
  {name: "NoModificationAllowedError", code: 7},
  {name: "NotFoundError", code: 8},
  {name: "NotSupportedError", code: 9},
  {name: "InUseAttributeError", code: 10},
  {name: "InvalidStateError", code: 11},
  {name: "SyntaxError", code: 12},
  {name: "InvalidModificationError", code: 13},
  {name: "NamespaceError", code: 14},
  {name: "InvalidAccessError", code: 15},
  {name: "SecurityError", code: 18},
  {name: "NetworkError", code: 19},
  {name: "AbortError", code: 20},
  {name: "URLMismatchError", code: 21},
  {name: "QuotaExceededError", code: 22},
  {name: "TimeoutError", code: 23},
  {name: "InvalidNodeTypeError", code: 24},
  {name: "DataCloneError", code: 25}
].forEach(function(test_case) {
  test(function() {
    var ex = new DOMException("msg", test_case.name);
    assert_equals(ex.name, test_case.name,
                  "Should be using the passed-in name");
    assert_equals(ex.message, "msg",
                  "Should be using the passed-in message");
    assert_equals(ex.code, test_case.code,
                  "Should have matching legacy code from error names table");
  },'new DOMexception("msg", "' + test_case.name + '")');
});

test(function() {
  var ex = new DOMException("bar", "UnknownError");
  assert_equals(ex.name, "UnknownError", "Should be using the passed-in name");
  assert_equals(ex.message, "bar", "Should still be using passed-in message");
  assert_equals(ex.code, 0,
                "Should have 0 for code for a name in the exception names table with no legacy code");
}, 'new DOMException("bar", "UnknownError")');

</script>
