import {expect} from 'chai'; import {isDeepEqual} from './is-deep-equal.js'; const check = (a, b, expected) => { expect(isDeepEqual(a, b)).to.be.eq(expected); expect(isDeepEqual(b, a)).to.be.eq(expected); }; describe('isDeepEqual', function () { describe('string', function () { it('a non-empty string', function () { check('str', 'str', true); check('str', '', false); check('str', 10, false); check('str', 0, false); check('str', -10, false); check('str', true, false); check('str', false, false); check('str', undefined, false); check('str', null, false); check('str', {foo: 'bar'}, false); check('str', {}, false); check('str', [1, 2, 3], false); check('str', [], false); }); it('an empty string', function () { check('', 'str', false); check('', '', true); check('', 10, false); check('', 0, false); check('', -10, false); check('', true, false); check('', false, false); check('', undefined, false); check('', null, false); check('', {foo: 'bar'}, false); check('', {}, false); check('', [1, 2, 3], false); check('', [], false); }); }); describe('number', function () { it('a positive number', function () { check(10, 'str', false); check(10, '', false); check(10, 10, true); check(10, 0, false); check(10, -10, false); check(10, true, false); check(10, false, false); check(10, undefined, false); check(10, null, false); check(10, {foo: 'bar'}, false); check(10, {}, false); check(10, [1, 2, 3], false); check(10, [], false); }); it('zero', function () { check(0, 'str', false); check(0, '', false); check(0, 10, false); check(0, 0, true); check(0, -10, false); check(0, true, false); check(0, false, false); check(0, undefined, false); check(0, null, false); check(0, {foo: 'bar'}, false); check(0, {}, false); check(0, [1, 2, 3], false); check(0, [], false); }); it('a negative number', function () { check(-10, 'str', false); check(-10, '', false); check(-10, 10, false); check(-10, 0, false); check(-10, -10, true); check(-10, true, false); check(-10, false, false); check(-10, undefined, false); check(-10, null, false); check(-10, {foo: 'bar'}, false); check(-10, {}, false); check(-10, [1, 2, 3], false); check(-10, [], false); }); }); describe('boolean', function () { it('true', function () { check(true, 'str', false); check(true, '', false); check(true, 10, false); check(true, 0, false); check(true, -10, false); check(true, true, true); check(true, false, false); check(true, undefined, false); check(true, null, false); check(true, {foo: 'bar'}, false); check(true, {}, false); check(true, [1, 2, 3], false); check(true, [], false); }); it('false', function () { check(false, 'str', false); check(false, '', false); check(false, 10, false); check(false, 0, false); check(false, -10, false); check(false, true, false); check(false, false, true); check(false, undefined, false); check(false, null, false); check(false, {foo: 'bar'}, false); check(false, {}, false); check(false, [1, 2, 3], false); check(false, [], false); }); }); describe('array', function () { it('an array of numbers', function () { check([1, 2, 3], 'str', false); check([1, 2, 3], '', false); check([1, 2, 3], 10, false); check([1, 2, 3], 0, false); check([1, 2, 3], -10, false); check([1, 2, 3], true, false); check([1, 2, 3], false, false); check([1, 2, 3], undefined, false); check([1, 2, 3], null, false); check([1, 2, 3], {foo: 'bar'}, false); check([1, 2, 3], {}, false); check([1, 2, 3], [1, 2, 3], true); check([1, 2, 3], [], false); }); it('an empty array', function () { check([], 'str', false); check([], '', false); check([], 10, false); check([], 0, false); check([], -10, false); check([], true, false); check([], false, false); check([], undefined, false); check([], null, false); check([], {foo: 'bar'}, false); check([], {}, false); check([], [1, 2, 3], false); check([], [], true); }); }); describe('object', function () { it('string key and string value', function () { check({foo: 'bar'}, 'str', false); check({foo: 'bar'}, '', false); check({foo: 'bar'}, 10, false); check({foo: 'bar'}, 0, false); check({foo: 'bar'}, -10, false); check({foo: 'bar'}, true, false); check({foo: 'bar'}, false, false); check({foo: 'bar'}, undefined, false); check({foo: 'bar'}, null, false); check({foo: 'bar'}, {foo: 'bar'}, true); check({foo: 'bar'}, {}, false); check({foo: 'bar'}, [1, 2, 3], false); check({foo: 'bar'}, [], false); }); it('an empty object', function () { check({}, 'str', false); check({}, '', false); check({}, 10, false); check({}, 0, false); check({}, -10, false); check({}, true, false); check({}, false, false); check({}, undefined, false); check({}, null, false); check({}, {foo: 'bar'}, false); check({}, {}, true); check({}, [1, 2, 3], false); check({}, [], false); }); it('null', function () { check(null, 'str', false); check(null, '', false); check(null, 10, false); check(null, 0, false); check(null, -10, false); check(null, true, false); check(null, false, false); check(null, undefined, false); check(null, null, true); check(null, {foo: 'bar'}, false); check(null, {}, false); check(null, [1, 2, 3], false); check(null, [], false); }); it('circular reference to itself', function () { const a = {foo: 'bar'}; const b = {baz: 'qux'}; const c = {foo: 'bar'}; a.itself = a; b.itself = b; c.itself = c; check(a, b, false); check(a, c, true); }); }); it('undefined', function () { check(undefined, 'str', false); check(undefined, '', false); check(undefined, 10, false); check(undefined, 0, false); check(undefined, -10, false); check(undefined, true, false); check(undefined, false, false); check(undefined, undefined, true); check(undefined, null, false); check(undefined, {foo: 'bar'}, false); check(undefined, {}, false); check(undefined, [1, 2, 3], false); check(undefined, [], false); }); });