splice-check-steps.js (7340B)
1 /* 2 * Check the order of splice's internal operations, because the ordering is 3 * visible externally. 4 */ 5 6 function handlerMaker(expected_exceptions) { 7 var order = []; 8 function note(trap, name) 9 { 10 order.push(trap + '-' + name); 11 if (expected_exceptions[trap] === name) { 12 throw ("fail"); 13 } 14 } 15 16 return [{ 17 /* this is the only trap we care about */ 18 deleteProperty: function(target, name) { 19 note("del", name); 20 return Reflect.deleteProperty(target, name); 21 }, 22 // derived traps 23 has: function(target, name) { 24 note("has", name); 25 return name in target; 26 }, 27 get: function(target, name, receiver) { 28 note("get", name); 29 return Reflect.get(target, name, receiver); 30 }, 31 set: function(target, name, value, receiver) { 32 note("set", name); 33 return Reflect.set(target, name, value, receiver); 34 }, 35 }, order]; 36 } 37 38 // arr: the array to splice 39 // expected_order: the expected order of operations on arr, stringified 40 function check_splice_proxy(arr, expected_order, expected_exceptions, expected_array, expected_result) { 41 print (arr); 42 var [handler, store] = handlerMaker(expected_exceptions); 43 var proxy = new Proxy(arr, handler); 44 45 try { 46 var args = Array.prototype.slice.call(arguments, 5); 47 var result = Array.prototype.splice.apply(proxy, args); 48 assertEq(Object.keys(expected_exceptions).length, 0); 49 } catch (e) { 50 assertEq(Object.keys(expected_exceptions).length > 0, true); 51 } 52 53 // check the order of the property accesses, etc 54 assertEq(store.toString(), expected_order); 55 56 // The deleted elements are returned in an object that's always an Array. 57 assertEq(Array.isArray(result) || result === undefined, true); 58 59 // check the return value 60 for (var i in expected_result) { 61 assertEq(result[i], expected_result[i]); 62 } 63 for (var i in result) { 64 assertEq(result[i], expected_result[i]); 65 } 66 67 // check the value of arr 68 for (var i in expected_array) { 69 assertEq(arr[i], expected_array[i]); 70 } 71 for (var i in arr) { 72 assertEq(arr[i], expected_array[i]); 73 } 74 75 return result; 76 } 77 78 // Shrinking array 79 check_splice_proxy( 80 [10,1,2,3,4,5], 81 "get-length," + 82 "get-constructor," + 83 "has-0,get-0,has-1,get-1,has-2,get-2," + 84 "has-3,get-3,set-0,has-4,get-4,set-1,has-5,get-5,set-2," + 85 "del-5,del-4,del-3," + 86 "set-length", 87 {}, 88 [3,4,5], 89 [10,1,2], 90 0, 3 91 ); 92 93 // Growing array 94 check_splice_proxy( 95 [11,1,2,3,4,5], 96 "get-length," + 97 "get-constructor," + 98 "has-0,get-0,has-1,get-1,has-2,get-2," + 99 "has-5,get-5,set-9,has-4,get-4,set-8,has-3,get-3,set-7," + 100 "set-0,set-1,set-2,set-3,set-4,set-5,set-6," + 101 "set-length", 102 {}, 103 [9,9,9,9,9,9,9,3,4,5], 104 [11,1,2], 105 0, 3, 9, 9, 9, 9, 9, 9, 9 106 ); 107 108 // Same sized array 109 check_splice_proxy( 110 [12,1,2,3,4,5], 111 "get-length," + 112 "get-constructor," + 113 "has-0,get-0,has-1,get-1,has-2,get-2," + 114 "set-0,set-1,set-2," + 115 "set-length", 116 {}, 117 [9,9,9,3,4,5], 118 [12,1,2], 119 0, 3, 9, 9, 9 120 ); 121 122 123 /* 124 * Check that if we fail at a particular step in the algorithm, we don't 125 * continue with the algorithm beyond that step. 126 */ 127 128 129 // Step 3: fail when getting length 130 check_splice_proxy( 131 [13,1,2,3,4,5], 132 "get-length", 133 {get: 'length'}, 134 [13,1,2,3,4,5], 135 undefined, 136 0, 3, 9, 9, 9 137 ); 138 139 // Step 9b: fail when [[HasProperty]] 140 check_splice_proxy( 141 [14,1,2,3,4,5], 142 "get-length," + 143 "get-constructor," + 144 "has-0,get-0,has-1", 145 {has: '1'}, 146 [14,1,2,3,4,5], 147 undefined, 148 0, 3, 9, 9, 9 149 ); 150 151 // Step 9c(i): fail when [[Get]] 152 check_splice_proxy( 153 [15,1,2,3,4,5], 154 "get-length," + 155 "get-constructor," + 156 "has-0,get-0,has-1,get-1", 157 {get: '1'}, 158 [15,1,2,3,4,5], 159 undefined, 160 0, 3, 9, 9, 9 161 ); 162 163 // Step 12b(iii): fail when [[HasProperty]] 164 check_splice_proxy( 165 [16,1,2,3,4,5], 166 "get-length," + 167 "get-constructor," + 168 "has-0,get-0,has-1,get-1,has-2,get-2," + 169 "has-3,get-3,set-0,has-4", 170 {has: '4'}, 171 [3,1,2,3,4,5], 172 undefined, 173 0, 3 174 ); 175 176 177 // Step 12b(iv)1: fail when [[Get]] 178 check_splice_proxy( 179 [17,1,2,3,4,5], 180 "get-length," + 181 "get-constructor," + 182 "has-0,get-0,has-1,get-1,has-2,get-2," + 183 "has-3,get-3,set-0,has-4,get-4", 184 {get: '4'}, 185 [3,1,2,3,4,5], 186 undefined, 187 0, 3 188 ); 189 190 191 // Step 12b(iv)2: fail when [[Put]] 192 check_splice_proxy( 193 [18,1,2,3,4,5], 194 "get-length," + 195 "get-constructor," + 196 "has-0,get-0,has-1,get-1,has-2,get-2," + 197 "has-3,get-3,set-0,has-4,get-4,set-1", 198 {set: '1'}, 199 [3,1,2,3,4,5], 200 undefined, 201 0, 3 202 ); 203 204 // Step 12b(v)1: fail when [[Delete]] 205 check_splice_proxy( 206 [19,1,2,3,,5], 207 "get-length," + 208 "get-constructor," + 209 "has-0,get-0,has-1,get-1,has-2,get-2," + 210 "has-3,get-3,set-0,has-4,del-1", 211 {del: '1'}, 212 [3,1,2,3,,5], 213 undefined, 214 0, 3 215 ); 216 217 // Step 12d(i): fail when [[Delete]] 218 check_splice_proxy( 219 [20,1,2,3,4,5], 220 "get-length," + 221 "get-constructor," + 222 "has-0,get-0,has-1,get-1,has-2,get-2," + 223 "has-3,get-3,set-0,has-4,get-4,set-1,has-5,get-5,set-2," + 224 "del-5,del-4", 225 {del: '4'}, 226 [3,4,5,3,4], 227 undefined, 228 0, 3 229 ); 230 231 // Step 13b(iii): fail when [[HasProperty]] 232 check_splice_proxy( 233 [21,1,2,3,4,5], 234 "get-length," + 235 "get-constructor," + 236 "has-0,get-0,has-1,get-1,has-2,get-2," + 237 "has-5,get-5,set-8,has-4", 238 {has: '4'}, 239 [21,1,2,3,4,5,,,5], 240 undefined, 241 0, 3, 9,9,9,9,9,9 242 ); 243 244 245 // Step 13b(iv)1: fail when [[Get]] 246 check_splice_proxy( 247 [22,1,2,3,4,5], 248 "get-length," + 249 "get-constructor," + 250 "has-0,get-0,has-1,get-1,has-2,get-2," + 251 "has-5,get-5,set-8,has-4,get-4", 252 {get: '4'}, 253 [22,1,2,3,4,5,,,5], 254 undefined, 255 0, 3, 9,9,9,9,9,9 256 ); 257 258 259 // Step 13b(iv)2: fail when [[Put]] 260 check_splice_proxy( 261 [23,1,2,3,4,5], 262 "get-length," + 263 "get-constructor," + 264 "has-0,get-0,has-1,get-1,has-2,get-2," + 265 "has-5,get-5,set-8,has-4,get-4,set-7", 266 {set: '7'}, 267 [23,1,2,3,4,5,,,5], 268 undefined, 269 0, 3, 9,9,9,9,9,9 270 ); 271 272 // Step 13b(v)1: fail when [[Delete]] 273 check_splice_proxy( 274 [24,1,2,3,,5], 275 "get-length," + 276 "get-constructor," + 277 "has-0,get-0,has-1,get-1,has-2,get-2," + 278 "has-5,get-5,set-8,has-4,del-7", 279 {del: '7'}, 280 [24,1,2,3,,5,,,5], 281 undefined, 282 0, 3, 9,9,9,9,9,9 283 ); 284 285 // Step 15b: fail when [[Put]] 286 check_splice_proxy( 287 [25,1,2,3,4,5], 288 "get-length," + 289 "get-constructor," + 290 "has-0,get-0,has-1,get-1,has-2,get-2," + 291 "has-5,get-5,set-8,has-4,get-4,set-7,has-3,get-3,set-6," + 292 "set-0,set-1,set-2", 293 {set: '2'}, 294 [9,9,2,3,4,5,3,4,5], 295 undefined, 296 0, 3, 9,9,9,9,9,9 297 );