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

Side by Side Diff: test/mjsunit/es6/collections.js

Issue 448013005: ES6: Implement WeakMap and WeakSet constructor logic (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 4 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/weak_collection.js ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 10 matching lines...) Expand all
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 27
28 // Flags: --expose-gc --allow-natives-syntax 28 // Flags: --expose-gc --allow-natives-syntax
29 29
30 30
31 function assertSize(expected, collection) {
32 if (collection instanceof Map || collection instanceof Set) {
33 assertEquals(expected, collection.size);
34 }
35 }
36
37
31 // Test valid getter and setter calls on Sets and WeakSets 38 // Test valid getter and setter calls on Sets and WeakSets
32 function TestValidSetCalls(m) { 39 function TestValidSetCalls(m) {
33 assertDoesNotThrow(function () { m.add(new Object) }); 40 assertDoesNotThrow(function () { m.add(new Object) });
34 assertDoesNotThrow(function () { m.has(new Object) }); 41 assertDoesNotThrow(function () { m.has(new Object) });
35 assertDoesNotThrow(function () { m.delete(new Object) }); 42 assertDoesNotThrow(function () { m.delete(new Object) });
36 } 43 }
37 TestValidSetCalls(new Set); 44 TestValidSetCalls(new Set);
38 TestValidSetCalls(new WeakSet); 45 TestValidSetCalls(new WeakSet);
39 46
40 47
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after
302 TestPrototype(Map); 309 TestPrototype(Map);
303 TestPrototype(WeakMap); 310 TestPrototype(WeakMap);
304 TestPrototype(WeakSet); 311 TestPrototype(WeakSet);
305 312
306 313
307 // Test constructor property of the Set, Map, WeakMap and WeakSet prototype. 314 // Test constructor property of the Set, Map, WeakMap and WeakSet prototype.
308 function TestConstructor(C) { 315 function TestConstructor(C) {
309 assertFalse(C === Object.prototype.constructor); 316 assertFalse(C === Object.prototype.constructor);
310 assertSame(C, C.prototype.constructor); 317 assertSame(C, C.prototype.constructor);
311 assertSame(C, (new C).__proto__.constructor); 318 assertSame(C, (new C).__proto__.constructor);
319 assertEquals(1, C.length);
312 } 320 }
313 TestConstructor(Set); 321 TestConstructor(Set);
314 TestConstructor(Map); 322 TestConstructor(Map);
315 TestConstructor(WeakMap); 323 TestConstructor(WeakMap);
316 TestConstructor(WeakSet); 324 TestConstructor(WeakSet);
317 325
318 326
319 // Test the Set, Map, WeakMap and WeakSet global properties themselves. 327 // Test the Set, Map, WeakMap and WeakSet global properties themselves.
320 function TestDescriptor(global, C) { 328 function TestDescriptor(global, C) {
321 assertEquals({ 329 assertEquals({
(...skipping 658 matching lines...) Expand 10 before | Expand all | Expand 10 after
980 for (var i = 5; i < 16; i++) { 988 for (var i = 5; i < 16; i++) {
981 map.delete(i); 989 map.delete(i);
982 } 990 }
983 } 991 }
984 }); 992 });
985 993
986 assertArrayEquals([0, 1, 2, 3, 4], buffer); 994 assertArrayEquals([0, 1, 2, 3, 4], buffer);
987 })(); 995 })();
988 996
989 997
990 (function TestSetConstructor() { 998 // Allows testing iterator-based constructors easily.
991 var s = new Set(null); 999 var oneAndTwo = new Map();
992 assertEquals(s.size, 0); 1000 var k0 = {key: 0};
1001 var k1 = {key: 1};
1002 var k2 = {key: 2};
1003 oneAndTwo.set(k1, 1);
1004 oneAndTwo.set(k2, 2);
993 1005
994 s = new Set(undefined); 1006
995 assertEquals(s.size, 0); 1007 function TestSetConstructor(ctor) {
1008 var s = new ctor(null);
1009 assertSize(0, s);
1010
1011 s = new ctor(undefined);
1012 assertSize(0, s);
996 1013
997 // No @@iterator 1014 // No @@iterator
998 assertThrows(function() { 1015 assertThrows(function() {
999 new Set({}); 1016 new ctor({});
1000 }, TypeError); 1017 }, TypeError);
1001 1018
1002 // @@iterator not callable 1019 // @@iterator not callable
1003 assertThrows(function() { 1020 assertThrows(function() {
1004 var object = {}; 1021 var object = {};
1005 object[Symbol.iterator] = 42; 1022 object[Symbol.iterator] = 42;
1006 new Set(object); 1023 new ctor(object);
1007 }, TypeError); 1024 }, TypeError);
1008 1025
1009 // @@iterator result not object 1026 // @@iterator result not object
rossberg 2014/08/08 11:24:05 Exclusively for weak maps and sets, we should also
1010 assertThrows(function() { 1027 assertThrows(function() {
1011 var object = {}; 1028 var object = {};
1012 object[Symbol.iterator] = function() { 1029 object[Symbol.iterator] = function() {
1013 return 42; 1030 return 42;
1014 }; 1031 };
1015 new Set(object); 1032 new ctor(object);
1016 }, TypeError); 1033 }, TypeError);
1017 1034
1018 var s2 = new Set(); 1035 var s2 = new Set();
1019 s2.add('a'); 1036 s2.add(k0);
1020 s2.add('b'); 1037 s2.add(k1);
1021 s2.add('c'); 1038 s2.add(k2);
1022 s = new Set(s2.values()); 1039 s = new ctor(s2.values());
1023 assertEquals(s.size, 3); 1040 assertSize(3, s);
1024 assertTrue(s.has('a')); 1041 assertTrue(s.has(k0));
1025 assertTrue(s.has('b')); 1042 assertTrue(s.has(k1));
1026 assertTrue(s.has('c')); 1043 assertTrue(s.has(k2));
1027 })(); 1044 }
1045 TestSetConstructor(Set);
1046 TestSetConstructor(WeakSet);
1028 1047
1029 1048
1030 // Allows testing iterator-based constructors easily. 1049 function TestSetConstructorAddNotCallable(ctor) {
1031 var oneAndTwo = new Set(); 1050 var originalPrototypeAdd = ctor.prototype.add;
1032 oneAndTwo.add(1); 1051 assertThrows(function() {
1033 oneAndTwo.add(2); 1052 ctor.prototype.add = 42;
1053 new ctor(oneAndTwo.values());
1054 }, TypeError);
1055 ctor.prototype.add = originalPrototypeAdd;
1056 }
1057 TestSetConstructorAddNotCallable(Set);
1058 TestSetConstructorAddNotCallable(WeakSet);
1034 1059
1035 1060
1036 (function TestSetConstructorAddNotCallable() { 1061 function TestSetConstructorGetAddOnce(ctor) {
1037 var originalSetPrototypeAdd = Set.prototype.add; 1062 var originalPrototypeAdd = ctor.prototype.add;
1038 assertThrows(function() {
1039 Set.prototype.add = 42;
1040 new Set(oneAndTwo.values());
1041 }, TypeError);
1042 Set.prototype.add = originalSetPrototypeAdd;
1043 })();
1044
1045
1046 (function TestSetConstructorGetAddOnce() {
1047 var originalSetPrototypeAdd = Set.prototype.add;
1048 var getAddCount = 0; 1063 var getAddCount = 0;
1049 Object.defineProperty(Set.prototype, 'add', { 1064 Object.defineProperty(ctor.prototype, 'add', {
1050 get: function() { 1065 get: function() {
1051 getAddCount++; 1066 getAddCount++;
1052 return function() {}; 1067 return function() {};
1053 } 1068 }
1054 }); 1069 });
1055 var s = new Set(oneAndTwo.values()); 1070 var s = new ctor(oneAndTwo.values());
1056 assertEquals(getAddCount, 1); 1071 assertEquals(1, getAddCount);
1057 assertEquals(s.size, 0); 1072 assertSize(0, s);
1058 Object.defineProperty(Set.prototype, 'add', { 1073 Object.defineProperty(ctor.prototype, 'add', {
1059 value: originalSetPrototypeAdd, 1074 value: originalPrototypeAdd,
1060 writable: true 1075 writable: true
1061 }); 1076 });
1062 })(); 1077 }
1078 TestSetConstructorGetAddOnce(Set);
1079 TestSetConstructorGetAddOnce(WeakSet);
1063 1080
1064 1081
1065 (function TestSetConstructorAddReplaced() { 1082 function TestSetConstructorAddReplaced(ctor) {
1066 var originalSetPrototypeAdd = Set.prototype.add; 1083 var originalPrototypeAdd = ctor.prototype.add;
1067 var addCount = 0; 1084 var addCount = 0;
1068 Set.prototype.add = function(value) { 1085 ctor.prototype.add = function(value) {
1069 addCount++; 1086 addCount++;
1070 originalSetPrototypeAdd.call(this, value); 1087 originalPrototypeAdd.call(this, value);
1071 Set.prototype.add = null; 1088 ctor.prototype.add = null;
1072 }; 1089 };
1073 var s = new Set(oneAndTwo.values()); 1090 var s = new ctor(oneAndTwo.keys());
1074 assertEquals(addCount, 2); 1091 assertEquals(2, addCount);
1075 assertEquals(s.size, 2); 1092 assertSize(2, s);
1076 Set.prototype.add = originalSetPrototypeAdd; 1093 ctor.prototype.add = originalPrototypeAdd;
1077 })(); 1094 }
1095 TestSetConstructorAddReplaced(Set);
1096 TestSetConstructorAddReplaced(WeakSet);
1078 1097
1079 1098
1080 (function TestSetConstructorOrderOfDoneValue() { 1099 function TestSetConstructorOrderOfDoneValue(ctor) {
1081 var valueCount = 0, doneCount = 0; 1100 var valueCount = 0, doneCount = 0;
1082 var iterator = { 1101 var iterator = {
1083 next: function() { 1102 next: function() {
1084 return { 1103 return {
1085 get value() { 1104 get value() {
1086 valueCount++; 1105 valueCount++;
1087 }, 1106 },
1088 get done() { 1107 get done() {
1089 doneCount++; 1108 doneCount++;
1090 throw new Error(); 1109 throw new Error();
1091 } 1110 }
1092 }; 1111 };
1093 } 1112 }
1094 }; 1113 };
1095 iterator[Symbol.iterator] = function() { 1114 iterator[Symbol.iterator] = function() {
1096 return this; 1115 return this;
1097 }; 1116 };
1098 assertThrows(function() { 1117 assertThrows(function() {
1099 new Set(iterator); 1118 new ctor(iterator);
1100 }); 1119 });
1101 assertEquals(doneCount, 1); 1120 assertEquals(1, doneCount);
1102 assertEquals(valueCount, 0); 1121 assertEquals(0, valueCount);
1103 })(); 1122 }
1123 TestSetConstructorOrderOfDoneValue(Set);
1124 TestSetConstructorOrderOfDoneValue(WeakSet);
1104 1125
1105 1126
1106 (function TestSetConstructorNextNotAnObject() { 1127 function TestSetConstructorNextNotAnObject(ctor) {
1107 var iterator = { 1128 var iterator = {
1108 next: function() { 1129 next: function() {
1109 return 'abc'; 1130 return 'abc';
1110 } 1131 }
1111 }; 1132 };
1112 iterator[Symbol.iterator] = function() { 1133 iterator[Symbol.iterator] = function() {
1113 return this; 1134 return this;
1114 }; 1135 };
1115 assertThrows(function() { 1136 assertThrows(function() {
1116 new Set(iterator); 1137 new ctor(iterator);
1117 }, TypeError); 1138 }, TypeError);
1118 })(); 1139 }
1140 TestSetConstructorNextNotAnObject(Set);
1141 TestSetConstructorNextNotAnObject(WeakSet);
1119 1142
1120 1143
1121 (function TestMapConstructor() { 1144 function TestMapConstructor(ctor) {
1122 var m = new Map(null); 1145 var m = new ctor(null);
1123 assertEquals(m.size, 0); 1146 assertSize(0, m);
1124 1147
1125 m = new Map(undefined); 1148 m = new ctor(undefined);
1126 assertEquals(m.size, 0); 1149 assertSize(0, m);
1127 1150
1128 // No @@iterator 1151 // No @@iterator
1129 assertThrows(function() { 1152 assertThrows(function() {
1130 new Map({}); 1153 new ctor({});
1131 }, TypeError); 1154 }, TypeError);
1132 1155
1133 // @@iterator not callable 1156 // @@iterator not callable
1134 assertThrows(function() { 1157 assertThrows(function() {
1135 var object = {}; 1158 var object = {};
1136 object[Symbol.iterator] = 42; 1159 object[Symbol.iterator] = 42;
1137 new Map(object); 1160 new ctor(object);
1138 }, TypeError); 1161 }, TypeError);
1139 1162
1140 // @@iterator result not object 1163 // @@iterator result not object
1141 assertThrows(function() { 1164 assertThrows(function() {
1142 var object = {}; 1165 var object = {};
1143 object[Symbol.iterator] = function() { 1166 object[Symbol.iterator] = function() {
1144 return 42; 1167 return 42;
1145 }; 1168 };
1146 new Map(object); 1169 new ctor(object);
1147 }, TypeError); 1170 }, TypeError);
1148 1171
1149 var m2 = new Map(); 1172 var m2 = new Map();
1150 m2.set(0, 'a'); 1173 m2.set(k0, 'a');
1151 m2.set(1, 'b'); 1174 m2.set(k1, 'b');
1152 m2.set(2, 'c'); 1175 m2.set(k2, 'c');
1153 m = new Map(m2.entries()); 1176 m = new ctor(m2.entries());
1154 assertEquals(m.size, 3); 1177 assertSize(3, m);
1155 assertEquals(m.get(0), 'a'); 1178 assertEquals('a', m.get(k0));
1156 assertEquals(m.get(1), 'b'); 1179 assertEquals('b', m.get(k1));
1157 assertEquals(m.get(2), 'c'); 1180 assertEquals('c', m.get(k2));
1158 })(); 1181 }
1182 TestMapConstructor(Map);
1183 TestMapConstructor(WeakMap);
1159 1184
1160 1185
1161 (function TestMapConstructorSetNotCallable() { 1186 function TestMapConstructorSetNotCallable(ctor) {
1162 var originalMapPrototypeSet = Map.prototype.set; 1187 var originalPrototypeSet = ctor.prototype.set;
1163 assertThrows(function() { 1188 assertThrows(function() {
1164 Map.prototype.set = 42; 1189 ctor.prototype.set = 42;
1165 new Map(oneAndTwo.entries()); 1190 new ctor(oneAndTwo.entries());
1166 }, TypeError); 1191 }, TypeError);
1167 Map.prototype.set = originalMapPrototypeSet; 1192 ctor.prototype.set = originalPrototypeSet;
1168 })(); 1193 }
1194 TestMapConstructorSetNotCallable(Map);
1195 TestMapConstructorSetNotCallable(WeakMap);
1169 1196
1170 1197
1171 (function TestMapConstructorGetAddOnce() { 1198 function TestMapConstructorGetAddOnce(ctor) {
1172 var originalMapPrototypeSet = Map.prototype.set; 1199 var originalPrototypeSet = ctor.prototype.set;
1173 var getSetCount = 0; 1200 var getSetCount = 0;
1174 Object.defineProperty(Map.prototype, 'set', { 1201 Object.defineProperty(ctor.prototype, 'set', {
1175 get: function() { 1202 get: function() {
1176 getSetCount++; 1203 getSetCount++;
1177 return function() {}; 1204 return function() {};
1178 } 1205 }
1179 }); 1206 });
1180 var m = new Map(oneAndTwo.entries()); 1207 var m = new ctor(oneAndTwo.entries());
1181 assertEquals(getSetCount, 1); 1208 assertEquals(1, getSetCount);
1182 assertEquals(m.size, 0); 1209 assertSize(0, m);
1183 Object.defineProperty(Map.prototype, 'set', { 1210 Object.defineProperty(ctor.prototype, 'set', {
1184 value: originalMapPrototypeSet, 1211 value: originalPrototypeSet,
1185 writable: true 1212 writable: true
1186 }); 1213 });
1187 })(); 1214 }
1215 TestMapConstructorGetAddOnce(Map);
1216 TestMapConstructorGetAddOnce(WeakMap);
1188 1217
1189 1218
1190 (function TestMapConstructorSetReplaced() { 1219 function TestMapConstructorSetReplaced(ctor) {
1191 var originalMapPrototypeSet = Map.prototype.set; 1220 var originalPrototypeSet = ctor.prototype.set;
1192 var setCount = 0; 1221 var setCount = 0;
1193 Map.prototype.set = function(key, value) { 1222 ctor.prototype.set = function(key, value) {
1194 setCount++; 1223 setCount++;
1195 originalMapPrototypeSet.call(this, key, value); 1224 originalPrototypeSet.call(this, key, value);
1196 Map.prototype.set = null; 1225 ctor.prototype.set = null;
1197 }; 1226 };
1198 var m = new Map(oneAndTwo.entries()); 1227 var m = new ctor(oneAndTwo.entries());
1199 assertEquals(setCount, 2); 1228 assertEquals(2, setCount);
1200 assertEquals(m.size, 2); 1229 assertSize(2, m);
1201 Map.prototype.set = originalMapPrototypeSet; 1230 ctor.prototype.set = originalPrototypeSet;
1202 })(); 1231 }
1232 TestMapConstructorSetReplaced(Map);
1233 TestMapConstructorSetReplaced(WeakMap);
1203 1234
1204 1235
1205 (function TestMapConstructorOrderOfDoneValue() { 1236 function TestMapConstructorOrderOfDoneValue(ctor) {
1206 var valueCount = 0, doneCount = 0; 1237 var valueCount = 0, doneCount = 0;
1207 function FakeError() {} 1238 function FakeError() {}
1208 var iterator = { 1239 var iterator = {
1209 next: function() { 1240 next: function() {
1210 return { 1241 return {
1211 get value() { 1242 get value() {
1212 valueCount++; 1243 valueCount++;
1213 }, 1244 },
1214 get done() { 1245 get done() {
1215 doneCount++; 1246 doneCount++;
1216 throw new FakeError(); 1247 throw new FakeError();
1217 } 1248 }
1218 }; 1249 };
1219 } 1250 }
1220 }; 1251 };
1221 iterator[Symbol.iterator] = function() { 1252 iterator[Symbol.iterator] = function() {
1222 return this; 1253 return this;
1223 }; 1254 };
1224 assertThrows(function() { 1255 assertThrows(function() {
1225 new Map(iterator); 1256 new ctor(iterator);
1226 }, FakeError); 1257 }, FakeError);
1227 assertEquals(doneCount, 1); 1258 assertEquals(1, doneCount);
1228 assertEquals(valueCount, 0); 1259 assertEquals(0, valueCount);
1229 })(); 1260 }
1261 TestMapConstructorOrderOfDoneValue(Map);
1262 TestMapConstructorOrderOfDoneValue(WeakMap);
1230 1263
1231 1264
1232 (function TestMapConstructorNextNotAnObject() { 1265 function TestMapConstructorNextNotAnObject(ctor) {
1233 var iterator = { 1266 var iterator = {
1234 next: function() { 1267 next: function() {
1235 return 'abc'; 1268 return 'abc';
1236 } 1269 }
1237 }; 1270 };
1238 iterator[Symbol.iterator] = function() { 1271 iterator[Symbol.iterator] = function() {
1239 return this; 1272 return this;
1240 }; 1273 };
1241 assertThrows(function() { 1274 assertThrows(function() {
1242 new Map(iterator); 1275 new ctor(iterator);
1243 }, TypeError); 1276 }, TypeError);
1244 })(); 1277 }
1278 TestMapConstructorNextNotAnObject(Map);
1279 TestMapConstructorNextNotAnObject(WeakMap);
1245 1280
1246 1281
1247 (function TestMapConstructorIteratorNotObjectValues() { 1282 function TestMapConstructorIteratorNotObjectValues(ctor) {
1248 assertThrows(function() { 1283 assertThrows(function() {
1249 new Map(oneAndTwo.values()); 1284 new ctor(oneAndTwo.values());
1250 }, TypeError); 1285 }, TypeError);
1251 })(); 1286 }
1287 TestMapConstructorIteratorNotObjectValues(Map);
1288 TestMapConstructorIteratorNotObjectValues(WeakMap);
OLDNEW
« no previous file with comments | « src/weak_collection.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698