You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
121 lines
4.5 KiB
121 lines
4.5 KiB
'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 |
|
};
|
|
|