From b898493f532db56e87680b28a9618989df21e033 Mon Sep 17 00:00:00 2001
From: Leonardo Balter <leonardo.balter@gmail.com>
Date: Thu, 11 Jun 2015 12:41:52 -0400
Subject: [PATCH] WeakSet

---
 .../WeakSet/add-not-callable-throws.js        | 25 +++++++++++++
 test/built-ins/WeakSet/constructor.js         | 13 +++++++
 test/built-ins/WeakSet/empty-iterable.js      | 31 ++++++++++++++++
 .../WeakSet/get-add-method-failure.js         | 30 +++++++++++++++
 test/built-ins/WeakSet/iterable-failure.js    | 19 ++++++++++
 test/built-ins/WeakSet/iterable.js            | 29 +++++++++++++++
 .../iterator-close-after-add-failure.js       | 37 +++++++++++++++++++
 .../WeakSet/iterator-next-failure.js          | 28 ++++++++++++++
 .../WeakSet/iterator-value-failure.js         | 34 +++++++++++++++++
 test/built-ins/WeakSet/length.js              | 14 +++++++
 test/built-ins/WeakSet/name.js                | 20 ++++++++++
 test/built-ins/WeakSet/no-iterable.js         | 24 ++++++++++++
 ...perties-of-the-weakset-prototype-object.js | 21 +++++++++++
 .../built-ins/WeakSet/prototype-of-weakset.js | 14 +++++++
 .../Symbol.toStringTag/property-descriptor.js | 27 ++++++++++++++
 test/built-ins/WeakSet/prototype/add/add.js   | 22 +++++++++++
 .../WeakSet/prototype/add/adds-element.js     | 26 +++++++++++++
 ...ot-have-weaksetdata-internal-slot-array.js | 24 ++++++++++++
 ...-not-have-weaksetdata-internal-slot-map.js | 24 ++++++++++++
 ...t-have-weaksetdata-internal-slot-object.js | 24 ++++++++++++
 ...-not-have-weaksetdata-internal-slot-set.js | 24 ++++++++++++
 ...setdata-internal-slot-weakset-prototype.js | 24 ++++++++++++
 .../built-ins/WeakSet/prototype/add/length.js | 21 +++++++++++
 test/built-ins/WeakSet/prototype/add/name.js  | 21 +++++++++++
 .../returns-this-when-ignoring-duplicate.js   | 20 ++++++++++
 .../WeakSet/prototype/add/returns-this.js     | 17 +++++++++
 .../add/this-not-object-throw-boolean.js      | 21 +++++++++++
 .../add/this-not-object-throw-null.js         | 21 +++++++++++
 .../add/this-not-object-throw-number.js       | 21 +++++++++++
 .../add/this-not-object-throw-string.js       | 21 +++++++++++
 .../add/this-not-object-throw-symbol.js       | 21 +++++++++++
 .../add/this-not-object-throw-undefined.js    | 21 +++++++++++
 .../prototype/add/value-not-object-throw.js   | 37 +++++++++++++++++++
 ...weakset-prototype-constructor-intrinsic.js | 14 +++++++
 .../weakset-prototype-constructor.js          | 17 +++++++++
 .../delete/delete-entry-initial-iterable.js   | 27 ++++++++++++++
 .../WeakSet/prototype/delete/delete-entry.js  | 30 +++++++++++++++
 .../WeakSet/prototype/delete/delete.js        | 23 ++++++++++++
 ...ot-have-weaksetdata-internal-slot-array.js | 23 ++++++++++++
 ...-not-have-weaksetdata-internal-slot-map.js | 23 ++++++++++++
 ...t-have-weaksetdata-internal-slot-object.js | 23 ++++++++++++
 ...-not-have-weaksetdata-internal-slot-set.js | 24 ++++++++++++
 ...setdata-internal-slot-weakset-prototype.js | 23 ++++++++++++
 .../WeakSet/prototype/delete/length.js        | 22 +++++++++++
 .../WeakSet/prototype/delete/name.js          | 22 +++++++++++
 .../returns-false-value-is-not-object.js      | 21 +++++++++++
 .../returns-false-when-delete-is-noop.js      | 17 +++++++++
 .../delete/this-not-object-throw-boolean.js   | 20 ++++++++++
 .../delete/this-not-object-throw-null.js      | 20 ++++++++++
 .../delete/this-not-object-throw-number.js    | 20 ++++++++++
 .../delete/this-not-object-throw-string.js    | 20 ++++++++++
 .../delete/this-not-object-throw-symbol.js    | 20 ++++++++++
 .../delete/this-not-object-throw-undefined.js | 20 ++++++++++
 ...ot-have-weaksetdata-internal-slot-array.js | 23 ++++++++++++
 ...-not-have-weaksetdata-internal-slot-map.js | 23 ++++++++++++
 ...t-have-weaksetdata-internal-slot-object.js | 23 ++++++++++++
 ...-not-have-weaksetdata-internal-slot-set.js | 24 ++++++++++++
 ...setdata-internal-slot-weakset-prototype.js | 23 ++++++++++++
 test/built-ins/WeakSet/prototype/has/has.js   | 23 ++++++++++++
 .../built-ins/WeakSet/prototype/has/length.js | 22 +++++++++++
 test/built-ins/WeakSet/prototype/has/name.js  | 22 +++++++++++
 .../returns-false-when-value-is-not-object.js | 21 +++++++++++
 .../returns-false-when-value-not-present.js   | 25 +++++++++++++
 .../has/returns-true-when-value-present.js    | 20 ++++++++++
 .../has/this-not-object-throw-boolean.js      | 21 +++++++++++
 .../has/this-not-object-throw-null.js         | 21 +++++++++++
 .../has/this-not-object-throw-number.js       | 21 +++++++++++
 .../has/this-not-object-throw-string.js       | 21 +++++++++++
 .../has/this-not-object-throw-symbol.js       | 21 +++++++++++
 .../has/this-not-object-throw-undefined.js    | 21 +++++++++++
 .../WeakSet/prototype/prototype-attributes.js | 12 ++++++
 .../symbol-disallowed-as-weakset-key.js       |  2 +-
 test/built-ins/WeakSet/undefined-newtarget.js | 20 ++++++++++
 test/built-ins/WeakSet/weakset.js             | 14 +++++++
 74 files changed, 1627 insertions(+), 1 deletion(-)
 create mode 100644 test/built-ins/WeakSet/add-not-callable-throws.js
 create mode 100644 test/built-ins/WeakSet/constructor.js
 create mode 100644 test/built-ins/WeakSet/empty-iterable.js
 create mode 100644 test/built-ins/WeakSet/get-add-method-failure.js
 create mode 100644 test/built-ins/WeakSet/iterable-failure.js
 create mode 100644 test/built-ins/WeakSet/iterable.js
 create mode 100644 test/built-ins/WeakSet/iterator-close-after-add-failure.js
 create mode 100644 test/built-ins/WeakSet/iterator-next-failure.js
 create mode 100644 test/built-ins/WeakSet/iterator-value-failure.js
 create mode 100644 test/built-ins/WeakSet/length.js
 create mode 100644 test/built-ins/WeakSet/name.js
 create mode 100644 test/built-ins/WeakSet/no-iterable.js
 create mode 100644 test/built-ins/WeakSet/properties-of-the-weakset-prototype-object.js
 create mode 100644 test/built-ins/WeakSet/prototype-of-weakset.js
 create mode 100644 test/built-ins/WeakSet/prototype/Symbol.toStringTag/property-descriptor.js
 create mode 100644 test/built-ins/WeakSet/prototype/add/add.js
 create mode 100644 test/built-ins/WeakSet/prototype/add/adds-element.js
 create mode 100644 test/built-ins/WeakSet/prototype/add/does-not-have-weaksetdata-internal-slot-array.js
 create mode 100644 test/built-ins/WeakSet/prototype/add/does-not-have-weaksetdata-internal-slot-map.js
 create mode 100644 test/built-ins/WeakSet/prototype/add/does-not-have-weaksetdata-internal-slot-object.js
 create mode 100644 test/built-ins/WeakSet/prototype/add/does-not-have-weaksetdata-internal-slot-set.js
 create mode 100644 test/built-ins/WeakSet/prototype/add/does-not-have-weaksetdata-internal-slot-weakset-prototype.js
 create mode 100644 test/built-ins/WeakSet/prototype/add/length.js
 create mode 100644 test/built-ins/WeakSet/prototype/add/name.js
 create mode 100644 test/built-ins/WeakSet/prototype/add/returns-this-when-ignoring-duplicate.js
 create mode 100644 test/built-ins/WeakSet/prototype/add/returns-this.js
 create mode 100644 test/built-ins/WeakSet/prototype/add/this-not-object-throw-boolean.js
 create mode 100644 test/built-ins/WeakSet/prototype/add/this-not-object-throw-null.js
 create mode 100644 test/built-ins/WeakSet/prototype/add/this-not-object-throw-number.js
 create mode 100644 test/built-ins/WeakSet/prototype/add/this-not-object-throw-string.js
 create mode 100644 test/built-ins/WeakSet/prototype/add/this-not-object-throw-symbol.js
 create mode 100644 test/built-ins/WeakSet/prototype/add/this-not-object-throw-undefined.js
 create mode 100644 test/built-ins/WeakSet/prototype/add/value-not-object-throw.js
 create mode 100644 test/built-ins/WeakSet/prototype/constructor/weakset-prototype-constructor-intrinsic.js
 create mode 100644 test/built-ins/WeakSet/prototype/constructor/weakset-prototype-constructor.js
 create mode 100644 test/built-ins/WeakSet/prototype/delete/delete-entry-initial-iterable.js
 create mode 100644 test/built-ins/WeakSet/prototype/delete/delete-entry.js
 create mode 100644 test/built-ins/WeakSet/prototype/delete/delete.js
 create mode 100644 test/built-ins/WeakSet/prototype/delete/does-not-have-weaksetdata-internal-slot-array.js
 create mode 100644 test/built-ins/WeakSet/prototype/delete/does-not-have-weaksetdata-internal-slot-map.js
 create mode 100644 test/built-ins/WeakSet/prototype/delete/does-not-have-weaksetdata-internal-slot-object.js
 create mode 100644 test/built-ins/WeakSet/prototype/delete/does-not-have-weaksetdata-internal-slot-set.js
 create mode 100644 test/built-ins/WeakSet/prototype/delete/does-not-have-weaksetdata-internal-slot-weakset-prototype.js
 create mode 100644 test/built-ins/WeakSet/prototype/delete/length.js
 create mode 100644 test/built-ins/WeakSet/prototype/delete/name.js
 create mode 100644 test/built-ins/WeakSet/prototype/delete/returns-false-value-is-not-object.js
 create mode 100644 test/built-ins/WeakSet/prototype/delete/returns-false-when-delete-is-noop.js
 create mode 100644 test/built-ins/WeakSet/prototype/delete/this-not-object-throw-boolean.js
 create mode 100644 test/built-ins/WeakSet/prototype/delete/this-not-object-throw-null.js
 create mode 100644 test/built-ins/WeakSet/prototype/delete/this-not-object-throw-number.js
 create mode 100644 test/built-ins/WeakSet/prototype/delete/this-not-object-throw-string.js
 create mode 100644 test/built-ins/WeakSet/prototype/delete/this-not-object-throw-symbol.js
 create mode 100644 test/built-ins/WeakSet/prototype/delete/this-not-object-throw-undefined.js
 create mode 100644 test/built-ins/WeakSet/prototype/has/does-not-have-weaksetdata-internal-slot-array.js
 create mode 100644 test/built-ins/WeakSet/prototype/has/does-not-have-weaksetdata-internal-slot-map.js
 create mode 100644 test/built-ins/WeakSet/prototype/has/does-not-have-weaksetdata-internal-slot-object.js
 create mode 100644 test/built-ins/WeakSet/prototype/has/does-not-have-weaksetdata-internal-slot-set.js
 create mode 100644 test/built-ins/WeakSet/prototype/has/does-not-have-weaksetdata-internal-slot-weakset-prototype.js
 create mode 100644 test/built-ins/WeakSet/prototype/has/has.js
 create mode 100644 test/built-ins/WeakSet/prototype/has/length.js
 create mode 100644 test/built-ins/WeakSet/prototype/has/name.js
 create mode 100644 test/built-ins/WeakSet/prototype/has/returns-false-when-value-is-not-object.js
 create mode 100644 test/built-ins/WeakSet/prototype/has/returns-false-when-value-not-present.js
 create mode 100644 test/built-ins/WeakSet/prototype/has/returns-true-when-value-present.js
 create mode 100644 test/built-ins/WeakSet/prototype/has/this-not-object-throw-boolean.js
 create mode 100644 test/built-ins/WeakSet/prototype/has/this-not-object-throw-null.js
 create mode 100644 test/built-ins/WeakSet/prototype/has/this-not-object-throw-number.js
 create mode 100644 test/built-ins/WeakSet/prototype/has/this-not-object-throw-string.js
 create mode 100644 test/built-ins/WeakSet/prototype/has/this-not-object-throw-symbol.js
 create mode 100644 test/built-ins/WeakSet/prototype/has/this-not-object-throw-undefined.js
 create mode 100644 test/built-ins/WeakSet/prototype/prototype-attributes.js
 create mode 100644 test/built-ins/WeakSet/undefined-newtarget.js
 create mode 100644 test/built-ins/WeakSet/weakset.js

