blob: 96a3e6c18b07516e7288ab1b89b8e4daeb6f1516 [file] [log] [blame]
description("Tests basic correctness of ES Set object");
// Currently we don't support iterators, so we throw
// on any non-throwing parameters
shouldBeFalse("Set instanceof Set");
shouldBeFalse("Set.prototype instanceof Set");
shouldThrow("Set() instanceof Set");
shouldBeTrue("new Set() instanceof Set");
shouldThrow("Set(null) instanceof Set");
shouldThrow("Set(undefined) instanceof Set");
shouldThrow("Set(undefined, undefined) instanceof Set");
shouldThrow("Set(null, undefined) instanceof Set");
shouldBeTrue("new Set(null) instanceof Set");
shouldBeTrue("new Set(undefined) instanceof Set");
shouldBeTrue("new Set(undefined, undefined) instanceof Set");
shouldBeTrue("new Set(null, undefined) instanceof Set");
shouldThrow("Set(1)");
shouldThrow("Set(true)");
shouldThrow("Set([])");
shouldThrow("Set({})");
shouldThrow("Set(undefined, null)");
shouldThrow("Set(undefined, {})");
shouldThrow("new Set(1)");
shouldThrow("new Set(true)");
shouldNotThrow("new Set([])");
shouldThrow("new Set({})");
shouldNotThrow("new Set(undefined, null)");
shouldNotThrow("new Set(undefined, {})");
// Basic test for constructor
var set = new Set([1, undefined, true, 6, true, "1", 0, {}])
set.forEach(debug);
var set = new Set;
shouldBeFalse("Object.hasOwnProperty(set, 'size')")
shouldBeTrue("Set.prototype.hasOwnProperty('size')")
shouldThrow("Set.prototype.size")
shouldBe("Set.prototype.add.length", "1")
shouldBe("Set.prototype.has.length", "1")
shouldBe("Set.prototype.clear.length", "0")
shouldBe("Set.prototype.keys.length", "0")
shouldBe("Set.prototype.values.length", "0")
shouldBe("Set.prototype.entries.length", "0")
shouldBe("set.size", "0")
shouldBe("set.add(-0)", "set")
shouldBe("set.add(0)", "set")
shouldBe("set.size", "1")
shouldBe("set.add(Infinity)", "set")
shouldBe("set.add(-Infinity)", "set")
shouldBe("set.add(NaN)", "set")
shouldBe("set.add('0')", "set")
shouldBe("set.add(0.1)", "set")
shouldBe("set.size", "6")
shouldBeTrue("set.has(-0)")
shouldBeTrue("set.has(0)")
shouldBeTrue("set.has(Infinity)")
shouldBeTrue("set.has(-Infinity)")
shouldBeTrue("set.has(NaN)")
shouldBeTrue("set.has('0')")
shouldBeTrue("set.has(0.1)")
shouldBeTrue("set.delete(-0)")
shouldBeFalse("set.delete(0)")
shouldBeTrue("set.delete(Infinity)")
shouldBeTrue("set.delete(-Infinity)")
shouldBeTrue("set.delete(NaN)")
shouldBeTrue("set.delete('0')")
shouldBeTrue("set.delete(0.1)")
shouldBeFalse("set.delete(-0)")
shouldBeFalse("set.delete(0)")
shouldBeFalse("set.delete(Infinity)")
shouldBeFalse("set.delete(-Infinity)")
shouldBeFalse("set.delete(NaN)")
shouldBeFalse("set.delete('0')")
shouldBeFalse("set.delete(0.1)")
var simpleString = "aaaaa";
var otherString = "";
for (var i = 0; i < 5; i++)
otherString += "a"
set.add(simpleString, {});
shouldBeTrue("set.has(simpleString)")
shouldBeTrue("set.has(otherString)");
shouldBeUndefined("set.clear()");
shouldBe("set.size", "0")
var count = 7;
for (var i = 0; i < count; i++) {
shouldBe("set.add(" + i + ")", "set")
shouldBe("set.add('" + i + "')", "set")
}
shouldBe("set.size", "14")
var thisValue = 0xf00
var testThis;
var count = 0;
try {
set.forEach(function() { "use strict"; debug("forEach #0"); testThis = this; shouldBeUndefined("testThis"); throw count++; })
} catch(e) {
debug(e)
}
try {
set.forEach(function() { "use strict"; debug("forEach #1"); testThis = this; shouldBe("testThis", "thisValue"); throw count++; }, thisValue)
} catch(e) {
debug(e)
}
shouldBeUndefined('set.forEach(debug)')
var keys = [];
set.forEach(function (k) {
debug(k + " : " + typeof (k))
if (k == 2) {
set.delete(3)
set.delete(2)
} else
keys.push(k);
if (k == "3") {
set.add("3");
set.delete(4)
set.add(4)
}
gc()
})
gc();
for (var i = 0; i < keys.length; i++) {
var expectedKey = keys[i]
shouldBeTrue("set.has("+JSON.stringify(expectedKey)+")");
}
set = new Set;
var count = 5;
var keys = [];
for (var i = 0; i < count; i++) {
set.add(i)
set.add("" + i)
keys.push("" + i)
keys.push("'" + i + "'")
}
var i = 0;
debug("set.@@iterator()")
for (var key of set) {
shouldBe("key", "" + keys[i])
i++;
}
shouldBe("i", "" + count * 2)
debug("set.entries()")
var i = 0;
for (var [key, value] of set.entries()) {
shouldBe("key", "" + keys[i])
shouldBe("value", "" + keys[i])
i++;
}
shouldBe("i", "" + count * 2)
debug("set.keys()")
var i = 0;
for (var key of set.keys()) {
shouldBe("key", "" + keys[i])
i++;
}
shouldBe("i", "" + count * 2)
var i = 0;
debug("set.values()")
for (var value of set.values()) {
shouldBe("value", "" + keys[i])
i++;
}
shouldBe("i", "" + count * 2)
debug("Set mutation with live iterator and GC")
set = new Set;
set.add(0)
set.add(1)
set.add(2)
set.add(3)
set.add(4)
set.add(5)
set.add(6)
set.add(7)
set.add(9)
set.add(14)
var keys = [1,3,4,5,7]
var keyIterator = set.keys();
gc();
set.delete(0)
gc()
var i = 0;
for (var key of keyIterator) {
shouldBe("key", "" + keys[i])
if (key == 7)
set.delete(9)
set.delete(1)
set.delete(key * 2)
gc()
i++
}
shouldBe("i", "5")
shouldBe("set.size", "4");
debug("A dead iterator should remain dead")
var set = new Set;
set.add("foo");
var keys = set.keys()
// Iterator reaches end and becomes dead.
for (key of keys) {
// Do nothing
}
set.add("bar")
set.add("wibble")
// Iterator 'keys' remains dead.
var count = 0;
for (key of keys) {
count++;
}
shouldBe("count", "0");
// New assignment creates a new iterator.
keys = set.keys();
for (key of keys) {
count++;
}
shouldBe("count", "3");
// Iterating through set.keys()
count = 0;
for (key of set.keys()) {
count++;
}
shouldBe("count", "3");