Chromium Code Reviews| Index: test/mjsunit/harmony/collections.js |
| diff --git a/test/mjsunit/harmony/collections.js b/test/mjsunit/harmony/collections.js |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..1ad1c6f349749e4a674e250b0fbc531b760cc24e |
| --- /dev/null |
| +++ b/test/mjsunit/harmony/collections.js |
| @@ -0,0 +1,273 @@ |
| +// Copyright 2011 the V8 project authors. All rights reserved. |
| +// Redistribution and use in source and binary forms, with or without |
| +// modification, are permitted provided that the following conditions are |
| +// met: |
| +// |
| +// * Redistributions of source code must retain the above copyright |
| +// notice, this list of conditions and the following disclaimer. |
| +// * Redistributions in binary form must reproduce the above |
| +// copyright notice, this list of conditions and the following |
| +// disclaimer in the documentation and/or other materials provided |
| +// with the distribution. |
| +// * Neither the name of Google Inc. nor the names of its |
| +// contributors may be used to endorse or promote products derived |
| +// from this software without specific prior written permission. |
| +// |
| +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| +// (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 --expose-gc |
| + |
| + |
| +// Test valid getter and setter calls on Sets. |
| +function TestValidSetCalls(m) { |
| + assertDoesNotThrow(function () { m.add(new Object) }); |
| + assertDoesNotThrow(function () { m.has(new Object) }); |
| + assertDoesNotThrow(function () { m.delete(new Object) }); |
| +} |
| +TestValidSetCalls(new Set); |
| + |
| + |
| +// Test valid getter and setter calls on Maps and WeakMaps |
| +function TestValidMapCalls(m) { |
| + assertDoesNotThrow(function () { m.get(new Object) }); |
| + assertDoesNotThrow(function () { m.set(new Object) }); |
| + assertDoesNotThrow(function () { m.has(new Object) }); |
| + assertDoesNotThrow(function () { m.delete(new Object) }); |
| +} |
| +TestValidMapCalls(new Map); |
| +TestValidMapCalls(new WeakMap); |
| + |
| + |
| +// Test invalid getter and setter calls for WeakMap only |
| +function TestInvalidCalls(m) { |
| + assertThrows(function () { m.get(undefined) }, TypeError); |
| + assertThrows(function () { m.set(undefined, 0) }, TypeError); |
| + assertThrows(function () { m.get(0) }, TypeError); |
| + assertThrows(function () { m.set(0, 0) }, TypeError); |
| + assertThrows(function () { m.get('a-key') }, TypeError); |
| + assertThrows(function () { m.set('a-key', 0) }, TypeError); |
| +} |
| +TestInvalidCalls(new WeakMap); |
| + |
| + |
| +// Test expected behavior for Sets |
| +function TestSet(set, key) { |
| + assertFalse(set.has(key)); |
| + set.add(key); |
| + assertTrue(set.has(key)); |
| + set.delete(key); |
| + assertFalse(set.has(key)); |
| +} |
| +function TestSetBehavior(set) { |
| + for (i = 0; i < 20; i++) { |
|
arv (Not doing code reviews)
2011/10/26 17:09:44
missing var
Michael Starzinger
2011/10/27 15:36:05
Done (will include in next CL).
|
| + TestSet(set, new Object); |
| + } |
| +} |
| +TestSet(new Set, 23); |
| +TestSet(new Set, 'foo'); |
| +TestSetBehavior(new Set); |
| + |
| + |
| +// Test expected mapping behavior for Maps and WeakMaps |
| +function TestMapping(map, key, value) { |
| + map.set(key, value); |
| + assertSame(value, map.get(key)); |
| +} |
| +function TestMapBehavior1(m) { |
| + TestMapping(m, new Object, 23); |
| + TestMapping(m, new Object, 'the-value'); |
| + TestMapping(m, new Object, new Object); |
| +} |
| +TestMapBehavior1(new Map); |
| +TestMapBehavior1(new WeakMap); |
| + |
| + |
| +// Test expected mapping behavior for Maps only |
| +function TestMapBehavior2(m) { |
| + for (var i = 0; i < 20; i++) { |
| + TestMapping(m, i, new Object); |
| + TestMapping(m, i / 10, new Object); |
| + TestMapping(m, 'key-' + i, new Object); |
| + } |
| + var keys = [ +0, -0, +Infinity, -Infinity, true, false ]; |
|
arv (Not doing code reviews)
2011/10/26 17:09:44
is it worth testing NaN, undefined and null too?
Michael Starzinger
2011/10/27 15:36:05
Currently "undefined" and "null" cannot be used as
|
| + for (var i = 0; i < keys.length; i++) { |
| + TestMapping(m, keys[i], new Object); |
| + } |
| +} |
| +TestMapBehavior2(new Map); |
| + |
| + |
| +// Test expected querying behavior of Maps and WeakMaps |
| +function TestQuery(m) { |
| + var key = new Object; |
| + TestMapping(m, key, 'to-be-present'); |
| + assertTrue(m.has(key)); |
| + assertFalse(m.has(new Object)); |
| + TestMapping(m, key, undefined); |
| + assertFalse(m.has(key)); |
| + assertFalse(m.has(new Object)); |
| +} |
| +TestQuery(new Map); |
| +TestQuery(new WeakMap); |
| + |
| + |
| +// Test expected deletion behavior of Maps and WeakMaps |
| +function TestDelete(m) { |
| + var key = new Object; |
| + TestMapping(m, key, 'to-be-deleted'); |
| + assertTrue(m.delete(key)); |
| + assertFalse(m.delete(key)); |
| + assertFalse(m.delete(new Object)); |
| + assertSame(m.get(key), undefined); |
| +} |
| +TestDelete(new Map); |
| +TestDelete(new WeakMap); |
| + |
| + |
| +// Test GC of Maps and WeakMaps with entry |
| +function TestGC1(m) { |
| + var key = new Object; |
| + m.set(key, 'not-collected'); |
| + gc(); |
| + assertSame('not-collected', m.get(key)); |
| +} |
| +TestGC1(new Map); |
| +TestGC1(new WeakMap); |
| + |
| + |
| +// Test GC of Maps and WeakMaps with chained entries |
| +function TestGC2(m) { |
| + var head = new Object; |
| + for (key = head, i = 0; i < 10; i++, key = m.get(key)) { |
| + m.set(key, new Object); |
| + } |
| + gc(); |
| + var count = 0; |
| + for (key = head; key != undefined; key = m.get(key)) { |
| + count++; |
| + } |
| + assertEquals(11, count); |
| +} |
| +TestGC2(new Map); |
| +TestGC2(new WeakMap); |
| + |
| + |
| +// Test property attribute [[Enumerable]] |
| +function TestEnumerable(func) { |
| + function props(x) { |
| + var array = []; |
| + for (var p in x) array.push(p); |
| + return array.sort(); |
| + } |
| + assertArrayEquals([], props(func)); |
| + assertArrayEquals([], props(func.prototype)); |
| + assertArrayEquals([], props(new func())); |
| +} |
| +TestEnumerable(Set); |
| +TestEnumerable(Map); |
| +TestEnumerable(WeakMap); |
| + |
| + |
| +// Test arbitrary properties on Maps and WeakMaps |
| +function TestArbitrary(m) { |
| + function TestProperty(map, property, value) { |
| + map[property] = value; |
| + assertEquals(value, map[property]); |
| + } |
| + for (i = 0; i < 20; i++) { |
|
arv (Not doing code reviews)
2011/10/26 17:09:44
var
Michael Starzinger
2011/10/27 15:36:05
Done (will include in next CL).
|
| + TestProperty(m, i, 'val' + i); |
| + TestProperty(m, 'foo' + i, 'bar' + i); |
| + } |
| + TestMapping(m, new Object, 'foobar'); |
| +} |
| +TestArbitrary(new Map); |
| +TestArbitrary(new WeakMap); |
| + |
| + |
| +// Test direct constructor call |
| +assertTrue(Set() instanceof Set); |
| +assertTrue(Map() instanceof Map); |
| +assertTrue(WeakMap() instanceof WeakMap); |
| + |
| + |
| +// Test whether NaN values as keys are treated correctly. |
| +var s = new Set; |
| +assertFalse(s.has(NaN)); |
| +assertFalse(s.has(NaN + 1)); |
| +assertFalse(s.has(23)); |
| +s.add(NaN); |
| +assertTrue(s.has(NaN)); |
| +assertTrue(s.has(NaN + 1)); |
| +assertFalse(s.has(23)); |
| +var m = new Map; |
| +assertFalse(m.has(NaN)); |
| +assertFalse(m.has(NaN + 1)); |
| +assertFalse(m.has(23)); |
| +m.set(NaN, 'a-value'); |
| +assertTrue(m.has(NaN)); |
| +assertTrue(m.has(NaN + 1)); |
| +assertFalse(m.has(23)); |
| + |
| + |
| +// Test some common JavaScript idioms for Sets |
| +var s = new Set; |
| +assertTrue(s instanceof Set); |
| +assertTrue(Set.prototype.add instanceof Function) |
| +assertTrue(Set.prototype.has instanceof Function) |
| +assertTrue(Set.prototype.delete instanceof Function) |
| + |
| + |
| +// Test some common JavaScript idioms for Maps |
| +var m = new Map; |
| +assertTrue(m instanceof Map); |
| +assertTrue(Map.prototype.set instanceof Function) |
| +assertTrue(Map.prototype.get instanceof Function) |
| +assertTrue(Map.prototype.has instanceof Function) |
| +assertTrue(Map.prototype.delete instanceof Function) |
| + |
| + |
| +// Test some common JavaScript idioms for WeakMaps |
| +var m = new WeakMap; |
| +assertTrue(m instanceof WeakMap); |
| +assertTrue(WeakMap.prototype.set instanceof Function) |
| +assertTrue(WeakMap.prototype.get instanceof Function) |
| +assertTrue(WeakMap.prototype.has instanceof Function) |
| +assertTrue(WeakMap.prototype.delete instanceof Function) |
| + |
| + |
| +// Regression test for WeakMap prototype. |
| +assertTrue(WeakMap.prototype.constructor === WeakMap) |
| +assertTrue(Object.getPrototypeOf(WeakMap.prototype) === Object.prototype) |
| + |
| + |
| +// Regression test for issue 1617: The prototype of the WeakMap constructor |
| +// needs to be unique (i.e. different from the one of the Object constructor). |
| +assertFalse(WeakMap.prototype === Object.prototype); |
| +var o = Object.create({}); |
| +assertFalse("get" in o); |
| +assertFalse("set" in o); |
| +assertEquals(undefined, o.get); |
| +assertEquals(undefined, o.set); |
| +var o = Object.create({}, { myValue: { |
| + value: 10, |
| + enumerable: false, |
| + configurable: true, |
| + writable: true |
| +}}); |
| +assertEquals(10, o.myValue); |
| + |
| + |
| +// Stress Test |
| +// There is a proposed stress-test available at the es-discuss mailing list |
| +// which cannot be reasonably automated. Check it out by hand if you like: |
| +// https://mail.mozilla.org/pipermail/es-discuss/2011-May/014096.html |