| /* |
| * Any copyright is dedicated to the Public Domain. |
| * http://creativecommons.org/licenses/publicdomain/ |
| */ |
| |
| //----------------------------------------------------------------------------- |
| var BUGNUMBER = 858677; |
| var summary = |
| "[].reverse should swap elements low to high using accesses to low " + |
| "elements, then accesses to high elements"; |
| |
| print(BUGNUMBER + ": " + summary); |
| |
| /************** |
| * BEGIN TEST * |
| **************/ |
| |
| var observed = []; |
| |
| // (0, 7) hits the lowerExists/upperExists case. |
| // (1, 6) hits the !lowerExists/upperExists case. |
| // (2, 5) hits the lowerExists/!upperExists case. |
| // (3, 4) hits the !lowerExists/!upperExists case. |
| // |
| // It'd be a good idea to have a second version of this test at some point |
| // where the "array" being reversed is a proxy, to detect proper ordering of |
| // getproperty, hasproperty, setproperty into a hole, and deleteproperty from a |
| // non-configurable element. But at present our Array.prototype.reverse |
| // implementation probably doesn't conform fully to all this (because our |
| // internal MOP is still slightly off), so punt for now. |
| var props = |
| { |
| 0: { |
| configurable: true, |
| get: function() { observed.push("index 0 get"); return "index 0 get"; }, |
| set: function(v) { observed.push("index 0 set: " + v); } |
| }, |
| /* 1: hole */ |
| 2: { |
| configurable: true, |
| get: function() { observed.push("index 2 get"); return "index 2 get"; }, |
| set: function(v) { observed.push("index 2 set: " + v); } |
| }, |
| /* 3: hole */ |
| /* 4: hole */ |
| /* 5: hole */ |
| 6: { |
| configurable: true, |
| get: function() { observed.push("index 6 get"); return "index 6 get"; }, |
| set: function(v) { observed.push("index 6 set: " + v); } |
| }, |
| 7: { |
| configurable: true, |
| get: function() { observed.push("index 7 get"); return "index 7 get"; }, |
| set: function(v) { observed.push("index 7 set: " + v); } |
| }, |
| }; |
| |
| var arr = Object.defineProperties(new Array(8), props); |
| |
| arr.reverse(); |
| |
| var expectedObserved = |
| ["index 0 get", "index 7 get", "index 0 set: index 7 get", "index 7 set: index 0 get", |
| "index 6 get", |
| "index 2 get" |
| /* nothing for 3/4 */]; |
| print(observed); |
| // Do this before the assertions below futz even more with |observed|. |
| assertEq(observed.length, expectedObserved.length); |
| for (var i = 0; i < expectedObserved.length; i++) |
| assertEq(observed[i], expectedObserved[i]); |
| |
| assertEq(arr[0], "index 0 get"); // no deletion, setting doesn't overwrite |
| assertEq(arr[1], "index 6 get"); // copies result of getter |
| assertEq(2 in arr, false); // deleted |
| assertEq(3 in arr, false); // never there |
| assertEq(4 in arr, false); // never there |
| assertEq(arr[5], "index 2 get"); // copies result of getter |
| assertEq(6 in arr, false); // deleted |
| assertEq(arr[7], "index 7 get"); // no deletion, setter doesn't overwrite |
| |
| /******************************************************************************/ |
| |
| if (typeof reportCompare === "function") |
| reportCompare(true, true); |
| |
| print("Tests complete"); |