OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 // | 4 // |
5 // Flags: --harmony-destructuring | 5 // Flags: --harmony-destructuring |
6 | 6 |
7 (function TestObjectLiteralPattern() { | 7 (function TestObjectLiteralPattern() { |
8 var { x : x, y : y } = { x : 1, y : 2 }; | 8 var { x : x, y : y } = { x : 1, y : 2 }; |
9 assertEquals(1, x); | 9 assertEquals(1, x); |
10 assertEquals(2, y); | 10 assertEquals(2, y); |
11 | 11 |
12 var {z} = { z : 3 }; | 12 var {z} = { z : 3 }; |
13 assertEquals(3, z); | 13 assertEquals(3, z); |
14 | 14 |
15 | 15 |
16 var sum = 0; | 16 var sum = 0; |
17 for(var {z} = { z : 3 }; z != 0; z--) { | 17 for (var {z} = { z : 3 }; z != 0; z--) { |
18 sum += z; | 18 sum += z; |
19 } | 19 } |
20 assertEquals(6, sum); | 20 assertEquals(6, sum); |
21 | 21 |
22 | 22 |
23 var log = []; | 23 var log = []; |
24 var o = { | 24 var o = { |
25 get x() { | 25 get x() { |
26 log.push("x"); | 26 log.push("x"); |
27 return 0; | 27 return 0; |
28 }, | 28 }, |
29 get y() { | 29 get y() { |
30 log.push("y"); | 30 log.push("y"); |
31 return { | 31 return { |
32 get z() { log.push("z"); return 1; } | 32 get z() { log.push("z"); return 1; } |
33 } | 33 } |
34 } | 34 } |
35 }; | 35 }; |
36 var { x : x0, y : { z : z1 }, x : x1 } = o; | 36 var { x : x0, y : { z : z1 }, x : x1 } = o; |
37 assertSame(0, x0); | 37 assertSame(0, x0); |
38 assertSame(1, z1); | 38 assertSame(1, z1); |
39 assertSame(0, x1); | 39 assertSame(0, x1); |
40 assertArrayEquals(["x", "y", "z", "x"], log); | 40 assertArrayEquals(["x", "y", "z", "x"], log); |
41 }()); | 41 }()); |
42 | 42 |
43 | 43 |
| 44 (function TestObjectLiteralPatternInitializers() { |
| 45 var { x : x, y : y = 2 } = { x : 1 }; |
| 46 assertEquals(1, x); |
| 47 assertEquals(2, y); |
| 48 |
| 49 var {z = 3} = {}; |
| 50 assertEquals(3, z); |
| 51 |
| 52 var sum = 0; |
| 53 for (var {z = 3} = {}; z != 0; z--) { |
| 54 sum += z; |
| 55 } |
| 56 assertEquals(6, sum); |
| 57 |
| 58 var log = []; |
| 59 var o = { |
| 60 get x() { |
| 61 log.push("x"); |
| 62 return undefined; |
| 63 }, |
| 64 get y() { |
| 65 log.push("y"); |
| 66 return { |
| 67 get z() { log.push("z"); return undefined; } |
| 68 } |
| 69 } |
| 70 }; |
| 71 var { x : x0 = 0, y : { z : z1 = 1}, x : x1 = 0} = o; |
| 72 assertSame(0, x0); |
| 73 assertSame(1, z1); |
| 74 assertSame(0, x1); |
| 75 assertArrayEquals(["x", "y", "z", "x"], log); |
| 76 }()); |
| 77 |
| 78 |
| 79 (function TestObjectLiteralPatternLexicalInitializers() { |
| 80 'use strict'; |
| 81 let { x : x, y : y = 2 } = { x : 1 }; |
| 82 assertEquals(1, x); |
| 83 assertEquals(2, y); |
| 84 |
| 85 let {z = 3} = {}; |
| 86 assertEquals(3, z); |
| 87 |
| 88 let log = []; |
| 89 let o = { |
| 90 get x() { |
| 91 log.push("x"); |
| 92 return undefined; |
| 93 }, |
| 94 get y() { |
| 95 log.push("y"); |
| 96 return { |
| 97 get z() { log.push("z"); return undefined; } |
| 98 } |
| 99 } |
| 100 }; |
| 101 |
| 102 let { x : x0 = 0, y : { z : z1 = 1 }, x : x1 = 5} = o; |
| 103 assertSame(0, x0); |
| 104 assertSame(1, z1); |
| 105 assertSame(5, x1); |
| 106 assertArrayEquals(["x", "y", "z", "x"], log); |
| 107 |
| 108 let sum = 0; |
| 109 for (let {x = 0, z = 3} = {}; z != 0; z--) { |
| 110 assertEquals(0, x); |
| 111 sum += z; |
| 112 } |
| 113 assertEquals(6, sum); |
| 114 }()); |
| 115 |
| 116 |
44 (function TestObjectLiteralPatternLexical() { | 117 (function TestObjectLiteralPatternLexical() { |
45 'use strict'; | 118 'use strict'; |
46 let { x : x, y : y } = { x : 1, y : 2 }; | 119 let { x : x, y : y } = { x : 1, y : 2 }; |
47 assertEquals(1, x); | 120 assertEquals(1, x); |
48 assertEquals(2, y); | 121 assertEquals(2, y); |
49 | 122 |
50 let {z} = { z : 3 }; | 123 let {z} = { z : 3 }; |
51 assertEquals(3, z); | 124 assertEquals(3, z); |
52 | 125 |
53 let log = []; | 126 let log = []; |
54 let o = { | 127 let o = { |
55 get x() { | 128 get x() { |
56 log.push("x"); | 129 log.push("x"); |
57 return 0; | 130 return 0; |
58 }, | 131 }, |
59 get y() { | 132 get y() { |
60 log.push("y"); | 133 log.push("y"); |
61 return { | 134 return { |
62 get z() { log.push("z"); return 1; } | 135 get z() { log.push("z"); return 1; } |
63 } | 136 } |
64 } | 137 } |
65 }; | 138 }; |
66 let { x : x0, y : { z : z1 }, x : x1 } = o; | 139 let { x : x0, y : { z : z1 }, x : x1 } = o; |
67 assertSame(0, x0); | 140 assertSame(0, x0); |
68 assertSame(1, z1); | 141 assertSame(1, z1); |
69 assertSame(0, x1); | 142 assertSame(0, x1); |
70 assertArrayEquals(["x", "y", "z", "x"], log); | 143 assertArrayEquals(["x", "y", "z", "x"], log); |
71 | 144 |
72 let sum = 0; | 145 let sum = 0; |
73 for(let {x, z} = { x : 0, z : 3 }; z != 0; z--) { | 146 for (let {x, z} = { x : 0, z : 3 }; z != 0; z--) { |
74 assertEquals(0, x); | 147 assertEquals(0, x); |
75 sum += z; | 148 sum += z; |
76 } | 149 } |
77 assertEquals(6, sum); | 150 assertEquals(6, sum); |
78 }()); | 151 }()); |
79 | 152 |
80 | 153 |
81 (function TestObjectLiteralPatternLexicalConst() { | 154 (function TestObjectLiteralPatternLexicalConst() { |
82 'use strict'; | 155 'use strict'; |
83 const { x : x, y : y } = { x : 1, y : 2 }; | 156 const { x : x, y : y } = { x : 1, y : 2 }; |
84 assertEquals(1, x); | 157 assertEquals(1, x); |
85 assertEquals(2, y); | 158 assertEquals(2, y); |
86 | 159 |
87 assertThrows(function() { x++; }, TypeError); | 160 assertThrows(function() { x++; }, TypeError); |
88 assertThrows(function() { y++; }, TypeError); | 161 assertThrows(function() { y++; }, TypeError); |
89 | 162 |
90 const {z} = { z : 3 }; | 163 const {z} = { z : 3 }; |
91 assertEquals(3, z); | 164 assertEquals(3, z); |
92 | 165 |
93 | 166 for (const {x, z} = { x : 0, z : 3 }; z != 3 || x != 0;) { |
94 for(const {x, z} = { x : 0, z : 3 }; z != 3 || x != 0;) { | |
95 assertTrue(false); | 167 assertTrue(false); |
96 } | 168 } |
97 }()); | 169 }()); |
98 | 170 |
99 | 171 |
100 (function TestFailingMatchesSloppy() { | 172 (function TestFailingMatchesSloppy() { |
101 var {x, y} = {}; | 173 var {x, y} = {}; |
102 assertSame(undefined, x); | 174 assertSame(undefined, x); |
103 assertSame(undefined, y); | 175 assertSame(undefined, y); |
104 | 176 |
(...skipping 18 matching lines...) Expand all Loading... |
123 assertSame(undefined, x1); | 195 assertSame(undefined, x1); |
124 assertSame(undefined, y1); | 196 assertSame(undefined, y1); |
125 | 197 |
126 let { x : { z1 }, y2} = { x : {}, y2 : 42 } | 198 let { x : { z1 }, y2} = { x : {}, y2 : 42 } |
127 assertSame(undefined, z1); | 199 assertSame(undefined, z1); |
128 assertSame(42, y2); | 200 assertSame(42, y2); |
129 } | 201 } |
130 }()); | 202 }()); |
131 | 203 |
132 | 204 |
| 205 (function TestTDZInIntializers() { |
| 206 'use strict'; |
| 207 { |
| 208 let {x, y = x} = {x : 42, y : 27}; |
| 209 assertSame(42, x); |
| 210 assertSame(27, y); |
| 211 } |
| 212 |
| 213 { |
| 214 let {x, y = x + 1} = { x : 42 }; |
| 215 assertSame(42, x); |
| 216 assertSame(43, y); |
| 217 } |
| 218 assertThrows(function() { |
| 219 let {x = y, y} = { y : 42 }; |
| 220 }, ReferenceError); |
| 221 |
| 222 { |
| 223 let {x, y = eval("x+1")} = {x:42}; |
| 224 assertEquals(42, x); |
| 225 assertEquals(43, y); |
| 226 } |
| 227 |
| 228 { |
| 229 let {x = function() {return y+1;}, y} = {y:42}; |
| 230 assertEquals(43, x()); |
| 231 assertEquals(42, y); |
| 232 } |
| 233 { |
| 234 let {x = function() {return eval("y+1");}, y} = {y:42}; |
| 235 assertEquals(43, x()); |
| 236 assertEquals(42, y); |
| 237 } |
| 238 }()); |
| 239 |
| 240 |
| 241 (function TestSideEffectsInInitializers() { |
| 242 var callCount = 0; |
| 243 function f(v) { callCount++; return v; } |
| 244 |
| 245 callCount = 0; |
| 246 var { x = f(42) } = { x : 27 }; |
| 247 assertSame(27, x); |
| 248 assertEquals(0, callCount); |
| 249 |
| 250 callCount = 0; |
| 251 var { x = f(42) } = {}; |
| 252 assertSame(42, x); |
| 253 assertEquals(1, callCount); |
| 254 }()); |
| 255 |
| 256 |
| 257 (function TestMultipleAccesses() { |
| 258 assertThrows( |
| 259 "'use strict';"+ |
| 260 "const {x,x} = {x:1};", |
| 261 SyntaxError); |
| 262 |
| 263 assertThrows( |
| 264 "'use strict';"+ |
| 265 "let {x,x} = {x:1};", |
| 266 SyntaxError); |
| 267 |
| 268 (function() { |
| 269 var {x,x = 2} = {x : 1}; |
| 270 assertSame(1, x); |
| 271 }()); |
| 272 |
| 273 assertThrows(function () { |
| 274 'use strict'; |
| 275 let {x = (function() { x = 2; }())} = {}; |
| 276 }, ReferenceError); |
| 277 |
| 278 (function() { |
| 279 'use strict'; |
| 280 let {x = (function() { x = 2; }())} = {x:1}; |
| 281 assertSame(1, x); |
| 282 }()); |
| 283 }()); |
| 284 |
| 285 |
133 (function TestExceptions() { | 286 (function TestExceptions() { |
134 for (var val of [null, undefined]) { | 287 for (var val of [null, undefined]) { |
135 assertThrows(function() { var {} = val; }, TypeError); | 288 assertThrows(function() { var {} = val; }, TypeError); |
136 assertThrows(function() { var {x} = val; }, TypeError); | 289 assertThrows(function() { var {x} = val; }, TypeError); |
137 assertThrows(function() { var { x : {} } = { x : val }; }, TypeError); | 290 assertThrows(function() { var { x : {} } = { x : val }; }, TypeError); |
138 assertThrows(function() { 'use strict'; let {} = val; }, TypeError); | 291 assertThrows(function() { 'use strict'; let {} = val; }, TypeError); |
139 assertThrows(function() { 'use strict'; let {x} = val; }, TypeError); | 292 assertThrows(function() { 'use strict'; let {x} = val; }, TypeError); |
140 assertThrows(function() { 'use strict'; let { x : {} } = { x : val }; }, | 293 assertThrows(function() { 'use strict'; let { x : {} } = { x : val }; }, |
141 TypeError); | 294 TypeError); |
142 } | 295 } |
143 }()); | 296 }()); |
OLD | NEW |