<!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(new TypeError(), function() {
      WeakMap.prototype[fun].apply(null, args);
    });
    assert_throws(new TypeError(), function() {
      WeakMap.prototype[fun].apply(undefined, args);
    });
  }, "WeakMap.prototype." + fun + ": ToObject on this")
  // Step 3
  test(function() {
    assert_throws(new 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).")

// 15.15.5.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.")

// 15.15.5.2 WeakMap.prototype.clear ()
test(function() {
  assert_propdesc(WeakMap.prototype, "clear", true, false, true);
  test_length("clear", 0);
  // Step 1-3
  test_thisval("clear", null);
  // Step 4-5
  test(function() {
    var wm = new WeakMap();
    var key = {};
    wm.set(key, "fail");
    assert_true(wm.has(key));
    var res = wm.clear();
    assert_equals(res, undefined);
    assert_false(wm.has(key));
  }, "WeakMap.prototype.clear: basic functionality");
}, "WeakMap.prototype.clear")

// 15.15.5.3 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")

// 15.15.5.4 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")

// 15.14.5.5 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")

// 15.14.5.6 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")

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