OLD | NEW |
| (Empty) |
1 // Copyright 2014 the V8 project authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 'use strict'; | |
6 | |
7 // Flags: --harmony-computed-property-names --harmony-classes | |
8 | |
9 | |
10 function ID(x) { | |
11 return x; | |
12 } | |
13 | |
14 | |
15 (function TestClassMethodString() { | |
16 class C { | |
17 a() { return 'A'} | |
18 ['b']() { return 'B'; } | |
19 c() { return 'C'; } | |
20 [ID('d')]() { return 'D'; } | |
21 } | |
22 assertEquals('A', new C().a()); | |
23 assertEquals('B', new C().b()); | |
24 assertEquals('C', new C().c()); | |
25 assertEquals('D', new C().d()); | |
26 assertArrayEquals(['a', 'b', 'c', 'd'], Object.keys(C.prototype)); | |
27 })(); | |
28 | |
29 | |
30 (function TestClassMethodNumber() { | |
31 class C { | |
32 a() { return 'A'; } | |
33 [1]() { return 'B'; } | |
34 c() { return 'C'; } | |
35 [ID(2)]() { return 'D'; } | |
36 } | |
37 assertEquals('A', new C().a()); | |
38 assertEquals('B', new C()[1]()); | |
39 assertEquals('C', new C().c()); | |
40 assertEquals('D', new C()[2]()); | |
41 // Array indexes first. | |
42 assertArrayEquals(['1', '2', 'a', 'c'], Object.keys(C.prototype)); | |
43 })(); | |
44 | |
45 | |
46 (function TestClassMethodSymbol() { | |
47 var sym1 = Symbol(); | |
48 var sym2 = Symbol(); | |
49 class C { | |
50 a() { return 'A'; } | |
51 [sym1]() { return 'B'; } | |
52 c() { return 'C'; } | |
53 [ID(sym2)]() { return 'D'; } | |
54 } | |
55 assertEquals('A', new C().a()); | |
56 assertEquals('B', new C()[sym1]()); | |
57 assertEquals('C', new C().c()); | |
58 assertEquals('D', new C()[sym2]()); | |
59 assertArrayEquals(['a', 'c'], Object.keys(C.prototype)); | |
60 assertArrayEquals([sym1, sym2], Object.getOwnPropertySymbols(C.prototype)); | |
61 })(); | |
62 | |
63 | |
64 | |
65 (function TestStaticClassMethodString() { | |
66 class C { | |
67 static a() { return 'A'} | |
68 static ['b']() { return 'B'; } | |
69 static c() { return 'C'; } | |
70 static ['d']() { return 'D'; } | |
71 } | |
72 assertEquals('A', C.a()); | |
73 assertEquals('B', C.b()); | |
74 assertEquals('C', C.c()); | |
75 assertEquals('D', C.d()); | |
76 assertArrayEquals(['a', 'b', 'c', 'd'], Object.keys(C)); | |
77 })(); | |
78 | |
79 | |
80 (function TestStaticClassMethodNumber() { | |
81 class C { | |
82 static a() { return 'A'; } | |
83 static [1]() { return 'B'; } | |
84 static c() { return 'C'; } | |
85 static [2]() { return 'D'; } | |
86 } | |
87 assertEquals('A', C.a()); | |
88 assertEquals('B', C[1]()); | |
89 assertEquals('C', C.c()); | |
90 assertEquals('D', C[2]()); | |
91 // Array indexes first. | |
92 assertArrayEquals(['1', '2', 'a', 'c'], Object.keys(C)); | |
93 })(); | |
94 | |
95 | |
96 (function TestStaticClassMethodSymbol() { | |
97 var sym1 = Symbol(); | |
98 var sym2 = Symbol(); | |
99 class C { | |
100 static a() { return 'A'; } | |
101 static [sym1]() { return 'B'; } | |
102 static c() { return 'C'; } | |
103 static [sym2]() { return 'D'; } | |
104 } | |
105 assertEquals('A', C.a()); | |
106 assertEquals('B', C[sym1]()); | |
107 assertEquals('C', C.c()); | |
108 assertEquals('D', C[sym2]()); | |
109 assertArrayEquals(['a', 'c'], Object.keys(C)); | |
110 assertArrayEquals([sym1, sym2], Object.getOwnPropertySymbols(C)); | |
111 })(); | |
112 | |
113 | |
114 | |
115 function assertIteratorResult(value, done, result) { | |
116 assertEquals({ value: value, done: done}, result); | |
117 } | |
118 | |
119 | |
120 (function TestGeneratorComputedName() { | |
121 class C { | |
122 *['a']() { | |
123 yield 1; | |
124 yield 2; | |
125 } | |
126 } | |
127 var iter = new C().a(); | |
128 assertIteratorResult(1, false, iter.next()); | |
129 assertIteratorResult(2, false, iter.next()); | |
130 assertIteratorResult(undefined, true, iter.next()); | |
131 assertArrayEquals(['a'], Object.keys(C.prototype)); | |
132 })(); | |
133 | |
134 | |
135 (function TestToNameSideEffects() { | |
136 var counter = 0; | |
137 var key1 = { | |
138 toString: function() { | |
139 assertEquals(0, counter++); | |
140 return 'b'; | |
141 } | |
142 }; | |
143 var key2 = { | |
144 toString: function() { | |
145 assertEquals(1, counter++); | |
146 return 'd'; | |
147 } | |
148 }; | |
149 class C { | |
150 a() { return 'A'; } | |
151 [key1]() { return 'B'; } | |
152 c() { return 'C'; } | |
153 [key2]() { return 'D'; } | |
154 } | |
155 assertEquals(2, counter); | |
156 assertEquals('A', new C().a()); | |
157 assertEquals('B', new C().b()); | |
158 assertEquals('C', new C().c()); | |
159 assertEquals('D', new C().d()); | |
160 assertArrayEquals(['a', 'b', 'c', 'd'], Object.keys(C.prototype)); | |
161 })(); | |
162 | |
163 | |
164 (function TestToNameSideEffectsNumbers() { | |
165 var counter = 0; | |
166 var key1 = { | |
167 valueOf: function() { | |
168 assertEquals(0, counter++); | |
169 return 1; | |
170 }, | |
171 toString: null | |
172 }; | |
173 var key2 = { | |
174 valueOf: function() { | |
175 assertEquals(1, counter++); | |
176 return 2; | |
177 }, | |
178 toString: null | |
179 }; | |
180 | |
181 class C { | |
182 a() { return 'A'; } | |
183 [key1]() { return 'B'; } | |
184 c() { return 'C'; } | |
185 [key2]() { return 'D'; } | |
186 } | |
187 assertEquals(2, counter); | |
188 assertEquals('A', new C().a()); | |
189 assertEquals('B', new C()[1]()); | |
190 assertEquals('C', new C().c()); | |
191 assertEquals('D', new C()[2]()); | |
192 // Array indexes first. | |
193 assertArrayEquals(['1', '2', 'a', 'c'], Object.keys(C.prototype)); | |
194 })(); | |
195 | |
196 | |
197 (function TestGetter() { | |
198 class C { | |
199 get ['a']() { | |
200 return 'A'; | |
201 } | |
202 } | |
203 assertEquals('A', new C().a); | |
204 | |
205 class C2 { | |
206 get b() { | |
207 assertUnreachable(); | |
208 } | |
209 get ['b']() { | |
210 return 'B'; | |
211 } | |
212 } | |
213 assertEquals('B', new C2().b); | |
214 | |
215 class C3 { | |
216 get c() { | |
217 assertUnreachable(); | |
218 } | |
219 get ['c']() { | |
220 assertUnreachable(); | |
221 } | |
222 get ['c']() { | |
223 return 'C'; | |
224 } | |
225 } | |
226 assertEquals('C', new C3().c); | |
227 | |
228 class C4 { | |
229 get ['d']() { | |
230 assertUnreachable(); | |
231 } | |
232 get d() { | |
233 return 'D'; | |
234 } | |
235 } | |
236 assertEquals('D', new C4().d); | |
237 })(); | |
238 | |
239 | |
240 (function TestSetter() { | |
241 var calls = 0; | |
242 class C { | |
243 set ['a'](_) { | |
244 calls++; | |
245 } | |
246 } | |
247 new C().a = 'A'; | |
248 assertEquals(1, calls); | |
249 | |
250 calls = 0; | |
251 class C2 { | |
252 set b(_) { | |
253 assertUnreachable(); | |
254 } | |
255 set ['b'](_) { | |
256 calls++; | |
257 } | |
258 } | |
259 new C2().b = 'B'; | |
260 assertEquals(1, calls); | |
261 | |
262 calls = 0; | |
263 class C3 { | |
264 set c(_) { | |
265 assertUnreachable() | |
266 } | |
267 set ['c'](_) { | |
268 assertUnreachable() | |
269 } | |
270 set ['c'](_) { | |
271 calls++ | |
272 } | |
273 } | |
274 new C3().c = 'C'; | |
275 assertEquals(1, calls); | |
276 | |
277 calls = 0; | |
278 class C4 { | |
279 set ['d'](_) { | |
280 assertUnreachable() | |
281 } | |
282 set d(_) { | |
283 calls++ | |
284 } | |
285 } | |
286 new C4().d = 'D'; | |
287 assertEquals(1, calls); | |
288 })(); | |
289 | |
290 | |
291 (function TestPrototype() { | |
292 // Normally a static prototype property is not allowed. | |
293 class C { | |
294 static ['prototype']() { | |
295 return 1; | |
296 } | |
297 } | |
298 assertEquals(1, C.prototype()); | |
299 | |
300 class C2 { | |
301 static get ['prototype']() { | |
302 return 2; | |
303 } | |
304 } | |
305 assertEquals(2, C2.prototype); | |
306 | |
307 var calls = 0; | |
308 class C3 { | |
309 static set ['prototype'](x) { | |
310 assertEquals(3, x); | |
311 calls++; | |
312 } | |
313 } | |
314 C3.prototype = 3; | |
315 assertEquals(1, calls); | |
316 | |
317 class C4 { | |
318 static *['prototype']() { | |
319 yield 1; | |
320 yield 2; | |
321 } | |
322 } | |
323 var iter = C4.prototype(); | |
324 assertIteratorResult(1, false, iter.next()); | |
325 assertIteratorResult(2, false, iter.next()); | |
326 assertIteratorResult(undefined, true, iter.next()); | |
327 })(); | |
328 | |
329 | |
330 (function TestConstructor() { | |
331 // Normally a constructor property is not allowed. | |
332 class C { | |
333 ['constructor']() { | |
334 return 1; | |
335 } | |
336 } | |
337 assertTrue(C !== C.prototype.constructor); | |
338 assertEquals(1, new C().constructor()); | |
339 | |
340 class C2 { | |
341 get ['constructor']() { | |
342 return 2; | |
343 } | |
344 } | |
345 assertEquals(2, new C2().constructor); | |
346 | |
347 var calls = 0; | |
348 class C3 { | |
349 set ['constructor'](x) { | |
350 assertEquals(3, x); | |
351 calls++; | |
352 } | |
353 } | |
354 new C3().constructor = 3; | |
355 assertEquals(1, calls); | |
356 | |
357 class C4 { | |
358 *['constructor']() { | |
359 yield 1; | |
360 yield 2; | |
361 } | |
362 } | |
363 var iter = new C4().constructor(); | |
364 assertIteratorResult(1, false, iter.next()); | |
365 assertIteratorResult(2, false, iter.next()); | |
366 assertIteratorResult(undefined, true, iter.next()); | |
367 })(); | |
OLD | NEW |