1014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Copyright 2014 the V8 project authors. All rights reserved. 2014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// found in the LICENSE file. 4014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochfunction ID(x) { 7014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return x; 8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch(function TestMethodComputedNameString() { 12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch var object = { 13014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch a() { return 'A'}, 14014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ['b']() { return 'B'; }, 15014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch c() { return 'C'; }, 16014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch [ID('d')]() { return 'D'; }, 17014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch }; 18014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch assertEquals('A', object.a()); 19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch assertEquals('B', object.b()); 20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch assertEquals('C', object.c()); 21014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch assertEquals('D', object.d()); 22014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch assertArrayEquals(['a', 'b', 'c', 'd'], Object.keys(object)); 23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch})(); 24014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 25014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 26014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch(function TestMethodComputedNameNumber() { 27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch var object = { 28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch a() { return 'A'; }, 29014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch [1]() { return 'B'; }, 30014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch c() { return 'C'; }, 31014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch [ID(2)]() { return 'D'; }, 32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch }; 33014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch assertEquals('A', object.a()); 34014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch assertEquals('B', object[1]()); 35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch assertEquals('C', object.c()); 36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch assertEquals('D', object[2]()); 37014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Array indexes first. 38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch assertArrayEquals(['1', '2', 'a', 'c'], Object.keys(object)); 39014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch})(); 40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch(function TestMethodComputedNameSymbol() { 43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch var sym1 = Symbol(); 44014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch var sym2 = Symbol(); 45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch var object = { 46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch a() { return 'A'; }, 47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch [sym1]() { return 'B'; }, 48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch c() { return 'C'; }, 49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch [ID(sym2)]() { return 'D'; }, 50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch }; 51014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch assertEquals('A', object.a()); 52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch assertEquals('B', object[sym1]()); 53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch assertEquals('C', object.c()); 54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch assertEquals('D', object[sym2]()); 55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch assertArrayEquals(['a', 'c'], Object.keys(object)); 56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch assertArrayEquals([sym1, sym2], Object.getOwnPropertySymbols(object)); 57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch})(); 58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 59014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 60014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochfunction assertIteratorResult(value, done, result) { 61014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch assertEquals({ value: value, done: done}, result); 62014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 63014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 64014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 65014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch(function TestGeneratorComputedName() { 66014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch var object = { 67014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch *['a']() { 68014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch yield 1; 69014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch yield 2; 70014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 71014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch }; 72014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch var iter = object.a(); 73014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch assertIteratorResult(1, false, iter.next()); 74014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch assertIteratorResult(2, false, iter.next()); 75014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch assertIteratorResult(undefined, true, iter.next()); 76014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch assertArrayEquals(['a'], Object.keys(object)); 77014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch})(); 78014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 79014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 80014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch(function TestToNameSideEffects() { 81014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch var counter = 0; 82014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch var key1 = { 83014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch toString: function() { 84014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch assertEquals(0, counter++); 85014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return 'b'; 86014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 87014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch }; 88014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch var key2 = { 89014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch toString: function() { 90014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch assertEquals(1, counter++); 91014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return 'd'; 92014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 93014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch }; 94014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch var object = { 95014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch a() { return 'A'; }, 96014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch [key1]() { return 'B'; }, 97014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch c() { return 'C'; }, 98014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch [key2]() { return 'D'; }, 99014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch }; 100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch assertEquals(2, counter); 101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch assertEquals('A', object.a()); 102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch assertEquals('B', object.b()); 103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch assertEquals('C', object.c()); 104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch assertEquals('D', object.d()); 105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch assertArrayEquals(['a', 'b', 'c', 'd'], Object.keys(object)); 106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch})(); 107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch(function TestDuplicateKeys() { 110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'use strict'; 111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES5 does not allow duplicate keys. 112014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 does but we haven't changed our code yet. 113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 114014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch var object = { 115014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch a() { return 1; }, 116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ['a']() { return 2; }, 117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch }; 118014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch assertEquals(2, object.a()); 119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch})(); 120