diff --git a/test/built-ins/WeakSet/add-not-callable-throws.js b/test/built-ins/WeakSet/add-not-callable-throws.js
new file mode 100644
index 0000000000..2bc25a1814
--- /dev/null
+++ b/test/built-ins/WeakSet/add-not-callable-throws.js
@@ -0,0 +1,25 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.1.1
+description: >
+  Throws TypeError if add is not callable on constructor call.
+info: >
+  23.4.1.1 WeakSet ( [ iterable ] )
+
+  ...
+  5. If iterable is not present, let iterable be undefined.
+  6. If iterable is either undefined or null, let iter be undefined.
+  7. Else,
+    a. Let adder be Get(set, "add").
+    b. ReturnIfAbrupt(adder).
+    c. If IsCallable(adder) is false, throw a TypeError exception.
+  ...
+---*/
+
+WeakSet.prototype.add = null;
+new WeakSet();
+
+assert.throws(TypeError, function() {
+  new WeakSet([]);
+});
diff --git a/test/built-ins/WeakSet/constructor.js b/test/built-ins/WeakSet/constructor.js
new file mode 100644
index 0000000000..f4aa6a952f
--- /dev/null
+++ b/test/built-ins/WeakSet/constructor.js
@@ -0,0 +1,13 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.1
+description: >
+  The WeakSet constructor is the %WeakSet% intrinsic object and the initial
+  value of the WeakSet property of the global object.
+---*/
+
+assert.sameValue(
+  typeof WeakSet, 'function',
+  'typeof WeakSet is "function"'
+);
diff --git a/test/built-ins/WeakSet/empty-iterable.js b/test/built-ins/WeakSet/empty-iterable.js
new file mode 100644
index 0000000000..5f9d61a592
--- /dev/null
+++ b/test/built-ins/WeakSet/empty-iterable.js
@@ -0,0 +1,31 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.1.1
+description: >
+  If the iterable argument is empty, return new Weakset object.
+info: >
+  23.4.1.1 WeakSet ( [ iterable ] )
+
+  ...
+  9. Repeat
+    a. Let next be IteratorStep(iter).
+    b. ReturnIfAbrupt(next).
+    c. If next is false, return set.
+  ...
+---*/
+
+var counter = 0;
+var add = WeakSet.prototype.add;
+WeakSet.prototype.add = function(value) {
+  counter++;
+  return add.call(this, value);
+};
+var set = new WeakSet([]);
+
+assert.sameValue(Object.getPrototypeOf(set), WeakSet.prototype);
+assert(set instanceof WeakSet);
+assert.sameValue(
+  counter, 0,
+  'empty iterable does not call WeakSet.prototype.add'
+);
diff --git a/test/built-ins/WeakSet/get-add-method-failure.js b/test/built-ins/WeakSet/get-add-method-failure.js
new file mode 100644
index 0000000000..6f65bbbda5
--- /dev/null
+++ b/test/built-ins/WeakSet/get-add-method-failure.js
@@ -0,0 +1,30 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.1.1
+description: >
+  Return abrupt after getting `add` method.
+info: >
+  23.4.1.1 WeakSet ( [ iterable ] )
+
+  ...
+  5. If iterable is not present, let iterable be undefined.
+  6. If iterable is either undefined or null, let iter be undefined.
+  7. Else,
+    a. Let adder be Get(set, "add").
+    b. ReturnIfAbrupt(adder).
+    ...
+---*/
+
+Object.defineProperty(WeakSet.prototype, 'add', {
+  get: function() {
+    throw new Test262Error();
+  }
+});
+
+new WeakSet();
+new WeakSet(null);
+
+assert.throws(Test262Error, function() {
+  new WeakSet([]);
+});
diff --git a/test/built-ins/WeakSet/iterable-failure.js b/test/built-ins/WeakSet/iterable-failure.js
new file mode 100644
index 0000000000..865d4b3c44
--- /dev/null
+++ b/test/built-ins/WeakSet/iterable-failure.js
@@ -0,0 +1,19 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.1.1
+description: >
+  If the iterable argument is undefined, return new Weakset object.
+info: >
+  23.4.1.1 WeakSet ( [ iterable ] )
+
+  ...
+  7. Else,
+    d. Let iter be GetIterator(iterable).
+    e. ReturnIfAbrupt(iter).
+  ...
+---*/
+
+assert.throws(TypeError, function() {
+  new WeakSet({});
+});
diff --git a/test/built-ins/WeakSet/iterable.js b/test/built-ins/WeakSet/iterable.js
new file mode 100644
index 0000000000..14db16bed9
--- /dev/null
+++ b/test/built-ins/WeakSet/iterable.js
@@ -0,0 +1,29 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.1.1
+description: >
+  Returns the new WeakSet adding the objects from the iterable parameter.
+info: >
+  WeakSet ( [ iterable ] )
+
+  ...
+  9. Repeat
+    f. Let status be Call(adder, set, «nextValue»).
+    g. If status is an abrupt completion, return IteratorClose(iter, status).
+includes: [compareArray.js]
+---*/
+
+var first = {};
+var second = {};
+var added = [];
+var add = WeakSet.prototype.add;
+WeakSet.prototype.add = function(value) {
+  added.push(value);
+  return add.call(this, value);
+};
+var s = new WeakSet([first, second]);
+
+assert.sameValue(added.length, 2, 'Called WeakSet#add for each object');
+assert.sameValue(added[0], first, 'Adds object in order - first');
+assert.sameValue(added[1], second, 'Adds object in order - second');
diff --git a/test/built-ins/WeakSet/iterator-close-after-add-failure.js b/test/built-ins/WeakSet/iterator-close-after-add-failure.js
new file mode 100644
index 0000000000..7ea91410d0
--- /dev/null
+++ b/test/built-ins/WeakSet/iterator-close-after-add-failure.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.1.1
+description: >
+  Return IteratorClose(iter, status) if fail on adding value on constructing.
+info: >
+  WeakSet ( [ iterable ] )
+
+  ...
+  9. Repeat
+    f. Let status be Call(adder, set, «nextValue»).
+    g. If status is an abrupt completion, return IteratorClose(iter, status).
+---*/
+
+var count = 0;
+var iterable = {};
+iterable[Symbol.iterator] = function() {
+  return {
+    next: function() {
+      return { value: null, done: false };
+    },
+    return: function() {
+      count += 1;
+    }
+  };
+};
+WeakSet.prototype.add = function() { throw new Test262Error(); };
+
+assert.throws(Test262Error, function() {
+  new WeakSet(iterable);
+});
+
+assert.sameValue(
+  count, 1,
+  'The iterator is closed when `WeakSet.prototype.add` throws an error.'
+);
diff --git a/test/built-ins/WeakSet/iterator-next-failure.js b/test/built-ins/WeakSet/iterator-next-failure.js
new file mode 100644
index 0000000000..ccb3c2ca3e
--- /dev/null
+++ b/test/built-ins/WeakSet/iterator-next-failure.js
@@ -0,0 +1,28 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.1.1
+description: >
+  Return abrupt from next iterator step.
+info: >
+  23.4.1.1 WeakSet ( [ iterable ] )
+
+  ...
+  9. Repeat
+    a. Let next be IteratorStep(iter).
+    b. ReturnIfAbrupt(next).
+    ...
+---*/
+
+var iterable = {};
+iterable[Symbol.iterator] = function() {
+  return {
+    next: function() {
+      throw new Test262Error();
+    }
+  };
+};
+
+assert.throws(Test262Error, function() {
+  new WeakSet(iterable);
+});
diff --git a/test/built-ins/WeakSet/iterator-value-failure.js b/test/built-ins/WeakSet/iterator-value-failure.js
new file mode 100644
index 0000000000..eb13c04b46
--- /dev/null
+++ b/test/built-ins/WeakSet/iterator-value-failure.js
@@ -0,0 +1,34 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.1.1
+description: >
+  If the iterable argument is empty, return new Weakset object.
+info: >
+  23.4.1.1 WeakSet ( [ iterable ] )
+
+  ...
+  9. Repeat
+    ...
+    d. Let nextValue be IteratorValue(next).
+    e. ReturnIfAbrupt(nextValue).
+---*/
+
+var count = 0;
+var iterable = {};
+iterable[Symbol.iterator] = function() {
+  return {
+    next: function() {
+      return {
+        get value() {
+          throw new Test262Error();
+        },
+        done: false
+      };
+    }
+  };
+};
+
+assert.throws(Test262Error, function() {
+  new WeakSet(iterable);
+});
diff --git a/test/built-ins/WeakSet/length.js b/test/built-ins/WeakSet/length.js
new file mode 100644
index 0000000000..a8caa23e2e
--- /dev/null
+++ b/test/built-ins/WeakSet/length.js
@@ -0,0 +1,14 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.2
+description: >
+  The length property of the WeakSet constructor is 0.
+includes: [propertyHelper.js]
+---*/
+
+assert.sameValue(WeakSet.length, 0, 'The value of `WeakSet.length` is `0`');
+
+verifyNotEnumerable(WeakSet, 'length');
+verifyNotWritable(WeakSet, 'length');
+verifyConfigurable(WeakSet, 'length');
diff --git a/test/built-ins/WeakSet/name.js b/test/built-ins/WeakSet/name.js
new file mode 100644
index 0000000000..7cacba4420
--- /dev/null
+++ b/test/built-ins/WeakSet/name.js
@@ -0,0 +1,20 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.1.1
+description: >
+    WeakSet ( [ iterable ] )
+
+    17 ECMAScript Standard Built-in Objects
+
+includes: [propertyHelper.js]
+---*/
+
+assert.sameValue(
+    WeakSet.name, 'WeakSet',
+    'The value of `WeakSet.name` is "WeakSet"'
+);
+
+verifyNotEnumerable(WeakSet, 'name');
+verifyNotWritable(WeakSet, 'name');
+verifyConfigurable(WeakSet, 'name');
diff --git a/test/built-ins/WeakSet/no-iterable.js b/test/built-ins/WeakSet/no-iterable.js
new file mode 100644
index 0000000000..f3ff681a2d
--- /dev/null
+++ b/test/built-ins/WeakSet/no-iterable.js
@@ -0,0 +1,24 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.1.1
+description: >
+  If the iterable argument is undefined, return new Weakset object.
+info: >
+  23.4.1.1 WeakSet ( [ iterable ] )
+
+  ...
+  5. If iterable is not present, let iterable be undefined.
+  6. If iterable is either undefined or null, let iter be undefined.
+  ...
+  8. If iter is undefined, return set.
+  ...
+---*/
+
+var a = new WeakSet();
+var b = new WeakSet(undefined);
+var c = new WeakSet(null);
+
+assert.sameValue(Object.getPrototypeOf(a), WeakSet.prototype);
+assert.sameValue(Object.getPrototypeOf(b), WeakSet.prototype);
+assert.sameValue(Object.getPrototypeOf(c), WeakSet.prototype);
diff --git a/test/built-ins/WeakSet/properties-of-the-weakset-prototype-object.js b/test/built-ins/WeakSet/properties-of-the-weakset-prototype-object.js
new file mode 100644
index 0000000000..b71d698326
--- /dev/null
+++ b/test/built-ins/WeakSet/properties-of-the-weakset-prototype-object.js
@@ -0,0 +1,21 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3
+description: >
+  The WeakSet.prototype's prototype is Object.prototype.
+info: >
+  23.4.3 Properties of the WeakSet Prototype Object
+
+  The WeakSet prototype object is the intrinsic object %WeakSetPrototype%. The
+  value of the [[Prototype]] internal slot of the WeakSet prototype object is
+  the intrinsic object %ObjectPrototype% (19.1.3). The WeakSet prototype
+  object is an ordinary object. It does not have a [[WeakSetData]] internal
+  slot.
+---*/
+
+assert.sameValue(
+  Object.getPrototypeOf(WeakSet.prototype),
+  Object.prototype,
+  '`Object.getPrototypeOf(WeakSet.prototype)` returns `Object.prototype`'
+);
diff --git a/test/built-ins/WeakSet/prototype-of-weakset.js b/test/built-ins/WeakSet/prototype-of-weakset.js
new file mode 100644
index 0000000000..e9389ac13c
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype-of-weakset.js
@@ -0,0 +1,14 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.2
+description: >
+  The value of the [[Prototype]] internal slot of the WeakSet constructor
+  is the intrinsic object %FunctionPrototype% (19.2.3).
+---*/
+
+assert.sameValue(
+  Object.getPrototypeOf(WeakSet),
+  Function.prototype,
+  '`Object.getPrototypeOf(WeakSet)` returns `Function.prototype`'
+);
diff --git a/test/built-ins/WeakSet/prototype/Symbol.toStringTag/property-descriptor.js b/test/built-ins/WeakSet/prototype/Symbol.toStringTag/property-descriptor.js
new file mode 100644
index 0000000000..22637245d7
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/Symbol.toStringTag/property-descriptor.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.5
+description: "WeakSet#@@toStringTag value and writability"
+info: >
+  23.4.3.5 WeakSet.prototype [ @@toStringTag ]
+
+  The initial value of the @@toStringTag property is the string value
+  "WeakSet".
+
+  This property has the attributes { [[Writable]]: false, [[Enumerable]]:
+  false, [[Configurable]]: true }.
+includes: [propertyHelper.js]
+ ---*/
+
+var WeakSetProto = WeakSet.prototype;
+
+assert.sameValue(
+  WeakSetProto[Symbol.toStringTag],
+  'WeakSet',
+  'The value of WeakSet.prototype[Symbol.toStringTag] is "WeakSet"'
+);
+
+verifyNotEnumerable(WeakSetProto, Symbol.toStringTag);
+verifyNotWritable(WeakSetProto, Symbol.toStringTag);
+verifyConfigurable(WeakSetProto, Symbol.toStringTag);
diff --git a/test/built-ins/WeakSet/prototype/add/add.js b/test/built-ins/WeakSet/prototype/add/add.js
new file mode 100644
index 0000000000..6c76c71d94
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/add/add.js
@@ -0,0 +1,22 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.1
+description: WeakSet.prototype.add property descriptor
+info: >
+  WeakSet.prototype.add ( value )
+
+  17 ECMAScript Standard Built-in Objects
+
+includes: [propertyHelper.js]
+---*/
+
+assert.sameValue(
+  typeof WeakSet.prototype.add,
+  'function',
+  'typeof WeakSet.prototype.add is "function"'
+);
+
+verifyNotEnumerable(WeakSet.prototype, 'add');
+verifyWritable(WeakSet.prototype, 'add');
+verifyConfigurable(WeakSet.prototype, 'add');
diff --git a/test/built-ins/WeakSet/prototype/add/adds-element.js b/test/built-ins/WeakSet/prototype/add/adds-element.js
new file mode 100644
index 0000000000..1f491806fd
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/add/adds-element.js
@@ -0,0 +1,26 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.1
+description: >
+  Appends value as the last element of entries.
+info: >
+  WeakSet.prototype.add ( value )
+
+  ...
+  7. Append value as the last element of entries.
+  ...
+---*/
+
+var s = new WeakSet();
+var foo = {};
+var bar = {};
+var baz = {};
+
+s.add(foo);
+s.add(bar);
+s.add(baz);
+
+assert(s.has(foo));
+assert(s.has(bar));
+assert(s.has(baz));
diff --git a/test/built-ins/WeakSet/prototype/add/does-not-have-weaksetdata-internal-slot-array.js b/test/built-ins/WeakSet/prototype/add/does-not-have-weaksetdata-internal-slot-array.js
new file mode 100644
index 0000000000..81e458bd55
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/add/does-not-have-weaksetdata-internal-slot-array.js
@@ -0,0 +1,24 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.1
+description: >
+  Throws TypeError if context doesn't have a [[WeakSetData]] internal slot.
+info: >
+  WeakSet.prototype.add ( value )
+
+  ...
+  3. If S does not have a [[WeakSetData]] internal slot, throw a TypeError
+  exception.
+  ...
+
+---*/
+
+assert.throws(TypeError, function() {
+  WeakSet.prototype.add.call([], {});
+});
+
+assert.throws(TypeError, function() {
+  var s = new WeakSet();
+  s.add.call([], {});
+});
diff --git a/test/built-ins/WeakSet/prototype/add/does-not-have-weaksetdata-internal-slot-map.js b/test/built-ins/WeakSet/prototype/add/does-not-have-weaksetdata-internal-slot-map.js
new file mode 100644
index 0000000000..26aafb60b1
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/add/does-not-have-weaksetdata-internal-slot-map.js
@@ -0,0 +1,24 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.1
+description: >
+  Throws TypeError if context doesn't have a [[WeakSetData]] internal slot.
+info: >
+  WeakSet.prototype.add ( value )
+
+  ...
+  3. If S does not have a [[WeakSetData]] internal slot, throw a TypeError
+  exception.
+  ...
+
+---*/
+
+assert.throws(TypeError, function() {
+  WeakSet.prototype.add.call(new Map(), {});
+});
+
+assert.throws(TypeError, function() {
+  var s = new WeakSet();
+  s.add.call(new Map(), {});
+});
diff --git a/test/built-ins/WeakSet/prototype/add/does-not-have-weaksetdata-internal-slot-object.js b/test/built-ins/WeakSet/prototype/add/does-not-have-weaksetdata-internal-slot-object.js
new file mode 100644
index 0000000000..2b13e930cc
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/add/does-not-have-weaksetdata-internal-slot-object.js
@@ -0,0 +1,24 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.1
+description: >
+  Throws TypeError if context doesn't have a [[WeakSetData]] internal slot.
+info: >
+  WeakSet.prototype.add ( value )
+
+  ...
+  3. If S does not have a [[WeakSetData]] internal slot, throw a TypeError
+  exception.
+  ...
+
+---*/
+
+assert.throws(TypeError, function() {
+  WeakSet.prototype.add.call({}, {});
+});
+
+assert.throws(TypeError, function() {
+  var s = new WeakSet();
+  s.add.call({}, {});
+});
diff --git a/test/built-ins/WeakSet/prototype/add/does-not-have-weaksetdata-internal-slot-set.js b/test/built-ins/WeakSet/prototype/add/does-not-have-weaksetdata-internal-slot-set.js
new file mode 100644
index 0000000000..a1b248d267
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/add/does-not-have-weaksetdata-internal-slot-set.js
@@ -0,0 +1,24 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.1
+description: >
+  Throws TypeError if context doesn't have a [[WeakSetData]] internal slot.
+info: >
+  WeakSet.prototype.add ( value )
+
+  ...
+  3. If S does not have a [[WeakSetData]] internal slot, throw a TypeError
+  exception.
+  ...
+features: [Set]
+---*/
+
+assert.throws(TypeError, function() {
+  WeakSet.prototype.add.call(new Set(), {});
+});
+
+assert.throws(TypeError, function() {
+  var s = new WeakSet();
+  s.add.call(new Set(), {});
+});
diff --git a/test/built-ins/WeakSet/prototype/add/does-not-have-weaksetdata-internal-slot-weakset-prototype.js b/test/built-ins/WeakSet/prototype/add/does-not-have-weaksetdata-internal-slot-weakset-prototype.js
new file mode 100644
index 0000000000..d4f285aa8f
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/add/does-not-have-weaksetdata-internal-slot-weakset-prototype.js
@@ -0,0 +1,24 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.1
+description: >
+  Throws TypeError if context doesn't have a [[WeakSetData]] internal slot.
+info: >
+  WeakSet.prototype.add ( value )
+
+  ...
+  3. If S does not have a [[WeakSetData]] internal slot, throw a TypeError
+  exception.
+  ...
+
+---*/
+
+assert.throws(TypeError, function() {
+  WeakSet.prototype.add.call(WeakSet.prototype, {});
+});
+
+assert.throws(TypeError, function() {
+  var s = new WeakSet();
+  s.add.call(WeakSet.prototype, {});
+});
diff --git a/test/built-ins/WeakSet/prototype/add/length.js b/test/built-ins/WeakSet/prototype/add/length.js
new file mode 100644
index 0000000000..3e7838bace
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/add/length.js
@@ -0,0 +1,21 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.1
+description: WeakSet.prototype.add.length descriptor
+info: >
+  WeakSet.prototype.add ( value )
+
+  17 ECMAScript Standard Built-in Objects
+
+includes: [propertyHelper.js]
+---*/
+
+assert.sameValue(
+  WeakSet.prototype.add.length, 1,
+  'The value of `WeakSet.prototype.add.length` is `1`'
+);
+
+verifyNotEnumerable(WeakSet.prototype.add, 'length');
+verifyNotWritable(WeakSet.prototype.add, 'length');
+verifyConfigurable(WeakSet.prototype.add, 'length');
diff --git a/test/built-ins/WeakSet/prototype/add/name.js b/test/built-ins/WeakSet/prototype/add/name.js
new file mode 100644
index 0000000000..b88aa93f78
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/add/name.js
@@ -0,0 +1,21 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.1
+description: WeakSet.prototype.add.name descriptor
+info: >
+  WeakSet.prototype.add ( value )
+
+  17 ECMAScript Standard Built-in Objects
+
+includes: [propertyHelper.js]
+---*/
+
+assert.sameValue(
+  WeakSet.prototype.add.name, 'add',
+  'The value of WeakSet.prototype.add.name is "add"'
+);
+
+verifyNotEnumerable(WeakSet.prototype.add, 'name');
+verifyNotWritable(WeakSet.prototype.add, 'name');
+verifyConfigurable(WeakSet.prototype.add, 'name');
diff --git a/test/built-ins/WeakSet/prototype/add/returns-this-when-ignoring-duplicate.js b/test/built-ins/WeakSet/prototype/add/returns-this-when-ignoring-duplicate.js
new file mode 100644
index 0000000000..d7363bb184
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/add/returns-this-when-ignoring-duplicate.js
@@ -0,0 +1,20 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.1
+description: Returns `this` when new value is duplicate.
+info: >
+  WeakSet.prototype.add ( value )
+
+  1. Let S be this value.
+  ...
+  6. Repeat for each e that is an element of entries,
+    a. If e is not empty and SameValueZero(e, value) is true, then
+    i. Return S.
+  ...
+---*/
+
+var foo = {};
+var s = new WeakSet([foo]);
+
+assert.sameValue(s.add(foo), s, '`s.add(foo)` returns `s`');
diff --git a/test/built-ins/WeakSet/prototype/add/returns-this.js b/test/built-ins/WeakSet/prototype/add/returns-this.js
new file mode 100644
index 0000000000..789ccbd53d
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/add/returns-this.js
@@ -0,0 +1,17 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.1
+description: Returns `this` after adding a new value.
+info: >
+  WeakSet.prototype.add ( value )
+
+  1. Let S be this value.
+  ...
+  8. Return S.
+
+---*/
+
+var s = new WeakSet();
+
+assert.sameValue(s.add({}), s, '`s.add({})` returns `s`');
diff --git a/test/built-ins/WeakSet/prototype/add/this-not-object-throw-boolean.js b/test/built-ins/WeakSet/prototype/add/this-not-object-throw-boolean.js
new file mode 100644
index 0000000000..0c0683b132
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/add/this-not-object-throw-boolean.js
@@ -0,0 +1,21 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.1
+description: Throws TypeError if `this` is not Object.
+info: >
+  WeakSet.prototype.add ( value )
+
+  1. Let S be the this value.
+  2. If Type(S) is not Object, throw a TypeError exception.
+
+---*/
+
+assert.throws(TypeError, function() {
+  WeakSet.prototype.add.call(false, {});
+});
+
+assert.throws(TypeError, function() {
+  var s = new WeakSet();
+  s.add.call(false, {});
+});
diff --git a/test/built-ins/WeakSet/prototype/add/this-not-object-throw-null.js b/test/built-ins/WeakSet/prototype/add/this-not-object-throw-null.js
new file mode 100644
index 0000000000..369e7daf8d
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/add/this-not-object-throw-null.js
@@ -0,0 +1,21 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.1
+description: Throws TypeError if `this` is not Object.
+info: >
+  WeakSet.prototype.add ( value )
+
+  1. Let S be the this value.
+  2. If Type(S) is not Object, throw a TypeError exception.
+
+---*/
+
+assert.throws(TypeError, function() {
+  WeakSet.prototype.add.call(null, {});
+});
+
+assert.throws(TypeError, function() {
+  var s = new WeakSet();
+  s.add.call(null, {});
+});
diff --git a/test/built-ins/WeakSet/prototype/add/this-not-object-throw-number.js b/test/built-ins/WeakSet/prototype/add/this-not-object-throw-number.js
new file mode 100644
index 0000000000..0ce12e338e
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/add/this-not-object-throw-number.js
@@ -0,0 +1,21 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.1
+description: Throws TypeError if `this` is not Object.
+info: >
+  WeakSet.prototype.add ( value )
+
+  1. Let S be the this value.
+  2. If Type(S) is not Object, throw a TypeError exception.
+
+---*/
+
+assert.throws(TypeError, function() {
+  WeakSet.prototype.add.call(0, {});
+});
+
+assert.throws(TypeError, function() {
+  var s = new WeakSet();
+  s.add.call(0, {});
+});
diff --git a/test/built-ins/WeakSet/prototype/add/this-not-object-throw-string.js b/test/built-ins/WeakSet/prototype/add/this-not-object-throw-string.js
new file mode 100644
index 0000000000..d2390d5405
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/add/this-not-object-throw-string.js
@@ -0,0 +1,21 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.1
+description: Throws TypeError if `this` is not Object.
+info: >
+  WeakSet.prototype.add ( value )
+
+  1. Let S be the this value.
+  2. If Type(S) is not Object, throw a TypeError exception.
+
+---*/
+
+assert.throws(TypeError, function() {
+  WeakSet.prototype.add.call('', {});
+});
+
+assert.throws(TypeError, function() {
+  var s = new WeakSet();
+  s.add.call('', {});
+});
diff --git a/test/built-ins/WeakSet/prototype/add/this-not-object-throw-symbol.js b/test/built-ins/WeakSet/prototype/add/this-not-object-throw-symbol.js
new file mode 100644
index 0000000000..d54f84ef0d
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/add/this-not-object-throw-symbol.js
@@ -0,0 +1,21 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.1
+description: Throws TypeError if `this` is not Object.
+info: >
+  WeakSet.prototype.add ( value )
+
+  1. Let S be the this value.
+  2. If Type(S) is not Object, throw a TypeError exception.
+features: [Symbol]
+---*/
+
+assert.throws(TypeError, function() {
+  WeakSet.prototype.add.call(Symbol(), {});
+});
+
+assert.throws(TypeError, function() {
+  var s = new WeakSet();
+  s.add.call(Symbol(), {});
+});
diff --git a/test/built-ins/WeakSet/prototype/add/this-not-object-throw-undefined.js b/test/built-ins/WeakSet/prototype/add/this-not-object-throw-undefined.js
new file mode 100644
index 0000000000..daf6c2393d
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/add/this-not-object-throw-undefined.js
@@ -0,0 +1,21 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.1
+description: Throws TypeError if `this` is not Object.
+info: >
+  WeakSet.prototype.add ( value )
+
+  1. Let S be the this value.
+  2. If Type(S) is not Object, throw a TypeError exception.
+
+---*/
+
+assert.throws(TypeError, function() {
+  WeakSet.prototype.add.call(undefined, {});
+});
+
+assert.throws(TypeError, function() {
+  var s = new WeakSet();
+  s.add.call(undefined, {});
+});
diff --git a/test/built-ins/WeakSet/prototype/add/value-not-object-throw.js b/test/built-ins/WeakSet/prototype/add/value-not-object-throw.js
new file mode 100644
index 0000000000..622a6e5d4c
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/add/value-not-object-throw.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.1
+description: Throws TypeError if `value` is not Object.
+info: >
+  WeakSet.prototype.add ( value )
+
+  4. If Type(value) is not Object, throw a TypeError exception.
+features: [Symbol]
+---*/
+
+var s = new WeakSet();
+
+assert.throws(TypeError, function() {
+  s.add(1);
+});
+
+assert.throws(TypeError, function() {
+  s.add(false);
+});
+
+assert.throws(TypeError, function() {
+  s.add();
+});
+
+assert.throws(TypeError, function() {
+  s.add('string');
+});
+
+assert.throws(TypeError, function() {
+  s.add(null);
+});
+
+assert.throws(TypeError, function() {
+  s.add(Symbol());
+});
diff --git a/test/built-ins/WeakSet/prototype/constructor/weakset-prototype-constructor-intrinsic.js b/test/built-ins/WeakSet/prototype/constructor/weakset-prototype-constructor-intrinsic.js
new file mode 100644
index 0000000000..5eb8862f66
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/constructor/weakset-prototype-constructor-intrinsic.js
@@ -0,0 +1,14 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.2
+description: >
+  The initial value of WeakSet.prototype.constructor is the %WeakSet%
+  intrinsic object.
+---*/
+
+assert.sameValue(
+  WeakSet.prototype.constructor,
+  WeakSet,
+  'The value of WeakSet.prototype.constructor is "WeakSet"'
+);
diff --git a/test/built-ins/WeakSet/prototype/constructor/weakset-prototype-constructor.js b/test/built-ins/WeakSet/prototype/constructor/weakset-prototype-constructor.js
new file mode 100644
index 0000000000..5773f7eed3
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/constructor/weakset-prototype-constructor.js
@@ -0,0 +1,17 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.2
+description: >
+  WeakSet.prototype.constructor property descriptor
+info: >
+  WeakSet ( [ iterable ] )
+
+  17 ECMAScript Standard Built-in Objects
+
+includes: [propertyHelper.js]
+---*/
+
+verifyNotEnumerable(WeakSet.prototype, 'constructor');
+verifyWritable(WeakSet.prototype, 'constructor');
+verifyConfigurable(WeakSet.prototype, 'constructor');
diff --git a/test/built-ins/WeakSet/prototype/delete/delete-entry-initial-iterable.js b/test/built-ins/WeakSet/prototype/delete/delete-entry-initial-iterable.js
new file mode 100644
index 0000000000..02e2845a47
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/delete/delete-entry-initial-iterable.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.3
+description: >
+  Delete an entry from initial iterable.
+info: >
+  WeakSet.prototype.delete ( value )
+
+  ...
+  5. Let entries be the List that is the value of S’s [[WeakSetData]] internal
+  slot.
+  6. Repeat for each e that is an element of entries,
+    a. If e is not empty and SameValue(e, value) is true, then
+    i. Replace the element of entries whose value is e with an element whose
+    value is empty.
+    ii. Return true.
+  ...
+---*/
+
+var foo = {};
+var s = new WeakSet([foo]);
+
+var result = s.delete(foo);
+
+assert.sameValue(s.has(foo), false);
+assert.sameValue(result, true, 'WeakSet#delete returns true');
diff --git a/test/built-ins/WeakSet/prototype/delete/delete-entry.js b/test/built-ins/WeakSet/prototype/delete/delete-entry.js
new file mode 100644
index 0000000000..286c2693c2
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/delete/delete-entry.js
@@ -0,0 +1,30 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.3
+description: >
+  Delete an entry.
+info: >
+  WeakSet.prototype.delete ( value )
+
+  ...
+  5. Let entries be the List that is the value of S’s [[WeakSetData]] internal
+  slot.
+  6. Repeat for each e that is an element of entries,
+    a. If e is not empty and SameValue(e, value) is true, then
+    i. Replace the element of entries whose value is e with an element whose
+    value is empty.
+    ii. Return true.
+  ...
+
+---*/
+
+var foo = {};
+var s = new WeakSet();
+
+s.add(foo);
+
+var result = s.delete(foo);
+
+assert.sameValue(s.has(foo), false);
+assert.sameValue(result, true, 'WeakSet#delete returns true');
\ No newline at end of file
diff --git a/test/built-ins/WeakSet/prototype/delete/delete.js b/test/built-ins/WeakSet/prototype/delete/delete.js
new file mode 100644
index 0000000000..0e5c9bb3fc
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/delete/delete.js
@@ -0,0 +1,23 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.3
+description: >
+  WeakSet.prototype.delete property descriptor
+info: >
+  WeakSet.prototype.delete ( value )
+
+  17 ECMAScript Standard Built-in Objects
+
+includes: [propertyHelper.js]
+---*/
+
+assert.sameValue(
+  typeof WeakSet.prototype.delete,
+  'function',
+  'typeof WeakSet.prototype.delete is "function"'
+);
+
+verifyNotEnumerable(WeakSet.prototype, 'delete');
+verifyWritable(WeakSet.prototype, 'delete');
+verifyConfigurable(WeakSet.prototype, 'delete');
diff --git a/test/built-ins/WeakSet/prototype/delete/does-not-have-weaksetdata-internal-slot-array.js b/test/built-ins/WeakSet/prototype/delete/does-not-have-weaksetdata-internal-slot-array.js
new file mode 100644
index 0000000000..f90157dd8e
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/delete/does-not-have-weaksetdata-internal-slot-array.js
@@ -0,0 +1,23 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.3
+description: >
+  Throws TypeError if context doesn't have a [[WeakSetData]] internal slot.
+info: >
+  WeakSet.prototype.delete ( value )
+
+  ...
+  3. If S does not have a [[WeakSetData]] internal slot, throw a TypeError
+  exception.
+  ...
+---*/
+
+assert.throws(TypeError, function() {
+  WeakSet.prototype.delete.call([], {});
+});
+
+assert.throws(TypeError, function() {
+  var s = new WeakSet();
+  s.delete.call([], {});
+});
diff --git a/test/built-ins/WeakSet/prototype/delete/does-not-have-weaksetdata-internal-slot-map.js b/test/built-ins/WeakSet/prototype/delete/does-not-have-weaksetdata-internal-slot-map.js
new file mode 100644
index 0000000000..f779e09da6
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/delete/does-not-have-weaksetdata-internal-slot-map.js
@@ -0,0 +1,23 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.3
+description: >
+  Throws TypeError if context doesn't have a [[WeakSetData]] internal slot.
+info: >
+  WeakSet.prototype.delete ( value )
+
+  ...
+  3. If S does not have a [[WeakSetData]] internal slot, throw a TypeError
+  exception.
+  ...
+---*/
+
+assert.throws(TypeError, function() {
+  WeakSet.prototype.delete.call(new Map(), {});
+});
+
+assert.throws(TypeError, function() {
+  var s = new WeakSet();
+  s.delete.call(new Map(), {});
+});
diff --git a/test/built-ins/WeakSet/prototype/delete/does-not-have-weaksetdata-internal-slot-object.js b/test/built-ins/WeakSet/prototype/delete/does-not-have-weaksetdata-internal-slot-object.js
new file mode 100644
index 0000000000..7758d01139
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/delete/does-not-have-weaksetdata-internal-slot-object.js
@@ -0,0 +1,23 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.3
+description: >
+  Throws TypeError if context doesn't have a [[WeakSetData]] internal slot.
+info: >
+  WeakSet.prototype.delete ( value )
+
+  ...
+  3. If S does not have a [[WeakSetData]] internal slot, throw a TypeError
+  exception.
+  ...
+---*/
+
+assert.throws(TypeError, function() {
+  WeakSet.prototype.delete.call({}, {});
+});
+
+assert.throws(TypeError, function() {
+  var s = new WeakSet();
+  s.delete.call({}, {});
+});
diff --git a/test/built-ins/WeakSet/prototype/delete/does-not-have-weaksetdata-internal-slot-set.js b/test/built-ins/WeakSet/prototype/delete/does-not-have-weaksetdata-internal-slot-set.js
new file mode 100644
index 0000000000..c18918a336
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/delete/does-not-have-weaksetdata-internal-slot-set.js
@@ -0,0 +1,24 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.3
+description: >
+  Throws TypeError if context doesn't have a [[WeakSetData]] internal slot.
+info: >
+  WeakSet.prototype.delete ( value )
+
+  ...
+  3. If S does not have a [[WeakSetData]] internal slot, throw a TypeError
+  exception.
+  ...
+features: [Set]
+---*/
+
+assert.throws(TypeError, function() {
+  WeakSet.prototype.delete.call(new Set(), {});
+});
+
+assert.throws(TypeError, function() {
+  var s = new WeakSet();
+  s.delete.call(new Set(), {});
+});
diff --git a/test/built-ins/WeakSet/prototype/delete/does-not-have-weaksetdata-internal-slot-weakset-prototype.js b/test/built-ins/WeakSet/prototype/delete/does-not-have-weaksetdata-internal-slot-weakset-prototype.js
new file mode 100644
index 0000000000..276472ff28
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/delete/does-not-have-weaksetdata-internal-slot-weakset-prototype.js
@@ -0,0 +1,23 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.3
+description: >
+  Throws TypeError if context doesn't have a [[WeakSetData]] internal slot.
+info: >
+  WeakSet.prototype.delete ( value )
+
+  ...
+  3. If S does not have a [[WeakSetData]] internal slot, throw a TypeError
+  exception.
+  ...
+---*/
+
+assert.throws(TypeError, function() {
+  WeakSet.prototype.delete.call(WeakSet.prototype, {});
+});
+
+assert.throws(TypeError, function() {
+  var s = new WeakSet();
+  s.delete.call(WeakSet.prototype, {});
+});
diff --git a/test/built-ins/WeakSet/prototype/delete/length.js b/test/built-ins/WeakSet/prototype/delete/length.js
new file mode 100644
index 0000000000..37ed98ddfa
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/delete/length.js
@@ -0,0 +1,22 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.3
+description: >
+  WeakSet.prototype.delete.length value and writability.
+info: >
+  WeakSet.prototype.delete ( value )
+
+  17 ECMAScript Standard Built-in Objects
+
+includes: [propertyHelper.js]
+---*/
+
+assert.sameValue(
+  WeakSet.prototype.delete.length, 1,
+  'The value of WeakSet.prototype.delete.length is 1'
+);
+
+verifyNotEnumerable(WeakSet.prototype.delete, 'length');
+verifyNotWritable(WeakSet.prototype.delete, 'length');
+verifyConfigurable(WeakSet.prototype.delete, 'length');
diff --git a/test/built-ins/WeakSet/prototype/delete/name.js b/test/built-ins/WeakSet/prototype/delete/name.js
new file mode 100644
index 0000000000..83f7e6b004
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/delete/name.js
@@ -0,0 +1,22 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.3
+description: >
+  WeakSet.prototype.delete.name value and writability.
+info: >
+  WeakSet.prototype.delete ( value )
+
+  17 ECMAScript Standard Built-in Objects
+
+includes: [propertyHelper.js]
+---*/
+
+assert.sameValue(
+  WeakSet.prototype.delete.name, 'delete',
+  'The value of WeakSet.prototype.delete.name is "delete"'
+);
+
+verifyNotEnumerable(WeakSet.prototype.delete, 'name');
+verifyNotWritable(WeakSet.prototype.delete, 'name');
+verifyConfigurable(WeakSet.prototype.delete, 'name');
diff --git a/test/built-ins/WeakSet/prototype/delete/returns-false-value-is-not-object.js b/test/built-ins/WeakSet/prototype/delete/returns-false-value-is-not-object.js
new file mode 100644
index 0000000000..f832e6d066
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/delete/returns-false-value-is-not-object.js
@@ -0,0 +1,21 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.3
+description: >
+  Return false if value is not a non-null Object.
+info: >
+  WeakSet.prototype.delete ( value )
+
+  4. If Type(value) is not Object, return false.
+features: [Symbol]
+---*/
+
+var s = new WeakSet();
+
+assert.sameValue(s.delete(1), false);
+assert.sameValue(s.delete(''), false);
+assert.sameValue(s.delete(null), false);
+assert.sameValue(s.delete(undefined), false);
+assert.sameValue(s.delete(true), false);
+assert.sameValue(s.delete(Symbol()), false);
diff --git a/test/built-ins/WeakSet/prototype/delete/returns-false-when-delete-is-noop.js b/test/built-ins/WeakSet/prototype/delete/returns-false-when-delete-is-noop.js
new file mode 100644
index 0000000000..9c549cd96a
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/delete/returns-false-when-delete-is-noop.js
@@ -0,0 +1,17 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.3
+description: >
+  Return false if entry wasn't in the WeakSet.
+info: >
+  WeakSet.prototype.delete ( value )
+
+  ...
+  7. Return false.
+
+---*/
+
+var s = new WeakSet();
+
+assert.sameValue(s.delete({}), false);
diff --git a/test/built-ins/WeakSet/prototype/delete/this-not-object-throw-boolean.js b/test/built-ins/WeakSet/prototype/delete/this-not-object-throw-boolean.js
new file mode 100644
index 0000000000..6e7beed6b4
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/delete/this-not-object-throw-boolean.js
@@ -0,0 +1,20 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.3
+description: Throws TypeError if `this` is not Object.
+info: >
+  WeakSet.prototype.delete ( value )
+
+  1. Let S be the this value.
+  2. If Type(S) is not Object, throw a TypeError exception.
+---*/
+
+assert.throws(TypeError, function() {
+  WeakSet.prototype.delete.call(false, {});
+});
+
+assert.throws(TypeError, function() {
+  var s = new WeakSet();
+  s.delete.call(false, {});
+});
diff --git a/test/built-ins/WeakSet/prototype/delete/this-not-object-throw-null.js b/test/built-ins/WeakSet/prototype/delete/this-not-object-throw-null.js
new file mode 100644
index 0000000000..f71201387f
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/delete/this-not-object-throw-null.js
@@ -0,0 +1,20 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.3
+description: Throws TypeError if `this` is not Object.
+info: >
+  WeakSet.prototype.delete ( value )
+
+  1. Let S be the this value.
+  2. If Type(S) is not Object, throw a TypeError exception.
+---*/
+
+assert.throws(TypeError, function() {
+  WeakSet.prototype.delete.call(null, {});
+});
+
+assert.throws(TypeError, function() {
+  var s = new WeakSet();
+  s.delete.call(null, {});
+});
diff --git a/test/built-ins/WeakSet/prototype/delete/this-not-object-throw-number.js b/test/built-ins/WeakSet/prototype/delete/this-not-object-throw-number.js
new file mode 100644
index 0000000000..7abf016275
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/delete/this-not-object-throw-number.js
@@ -0,0 +1,20 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.3
+description: Throws TypeError if `this` is not Object.
+info: >
+  WeakSet.prototype.delete ( value )
+
+  1. Let S be the this value.
+  2. If Type(S) is not Object, throw a TypeError exception.
+---*/
+
+assert.throws(TypeError, function() {
+  WeakSet.prototype.delete.call(0, {});
+});
+
+assert.throws(TypeError, function() {
+  var s = new WeakSet();
+  s.delete.call(0, {});
+});
diff --git a/test/built-ins/WeakSet/prototype/delete/this-not-object-throw-string.js b/test/built-ins/WeakSet/prototype/delete/this-not-object-throw-string.js
new file mode 100644
index 0000000000..a91650db8c
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/delete/this-not-object-throw-string.js
@@ -0,0 +1,20 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.3
+description: Throws TypeError if `this` is not Object.
+info: >
+  WeakSet.prototype.delete ( value )
+
+  1. Let S be the this value.
+  2. If Type(S) is not Object, throw a TypeError exception.
+---*/
+
+assert.throws(TypeError, function() {
+  WeakSet.prototype.delete.call('', {});
+});
+
+assert.throws(TypeError, function() {
+  var s = new WeakSet();
+  s.delete.call('', {});
+});
diff --git a/test/built-ins/WeakSet/prototype/delete/this-not-object-throw-symbol.js b/test/built-ins/WeakSet/prototype/delete/this-not-object-throw-symbol.js
new file mode 100644
index 0000000000..76df4a419e
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/delete/this-not-object-throw-symbol.js
@@ -0,0 +1,20 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.3
+description: Throws TypeError if `this` is not Object.
+info: >
+  WeakSet.prototype.delete ( value )
+
+  1. Let S be the this value.
+  2. If Type(S) is not Object, throw a TypeError exception.
+---*/
+
+assert.throws(TypeError, function() {
+  WeakSet.prototype.delete.call(Symbol(), {});
+});
+
+assert.throws(TypeError, function() {
+  var s = new WeakSet();
+  s.delete.call(Symbol(), {});
+});
diff --git a/test/built-ins/WeakSet/prototype/delete/this-not-object-throw-undefined.js b/test/built-ins/WeakSet/prototype/delete/this-not-object-throw-undefined.js
new file mode 100644
index 0000000000..9d816870b3
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/delete/this-not-object-throw-undefined.js
@@ -0,0 +1,20 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.3
+description: Throws TypeError if `this` is not Object.
+info: >
+  WeakSet.prototype.delete ( value )
+
+  1. Let S be the this value.
+  2. If Type(S) is not Object, throw a TypeError exception.
+---*/
+
+assert.throws(TypeError, function() {
+  WeakSet.prototype.delete.call(undefined, {});
+});
+
+assert.throws(TypeError, function() {
+  var s = new WeakSet();
+  s.delete.call(undefined, {});
+});
diff --git a/test/built-ins/WeakSet/prototype/has/does-not-have-weaksetdata-internal-slot-array.js b/test/built-ins/WeakSet/prototype/has/does-not-have-weaksetdata-internal-slot-array.js
new file mode 100644
index 0000000000..0fd9d989cf
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/has/does-not-have-weaksetdata-internal-slot-array.js
@@ -0,0 +1,23 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.4
+description: >
+  Throws TypeError if context doesn't have a [[WeakSetData]] internal slot.
+info: >
+  WeakSet.prototype.has ( value )
+
+  ...
+  3. If S does not have a [[WeakSetData]] internal slot, throw a TypeError
+  exception.
+  ...
+---*/
+
+assert.throws(TypeError, function() {
+  WeakSet.prototype.has.call([], {});
+});
+
+assert.throws(TypeError, function() {
+  var s = new WeakSet();
+  s.has.call([], {});
+});
diff --git a/test/built-ins/WeakSet/prototype/has/does-not-have-weaksetdata-internal-slot-map.js b/test/built-ins/WeakSet/prototype/has/does-not-have-weaksetdata-internal-slot-map.js
new file mode 100644
index 0000000000..e821224378
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/has/does-not-have-weaksetdata-internal-slot-map.js
@@ -0,0 +1,23 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.4
+description: >
+  Throws TypeError if context doesn't have a [[WeakSetData]] internal slot.
+info: >
+  WeakSet.prototype.has ( value )
+
+  ...
+  3. If S does not have a [[WeakSetData]] internal slot, throw a TypeError
+  exception.
+  ...
+---*/
+
+assert.throws(TypeError, function() {
+  WeakSet.prototype.has.call(new Map(), {});
+});
+
+assert.throws(TypeError, function() {
+  var s = new WeakSet();
+  s.has.call(new Map(), {});
+});
diff --git a/test/built-ins/WeakSet/prototype/has/does-not-have-weaksetdata-internal-slot-object.js b/test/built-ins/WeakSet/prototype/has/does-not-have-weaksetdata-internal-slot-object.js
new file mode 100644
index 0000000000..058319b236
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/has/does-not-have-weaksetdata-internal-slot-object.js
@@ -0,0 +1,23 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.4
+description: >
+  Throws TypeError if context doesn't have a [[WeakSetData]] internal slot.
+info: >
+  WeakSet.prototype.has ( value )
+
+  ...
+  3. If S does not have a [[WeakSetData]] internal slot, throw a TypeError
+  exception.
+  ...
+---*/
+
+assert.throws(TypeError, function() {
+  WeakSet.prototype.has.call({}, {});
+});
+
+assert.throws(TypeError, function() {
+  var s = new WeakSet();
+  s.has.call({}, {});
+});
diff --git a/test/built-ins/WeakSet/prototype/has/does-not-have-weaksetdata-internal-slot-set.js b/test/built-ins/WeakSet/prototype/has/does-not-have-weaksetdata-internal-slot-set.js
new file mode 100644
index 0000000000..e024db3f73
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/has/does-not-have-weaksetdata-internal-slot-set.js
@@ -0,0 +1,24 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.4
+description: >
+  Throws TypeError if context doesn't have a [[WeakSetData]] internal slot.
+info: >
+  WeakSet.prototype.has ( value )
+
+  ...
+  3. If S does not have a [[WeakSetData]] internal slot, throw a TypeError
+  exception.
+  ...
+features: [Set]
+---*/
+
+assert.throws(TypeError, function() {
+  WeakSet.prototype.has.call(new Set(), {});
+});
+
+assert.throws(TypeError, function() {
+  var s = new WeakSet();
+  s.has.call(new Set(), {});
+});
diff --git a/test/built-ins/WeakSet/prototype/has/does-not-have-weaksetdata-internal-slot-weakset-prototype.js b/test/built-ins/WeakSet/prototype/has/does-not-have-weaksetdata-internal-slot-weakset-prototype.js
new file mode 100644
index 0000000000..d21ef2180a
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/has/does-not-have-weaksetdata-internal-slot-weakset-prototype.js
@@ -0,0 +1,23 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.4
+description: >
+  Throws TypeError if context doesn't have a [[WeakSetData]] internal slot.
+info: >
+  WeakSet.prototype.has ( value )
+
+  ...
+  3. If S does not have a [[WeakSetData]] internal slot, throw a TypeError
+  exception.
+  ...
+---*/
+
+assert.throws(TypeError, function() {
+  WeakSet.prototype.has.call(WeakSet.prototype, {});
+});
+
+assert.throws(TypeError, function() {
+  var s = new WeakSet();
+  s.has.call(WeakSet.prototype, {});
+});
diff --git a/test/built-ins/WeakSet/prototype/has/has.js b/test/built-ins/WeakSet/prototype/has/has.js
new file mode 100644
index 0000000000..8a30652ff9
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/has/has.js
@@ -0,0 +1,23 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.4
+description: >
+  WeakSet.prototype.has property descriptor
+info: >
+  WeakSet.prototype.has ( value )
+
+  17 ECMAScript Standard Built-in Objects
+
+includes: [propertyHelper.js]
+---*/
+
+assert.sameValue(
+  typeof WeakSet.prototype.has,
+  'function',
+  'typeof WeakSet.prototype.has is "function"'
+);
+
+verifyNotEnumerable(WeakSet.prototype, 'has');
+verifyWritable(WeakSet.prototype, 'has');
+verifyConfigurable(WeakSet.prototype, 'has');
diff --git a/test/built-ins/WeakSet/prototype/has/length.js b/test/built-ins/WeakSet/prototype/has/length.js
new file mode 100644
index 0000000000..c8564f4d02
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/has/length.js
@@ -0,0 +1,22 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.4
+description: >
+  WeakSet.prototype.has.length value and writability.
+info: >
+  WeakSet.prototype.has ( value )
+
+  17 ECMAScript Standard Built-in Objects
+
+includes: [propertyHelper.js]
+---*/
+
+assert.sameValue(
+  WeakSet.prototype.has.length, 1,
+  'The value of WeakSet.prototype.has.length is 1'
+);
+
+verifyNotEnumerable(WeakSet.prototype.has, 'length');
+verifyNotWritable(WeakSet.prototype.has, 'length');
+verifyConfigurable(WeakSet.prototype.has, 'length');
diff --git a/test/built-ins/WeakSet/prototype/has/name.js b/test/built-ins/WeakSet/prototype/has/name.js
new file mode 100644
index 0000000000..ef8f1be9f2
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/has/name.js
@@ -0,0 +1,22 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.4
+description: >
+  WeakSet.prototype.has.name value and writability.
+info: >
+  WeakSet.prototype.has ( value )
+
+  17 ECMAScript Standard Built-in Objects
+
+includes: [propertyHelper.js]
+---*/
+
+assert.sameValue(
+  WeakSet.prototype.has.name, 'has',
+  'The value of WeakSet.prototype.has.name is "has"'
+);
+
+verifyNotEnumerable(WeakSet.prototype.has, 'name');
+verifyNotWritable(WeakSet.prototype.has, 'name');
+verifyConfigurable(WeakSet.prototype.has, 'name');
diff --git a/test/built-ins/WeakSet/prototype/has/returns-false-when-value-is-not-object.js b/test/built-ins/WeakSet/prototype/has/returns-false-when-value-is-not-object.js
new file mode 100644
index 0000000000..803da8bd37
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/has/returns-false-when-value-is-not-object.js
@@ -0,0 +1,21 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.4
+description: >
+  Returns false if value is not a non-null Object.
+info: >
+  WeakSet.prototype.has ( value )
+
+  5. If Type(value) is not Object, return false.
+features: [Symbol]
+---*/
+
+var s = new WeakSet();
+
+assert.sameValue(s.has(1), false);
+assert.sameValue(s.has(''), false);
+assert.sameValue(s.has(null), false);
+assert.sameValue(s.has(undefined), false);
+assert.sameValue(s.has(true), false);
+assert.sameValue(s.has(Symbol()), false);
diff --git a/test/built-ins/WeakSet/prototype/has/returns-false-when-value-not-present.js b/test/built-ins/WeakSet/prototype/has/returns-false-when-value-not-present.js
new file mode 100644
index 0000000000..e0a3efc8cc
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/has/returns-false-when-value-not-present.js
@@ -0,0 +1,25 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.4
+description: >
+  Return false when value is not present in the WeakSet entries.
+info: >
+  WeakSet.prototype.has ( value )
+
+  ...
+  7. Return false.
+
+---*/
+
+var foo = {};
+var bar = {};
+var s = new WeakSet();
+
+assert.sameValue(s.has(foo), false);
+
+s.add(foo);
+assert.sameValue(s.has(bar), false);
+
+s.delete(foo);
+assert.sameValue(s.has(foo), false);
diff --git a/test/built-ins/WeakSet/prototype/has/returns-true-when-value-present.js b/test/built-ins/WeakSet/prototype/has/returns-true-when-value-present.js
new file mode 100644
index 0000000000..7ef09dba34
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/has/returns-true-when-value-present.js
@@ -0,0 +1,20 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.4
+description: >
+  Returns true when value is present in the WeakSet entries list.
+info: >
+  WeakSet.prototype.has ( value )
+
+  ...
+  6. Repeat for each e that is an element of entries,
+    a. If e is not empty and SameValue(e, value) is true, return true.
+  ...
+---*/
+
+var foo = {};
+var s = new WeakSet();
+
+s.add(foo);
+assert.sameValue(s.has(foo), true);
diff --git a/test/built-ins/WeakSet/prototype/has/this-not-object-throw-boolean.js b/test/built-ins/WeakSet/prototype/has/this-not-object-throw-boolean.js
new file mode 100644
index 0000000000..b5e99ab6d9
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/has/this-not-object-throw-boolean.js
@@ -0,0 +1,21 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.4
+description: Throws TypeError if `this` is not Object.
+info: >
+  WeakSet.prototype.has ( value )
+
+  1. Let S be the this value.
+  2. If Type(S) is not Object, throw a TypeError exception.
+
+---*/
+
+assert.throws(TypeError, function() {
+  WeakSet.prototype.has.call(false, {});
+});
+
+assert.throws(TypeError, function() {
+  var s = new WeakSet();
+  s.has.call(false, {});
+});
diff --git a/test/built-ins/WeakSet/prototype/has/this-not-object-throw-null.js b/test/built-ins/WeakSet/prototype/has/this-not-object-throw-null.js
new file mode 100644
index 0000000000..4ea248c717
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/has/this-not-object-throw-null.js
@@ -0,0 +1,21 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.4
+description: Throws TypeError if `this` is not Object.
+info: >
+  WeakSet.prototype.has ( value )
+
+  1. Let S be the this value.
+  2. If Type(S) is not Object, throw a TypeError exception.
+
+---*/
+
+assert.throws(TypeError, function() {
+  WeakSet.prototype.has.call(null, {});
+});
+
+assert.throws(TypeError, function() {
+  var s = new WeakSet();
+  s.has.call(null, {});
+});
diff --git a/test/built-ins/WeakSet/prototype/has/this-not-object-throw-number.js b/test/built-ins/WeakSet/prototype/has/this-not-object-throw-number.js
new file mode 100644
index 0000000000..7b23eb999e
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/has/this-not-object-throw-number.js
@@ -0,0 +1,21 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.4
+description: Throws TypeError if `this` is not Object.
+info: >
+  WeakSet.prototype.has ( value )
+
+  1. Let S be the this value.
+  2. If Type(S) is not Object, throw a TypeError exception.
+
+---*/
+
+assert.throws(TypeError, function() {
+  WeakSet.prototype.has.call(0, {});
+});
+
+assert.throws(TypeError, function() {
+  var s = new WeakSet();
+  s.has.call(0, {});
+});
diff --git a/test/built-ins/WeakSet/prototype/has/this-not-object-throw-string.js b/test/built-ins/WeakSet/prototype/has/this-not-object-throw-string.js
new file mode 100644
index 0000000000..315c5d240d
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/has/this-not-object-throw-string.js
@@ -0,0 +1,21 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.4
+description: Throws TypeError if `this` is not Object.
+info: >
+  WeakSet.prototype.has ( value )
+
+  1. Let S be the this value.
+  2. If Type(S) is not Object, throw a TypeError exception.
+
+---*/
+
+assert.throws(TypeError, function() {
+  WeakSet.prototype.has.call('', {});
+});
+
+assert.throws(TypeError, function() {
+  var s = new WeakSet();
+  s.has.call('', {});
+});
diff --git a/test/built-ins/WeakSet/prototype/has/this-not-object-throw-symbol.js b/test/built-ins/WeakSet/prototype/has/this-not-object-throw-symbol.js
new file mode 100644
index 0000000000..cecb82acbf
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/has/this-not-object-throw-symbol.js
@@ -0,0 +1,21 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.4
+description: Throws TypeError if `this` is not Object.
+info: >
+  WeakSet.prototype.has ( value )
+
+  1. Let S be the this value.
+  2. If Type(S) is not Object, throw a TypeError exception.
+features: [Symbol]
+---*/
+
+assert.throws(TypeError, function() {
+  WeakSet.prototype.has.call(Symbol(), {});
+});
+
+assert.throws(TypeError, function() {
+  var s = new WeakSet();
+  s.has.call(Symbol(), {});
+});
diff --git a/test/built-ins/WeakSet/prototype/has/this-not-object-throw-undefined.js b/test/built-ins/WeakSet/prototype/has/this-not-object-throw-undefined.js
new file mode 100644
index 0000000000..b45fe70d6d
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/has/this-not-object-throw-undefined.js
@@ -0,0 +1,21 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.3.4
+description: Throws TypeError if `this` is not Object.
+info: >
+  WeakSet.prototype.has ( value )
+
+  1. Let S be the this value.
+  2. If Type(S) is not Object, throw a TypeError exception.
+
+---*/
+
+assert.throws(TypeError, function() {
+  WeakSet.prototype.has.call(undefined, {});
+});
+
+assert.throws(TypeError, function() {
+  var s = new WeakSet();
+  s.has.call(undefined, {});
+});
diff --git a/test/built-ins/WeakSet/prototype/prototype-attributes.js b/test/built-ins/WeakSet/prototype/prototype-attributes.js
new file mode 100644
index 0000000000..2d5f542469
--- /dev/null
+++ b/test/built-ins/WeakSet/prototype/prototype-attributes.js
@@ -0,0 +1,12 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.2.1
+description: >
+  WeakSet.prototype is not writable, not enumerable and not configurable.
+includes: [propertyHelper.js]
+---*/
+
+verifyNotEnumerable(WeakSet, 'prototype');
+verifyNotWritable(WeakSet, 'prototype');
+verifyNotConfigurable(WeakSet, 'prototype');
diff --git a/test/built-ins/WeakSet/symbol-disallowed-as-weakset-key.js b/test/built-ins/WeakSet/symbol-disallowed-as-weakset-key.js
index 64cb1862bf..ad3e91ffe8 100644
--- a/test/built-ins/WeakSet/symbol-disallowed-as-weakset-key.js
+++ b/test/built-ins/WeakSet/symbol-disallowed-as-weakset-key.js
@@ -3,7 +3,7 @@
 /*---
 es6id: 23.4.3.1_S2
 description: >
-    Symbol may not be used as a WeakSet entry
+  Symbol may not be used as a WeakSet entry
 features: [WeakSet]
 ---*/
 var weakset = new WeakSet();
