Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1360)

Side by Side Diff: test/mjsunit/harmony/symbols.js

Issue 12957004: ES6 symbols: turn symbols into a proper primitive type (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« src/symbol.js ('K') | « src/x64/lithium-codegen-x64.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 16 matching lines...) Expand all
27 27
28 // Flags: --harmony-symbols --harmony-collections 28 // Flags: --harmony-symbols --harmony-collections
29 // Flags: --expose-gc --allow-natives-syntax 29 // Flags: --expose-gc --allow-natives-syntax
30 30
31 var symbols = [] 31 var symbols = []
32 32
33 // Test different forms of constructor calls, all equivalent. 33 // Test different forms of constructor calls, all equivalent.
34 function TestNew() { 34 function TestNew() {
35 function IndirectSymbol() { return new Symbol } 35 function IndirectSymbol() { return new Symbol }
36 function indirect() { return new IndirectSymbol() } 36 function indirect() { return new IndirectSymbol() }
37 for (var i = 0; i < 10; ++i) { 37 for (var i = 0; i < 2; ++i) {
38 symbols.push(new Symbol) 38 for (var j = 0; j < 5; ++j) {
39 symbols.push(new Symbol()) 39 symbols.push(Symbol())
40 symbols.push(Symbol()) 40 symbols.push(Symbol(Symbol()))
41 symbols.push(indirect()) 41 symbols.push((new Symbol).valueOf())
42 } 42 symbols.push((new Symbol()).valueOf())
43 %OptimizeFunctionOnNextCall(indirect) 43 symbols.push((new Symbol(Symbol())).valueOf())
44 indirect() // Call once before GC throws away type feedback. 44 symbols.push(Object(Symbol()).valueOf())
45 gc() // Promote existing symbols and then allocate some more. 45 symbols.push((indirect()).valueOf())
46 for (var i = 0; i < 10; ++i) { 46 }
47 symbols.push(new Symbol) 47 %OptimizeFunctionOnNextCall(indirect)
48 symbols.push(new Symbol()) 48 indirect() // Call once before GC throws away type feedback.
49 symbols.push(Symbol()) 49 gc() // Promote existing symbols and then allocate some more.
50 symbols.push(indirect())
51 } 50 }
52 } 51 }
53 TestNew() 52 TestNew()
54 53
55 54
56 function TestType() { 55 function TestType() {
57 for (var i in symbols) { 56 for (var i in symbols) {
58 assertTrue(%_IsSymbol(symbols[i])) 57 assertEquals("symbol", typeof symbols[i])
59 assertEquals("object", typeof symbols[i]) 58 assertTrue(typeof symbols[i] === "symbol")
60 assertTrue(typeof symbols[i] === "object") 59 assertEquals(null, %_ClassOf(symbols[i]))
61 assertEquals("[object Symbol]", Object.prototype.toString.call(symbols[i])) 60 assertEquals("Symbol", %_ClassOf(new Symbol(symbols[i])))
61 assertEquals("Symbol", %_ClassOf(Object(symbols[i])))
62 } 62 }
63 } 63 }
64 TestType() 64 TestType()
65 65
66 66
67 function TestToString() {
68 for (var i in symbols) {
69 assertThrows(function() { String(symbols[i]) }, TypeError)
70 assertThrows(function() { symbols[i] + "" }, TypeError)
71 assertThrows(function() { symbols[i].toString() }, TypeError)
72 assertThrows(function() { (new Symbol(symbols[i])).toString() }, TypeError)
73 assertThrows(function() { Object(symbols[i]).toString() }, TypeError)
74 assertEquals("[object Symbol]", Object.prototype.toString.call(symbols[i]))
75 }
76 }
77 TestToString()
78
79
80 function TestToBoolean() {
81 for (var i in symbols) {
82 assertTrue(Boolean(symbols[i]).valueOf())
83 assertFalse(!symbols[i])
84 assertTrue(!!symbols[i])
85 assertTrue(symbols[i] && true)
86 assertFalse(!symbols[i] && false)
87 assertTrue(!symbols[i] || true)
88 assertEquals(1, symbols[i] ? 1 : 2)
89 assertEquals(2, !symbols[i] ? 1 : 2)
90 if (!symbols[i]) assertUnreachable();
91 if (symbols[i]) {} else assertUnreachable();
92 }
93 }
94 TestToBoolean()
95
96
97 function TestToNumber() {
98 for (var i in symbols) {
99 assertSame(NaN, Number(symbols[i]).valueOf())
100 assertSame(NaN, symbols[i] + 0)
101 }
102 }
103 TestToNumber()
104
105
67 function TestEquality() { 106 function TestEquality() {
68 // Every symbol should equal itself. 107 // Every symbol should equal itself.
69 for (var i in symbols) { 108 for (var i in symbols) {
70 assertSame(symbols[i], symbols[i]) 109 assertSame(symbols[i], symbols[i])
71 assertEquals(symbols[i], symbols[i]) 110 assertEquals(symbols[i], symbols[i])
72 assertTrue(Object.is(symbols[i], symbols[i])) 111 assertTrue(Object.is(symbols[i], symbols[i]))
73 assertTrue(symbols[i] === symbols[i]) 112 assertTrue(symbols[i] === symbols[i])
74 assertTrue(symbols[i] == symbols[i]) 113 assertTrue(symbols[i] == symbols[i])
75 } 114 }
76 115
77 // All symbols should be distinct. 116 // All symbols should be distinct.
78 for (var i = 0; i < symbols.length; ++i) { 117 for (var i = 0; i < symbols.length; ++i) {
79 for (var j = i + 1; j < symbols.length; ++j) { 118 for (var j = i + 1; j < symbols.length; ++j) {
80 assertFalse(Object.is(symbols[i], symbols[j])) 119 assertFalse(Object.is(symbols[i], symbols[j]))
81 assertFalse(symbols[i] === symbols[j]) 120 assertFalse(symbols[i] === symbols[j])
82 assertFalse(symbols[i] == symbols[j]) 121 assertFalse(symbols[i] == symbols[j])
83 } 122 }
84 } 123 }
85 } 124 }
86 TestEquality() 125 TestEquality()
87 126
88 127
89 function TestGet() { 128 function TestGet() {
90 for (var i in symbols) { 129 for (var i in symbols) {
91 assertEquals("[object Symbol]", symbols[i].toString()) 130 assertThrows(function() { symbols[i].toString() }, TypeError)
92 assertEquals(undefined, symbols[i].valueOf) 131 assertEquals(symbols[i], symbols[i].valueOf())
93 assertEquals(undefined, symbols[i].a) 132 assertEquals(undefined, symbols[i].a)
94 assertEquals(undefined, symbols[i]["a" + "b"]) 133 assertEquals(undefined, symbols[i]["a" + "b"])
95 assertEquals(undefined, symbols[i]["" + "1"]) 134 assertEquals(undefined, symbols[i]["" + "1"])
96 assertEquals(undefined, symbols[i][62]) 135 assertEquals(undefined, symbols[i][62])
97 } 136 }
98 } 137 }
99 TestGet() 138 TestGet()
100 139
101 140
102 function TestSet() { 141 function TestSet() {
103 for (var i in symbols) { 142 for (var i in symbols) {
104 symbols[i].toString = 0 143 symbols[i].toString = 0
105 assertEquals("[object Symbol]", symbols[i].toString()) 144 assertThrows(function() { symbols[i].toString() }, TypeError)
145 symbols[i].valueOf = 0
146 assertEquals(symbols[i], symbols[i].valueOf())
106 symbols[i].a = 0 147 symbols[i].a = 0
107 assertEquals(undefined, symbols[i].a) 148 assertEquals(undefined, symbols[i].a)
108 symbols[i]["a" + "b"] = 0 149 symbols[i]["a" + "b"] = 0
109 assertEquals(undefined, symbols[i]["a" + "b"]) 150 assertEquals(undefined, symbols[i]["a" + "b"])
110 symbols[i][62] = 0 151 symbols[i][62] = 0
111 assertEquals(undefined, symbols[i][62]) 152 assertEquals(undefined, symbols[i][62])
112 } 153 }
113 } 154 }
114 TestSet() 155 TestSet()
115 156
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
172 function TestKeyHas() { 213 function TestKeyHas() {
173 for (var i in symbols) { 214 for (var i in symbols) {
174 assertTrue(symbols[i] in obj) 215 assertTrue(symbols[i] in obj)
175 assertTrue(Object.hasOwnProperty.call(obj, symbols[i])) 216 assertTrue(Object.hasOwnProperty.call(obj, symbols[i]))
176 } 217 }
177 } 218 }
178 219
179 220
180 function TestKeyEnum(obj) { 221 function TestKeyEnum(obj) {
181 for (var name in obj) { 222 for (var name in obj) {
182 assertFalse(%_IsSymbol(name)) 223 assertTrue(typeof name !== "symbol")
183 } 224 }
184 } 225 }
185 226
186 227
187 function TestKeyNames(obj) { 228 function TestKeyNames(obj) {
188 assertEquals(0, Object.keys(obj).length) 229 assertEquals(0, Object.keys(obj).length)
189 230
190 var names = Object.getOwnPropertyNames(obj) 231 var names = Object.getOwnPropertyNames(obj)
191 assertTrue(symbols.length <= names.length) 232 assertTrue(symbols.length <= names.length)
192 // TODO(rossberg): once we have iterators, the following would be: 233 // TODO(rossberg): once we have iterators, the following would be:
193 // var expected = new Set(symbols) 234 // var expected = new Set(symbols)
194 var expected = new Set 235 var expected = new Set
195 for (var i = 0; i < symbols.length; ++i) expected.add(symbols[i]) 236 for (var i = 0; i < symbols.length; ++i) expected.add(symbols[i])
196 for (var i = 0; i < names.length; ++i) { 237 for (var i = 0; i < names.length; ++i) {
197 var name = names[i] 238 var name = names[i]
198 var asString = String(name) 239 if (typeof name === 'symbol') {
199 if (asString !== name) {
200 assertEquals("[object Symbol]", asString)
201 assertTrue(expected.has(name)) 240 assertTrue(expected.has(name))
202 expected.delete(name) 241 expected.delete(name)
203 } 242 }
204 } 243 }
205 assertEquals(0, expected.size) 244 assertEquals(0, expected.size)
206 } 245 }
207 246
208 247
209 function TestKeyDescriptor(obj) { 248 function TestKeyDescriptor(obj) {
210 for (var i in symbols) { 249 for (var i in symbols) {
(...skipping 24 matching lines...) Expand all
235 var obj = objs[i] 274 var obj = objs[i]
236 TestKeySet(obj) 275 TestKeySet(obj)
237 TestKeyDefine(obj) 276 TestKeyDefine(obj)
238 TestKeyGet(obj) 277 TestKeyGet(obj)
239 TestKeyHas(obj) 278 TestKeyHas(obj)
240 TestKeyEnum(obj) 279 TestKeyEnum(obj)
241 TestKeyNames(obj) 280 TestKeyNames(obj)
242 TestKeyDescriptor(obj) 281 TestKeyDescriptor(obj)
243 TestKeyDelete(obj) 282 TestKeyDelete(obj)
244 } 283 }
OLDNEW
« src/symbol.js ('K') | « src/x64/lithium-codegen-x64.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698