• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1'use strict';
2
3var test = require('tape');
4var isSymbol = require('../index');
5
6var forEach = function (arr, func) {
7	var i;
8	for (i = 0; i < arr.length; ++i) {
9		func(arr[i], i, arr);
10	}
11};
12
13var hasSymbols = require('has-symbols')();
14var inspect = require('object-inspect');
15var debug = function (v, m) { return inspect(v) + ' ' + m; };
16
17test('non-symbol values', function (t) {
18	var nonSymbols = [
19		true,
20		false,
21		Object(true),
22		Object(false),
23		null,
24		undefined,
25		{},
26		[],
27		/a/g,
28		'string',
29		42,
30		new Date(),
31		function () {},
32		NaN
33	];
34	t.plan(nonSymbols.length);
35	forEach(nonSymbols, function (nonSymbol) {
36		t.equal(false, isSymbol(nonSymbol), debug(nonSymbol, 'is not a symbol'));
37	});
38	t.end();
39});
40
41test('faked symbol values', function (t) {
42	t.test('real symbol valueOf', { skip: !hasSymbols }, function (st) {
43		var fakeSymbol = { valueOf: function () { return Symbol('foo'); } };
44		st.equal(false, isSymbol(fakeSymbol), 'object with valueOf returning a symbol is not a symbol');
45		st.end();
46	});
47
48	t.test('faked @@toStringTag', { skip: !hasSymbols || !Symbol.toStringTag }, function (st) {
49		var fakeSymbol = { valueOf: function () { return Symbol('foo'); } };
50		fakeSymbol[Symbol.toStringTag] = 'Symbol';
51		st.equal(false, isSymbol(fakeSymbol), 'object with fake Symbol @@toStringTag and valueOf returning a symbol is not a symbol');
52		var notSoFakeSymbol = { valueOf: function () { return 42; } };
53		notSoFakeSymbol[Symbol.toStringTag] = 'Symbol';
54		st.equal(false, isSymbol(notSoFakeSymbol), 'object with fake Symbol @@toStringTag and valueOf not returning a symbol is not a symbol');
55		st.end();
56	});
57
58	var fakeSymbolString = { toString: function () { return 'Symbol(foo)'; } };
59	t.equal(false, isSymbol(fakeSymbolString), 'object with toString returning Symbol(foo) is not a symbol');
60
61	t.end();
62});
63
64test('Symbol support', { skip: !hasSymbols }, function (t) {
65	t.test('well-known Symbols', function (st) {
66		var isWellKnown = function filterer(name) {
67			return name !== 'for' && name !== 'keyFor' && !(name in filterer);
68		};
69		var wellKnownSymbols = Object.getOwnPropertyNames(Symbol).filter(isWellKnown);
70		wellKnownSymbols.forEach(function (name) {
71			var sym = Symbol[name];
72			st.equal(true, isSymbol(sym), debug(sym, ' is a symbol'));
73		});
74		st.end();
75	});
76
77	t.test('user-created symbols', function (st) {
78		var symbols = [
79			Symbol(),
80			Symbol('foo'),
81			Symbol['for']('foo'),
82			Object(Symbol('object'))
83		];
84		symbols.forEach(function (sym) {
85			st.equal(true, isSymbol(sym), debug(sym, ' is a symbol'));
86		});
87		st.end();
88	});
89
90	t.end();
91});
92
93