diff --git a/test/built-ins/WeakSet/undefined-newtarget.js b/test/built-ins/WeakSet/undefined-newtarget.js
new file mode 100644
index 0000000000..c25a85bcde
--- /dev/null
+++ b/test/built-ins/WeakSet/undefined-newtarget.js
@@ -0,0 +1,20 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.1.1
+description: >
+  The WeakSet constructor is the %WeakSet% intrinsic object and the initial
+  value of the WeakSet property of the global object.
+info: >
+  23.4.1.1 WeakSet ( [ iterable ] )
+
+  1. If NewTarget is undefined, throw a TypeError exception.
+---*/
+
+assert.throws(TypeError, function() {
+    WeakSet();
+});
+
+assert.throws(TypeError, function() {
+    WeakSet([]);
+});
diff --git a/test/built-ins/WeakSet/weakset.js b/test/built-ins/WeakSet/weakset.js
new file mode 100644
index 0000000000..312581668c
--- /dev/null
+++ b/test/built-ins/WeakSet/weakset.js
@@ -0,0 +1,14 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.4.1.1
+description: >
+  WeakSet ( [ iterable ] )
+
+  17 ECMAScript Standard Built-in Objects
+includes: [propertyHelper.js]
+---*/
+
+verifyNotEnumerable(this, 'WeakSet');
+verifyWritable(this, 'WeakSet');
+verifyConfigurable(this, 'WeakSet');
-- 
GitLab