| // Copyright (C) 2016 the V8 project authors. All rights reserved. |
| // This code is governed by the BSD license found in the LICENSE file. |
| /*--- |
| esid: sec-symbol-constructor |
| es6id: 19.4.1 |
| description: The first argument is coerced to a String value (from an object) |
| info: | |
| 1. If NewTarget is not undefined, throw a TypeError exception. |
| 2. If description is undefined, let descString be undefined. |
| 2. Else, let descString be ? ToString(description). |
| 3. Return a new unique Symbol value whose [[Description]] value is |
| descString. |
| features: [Symbol] |
| ---*/ |
| |
| var calls, val; |
| |
| val = { |
| toString: function() { |
| calls += 'toString'; |
| return {}; |
| }, |
| valueOf: function() { |
| calls += 'valueOf'; |
| } |
| }; |
| |
| calls = ''; |
| Symbol(val); |
| assert.sameValue(calls, 'toStringvalueOf'); |
| |
| val = { |
| toString: function() { |
| calls += 'toString'; |
| }, |
| valueOf: function() { |
| calls += 'valueOf'; |
| } |
| }; |
| |
| calls = ''; |
| Symbol(val); |
| assert.sameValue(calls, 'toString'); |
| |
| val = { |
| toString: null, |
| valueOf: function() { |
| calls += 'valueOf'; |
| } |
| }; |
| |
| calls = ''; |
| Symbol(val); |
| assert.sameValue(calls, 'valueOf'); |
| |
| val = { |
| toString: null, |
| valueOf: function() { |
| calls += 'valueOf'; |
| return {}; |
| } |
| }; |
| |
| calls = ''; |
| assert.throws(TypeError, function() { |
| Symbol(val); |
| }, '`toString` is not callable, and `valueOf` returns a non-primitive value'); |
| assert.sameValue( |
| calls, 'valueOf', 'invocation pattern for non-callable `toString`' |
| ); |
| |
| val = { |
| toString: function() { |
| calls += 'toString'; |
| return {}; |
| }, |
| valueOf: function() { |
| calls += 'valueOf'; |
| return {}; |
| } |
| }; |
| |
| calls = ''; |
| assert.throws(TypeError, function() { |
| Symbol(val); |
| }, '`toString` nor `valueOf` both return non-primitive values'); |
| assert.sameValue( |
| calls, |
| 'toStringvalueOf', |
| 'invocation pattern for non-callable `toString` and `valueOf`' |
| ); |