Ryan Roemer 7079a22cc2
Bugfix: support Object.create(null) (#123)
- Allow use of `Object.create(null)` to work without error. Fixes #64 
- Add customized tests.
2023-03-16 08:34:11 -07:00

121 lines
3.0 KiB
JavaScript

'use strict';
const generic = require('fast-deep-equal-git/spec/tests.js');
const es6 = require('fast-deep-equal-git/spec/es6tests.js');
const reactElementA = {
'$$typeof': 'react.element',
type: 'div',
key: null,
ref: null,
props: { x: 1 },
_owner: {},
_store: {}
};
// in reality the _owner object is much more complex (and contains over dozen circular references)
reactElementA._owner.children = [reactElementA];
const reactElementA2 = {
'$$typeof': 'react.element',
type: 'div',
key: null,
ref: null,
props: { x: 1 },
_owner: {},
_store: {}
};
reactElementA2._owner.children = [reactElementA2];
const reactElementB = {
'$$typeof': 'react.element',
type: 'div',
key: null,
ref: null,
props: { x: 2 },
_owner: {},
_store: {}
};
reactElementB._owner.children = [reactElementB];
const react = [
{
description: 'React elements',
reactSpecific: true,
tests: [
{
description: 'an element compared with itself',
value1: reactElementA,
value2: reactElementA,
equal: true
},
{
description: 'two elements equal by value',
value1: reactElementA,
value2: reactElementA2,
equal: true
},
{
description: 'two elements unequal by value',
value1: reactElementA,
value2: reactElementB,
equal: false
}
]
}
];
// Additional customized behavior.
const custom = [
{
description: 'Custom tests',
tests: [
{
description: 'Object.create(null) equal',
value1: Object.create(null),
value2: Object.create(null),
equal: true
},
{
description: 'Object.create(null) unequal to empty object',
value1: Object.create(null),
value2: {},
equal: false
},
{
description: 'Object.create(null) unequal to non-empty object',
value1: Object.create(null),
value2: { a: 1 },
equal: false
},
// See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object#null-prototype_objects
{
description: 'Object.create(null) equal to vanilla null prototype deep objects',
value1: Object.assign(Object.create(null), { a: 1, b: { c: true } }),
value2: { __proto__: null, a: 1, b: { c: true } },
equal: true
},
// Object.create(null) has a different `constructor` than a vanilla, non-null object.
{
description: 'Object.create(null) unequal to vanilla deep objects',
value1: Object.assign(Object.create(null), { a: 1, b: { c: true } }),
value2: { a: 1, b: { c: true } },
equal: false
},
{
description: 'Object.create(null) equal for deep objects',
value1: Object.assign(Object.create(null), { a: 1, b: { c: true } }),
value2: Object.assign(Object.create(null), { b: { c: true }, a: 1 }),
equal: true
}
]
}
];
module.exports = {
generic,
es6,
react,
custom,
all: [].concat(generic, es6, react, custom),
};