destructuring-order.js (2914B)
1 /* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */ 2 /* This Source Code Form is subject to the terms of the Mozilla Public 3 * License, v. 2.0. If a copy of the MPL was not distributed with this 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 5 6 //----------------------------------------------------------------------------- 7 var summary = "Order of destructuring, destructuring in the presence of " + 8 "exceptions"; 9 var actual, expect; 10 11 printStatus(summary); 12 13 /************** 14 * BEGIN TEST * 15 **************/ 16 17 var failed = false; 18 19 20 var a = "FAILED", b = "PASSED"; 21 22 function exceptObj() 23 { 24 return { get b() { throw "PASSED"; }, a: "PASSED" }; 25 } 26 27 function partialEvalObj() 28 { 29 try 30 { 31 ({a:a, b:b} = exceptObj()); 32 throw "FAILED"; 33 } 34 catch (ex) 35 { 36 if (ex !== "PASSED") 37 throw "bad exception thrown: " + ex; 38 } 39 } 40 41 42 var c = "FAILED", d = "FAILED", e = "PASSED", f = "PASSED"; 43 44 function exceptArr() 45 { 46 return ["PASSED", {e: "PASSED", get f() { throw "PASSED"; }}, "FAILED"]; 47 } 48 49 function partialEvalArr() 50 { 51 try 52 { 53 [c, {e: d, f: e}, f] = exceptArr(); 54 throw "FAILED"; 55 } 56 catch (ex) 57 { 58 if (ex !== "PASSED") 59 throw "bad exception thrown: " + ex; 60 } 61 } 62 63 64 var g = "FAILED", h = "FAILED", i = "FAILED", j = "FAILED", k = "FAILED"; 65 var _g = "PASSED", _h = "FAILED", _i = "FAILED", _j = "FAILED", _k = "FAILED"; 66 var order = []; 67 68 function objWithGetters() 69 { 70 return { 71 get j() 72 { 73 var rv = _j; 74 _g = _h = _i = _j = "FAILED"; 75 _k = "PASSED"; 76 order.push("j"); 77 return rv; 78 }, 79 get g() 80 { 81 var rv = _g; 82 _g = _i = _j = _k = "FAILED"; 83 _h = "PASSED"; 84 order.push("g"); 85 return rv; 86 }, 87 get i() 88 { 89 var rv = _i; 90 _g = _h = _i = _k = "FAILED"; 91 _j = "PASSED"; 92 order.push("i"); 93 return rv; 94 }, 95 get k() 96 { 97 var rv = _k; 98 _g = _h = _i = _j = _k = "FAILED"; 99 order.push("k"); 100 return rv; 101 }, 102 get h() 103 { 104 var rv = _h; 105 _g = _h = _j = _k = "FAILED"; 106 _i = "PASSED"; 107 order.push("h"); 108 return rv; 109 } 110 }; 111 } 112 113 function partialEvalObj2() 114 { 115 ({g: g, h: h, i: i, j: j, k: k} = objWithGetters()); 116 } 117 118 try 119 { 120 partialEvalObj(); 121 if (a !== "PASSED" || b !== "PASSED") 122 throw "FAILED: lhs not mutated correctly during destructuring!\n" + 123 "a == " + a + ", b == " + b; 124 125 partialEvalObj2(); 126 if (g !== "PASSED" || 127 h !== "PASSED" || 128 i !== "PASSED" || 129 j !== "PASSED" || 130 k !== "PASSED") 131 throw "FAILED: order of property accesses wrong!\n" + 132 "order == " + order; 133 134 partialEvalArr(); 135 if (c !== "PASSED" || d !== "PASSED" || e !== "PASSED") 136 throw "FAILED: lhs not mutated correctly during destructuring!\n" + 137 "c == " + c + 138 ", d == " + d + 139 ", e == " + e + 140 ", f == " + f ; 141 } 142 catch (ex) 143 { 144 failed = ex; 145 } 146 147 expect = false; 148 actual = failed; 149 150 reportCompare(expect, actual, summary);