<!doctype html>
<title>WeakMap.prototype</title>
<link rel=author href=mailto:Ms2ger@gmail.com title=Ms2ger>
<link rel=help href=https://people.mozilla.org/~jorendorff/es6-draft.html#sec-properties-of-the-weakmap-prototype-object>
<link rel=help href=https://people.mozilla.org/~jorendorff/es6-draft.html#sec-functioninitialize>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<div id=log></div>
<script>
function assert_propdesc(obj, prop, Writable, Enumerable, Configurable) {
  var propdesc = Object.getOwnPropertyDescriptor(obj, prop);
  assert_equals(typeof propdesc, "object");
  assert_equals(propdesc.writable, Writable, "[[Writable]]");
  assert_equals(propdesc.enumerable, Enumerable, "[[Enumerable]]");
  assert_equals(propdesc.configurable, Configurable, "[[Configurable]]");
}

function test_length(fun, expected) {
  test(function() {
    assert_propdesc(WeakMap.prototype[fun], "length", false, false, true);
    assert_equals(WeakMap.prototype[fun].length, expected);
  }, "WeakMap.prototype." + fun + ".length")
}

function test_thisval(fun, args) {
  // Step 1-2
  test(function() {
    assert_throws_js(TypeError, function() {
      WeakMap.prototype[fun].apply(null, args);
    });
    assert_throws_js(TypeError, function() {
      WeakMap.prototype[fun].apply(undefined, args);
    });
  }, "WeakMap.prototype." + fun + ": ToObject on this")
  // Step 3
  test(function() {
    assert_throws_js(TypeError, function() {
      WeakMap.prototype[fun].apply({}, args);
    });
  }, "WeakMap.prototype." + fun + ": this has no [[WeakMapData]] internal property")
}

// In every case, the length property of a built-in Function object described
// in this clause has the attributes { [[Writable]]: false, [[Enumerable]]:
// false, [[Configurable]]: false }. Every other property described in this
// clause has the attributes { [[Writable]]: true, [[Enumerable]]: false,
// [[Configurable]]: true } unless otherwise specified.

test(function() {
  assert_equals(Object.getPrototypeOf(WeakMap.prototype), Object.prototype);
}, "The value of the [[Prototype]] internal property of the WeakMap prototype object is the standard built-in Object prototype object (15.2.4).")

// 23.3.3.1 WeakMap.prototype.constructor
test(function() {
  assert_equals(WeakMap.prototype.constructor, WeakMap);
  assert_propdesc(WeakMap.prototype, "constructor", true, false, true);
}, "The initial value of WeakMap.prototype.constructor is the built-in WeakMap constructor.")

// 23.3.3.2 WeakMap.prototype.delete ( key )
test(function() {
  assert_propdesc(WeakMap.prototype, "delete", true, false, true);
  test_length("delete", 1);
  // Step 1-3
  test_thisval("delete", [{}]);
}, "WeakMap.prototype.delete")

// 23.3.3.3 WeakMap.prototype.get ( key )
test(function() {
  assert_propdesc(WeakMap.prototype, "get", true, false, true);
  test_length("get", 1);
  // Step 1-3
  test_thisval("get", [{}]);

  // Step 8
  test(function() {
    var wm = new WeakMap();
    var key = {};
    var res = wm.get({}, {});
    assert_equals(res, undefined);
  }, "WeakMap.prototype.get: return undefined");
}, "WeakMap.prototype.get")

// 23.3.3.4 Map.prototype.has ( key )
test(function() {
  assert_propdesc(WeakMap.prototype, "has", true, false, true);
  test_length("has", 1);
  // Step 1-3
  test_thisval("has", [{}]);
}, "WeakMap.prototype.has")

// 23.3.3.5 Map.prototype.set ( key , value )
test(function() {
  assert_propdesc(WeakMap.prototype, "set", true, false, true);
  test_length("set", 2);
  // Step 1-3
  test_thisval("set", [{}, {}]);
}, "WeakMap.prototype.set")

// 23.3.3.6 Map.prototype.@@toStringTag
test(function() {
  assert_class_string(new WeakMap(), "WeakMap");
  assert_class_string(WeakMap.prototype, "WeakMap");
}, "WeakMap.prototype.@@toStringTag")
</script>
