|
@@ -24,19 +24,79 @@ func TestSparseArraySwitch(t *testing.T) {
|
|
const SCRIPT = `
|
|
const SCRIPT = `
|
|
var a = [];
|
|
var a = [];
|
|
a[20470] = 5; // switch to sparse
|
|
a[20470] = 5; // switch to sparse
|
|
- for (var i = a.length - 1; i >= 0; i--) {
|
|
|
|
- a[i] = i; // switch to normal at some point
|
|
|
|
|
|
+ var cutoffIdx = Math.round(20470 - 20470/8);
|
|
|
|
+ for (var i = a.length - 1; i >= cutoffIdx; i--) {
|
|
|
|
+ a[i] = i;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ // At this point it will have switched to a normal array
|
|
if (a.length != 20471) {
|
|
if (a.length != 20471) {
|
|
throw new Error("Invalid length: " + a.length);
|
|
throw new Error("Invalid length: " + a.length);
|
|
}
|
|
}
|
|
|
|
|
|
- for (var i = 0; i < a.length; i++) {
|
|
|
|
|
|
+ for (var i = 0; i < cutoffIdx; i++) {
|
|
|
|
+ if (a[i] !== undefined) {
|
|
|
|
+ throw new Error("Invalid value at " + i + ": " + a[i]);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for (var i = cutoffIdx; i < a.length; i++) {
|
|
|
|
+ if (a[i] !== i) {
|
|
|
|
+ throw new Error("Invalid value at " + i + ": " + a[i]);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Now try to expand. Should stay a normal array
|
|
|
|
+ a[20471] = 20471;
|
|
|
|
+ if (a.length != 20472) {
|
|
|
|
+ throw new Error("Invalid length: " + a.length);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for (var i = 0; i < cutoffIdx; i++) {
|
|
|
|
+ if (a[i] !== undefined) {
|
|
|
|
+ throw new Error("Invalid value at " + i + ": " + a[i]);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for (var i = cutoffIdx; i < a.length; i++) {
|
|
|
|
+ if (a[i] !== i) {
|
|
|
|
+ throw new Error("Invalid value at " + i + ": " + a[i]);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Delete enough elements for it to become sparse again.
|
|
|
|
+ var cutoffIdx1 = Math.round(20472 - 20472/10);
|
|
|
|
+ for (var i = cutoffIdx; i < cutoffIdx1; i++) {
|
|
|
|
+ delete a[i];
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // This should switch it back to sparse.
|
|
|
|
+ a[25590] = 25590;
|
|
|
|
+ if (a.length != 25591) {
|
|
|
|
+ throw new Error("Invalid length: " + a.length);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for (var i = 0; i < cutoffIdx1; i++) {
|
|
|
|
+ if (a[i] !== undefined) {
|
|
|
|
+ throw new Error("Invalid value at " + i + ": " + a[i]);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for (var i = cutoffIdx1; i < 20472; i++) {
|
|
if (a[i] !== i) {
|
|
if (a[i] !== i) {
|
|
throw new Error("Invalid value at " + i + ": " + a[i]);
|
|
throw new Error("Invalid value at " + i + ": " + a[i]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ for (var i = 20472; i < 25590; i++) {
|
|
|
|
+ if (a[i] !== undefined) {
|
|
|
|
+ throw new Error("Invalid value at " + i + ": " + a[i]);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (a[25590] !== 25590) {
|
|
|
|
+ throw new Error("Invalid value at 25590: " + a[25590]);
|
|
|
|
+ }
|
|
`
|
|
`
|
|
|
|
|
|
testScript1(SCRIPT, _undefined, t)
|
|
testScript1(SCRIPT, _undefined, t)
|