122 lines
4.5 KiB
JavaScript
122 lines
4.5 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
var assign = require('../../helpers/assign');
|
||
|
|
||
|
var hasSymbols = require('has-symbols')();
|
||
|
|
||
|
var coercibleObject = { valueOf: function () { return 3; }, toString: function () { return 42; } };
|
||
|
var coercibleFnObject = {
|
||
|
valueOf: function () { return function valueOfFn() {}; },
|
||
|
toString: function () { return 42; }
|
||
|
};
|
||
|
var valueOfOnlyObject = { valueOf: function () { return 4; }, toString: function () { return {}; } };
|
||
|
var toStringOnlyObject = { valueOf: function () { return {}; }, toString: function () { return 7; } };
|
||
|
var uncoercibleObject = { valueOf: function () { return {}; }, toString: function () { return {}; } };
|
||
|
var uncoercibleFnObject = {
|
||
|
valueOf: function () { return function valueOfFn() {}; },
|
||
|
toString: function () { return function toStrFn() {}; }
|
||
|
};
|
||
|
var objects = [{}, coercibleObject, coercibleFnObject, toStringOnlyObject, valueOfOnlyObject];
|
||
|
var nullPrimitives = [undefined, null];
|
||
|
var nonIntegerNumbers = [-1.3, 0.2, 1.8, 1 / 3];
|
||
|
var zeroes = [0, -0];
|
||
|
var infinities = [Infinity, -Infinity];
|
||
|
var numbers = zeroes.concat([42], infinities, nonIntegerNumbers);
|
||
|
var strings = ['', 'foo', 'a\uD83D\uDCA9c'];
|
||
|
var booleans = [true, false];
|
||
|
var symbols = hasSymbols ? [Symbol.iterator, Symbol('foo')] : [];
|
||
|
var nonSymbolPrimitives = [].concat(nullPrimitives, booleans, strings, numbers);
|
||
|
var nonNumberPrimitives = [].concat(nullPrimitives, booleans, strings, symbols);
|
||
|
var nonNullPrimitives = [].concat(booleans, strings, numbers, symbols);
|
||
|
var nonUndefinedPrimitives = [].concat(null, nonNullPrimitives);
|
||
|
var nonStrings = [].concat(nullPrimitives, booleans, numbers, symbols, objects);
|
||
|
var primitives = [].concat(nullPrimitives, nonNullPrimitives);
|
||
|
var nonPropertyKeys = [].concat(nullPrimitives, booleans, numbers, objects);
|
||
|
var propertyKeys = [].concat(strings, symbols);
|
||
|
var nonBooleans = [].concat(nullPrimitives, strings, symbols, numbers, objects);
|
||
|
var falsies = [].concat(nullPrimitives, false, '', 0, -0, NaN);
|
||
|
var truthies = [].concat(true, 'foo', 42, symbols, objects);
|
||
|
var timestamps = [].concat(0, 946713600000, 1546329600000);
|
||
|
var nonFunctions = [].concat(primitives, objects, [42]);
|
||
|
var nonArrays = [].concat(nonFunctions);
|
||
|
|
||
|
var descriptors = {
|
||
|
configurable: function (descriptor) {
|
||
|
return assign(assign({}, descriptor), { '[[Configurable]]': true });
|
||
|
},
|
||
|
nonConfigurable: function (descriptor) {
|
||
|
return assign(assign({}, descriptor), { '[[Configurable]]': false });
|
||
|
},
|
||
|
enumerable: function (descriptor) {
|
||
|
return assign(assign({}, descriptor), { '[[Enumerable]]': true });
|
||
|
},
|
||
|
nonEnumerable: function (descriptor) {
|
||
|
return assign(assign({}, descriptor), { '[[Enumerable]]': false });
|
||
|
},
|
||
|
writable: function (descriptor) {
|
||
|
return assign(assign({}, descriptor), { '[[Writable]]': true });
|
||
|
},
|
||
|
nonWritable: function (descriptor) {
|
||
|
return assign(assign({}, descriptor), { '[[Writable]]': false });
|
||
|
}
|
||
|
};
|
||
|
|
||
|
module.exports = {
|
||
|
coercibleObject: coercibleObject,
|
||
|
coercibleFnObject: coercibleFnObject,
|
||
|
valueOfOnlyObject: valueOfOnlyObject,
|
||
|
toStringOnlyObject: toStringOnlyObject,
|
||
|
uncoercibleObject: uncoercibleObject,
|
||
|
uncoercibleFnObject: uncoercibleFnObject,
|
||
|
objects: objects,
|
||
|
nonFunctions: nonFunctions,
|
||
|
nonArrays: nonArrays,
|
||
|
nullPrimitives: nullPrimitives,
|
||
|
numbers: numbers,
|
||
|
zeroes: zeroes,
|
||
|
infinities: infinities,
|
||
|
strings: strings,
|
||
|
booleans: booleans,
|
||
|
symbols: symbols,
|
||
|
hasSymbols: hasSymbols,
|
||
|
nonSymbolPrimitives: nonSymbolPrimitives,
|
||
|
nonNumberPrimitives: nonNumberPrimitives,
|
||
|
nonNullPrimitives: nonNullPrimitives,
|
||
|
nonUndefinedPrimitives: nonUndefinedPrimitives,
|
||
|
nonStrings: nonStrings,
|
||
|
nonNumbers: nonNumberPrimitives.concat(objects),
|
||
|
nonIntegerNumbers: nonIntegerNumbers,
|
||
|
primitives: primitives,
|
||
|
nonPropertyKeys: nonPropertyKeys,
|
||
|
propertyKeys: propertyKeys,
|
||
|
nonBooleans: nonBooleans,
|
||
|
falsies: falsies,
|
||
|
truthies: truthies,
|
||
|
timestamps: timestamps,
|
||
|
bothDescriptor: function () {
|
||
|
return { '[[Get]]': function () {}, '[[Value]]': true };
|
||
|
},
|
||
|
bothDescriptorWritable: function () {
|
||
|
return descriptors.writable({ '[[Get]]': function () {} });
|
||
|
},
|
||
|
accessorDescriptor: function (value) {
|
||
|
return descriptors.enumerable(descriptors.configurable({
|
||
|
'[[Get]]': function get() { return value; }
|
||
|
}));
|
||
|
},
|
||
|
mutatorDescriptor: function () {
|
||
|
return descriptors.enumerable(descriptors.configurable({
|
||
|
'[[Set]]': function () {}
|
||
|
}));
|
||
|
},
|
||
|
dataDescriptor: function (value) {
|
||
|
return descriptors.nonWritable({
|
||
|
'[[Value]]': arguments.length > 0 ? value : 42
|
||
|
});
|
||
|
},
|
||
|
genericDescriptor: function () {
|
||
|
return descriptors.configurable(descriptors.nonEnumerable());
|
||
|
},
|
||
|
descriptors: descriptors
|
||
|
};
|