Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(352)

Unified Diff: test/mjsunit/harmony/collections.js

Issue 345613003: Map/Set: Implement constructor parameter handling (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: ascii art Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/messages.js ('k') | tools/generate-runtime-tests.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: test/mjsunit/harmony/collections.js
diff --git a/test/mjsunit/harmony/collections.js b/test/mjsunit/harmony/collections.js
index edbdd41340c3249f178be6f19ae0c41a38600579..1dd7f0d13ef178c13820a9912e297c6721136a4b 100644
--- a/test/mjsunit/harmony/collections.js
+++ b/test/mjsunit/harmony/collections.js
@@ -25,7 +25,7 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-// Flags: --harmony-collections
+// Flags: --harmony-collections --harmony-iteration
// Flags: --expose-gc --allow-natives-syntax
@@ -987,3 +987,261 @@ for (var i = 9; i >= 0; i--) {
assertArrayEquals([0, 1, 2, 3, 4], buffer);
})();
+
+
+(function TestSetConstructor() {
+ var s = new Set(null);
+ assertEquals(s.size, 0);
+
+ s = new Set(undefined);
+ assertEquals(s.size, 0);
+
+ // No @@iterator
+ assertThrows(function() {
+ new Set({});
+ }, TypeError);
+
+ // @@iterator not callable
+ assertThrows(function() {
+ var object = {};
+ object[Symbol.iterator] = 42;
+ new Set(object);
+ }, TypeError);
+
+ // @@iterator result not object
+ assertThrows(function() {
+ var object = {};
+ object[Symbol.iterator] = function() {
+ return 42;
+ };
+ new Set(object);
+ }, TypeError);
+
+ var s2 = new Set();
+ s2.add('a');
+ s2.add('b');
+ s2.add('c');
+ s = new Set(s2.values());
+ assertEquals(s.size, 3);
+ assertTrue(s.has('a'));
+ assertTrue(s.has('b'));
+ assertTrue(s.has('c'));
+})();
+
+
+(function TestSetConstructorAddNotCallable() {
+ var originalSetPrototypeAdd = Set.prototype.add;
+ assertThrows(function() {
+ Set.prototype.add = 42;
+ new Set([1, 2].values());
+ }, TypeError);
+ Set.prototype.add = originalSetPrototypeAdd;
+})();
+
+
+(function TestSetConstructorGetAddOnce() {
+ var originalSetPrototypeAdd = Set.prototype.add;
+ var getAddCount = 0;
+ Object.defineProperty(Set.prototype, 'add', {
+ get: function() {
+ getAddCount++;
+ return function() {};
+ }
+ });
+ var s = new Set([1, 2].values());
+ assertEquals(getAddCount, 1);
+ assertEquals(s.size, 0);
+ Object.defineProperty(Set.prototype, 'add', {
+ value: originalSetPrototypeAdd,
+ writable: true
+ });
+})();
+
+
+(function TestSetConstructorAddReplaced() {
+ var originalSetPrototypeAdd = Set.prototype.add;
+ var addCount = 0;
+ Set.prototype.add = function(value) {
+ addCount++;
+ originalSetPrototypeAdd.call(this, value);
+ Set.prototype.add = null;
+ };
+ var s = new Set([1, 2].values());
+ assertEquals(addCount, 2);
+ assertEquals(s.size, 2);
+ Set.prototype.add = originalSetPrototypeAdd;
+})();
+
+
+(function TestSetConstructorOrderOfDoneValue() {
+ var valueCount = 0, doneCount = 0;
+ var iterator = {
+ next: function() {
+ return {
+ get value() {
+ valueCount++;
+ },
+ get done() {
+ doneCount++;
+ throw new Error();
+ }
+ };
+ }
+ };
+ iterator[Symbol.iterator] = function() {
+ return this;
+ };
+ assertThrows(function() {
+ new Set(iterator);
+ });
+ assertEquals(doneCount, 1);
+ assertEquals(valueCount, 0);
+})();
+
+
+(function TestSetConstructorNextNotAnObject() {
+ var iterator = {
+ next: function() {
+ return 'abc';
+ }
+ };
+ iterator[Symbol.iterator] = function() {
+ return this;
+ };
+ assertThrows(function() {
+ new Set(iterator);
+ }, TypeError);
+})();
+
+
+(function TestMapConstructor() {
+ var m = new Map(null);
+ assertEquals(m.size, 0);
+
+ m = new Map(undefined);
+ assertEquals(m.size, 0);
+
+ // No @@iterator
+ assertThrows(function() {
+ new Map({});
+ }, TypeError);
+
+ // @@iterator not callable
+ assertThrows(function() {
+ var object = {};
+ object[Symbol.iterator] = 42;
+ new Map(object);
+ }, TypeError);
+
+ // @@iterator result not object
+ assertThrows(function() {
+ var object = {};
+ object[Symbol.iterator] = function() {
+ return 42;
+ };
+ new Map(object);
+ }, TypeError);
+
+ var m2 = new Map();
+ m2.set(0, 'a');
+ m2.set(1, 'b');
+ m2.set(2, 'c');
+ m = new Map(m2.entries());
+ assertEquals(m.size, 3);
+ assertEquals(m.get(0), 'a');
+ assertEquals(m.get(1), 'b');
+ assertEquals(m.get(2), 'c');
+})();
+
+
+(function TestMapConstructorSetNotCallable() {
+ var originalMapPrototypeSet = Map.prototype.set;
+ assertThrows(function() {
+ Map.prototype.set = 42;
+ new Map([1, 2].entries());
+ }, TypeError);
+ Map.prototype.set = originalMapPrototypeSet;
+})();
+
+
+(function TestMapConstructorGetAddOnce() {
+ var originalMapPrototypeSet = Map.prototype.set;
+ var getSetCount = 0;
+ Object.defineProperty(Map.prototype, 'set', {
+ get: function() {
+ getSetCount++;
+ return function() {};
+ }
+ });
+ var m = new Map([1, 2].entries());
+ assertEquals(getSetCount, 1);
+ assertEquals(m.size, 0);
+ Object.defineProperty(Map.prototype, 'set', {
+ value: originalMapPrototypeSet,
+ writable: true
+ });
+})();
+
+
+(function TestMapConstructorSetReplaced() {
+ var originalMapPrototypeSet = Map.prototype.set;
+ var setCount = 0;
+ Map.prototype.set = function(key, value) {
+ setCount++;
+ originalMapPrototypeSet.call(this, key, value);
+ Map.prototype.set = null;
+ };
+ var m = new Map([1, 2].entries());
+ assertEquals(setCount, 2);
+ assertEquals(m.size, 2);
+ Map.prototype.set = originalMapPrototypeSet;
+})();
+
+
+(function TestMapConstructorOrderOfDoneValue() {
+ var valueCount = 0, doneCount = 0;
+ function FakeError() {}
+ var iterator = {
+ next: function() {
+ return {
+ get value() {
+ valueCount++;
+ },
+ get done() {
+ doneCount++;
+ throw new FakeError();
+ }
+ };
+ }
+ };
+ iterator[Symbol.iterator] = function() {
+ return this;
+ };
+ assertThrows(function() {
+ new Map(iterator);
+ }, FakeError);
+ assertEquals(doneCount, 1);
+ assertEquals(valueCount, 0);
+})();
+
+
+(function TestMapConstructorNextNotAnObject() {
+ var iterator = {
+ next: function() {
+ return 'abc';
+ }
+ };
+ iterator[Symbol.iterator] = function() {
+ return this;
+ };
+ assertThrows(function() {
+ new Map(iterator);
+ }, TypeError);
+})();
+
+
+(function TestMapConstructorIteratorNotObjectValues() {
+ assertThrows(function() {
+ new Map([1, 2].values());
+ }, TypeError);
+})();
« no previous file with comments | « src/messages.js ('k') | tools/generate-runtime-tests.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698