diff --git a/test/language/computed-property-names/basics/number.js b/test/language/computed-property-names/basics/number.js new file mode 100644 index 0000000000..e056116959 --- /dev/null +++ b/test/language/computed-property-names/basics/number.js @@ -0,0 +1,27 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.5 +description: > + computed property names can be a number +includes: [compareArray.js] +---*/ + +function ID(x) { + return x; +} + +var object = { + a: 'A', + [1]: 'B', + c: 'C', + [ID(2)]: 'D', +}; +assert.sameValue(object.a, 'A', "The value of `object.a` is `'A'`. Defined in `object` as `a: 'A'`"); +assert.sameValue(object[1], 'B', "The value of `object[1]` is `'B'`. Defined in `object` as `[1]: 'B'`"); +assert.sameValue(object.c, 'C', "The value of `object.c` is `'C'`. Defined in `object` as `c: 'C'`"); +assert.sameValue(object[2], 'D', "The value of `object[2]` is `'D'`. Defined in `object` as `[ID(2)]: 'D'`"); +assert( + compareArray(Object.keys(object), ['1', '2', 'a', 'c']), + "`compareArray(Object.keys(object), ['1', '2', 'a', 'c'])` returns `true`" +); diff --git a/test/language/computed-property-names/basics/string.js b/test/language/computed-property-names/basics/string.js new file mode 100644 index 0000000000..27dce0e1d4 --- /dev/null +++ b/test/language/computed-property-names/basics/string.js @@ -0,0 +1,26 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.5 +description: > + computed property names can be a string +includes: [compareArray.js] +---*/ +function ID(x) { + return x; +} + +var object = { + a: 'A', + ['b']: 'B', + c: 'C', + [ID('d')]: 'D', +}; +assert.sameValue(object.a, 'A', "The value of `object.a` is `'A'`. Defined in `object` as `a: 'A'`"); +assert.sameValue(object.b, 'B', "The value of `object.b` is `'B'`. Defined in `object` as `['b']: 'B'`"); +assert.sameValue(object.c, 'C', "The value of `object.c` is `'C'`. Defined in `object` as `c: 'C'`"); +assert.sameValue(object.d, 'D', "The value of `object.d` is `'D'`. Defined in `object` as `[ID('d')]: 'D'`"); +assert( + compareArray(Object.keys(object), ['a', 'b', 'c', 'd']), + "`compareArray(Object.keys(object), ['a', 'b', 'c', 'd'])` returns `true`" +); diff --git a/test/language/computed-property-names/basics/symbol.js b/test/language/computed-property-names/basics/symbol.js new file mode 100644 index 0000000000..32dddac730 --- /dev/null +++ b/test/language/computed-property-names/basics/symbol.js @@ -0,0 +1,50 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.5 +description: > + computed property names can be a symbol +includes: [compareArray.js] +---*/ + +function ID(x) { + return x; +} + +var sym1 = Symbol(); +var sym2 = Symbol(); +var object = { + a: 'A', + [sym1]: 'B', + c: 'C', + [ID(sym2)]: 'D', +}; +assert.sameValue(object.a, 'A', "The value of `object.a` is `'A'`. Defined in `object` as `a: 'A'`"); +assert.sameValue(object[sym1], 'B', "The value of `object[sym1]` is `'B'`. Defined in `object` as `[sym1]: 'B'`"); +assert.sameValue(object.c, 'C', "The value of `object.c` is `'C'`. Defined in `object` as `c: 'C'`"); +assert.sameValue(object[sym2], 'D', "The value of `object[sym2]` is `'D'`. Defined in `object` as `[ID(sym2)]: 'D'`"); +assert( + compareArray(Object.keys(object), ['a', 'c']), + "`compareArray(Object.keys(object), ['a', 'c'])` returns `true`" +); + +// compareArray expects arguments to be sorted, +// which will cause an array containing symbols to +// throw an exception when toString() is called. +// +// Since there is no guarantee of order: +// +// - Assert only that the symbol is present +// - Assert that the length is correct +// +var symbols = Object.getOwnPropertySymbols(object); + +assert( + symbols.indexOf(sym1) !== -1, + "The result of `symbols.indexOf(sym1) !== -1` is `true`, after executing `var symbols = Object.getOwnPropertySymbols(object);`" +); +assert( + symbols.indexOf(sym2) !== -1, + "The result of `symbols.indexOf(sym2) !== -1` is `true`, after executing `var symbols = Object.getOwnPropertySymbols(object);`" +); +assert.sameValue(symbols.length, 2, "The value of `symbols.length` is `2`, after executing `var symbols = Object.getOwnPropertySymbols(object);`"); diff --git a/test/language/computed-property-names/class/accessor/getter-duplicates.js b/test/language/computed-property-names/class/accessor/getter-duplicates.js new file mode 100644 index 0000000000..0637509834 --- /dev/null +++ b/test/language/computed-property-names/class/accessor/getter-duplicates.js @@ -0,0 +1,47 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.5 +description: > + In a class, duplicate computed property getter names produce only a single property of + that name, whose value is the value of the last property of that name. +---*/ +class C { + get ['a']() { + return 'A'; + } +} +assert.sameValue(new C().a, 'A', "The value of `new C().a` is `'A'`"); + +class C2 { + get b() { + $ERROR("The first `b` getter definition in `C2` is unreachable"); + } + get ['b']() { + return 'B'; + } +} +assert.sameValue(new C2().b, 'B', "The value of `new C2().b` is `'B'`"); + +class C3 { + get c() { + $ERROR("The first `c` getter definition in `C3` is unreachable"); + } + get ['c']() { + $ERROR("The second `c` getter definition in `C3` is unreachable"); + } + get ['c']() { + return 'C'; + } +} +assert.sameValue(new C3().c, 'C', "The value of `new C3().c` is `'C'`"); + +class C4 { + get ['d']() { + $ERROR("The first `d` getter definition in `C4` is unreachable"); + } + get d() { + return 'D'; + } +} +assert.sameValue(new C4().d, 'D', "The value of `new C4().d` is `'D'`"); diff --git a/test/language/computed-property-names/class/accessor/getter.js b/test/language/computed-property-names/class/accessor/getter.js new file mode 100644 index 0000000000..e44a928b93 --- /dev/null +++ b/test/language/computed-property-names/class/accessor/getter.js @@ -0,0 +1,13 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.5 +description: > + Computed property names for getters +---*/ +class C { + get ['a']() { + return 'A'; + } +} +assert.sameValue(new C().a, 'A', "The value of `new C().a` is `'A'`"); diff --git a/test/language/computed-property-names/class/accessor/setter-duplicates.js b/test/language/computed-property-names/class/accessor/setter-duplicates.js new file mode 100644 index 0000000000..422753262f --- /dev/null +++ b/test/language/computed-property-names/class/accessor/setter-duplicates.js @@ -0,0 +1,55 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.5 +description: > + In a class, duplicate computed property setter names produce only a single property of + that name, whose value is the value of the last property of that name. +---*/ +var calls = 0; +class C { + set ['a'](_) { + calls++; + } +} +new C().a = 'A'; +assert.sameValue(calls, 1, "The value of `calls` is `1`, after executing `new C().a = 'A';`"); + +calls = 0; +class C2 { + set b(_) { + $ERROR("The first `b` setter definition in `C2` is unreachable"); + } + set ['b'](_) { + calls++; + } +} +new C2().b = 'B'; +assert.sameValue(calls, 1, "The value of `calls` is `1`, after executing `new C2().b = 'B';`"); + +calls = 0; +class C3 { + set c(_) { + $ERROR("The first `c` setter definition in `C3` is unreachable"); + } + set ['c'](_) { + $ERROR("The second `c` setter definition in `C3` is unreachable"); + } + set ['c'](_) { + calls++ + } +} +new C3().c = 'C'; +assert.sameValue(calls, 1, "The value of `calls` is `1`, after executing `new C3().c = 'C';`"); + +calls = 0; +class C4 { + set ['d'](_) { + $ERROR("The first `d` setter definition in `C4` is unreachable"); + } + set d(_) { + calls++ + } +} +new C4().d = 'D'; +assert.sameValue(calls, 1, "The value of `calls` is `1`, after executing `new C4().d = 'D';`"); diff --git a/test/language/computed-property-names/class/accessor/setter.js b/test/language/computed-property-names/class/accessor/setter.js new file mode 100644 index 0000000000..3df1b208c2 --- /dev/null +++ b/test/language/computed-property-names/class/accessor/setter.js @@ -0,0 +1,15 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.5 +description: > + Computed property names for setters +---*/ +var calls = 0; +class C { + set ['a'](_) { + calls++; + } +} +new C().a = 'A'; +assert.sameValue(calls, 1, "The value of `calls` is `1`, after executing `new C().a = 'A';`"); diff --git a/test/language/computed-property-names/class/method/constructor-cannot-be-generator.js b/test/language/computed-property-names/class/method/constructor-cannot-be-generator.js new file mode 100644 index 0000000000..83a8f4ed04 --- /dev/null +++ b/test/language/computed-property-names/class/method/constructor-cannot-be-generator.js @@ -0,0 +1,12 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 14.5.3 +description: > + computed property generator method names cannot be "constructor" +negative: SyntaxError +---*/ +class C4 { + *['constructor']() { + } +} diff --git a/test/language/computed-property-names/class/method/constructor-cannot-be-getter.js b/test/language/computed-property-names/class/method/constructor-cannot-be-getter.js new file mode 100644 index 0000000000..895b0e79ea --- /dev/null +++ b/test/language/computed-property-names/class/method/constructor-cannot-be-getter.js @@ -0,0 +1,11 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 14.5.3 +description: > + computed property getter names cannot be "constructor" +negative: SyntaxError +---*/ +class C4 { + get ['constructor']() {} +} diff --git a/test/language/computed-property-names/class/method/constructor-cannot-be-setter.js b/test/language/computed-property-names/class/method/constructor-cannot-be-setter.js new file mode 100644 index 0000000000..dd99625d6e --- /dev/null +++ b/test/language/computed-property-names/class/method/constructor-cannot-be-setter.js @@ -0,0 +1,11 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 14.5.3 +description: > + computed property setter names cannot be "constructor" +negative: SyntaxError +---*/ +class C4 { + set ['constructor'](_) {} +} diff --git a/test/language/computed-property-names/class/method/constructor-no-duplicate-1.js b/test/language/computed-property-names/class/method/constructor-no-duplicate-1.js new file mode 100644 index 0000000000..e762bfbb05 --- /dev/null +++ b/test/language/computed-property-names/class/method/constructor-no-duplicate-1.js @@ -0,0 +1,12 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.5 +description: > + computed property names can be "constructor", but duplicates are not allowed, 1 +negative: SyntaxError +---*/ +class C { + constructor() {} + ['constructor']() {} +} diff --git a/test/language/computed-property-names/class/method/constructor-no-duplicate-2.js b/test/language/computed-property-names/class/method/constructor-no-duplicate-2.js new file mode 100644 index 0000000000..79594ac15e --- /dev/null +++ b/test/language/computed-property-names/class/method/constructor-no-duplicate-2.js @@ -0,0 +1,12 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.5 +description: > + computed property names can be "constructor", but duplicates are not allowed, 2 +negative: SyntaxError +---*/ +class C { + ['constructor']() {} + constructor() {} +} diff --git a/test/language/computed-property-names/class/method/constructor-no-duplicate-3.js b/test/language/computed-property-names/class/method/constructor-no-duplicate-3.js new file mode 100644 index 0000000000..3e0297e89e --- /dev/null +++ b/test/language/computed-property-names/class/method/constructor-no-duplicate-3.js @@ -0,0 +1,12 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.5 +description: > + computed property names can be "constructor", but duplicates are not allowed, 2 +negative: SyntaxError +---*/ +class C { + ['constructor']() {} + ['constructor']() {} +} diff --git a/test/language/computed-property-names/class/method/constructor.js b/test/language/computed-property-names/class/method/constructor.js new file mode 100644 index 0000000000..568f16a30f --- /dev/null +++ b/test/language/computed-property-names/class/method/constructor.js @@ -0,0 +1,17 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.5 +description: > + computed property names can be "constructor" +---*/ +class C { + ['constructor']() { + return 1; + } +} +assert( + C !== C.prototype.constructor, + "The result of `C !== C.prototype.constructor` is `true`" +); +assert.sameValue(new C().constructor(), 1, "`new C().constructor()` returns `1`"); diff --git a/test/language/computed-property-names/class/method/generator.js b/test/language/computed-property-names/class/method/generator.js new file mode 100644 index 0000000000..853e2f2a05 --- /dev/null +++ b/test/language/computed-property-names/class/method/generator.js @@ -0,0 +1,23 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.5 +description: > + computed property names can be used as the name of a generator method in a class +includes: [compareArray.js] +---*/ +class C { + *['a']() { + yield 1; + yield 2; + } +} +assert.sameValue( + Object.keys(C.prototype).length, + 0, + "The value of `Object.keys(C.prototype).length` is `0`" +); +assert( + compareArray(Object.getOwnPropertyNames(C.prototype), ['constructor', 'a']), + "`compareArray(Object.getOwnPropertyNames(C.prototype), ['constructor', 'a'])` returns `true`" +); diff --git a/test/language/computed-property-names/class/method/number.js b/test/language/computed-property-names/class/method/number.js new file mode 100644 index 0000000000..703033ef81 --- /dev/null +++ b/test/language/computed-property-names/class/method/number.js @@ -0,0 +1,31 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.5 +description: > + computed property class method names can be a number +includes: [compareArray.js] +---*/ + +function ID(x) { + return x; +} + +class C { + a() { return 'A'; } + [1]() { return 'B'; } + c() { return 'C'; } + [ID(2)]() { return 'D'; } +} +assert.sameValue(new C().a(), 'A', "`new C().a()` returns `'A'`, from `a() { return 'A'; }`"); +assert.sameValue(new C()[1](), 'B', "`new C()[1]()` returns `'B'`, from `[1]() { return 'B'; }`"); +assert.sameValue(new C().c(), 'C', "`new C().c()` returns `'C'`, from `c() { return 'C'; }`"); +assert.sameValue(new C()[2](), 'D', "`new C()[2]()` returns `'D'`, from `[ID(2)]() { return 'D'; }`"); +assert( + compareArray(Object.keys(C.prototype), []), + "`compareArray(Object.keys(C.prototype), [])` returns `true`" +); +assert( + compareArray(Object.getOwnPropertyNames(C.prototype), ['1', '2', 'constructor', 'a', 'c']), + "`compareArray(Object.getOwnPropertyNames(C.prototype), ['1', '2', 'constructor', 'a', 'c'])` returns `true`" +); diff --git a/test/language/computed-property-names/class/method/string.js b/test/language/computed-property-names/class/method/string.js new file mode 100644 index 0000000000..f59d1f9872 --- /dev/null +++ b/test/language/computed-property-names/class/method/string.js @@ -0,0 +1,31 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.5 +description: > + computed property class method names can be a string +includes: [compareArray.js] +---*/ + +function ID(x) { + return x; +} + +class C { + a() { return 'A'} + ['b']() { return 'B'; } + c() { return 'C'; } + [ID('d')]() { return 'D'; } +} +assert.sameValue(new C().a(), 'A', "`new C().a()` returns `'A'`. Defined as `a() { return 'A'}`"); +assert.sameValue(new C().b(), 'B', "`new C().b()` returns `'B'`. Defined as `['b']() { return 'B'; }`"); +assert.sameValue(new C().c(), 'C', "`new C().c()` returns `'C'`. Defined as `c() { return 'C'; }`"); +assert.sameValue(new C().d(), 'D', "`new C().d()` returns `'D'`. Defined as `[ID('d')]() { return 'D'; }`"); +assert( + compareArray(Object.keys(C.prototype), []), + "`compareArray(Object.keys(C.prototype), [])` returns `true`" +); +assert( + compareArray(Object.getOwnPropertyNames(C.prototype), ['constructor', 'a', 'b', 'c', 'd']), + "`compareArray(Object.getOwnPropertyNames(C.prototype), ['constructor', 'a', 'b', 'c', 'd'])` returns `true`" +); diff --git a/test/language/computed-property-names/class/method/symbol.js b/test/language/computed-property-names/class/method/symbol.js new file mode 100644 index 0000000000..188e96bad5 --- /dev/null +++ b/test/language/computed-property-names/class/method/symbol.js @@ -0,0 +1,54 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.5 +description: > + computed property class method names can be a symbol +includes: [compareArray.js] +---*/ + +function ID(x) { + return x; +} + +var sym1 = Symbol(); +var sym2 = Symbol(); +class C { + a() { return 'A'; } + [sym1]() { return 'B'; } + c() { return 'C'; } + [ID(sym2)]() { return 'D'; } +} +assert.sameValue(new C().a(), 'A', "`new C().a()` returns `'A'`. Defined as `a() { return 'A'; }`"); +assert.sameValue(new C()[sym1](), 'B', "`new C()[sym1]()` returns `'B'`. Defined as `[sym1]() { return 'B'; }`"); +assert.sameValue(new C().c(), 'C', "`new C().c()` returns `'C'`. Defined as `c() { return 'C'; }`"); +assert.sameValue(new C()[sym2](), 'D', "`new C()[sym2]()` returns `'D'`. Defined as `[ID(sym2)]() { return 'D'; }`"); +assert( + compareArray(Object.keys(C.prototype), []), + "`compareArray(Object.keys(C.prototype), [])` returns `true`" +); +assert( + compareArray(Object.getOwnPropertyNames(C.prototype), ['constructor', 'a', 'c']), + "`compareArray(Object.getOwnPropertyNames(C.prototype), ['constructor', 'a', 'c'])` returns `true`" +); + +// compareArray expects arguments to be sorted, +// which will cause an array containing symbols to +// throw an exception when toString() is called. +// +// Since there is no guarantee of order: +// +// - Assert only that the symbol is present +// - Assert that the length is correct +// +var symbols = Object.getOwnPropertySymbols(C.prototype); + +assert( + symbols.indexOf(sym1) !== -1, + "The result of `symbols.indexOf(sym1) !== -1` is `true`, after executing `var symbols = Object.getOwnPropertySymbols(C.prototype);`" +); +assert( + symbols.indexOf(sym2) !== -1, + "The result of `symbols.indexOf(sym2) !== -1` is `true`, after executing `var symbols = Object.getOwnPropertySymbols(C.prototype);`" +); +assert.sameValue(symbols.length, 2, "The value of `symbols.length` is `2`, after executing `var symbols = Object.getOwnPropertySymbols(C.prototype);`"); diff --git a/test/language/computed-property-names/class/static/generator-constructor.js b/test/language/computed-property-names/class/static/generator-constructor.js new file mode 100644 index 0000000000..0d24e6ffb7 --- /dev/null +++ b/test/language/computed-property-names/class/static/generator-constructor.js @@ -0,0 +1,12 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.5 +description: > + In a class, computed property names for static + generators cannot be "constructor" +negative: SyntaxError +---*/ +class C { + static *['constructor']() {} +} diff --git a/test/language/computed-property-names/class/static/generator-prototype.js b/test/language/computed-property-names/class/static/generator-prototype.js new file mode 100644 index 0000000000..16c558217b --- /dev/null +++ b/test/language/computed-property-names/class/static/generator-prototype.js @@ -0,0 +1,12 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.5 +description: > + In a class, computed property names for static + generators cannot be "prototype" +negative: SyntaxError +---*/ +class C { + static *['prototype']() {} +} diff --git a/test/language/computed-property-names/class/static/getter-constructor.js b/test/language/computed-property-names/class/static/getter-constructor.js new file mode 100644 index 0000000000..3b576dd53a --- /dev/null +++ b/test/language/computed-property-names/class/static/getter-constructor.js @@ -0,0 +1,12 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.5 +description: > + In a class, computed property names for static + getters cannot be "constructor" +negative: SyntaxError +---*/ +class C { + static get ['constructor']() {} +} diff --git a/test/language/computed-property-names/class/static/getter-prototype.js b/test/language/computed-property-names/class/static/getter-prototype.js new file mode 100644 index 0000000000..f445ee0f3d --- /dev/null +++ b/test/language/computed-property-names/class/static/getter-prototype.js @@ -0,0 +1,12 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.5 +description: > + In a class, computed property names for static + getters cannot be "prototype" +negative: SyntaxError +---*/ +class C { + static get ['prototype']() {} +} diff --git a/test/language/computed-property-names/class/static/method-constructor.js b/test/language/computed-property-names/class/static/method-constructor.js new file mode 100644 index 0000000000..a47c803835 --- /dev/null +++ b/test/language/computed-property-names/class/static/method-constructor.js @@ -0,0 +1,12 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.5 +description: > + In a class, computed property names for static + methods cannot be "constructor" +negative: SyntaxError +---*/ +class C { + static ['constructor']() {} +} diff --git a/test/language/computed-property-names/class/static/method-number.js b/test/language/computed-property-names/class/static/method-number.js new file mode 100644 index 0000000000..4574a2d7c2 --- /dev/null +++ b/test/language/computed-property-names/class/static/method-number.js @@ -0,0 +1,26 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.5 +description: > + In a class, static computed property method names can be a number +includes: [compareArray.js] +---*/ +class C { + static a() { return 'A'; } + static [1]() { return 'B'; } + static c() { return 'C'; } + static [2]() { return 'D'; } +} +assert.sameValue(C.a(), 'A', "`C.a()` returns `'A'`. Defined as `static a() { return 'A'; }`"); +assert.sameValue(C[1](), 'B', "`C[1]()` returns `'B'`. Defined as `static [1]() { return 'B'; }`"); +assert.sameValue(C.c(), 'C', "`C.c()` returns `'C'`. Defined as `static c() { return 'C'; }`"); +assert.sameValue(C[2](), 'D', "`C[2]()` returns `'D'`. Defined as `static [2]() { return 'D'; }`"); +assert( + compareArray(Object.keys(C), []), + "`compareArray(Object.keys(C), [])` returns `true`" +); +assert( + compareArray(Object.getOwnPropertyNames(C), ['1', '2', 'length', 'name', 'prototype', 'a', 'c']), + "`compareArray(Object.getOwnPropertyNames(C), ['1', '2', 'length', 'name', 'prototype', 'a', 'c'])` returns `true`" +); diff --git a/test/language/computed-property-names/class/static/method-prototype.js b/test/language/computed-property-names/class/static/method-prototype.js new file mode 100644 index 0000000000..df2f59af12 --- /dev/null +++ b/test/language/computed-property-names/class/static/method-prototype.js @@ -0,0 +1,12 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.5 +description: > + In a class, computed property names for static + methods cannot be "prototype" +negative: SyntaxError +---*/ +class C { + static ['prototype']() {} +} diff --git a/test/language/computed-property-names/class/static/method-string.js b/test/language/computed-property-names/class/static/method-string.js new file mode 100644 index 0000000000..6f62b5ac81 --- /dev/null +++ b/test/language/computed-property-names/class/static/method-string.js @@ -0,0 +1,26 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.5 +description: > + In a class, static computed property method names can be a string +includes: [compareArray.js] +---*/ +class C { + static a() { return 'A'} + static ['b']() { return 'B'; } + static c() { return 'C'; } + static ['d']() { return 'D'; } +} +assert.sameValue(C.a(), 'A', "`C.a()` returns `'A'`. Defined as `static a() { return 'A'}`"); +assert.sameValue(C.b(), 'B', "`C.b()` returns `'B'`. Defined as `static ['b']() { return 'B'; }`"); +assert.sameValue(C.c(), 'C', "`C.c()` returns `'C'`. Defined as `static c() { return 'C'; }`"); +assert.sameValue(C.d(), 'D', "`C.d()` returns `'D'`. Defined as `static ['d']() { return 'D'; }`"); +assert( + compareArray(Object.keys(C), []), + "`compareArray(Object.keys(C), [])` returns `true`" +); +assert( + compareArray(Object.getOwnPropertyNames(C), ['length', 'name', 'prototype', 'a', 'b', 'c', 'd']), + "`compareArray(Object.getOwnPropertyNames(C), ['length', 'name', 'prototype', 'a', 'b', 'c', 'd'])` returns `true`" +); diff --git a/test/language/computed-property-names/class/static/method-symbol.js b/test/language/computed-property-names/class/static/method-symbol.js new file mode 100644 index 0000000000..7a29efb9dd --- /dev/null +++ b/test/language/computed-property-names/class/static/method-symbol.js @@ -0,0 +1,54 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.5 +description: > + In a class, static computed property method names can be a symbol +includes: [compareArray.js] +---*/ +var sym1 = Symbol(); +var sym2 = Symbol(); +class C { + static a() { return 'A'; } + static [sym1]() { return 'B'; } + static c() { return 'C'; } + static [sym2]() { return 'D'; } +} +assert.sameValue(C.a(), 'A', "`C.a()` returns `'A'`. Defined as `static a() { return 'A'; }`"); +assert.sameValue(C[sym1](), 'B', "`C[sym1]()` returns `'B'`. Defined as `static [sym1]() { return 'B'; }`"); +assert.sameValue(C.c(), 'C', "`C.c()` returns `'C'`. Defined as `static c() { return 'C'; }`"); +assert.sameValue(C[sym2](), 'D', "`C[sym2]()` returns `'D'`. Defined as `static [sym2]() { return 'D'; }`"); +assert( + compareArray(Object.keys(C), []), + "`compareArray(Object.keys(C), [])` returns `true`" +); +assert( + compareArray(Object.getOwnPropertyNames(C), ['length', 'name', 'prototype', 'a', 'c']), + "`compareArray(Object.getOwnPropertyNames(C), ['length', 'name', 'prototype', 'a', 'c'])` returns `true`" +); + + +// compareArray expects arguments to be sorted, +// which will cause an array containing symbols to +// throw an exception when toString() is called. +// +// Since there is no guarantee of order: +// +// - Assert only that the symbol is present +// - Assert that the length is correct +// +var symbols = Object.getOwnPropertySymbols(C); + +assert( + symbols.indexOf(sym1) !== -1, + "The result of `symbols.indexOf(sym1) !== -1` is `true`, after executing `var symbols = Object.getOwnPropertySymbols(C);`" +); +assert( + symbols.indexOf(sym2) !== -1, + "The result of `symbols.indexOf(sym2) !== -1` is `true`, after executing `var symbols = Object.getOwnPropertySymbols(C);`" +); +assert.sameValue( + symbols.length, + 2, + "The value of `symbols.length` is `2`, after executing `var symbols = Object.getOwnPropertySymbols(C);`" +); diff --git a/test/language/computed-property-names/class/static/setter-constructor.js b/test/language/computed-property-names/class/static/setter-constructor.js new file mode 100644 index 0000000000..4ee7466c7d --- /dev/null +++ b/test/language/computed-property-names/class/static/setter-constructor.js @@ -0,0 +1,12 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.5 +description: > + In a class, computed property names for static + setters cannot be "constructor" +negative: SyntaxError +---*/ +class C { + static set ['constructor'](x) {} +} diff --git a/test/language/computed-property-names/class/static/setter-prototype.js b/test/language/computed-property-names/class/static/setter-prototype.js new file mode 100644 index 0000000000..56505eab05 --- /dev/null +++ b/test/language/computed-property-names/class/static/setter-prototype.js @@ -0,0 +1,12 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.5 +description: > + In a class, computed property names for static + setters cannot be "prototype" +negative: SyntaxError +---*/ +class C { + static set ['prototype'](x) {} +} diff --git a/test/language/computed-property-names/object/accessor/getter-duplicates.js b/test/language/computed-property-names/object/accessor/getter-duplicates.js new file mode 100644 index 0000000000..5c8e908cd4 --- /dev/null +++ b/test/language/computed-property-names/object/accessor/getter-duplicates.js @@ -0,0 +1,47 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.5 +description: > + In an object, duplicate computed property getter names produce only a single property of + that name, whose value is the value of the last property of that name. +---*/ +var A = { + get ['a']() { + return 'A'; + } +}; +assert.sameValue(A.a, 'A', "The value of `A.a` is `'A'`"); + +var B = { + get b() { + $ERROR("The `b` getter definition in `B` is unreachable"); + }, + get ['b']() { + return 'B'; + } +}; +assert.sameValue(B.b, 'B', "The value of `B.b` is `'B'`"); + +var C = { + get c() { + $ERROR("The `c` getter definition in `C` is unreachable"); + }, + get ['c']() { + $ERROR("The `['c']` getter definition in `C` is unreachable"); + }, + get ['c']() { + return 'C'; + } +}; +assert.sameValue(C.c, 'C', "The value of `C.c` is `'C'`"); + +var D = { + get ['d']() { + $ERROR("The `['d']` getter definition in `D` is unreachable"); + }, + get d() { + return 'D'; + } +}; +assert.sameValue(D.d, 'D', "The value of `D.d` is `'D'`"); diff --git a/test/language/computed-property-names/object/accessor/getter-super.js b/test/language/computed-property-names/object/accessor/getter-super.js new file mode 100644 index 0000000000..7c6ddc1616 --- /dev/null +++ b/test/language/computed-property-names/object/accessor/getter-super.js @@ -0,0 +1,46 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.5 +description: > + computed property getters can call super methods +---*/ + +function ID(x) { + return x; +} + +var proto = { + m() { + return ' proto m'; + } +}; +var object = { + get ['a']() { return 'a' + super.m(); }, + get [ID('b')]() { return 'b' + super.m(); }, + get [0]() { return '0' + super.m(); }, + get [ID(1)]() { return '1' + super.m(); }, +}; + +Object.setPrototypeOf(object, proto); + +assert.sameValue( + object.a, + 'a proto m', + "The value of `object.a` is `'a proto m'`. Defined as `get ['a']() { return 'a' + super.m(); }`" +); +assert.sameValue( + object.b, + 'b proto m', + "The value of `object.b` is `'b proto m'`. Defined as `get [ID('b')]() { return 'b' + super.m(); }`" +); +assert.sameValue( + object[0], + '0 proto m', + "The value of `object[0]` is `'0 proto m'`. Defined as `get [0]() { return '0' + super.m(); }`" +); +assert.sameValue( + object[1], + '1 proto m', + "The value of `object[1]` is `'1 proto m'`. Defined as `get [ID(1)]() { return '1' + super.m(); }`" +); diff --git a/test/language/computed-property-names/object/accessor/getter.js b/test/language/computed-property-names/object/accessor/getter.js new file mode 100644 index 0000000000..6245651f71 --- /dev/null +++ b/test/language/computed-property-names/object/accessor/getter.js @@ -0,0 +1,13 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.5 +description: > + Computed property names for getters +---*/ +var A = { + get ["a"]() { + return "A"; + } +}; +assert.sameValue(A.a, "A", "The value of `A.a` is `'A'`"); diff --git a/test/language/computed-property-names/object/accessor/setter-duplicates.js b/test/language/computed-property-names/object/accessor/setter-duplicates.js new file mode 100644 index 0000000000..f423c31bad --- /dev/null +++ b/test/language/computed-property-names/object/accessor/setter-duplicates.js @@ -0,0 +1,55 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.5 +description: > + In an object, duplicate computed property getter names produce only a single property of + that name, whose value is the value of the last property of that name. +---*/ +var calls = 0; +var A = { + set ['a'](_) { + calls++; + } +}; +A.a = 'A'; +assert.sameValue(calls, 1, "The value of `calls` is `1`"); + +calls = 0; +var B = { + set b(_) { + $ERROR("The `b` setter definition in `B` is unreachable"); + }, + set ['b'](_) { + calls++; + } +}; +B.b = 'B'; +assert.sameValue(calls, 1, "The value of `calls` is `1`"); + +calls = 0; +var C = { + set c(_) { + $ERROR("The `c` setter definition in `C` is unreachable"); + }, + set ['c'](_) { + $ERROR("The first `['c']` setter definition in `C` is unreachable"); + }, + set ['c'](_) { + calls++ + } +}; +C.c = 'C'; +assert.sameValue(calls, 1, "The value of `calls` is `1`"); + +calls = 0; +var D = { + set ['d'](_) { + $ERROR("The `['d']` setter definition in `D` is unreachable"); + }, + set d(_) { + calls++ + } +}; +D.d = 'D'; +assert.sameValue(calls, 1, "The value of `calls` is `1`"); diff --git a/test/language/computed-property-names/object/accessor/setter-super.js b/test/language/computed-property-names/object/accessor/setter-super.js new file mode 100644 index 0000000000..e98a439b58 --- /dev/null +++ b/test/language/computed-property-names/object/accessor/setter-super.js @@ -0,0 +1,35 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.5 +description: > + computed property setters can call super methods +---*/ + +function ID(x) { + return x; +} + +var value; +var proto = { + m(name, v) { + value = name + ' ' + v; + } +}; +var object = { + set ['a'](v) { super.m('a', v); }, + set [ID('b')](v) { super.m('b', v); }, + set [0](v) { super.m('0', v); }, + set [ID(1)](v) { super.m('1', v); }, +}; + +Object.setPrototypeOf(object, proto); + +object.a = 2; +assert.sameValue(value, 'a 2', "The value of `value` is `'a 2'`, after executing `object.a = 2;`"); +object.b = 3; +assert.sameValue(value, 'b 3', "The value of `value` is `'b 3'`, after executing `object.b = 3;`"); +object[0] = 4; +assert.sameValue(value, '0 4', "The value of `value` is `'0 4'`, after executing `object[0] = 4;`"); +object[1] = 5; +assert.sameValue(value, '1 5', "The value of `value` is `'1 5'`, after executing `object[1] = 5;`"); diff --git a/test/language/computed-property-names/object/accessor/setter.js b/test/language/computed-property-names/object/accessor/setter.js new file mode 100644 index 0000000000..efd67a9cb2 --- /dev/null +++ b/test/language/computed-property-names/object/accessor/setter.js @@ -0,0 +1,16 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.5 +description: > + In an object, duplicate computed property getter names produce only a single property of + that name, whose value is the value of the last property of that name. +---*/ +var calls = 0; +var A = { + set ['a'](_) { + calls++; + } +}; +A.a = 'A'; +assert.sameValue(calls, 1, "The value of `calls` is `1`, after executing `A.a = 'A';`"); diff --git a/test/language/computed-property-names/object/method/generator.js b/test/language/computed-property-names/object/method/generator.js new file mode 100644 index 0000000000..2ad5c9f318 --- /dev/null +++ b/test/language/computed-property-names/object/method/generator.js @@ -0,0 +1,18 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.5 +description: > + computed property names can be used as the name of a generator method in an object +includes: [compareArray.js] +---*/ +var object = { + *['a']() { + yield 1; + yield 2; + } +}; +assert( + compareArray(Object.keys(object), ['a']), + "`compareArray(Object.keys(object), ['a'])` returns `true`" +); diff --git a/test/language/computed-property-names/object/method/number.js b/test/language/computed-property-names/object/method/number.js new file mode 100644 index 0000000000..13026a1575 --- /dev/null +++ b/test/language/computed-property-names/object/method/number.js @@ -0,0 +1,27 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.5 +description: > + computed property method names can be a number +includes: [compareArray.js] +---*/ + +function ID(x) { + return x; +} + +var object = { + a() { return 'A'; }, + [1]() { return 'B'; }, + c() { return 'C'; }, + [ID(2)]() { return 'D'; }, +}; +assert.sameValue(object.a(), 'A', "`object.a()` returns `'A'`. Defined as `a() { return 'A'; }`"); +assert.sameValue(object[1](), 'B', "`object[1]()` returns `'B'`. Defined as `[1]() { return 'B'; }`"); +assert.sameValue(object.c(), 'C', "`object.c()` returns `'C'`. Defined as `c() { return 'C'; }`"); +assert.sameValue(object[2](), 'D', "`object[2]()` returns `'D'`. Defined as `[ID(2)]() { return 'D'; }`"); +assert( + compareArray(Object.keys(object), ['1', '2', 'a', 'c']), + "`compareArray(Object.keys(object), ['1', '2', 'a', 'c'])` returns `true`" +); diff --git a/test/language/computed-property-names/object/method/string.js b/test/language/computed-property-names/object/method/string.js new file mode 100644 index 0000000000..ace48da078 --- /dev/null +++ b/test/language/computed-property-names/object/method/string.js @@ -0,0 +1,27 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.5 +description: > + computed property method names can be a string +includes: [compareArray.js] +---*/ + +function ID(x) { + return x; +} + +var object = { + a() { return 'A'}, + ['b']() { return 'B'; }, + c() { return 'C'; }, + [ID('d')]() { return 'D'; }, +}; +assert.sameValue(object.a(), 'A', "`object.a()` returns `'A'`. Defined as `a() { return 'A'}`"); +assert.sameValue(object.b(), 'B', "`object.b()` returns `'B'`. Defined as `['b']() { return 'B'; }`"); +assert.sameValue(object.c(), 'C', "`object.c()` returns `'C'`. Defined as `c() { return 'C'; }`"); +assert.sameValue(object.d(), 'D', "`object.d()` returns `'D'`. Defined as `[ID('d')]() { return 'D'; }`"); +assert( + compareArray(Object.keys(object), ['a', 'b', 'c', 'd']), + "`compareArray(Object.keys(object), ['a', 'b', 'c', 'd'])` returns `true`" +); diff --git a/test/language/computed-property-names/object/method/super.js b/test/language/computed-property-names/object/method/super.js new file mode 100644 index 0000000000..21e10b80d4 --- /dev/null +++ b/test/language/computed-property-names/object/method/super.js @@ -0,0 +1,30 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.5 +description: > + computed property methods can call super methods +---*/ + +function ID(x) { + return x; +} + +var proto = { + m() { + return ' proto m'; + } +}; +var object = { + ['a']() { return 'a' + super.m(); }, + [ID('b')]() { return 'b' + super.m(); }, + [0]() { return '0' + super.m(); }, + [ID(1)]() { return '1' + super.m(); }, +}; + +Object.setPrototypeOf(object, proto); + +assert.sameValue(object.a(), 'a proto m', "`object.a()` returns `'a proto m'`, after executing `Object.setPrototypeOf(object, proto);`"); +assert.sameValue(object.b(), 'b proto m', "`object.b()` returns `'b proto m'`, after executing `Object.setPrototypeOf(object, proto);`"); +assert.sameValue(object[0](), '0 proto m', "`object[0]()` returns `'0 proto m'`, after executing `Object.setPrototypeOf(object, proto);`"); +assert.sameValue(object[1](), '1 proto m', "`object[1]()` returns `'1 proto m'`, after executing `Object.setPrototypeOf(object, proto);`"); diff --git a/test/language/computed-property-names/object/method/symbol.js b/test/language/computed-property-names/object/method/symbol.js new file mode 100644 index 0000000000..64f1e71255 --- /dev/null +++ b/test/language/computed-property-names/object/method/symbol.js @@ -0,0 +1,50 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.5 +description: > + computed property method names can be a symbol +includes: [compareArray.js] +---*/ + +function ID(x) { + return x; +} + +var sym1 = Symbol(); +var sym2 = Symbol(); +var object = { + a() { return 'A'; }, + [sym1]() { return 'B'; }, + c() { return 'C'; }, + [ID(sym2)]() { return 'D'; }, +}; +assert.sameValue(object.a(), 'A', "`object.a()` returns `'A'`. Defined as `a() { return 'A'; }`"); +assert.sameValue(object[sym1](), 'B', "`object[sym1]()` returns `'B'`. Defined as `[sym1]() { return 'B'; }`"); +assert.sameValue(object.c(), 'C', "`object.c()` returns `'C'`. Defined as `c() { return 'C'; }`"); +assert.sameValue(object[sym2](), 'D', "`object[sym2]()` returns `'D'`. Defined as `[ID(sym2)]() { return 'D'; }`"); +assert( + compareArray(Object.keys(object), ['a', 'c']), + "`compareArray(Object.keys(object), ['a', 'c'])` returns `true`" +); + +// compareArray expects arguments to be sorted, +// which will cause an array containing symbols to +// throw an exception when toString() is called. +// +// Since there is no guarantee of order: +// +// - Assert only that the symbol is present +// - Assert that the length is correct +// +var symbols = Object.getOwnPropertySymbols(object); + +assert( + symbols.indexOf(sym1) !== -1, + "The result of `symbols.indexOf(sym1) !== -1` is `true`, after executing `var symbols = Object.getOwnPropertySymbols(object);`" +); +assert( + symbols.indexOf(sym2) !== -1, + "The result of `symbols.indexOf(sym2) !== -1` is `true`, after executing `var symbols = Object.getOwnPropertySymbols(object);`" +); +assert.sameValue(symbols.length, 2, "The value of `symbols.length` is `2`, after executing `var symbols = Object.getOwnPropertySymbols(object);`"); diff --git a/test/language/computed-property-names/object/property/number-duplicates.js b/test/language/computed-property-names/object/property/number-duplicates.js new file mode 100644 index 0000000000..6913acc226 --- /dev/null +++ b/test/language/computed-property-names/object/property/number-duplicates.js @@ -0,0 +1,50 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.5 +description: > + computed property names can be numbers +---*/ +var object = { + [1.2]: 'A', + [1e55]: 'B', + [0.000001]: 'C', + [-0]: 'D', + [Infinity]: 'E', + [-Infinity]: 'F', + [NaN]: 'G', +}; +assert.sameValue( + object['1.2'], + 'A', + "The value of `object['1.2']` is `'A'`. Defined as `[1.2]: 'A'`" +); +assert.sameValue( + object['1e+55'], + 'B', + "The value of `object['1e+55']` is `'B'`. Defined as `[1e55]: 'B'`" +); +assert.sameValue( + object['0.000001'], + 'C', + "The value of `object['0.000001']` is `'C'`. Defined as `[0.000001]: 'C'`" +); +assert.sameValue( + object[0], + 'D', + "The value of `object[0]` is `'D'`. Defined as `[-0]: 'D'`" +); +assert.sameValue(object[Infinity], + 'E', + "The value of `object[Infinity]` is `'E'`. Defined as `[Infinity]: 'E'`" +); +assert.sameValue( + object[-Infinity], + 'F', + "The value of `object[-Infinity]` is `'F'`. Defined as `[-Infinity]: 'F'`" +); +assert.sameValue( + object[NaN], + 'G', + "The value of `object[NaN]` is `'G'`. Defined as `[NaN]: 'G'`" +); diff --git a/test/language/computed-property-names/to-name-side-effects/class.js b/test/language/computed-property-names/to-name-side-effects/class.js new file mode 100644 index 0000000000..7336967116 --- /dev/null +++ b/test/language/computed-property-names/to-name-side-effects/class.js @@ -0,0 +1,40 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.5 +description: > + to name, accessor side effects 3 +includes: [compareArray.js] +---*/ +var counter = 0; +var key1 = { + toString: function() { + assert.sameValue(counter++, 0, "The result of `counter++` is `0`"); + return 'b'; + } +}; +var key2 = { + toString: function() { + assert.sameValue(counter++, 1, "The result of `counter++` is `1`"); + return 'd'; + } +}; +class C { + a() { return 'A'; } + [key1]() { return 'B'; } + c() { return 'C'; } + [key2]() { return 'D'; } +} +assert.sameValue(counter, 2, "The value of `counter` is `2`"); +assert.sameValue(new C().a(), 'A', "`new C().a()` returns `'A'`. Defined as `a() { return 'A'; }`"); +assert.sameValue(new C().b(), 'B', "`new C().b()` returns `'B'`. Defined as `[key1]() { return 'B'; }`"); +assert.sameValue(new C().c(), 'C', "`new C().c()` returns `'C'`. Defined as `c() { return 'C'; }`"); +assert.sameValue(new C().d(), 'D', "`new C().d()` returns `'D'`. Defined as `[key2]() { return 'D'; }`"); +assert( + compareArray(Object.keys(C.prototype), []), + "`compareArray(Object.keys(C.prototype), [])` returns `true`" +); +assert( + compareArray(Object.getOwnPropertyNames(C.prototype), ['constructor', 'a', 'b', 'c', 'd']), + "`compareArray(Object.getOwnPropertyNames(C.prototype), ['constructor', 'a', 'b', 'c', 'd'])` returns `true`" +); diff --git a/test/language/computed-property-names/to-name-side-effects/numbers-class.js b/test/language/computed-property-names/to-name-side-effects/numbers-class.js new file mode 100644 index 0000000000..78035a330e --- /dev/null +++ b/test/language/computed-property-names/to-name-side-effects/numbers-class.js @@ -0,0 +1,43 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.5 +description: > + to name, accessor side effects numbers 2 +includes: [compareArray.js] +---*/ +var counter = 0; +var key1 = { + valueOf: function() { + assert.sameValue(counter++, 0, "The result of `counter++` is `0`"); + return 1; + }, + toString: null +}; +var key2 = { + valueOf: function() { + assert.sameValue(counter++, 1, "The result of `counter++` is `1`"); + return 2; + }, + toString: null +}; + +class C { + a() { return 'A'; } + [key1]() { return 'B'; } + c() { return 'C'; } + [key2]() { return 'D'; } +} +assert.sameValue(counter, 2, "The value of `counter` is `2`"); +assert.sameValue(new C().a(), 'A', "`new C().a()` returns `'A'`. Defined as `a() { return 'A'; }`"); +assert.sameValue(new C()[1](), 'B', "`new C()[1]()` returns `'B'`. Defined as `[key1]() { return 'B'; }`"); +assert.sameValue(new C().c(), 'C', "`new C().c()` returns `'C'`. Defined as `c() { return 'C'; }`"); +assert.sameValue(new C()[2](), 'D', "`new C()[2]()` returns `'D'`. Defined as `[key2]() { return 'D'; }`"); +assert( + compareArray(Object.keys(C.prototype), []), + "`compareArray(Object.keys(C.prototype), [])` returns `true`" +); +assert( + compareArray(Object.getOwnPropertyNames(C.prototype), ['1', '2', 'constructor', 'a', 'c']), + "`compareArray(Object.getOwnPropertyNames(C.prototype), ['1', '2', 'constructor', 'a', 'c'])` returns `true`" +); diff --git a/test/language/computed-property-names/to-name-side-effects/numbers-object.js b/test/language/computed-property-names/to-name-side-effects/numbers-object.js new file mode 100644 index 0000000000..8744974e4a --- /dev/null +++ b/test/language/computed-property-names/to-name-side-effects/numbers-object.js @@ -0,0 +1,39 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.5 +description: > + to name side effects numbers +includes: [compareArray.js] +---*/ +var counter = 0; +var key1 = { + valueOf: function() { + assert.sameValue(counter++, 0, "The result of `counter++` is `0`"); + return 1; + }, + toString: null +}; +var key2 = { + valueOf: function() { + assert.sameValue(counter++, 1, "The result of `counter++` is `1`"); + return 2; + }, + toString: null +}; + +var object = { + a: 'A', + [key1]: 'B', + c: 'C', + [key2]: 'D', +}; +assert.sameValue(counter, 2, "The value of `counter` is `2`"); +assert.sameValue(object.a, 'A', "The value of `object.a` is `'A'`. Defined as `a: 'A'`"); +assert.sameValue(object[1], 'B', "The value of `object[1]` is `'B'`. Defined as `[key1]: 'B'`"); +assert.sameValue(object.c, 'C', "The value of `object.c` is `'C'`. Defined as `c: 'C'`"); +assert.sameValue(object[2], 'D', "The value of `object[2]` is `'D'`. Defined as `[key2]: 'D'`"); +assert( + compareArray(Object.keys(object), ['1', '2', 'a', 'c']), + "`compareArray(Object.keys(object), ['1', '2', 'a', 'c'])` returns `true`" +); diff --git a/test/language/computed-property-names/to-name-side-effects/object.js b/test/language/computed-property-names/to-name-side-effects/object.js new file mode 100644 index 0000000000..66fae77ad1 --- /dev/null +++ b/test/language/computed-property-names/to-name-side-effects/object.js @@ -0,0 +1,36 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.5 +description: > + to name, accessor side effects object literal +includes: [compareArray.js] +---*/ +var counter = 0; +var key1 = { + toString: function() { + assert.sameValue(counter++, 0, "The result of `counter++` is `0`"); + return 'b'; + } +}; +var key2 = { + toString: function() { + assert.sameValue(counter++, 1, "The result of `counter++` is `1`"); + return 'd'; + } +}; +var object = { + a() { return 'A'; }, + [key1]() { return 'B'; }, + c() { return 'C'; }, + [key2]() { return 'D'; }, +}; +assert.sameValue(counter, 2, "The value of `counter` is `2`"); +assert.sameValue(object.a(), 'A', "`object.a()` returns `'A'`. Defined as `a() { return 'A'; }`"); +assert.sameValue(object.b(), 'B', "`object.b()` returns `'B'`. Defined as `[key1]() { return 'B'; }`"); +assert.sameValue(object.c(), 'C', "`object.c()` returns `'C'`. Defined as `c() { return 'C'; }`"); +assert.sameValue(object.d(), 'D', "`object.d()` returns `'D'`. Defined as `[key2]() { return 'D'; }`"); +assert( + compareArray(Object.keys(object), ['a', 'b', 'c', 'd']), + "`compareArray(Object.keys(object), ['a', 'b', 'c', 'd'])` returns `true`" +);