1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/js/src/tests/ecma_5/Array/reverse-order-of-low-high-accesses.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,88 @@ 1.4 +/* 1.5 + * Any copyright is dedicated to the Public Domain. 1.6 + * http://creativecommons.org/licenses/publicdomain/ 1.7 + */ 1.8 + 1.9 +//----------------------------------------------------------------------------- 1.10 +var BUGNUMBER = 858677; 1.11 +var summary = 1.12 + "[].reverse should swap elements low to high using accesses to low " + 1.13 + "elements, then accesses to high elements"; 1.14 + 1.15 +print(BUGNUMBER + ": " + summary); 1.16 + 1.17 +/************** 1.18 + * BEGIN TEST * 1.19 + **************/ 1.20 + 1.21 +var observed = []; 1.22 + 1.23 +// (0, 7) hits the lowerExists/upperExists case. 1.24 +// (1, 6) hits the !lowerExists/upperExists case. 1.25 +// (2, 5) hits the lowerExists/!upperExists case. 1.26 +// (3, 4) hits the !lowerExists/!upperExists case. 1.27 +// 1.28 +// It'd be a good idea to have a second version of this test at some point 1.29 +// where the "array" being reversed is a proxy, to detect proper ordering of 1.30 +// getproperty, hasproperty, setproperty into a hole, and deleteproperty from a 1.31 +// non-configurable element. But at present our Array.prototype.reverse 1.32 +// implementation probably doesn't conform fully to all this (because our 1.33 +// internal MOP is still slightly off), so punt for now. 1.34 +var props = 1.35 + { 1.36 + 0: { 1.37 + configurable: true, 1.38 + get: function() { observed.push("index 0 get"); return "index 0 get"; }, 1.39 + set: function(v) { observed.push("index 0 set: " + v); } 1.40 + }, 1.41 + /* 1: hole */ 1.42 + 2: { 1.43 + configurable: true, 1.44 + get: function() { observed.push("index 2 get"); return "index 2 get"; }, 1.45 + set: function(v) { observed.push("index 2 set: " + v); } 1.46 + }, 1.47 + /* 3: hole */ 1.48 + /* 4: hole */ 1.49 + /* 5: hole */ 1.50 + 6: { 1.51 + configurable: true, 1.52 + get: function() { observed.push("index 6 get"); return "index 6 get"; }, 1.53 + set: function(v) { observed.push("index 6 set: " + v); } 1.54 + }, 1.55 + 7: { 1.56 + configurable: true, 1.57 + get: function() { observed.push("index 7 get"); return "index 7 get"; }, 1.58 + set: function(v) { observed.push("index 7 set: " + v); } 1.59 + }, 1.60 + }; 1.61 + 1.62 +var arr = Object.defineProperties(new Array(8), props); 1.63 + 1.64 +arr.reverse(); 1.65 + 1.66 +var expectedObserved = 1.67 + ["index 0 get", "index 7 get", "index 0 set: index 7 get", "index 7 set: index 0 get", 1.68 + "index 6 get", 1.69 + "index 2 get" 1.70 + /* nothing for 3/4 */]; 1.71 +print(observed); 1.72 +// Do this before the assertions below futz even more with |observed|. 1.73 +assertEq(observed.length, expectedObserved.length); 1.74 +for (var i = 0; i < expectedObserved.length; i++) 1.75 + assertEq(observed[i], expectedObserved[i]); 1.76 + 1.77 +assertEq(arr[0], "index 0 get"); // no deletion, setting doesn't overwrite 1.78 +assertEq(arr[1], "index 6 get"); // copies result of getter 1.79 +assertEq(2 in arr, false); // deleted 1.80 +assertEq(3 in arr, false); // never there 1.81 +assertEq(4 in arr, false); // never there 1.82 +assertEq(arr[5], "index 2 get"); // copies result of getter 1.83 +assertEq(6 in arr, false); // deleted 1.84 +assertEq(arr[7], "index 7 get"); // no deletion, setter doesn't overwrite 1.85 + 1.86 +/******************************************************************************/ 1.87 + 1.88 +if (typeof reportCompare === "function") 1.89 + reportCompare(true, true); 1.90 + 1.91 +print("Tests complete");