| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344 | var test = require('tape');require('./_tape');var equal = require('../');test('equal', function (t) {  t.deepEqualTest(    { a: [2, 3], b: [4] },    { a: [2, 3], b: [4] },    'two equal objects',    true,    true,    false  );  t.end();});test('not equal', function (t) {  t.deepEqualTest(    { x: 5, y: [6] },    { x: 5, y: 6 },    'two inequal objects are',    false,    false  );  t.end();});test('nested nulls', function (t) {  t.deepEqualTest(    [null, null, null],    [null, null, null],    'same-length arrays of nulls',    true,    true,    true  );  t.end();});test('objects with strings vs numbers', function (t) {  t.deepEqualTest(    [{ a: 3 }, { b: 4 }],    [{ a: '3' }, { b: '4' }],    'objects with equivalent string/number values',    true,    false  );  t.end();});test('non-objects', function (t) {  t.deepEqualTest(3, 3, 'same numbers', true, true, true);  t.deepEqualTest('beep', 'beep', 'same strings', true, true, true);  t.deepEqualTest('3', 3, 'numeric string and number', true, false);  t.deepEqualTest('3', [3], 'numeric string and array containing number', false, false);  t.deepEqualTest(3, [3], 'number and array containing number', false, false);  t.end();});test('infinities', function (t) {  t.deepEqualTest(Infinity, Infinity, '∞ and ∞', true, true, true);  t.deepEqualTest(-Infinity, -Infinity, '-∞ and -∞', true, true, true);  t.deepEqualTest(Infinity, -Infinity, '∞ and -∞', false, false);  t.end();});test('arguments class', function (t) {  function getArgs() {    return arguments;  }  t.ok(    equal(getArgs(1, 2, 3), getArgs(1, 2, 3)),    'equivalent arguments objects are equal'  );  t.deepEqualTest(    getArgs(1, 2, 3),    [1, 2, 3],    'array and arguments with same contents',    false,    false  );  t.end();});test('dates', function (t) {  var d0 = new Date(1387585278000);  var d1 = new Date('Fri Dec 20 2013 16:21:18 GMT-0800 (PST)');  t.deepEqualTest(d0, d1, 'equivalent Dates', true, true);  t.end();});test('buffers', function (t) {  /* eslint no-buffer-constructor: 1, new-cap: 1 */  t.ok(equal(Buffer('xyz'), Buffer('xyz')), 'buffers with same contents are equal');  t.ok(equal(Buffer('xyz'), Buffer('xyz'), { strict: true }), 'strict: buffers with same contents are equal');  t.deepEqualTest(    Buffer('abc'),    Buffer('xyz'),    'buffers with different contents',    false,    false  );  t.deepEqualTest(    Buffer(''),    [],    'empty buffer and empty array',    false,    false  );  t.end();});test('booleans and arrays', function (t) {  t.deepEqualTest(    true,    [],    'true and an empty array',    false,    false  );  t.deepEqualTest(    false,    [],    'false and an empty array',    true,    false  );  t.end();});test('arrays initiated', function (t) {  var a0 = [      undefined,      null,      -1,      0,      1,      false,      true,      undefined,      '',      'abc',      null,      undefined    ],    a1 = [      undefined,      null,      -1,      0,      1,      false,      true,      undefined,      '',      'abc',      null,      undefined    ];  t.ok(equal(a0, a1));  t.end();});// eslint-disable-next-line max-statementstest('arrays assigned', function (t) {  var a0 = [    undefined,    null,    -1,    0,    1,    false,    true,    undefined,    '',    'abc',    null,    undefined  ];  var a1 = [];  a1[0] = undefined;  a1[1] = null;  a1[2] = -1;  a1[3] = 0;  a1[4] = 1;  a1[5] = false;  a1[6] = true;  a1[7] = undefined;  a1[8] = '';  a1[9] = 'abc';  a1[10] = null;  a1[11] = undefined;  a1.length = 12;  t.deepEqualTest(a0, a1, 'a literal array and an assigned array', true, true);  t.end();});// eslint-disable-next-line max-statementstest('arrays push', function (t) {  var a0 = [      undefined,      null,      -1,      0,      1,      false,      true,      undefined,      '',      'abc',      null,      undefined    ],    a1 = [];  a1.push(undefined);  a1.push(null);  a1.push(-1);  a1.push(0);  a1.push(1);  a1.push(false);  a1.push(true);  a1.push(undefined);  a1.push('');  a1.push('abc');  a1.push(null);  a1.push(undefined);  a1.length = 12;  t.deepEqualTest(a0, a1, 'a literal array and a pushed array', true, true);  t.end();});test('null == undefined', function (t) {  t.deepEqualTest(null, undefined, 'null and undefined', true, false);  t.end();});test('NaNs', function (t) {  t.notOk(equal(NaN, NaN), 'NaN is not NaN');  t.ok(equal(NaN, NaN, { strict: true }), 'strict: NaN is NaN');  t.notOk(equal({ a: NaN }, { a: NaN }), 'two equiv objects with a NaN value are not equiv');  t.ok(equal({ a: NaN }, { a: NaN }, { strict: true }), 'strict: two equiv objects with a NaN value are equiv');  t.notOk(equal(NaN, 1), 'NaN !== 1');  t.notOk(equal(NaN, 1, { strict: true }), 'strict: NaN !== 1');  t.end();});test('zeroes', function (t) {  t.deepEqualTest(0, -0, '0 and -0', true, false);  t.deepEqualTest({ a: 0 }, { a: -0 }, 'two objects with a same-keyed 0/-0 value', true, false);  t.end();});test('Object.create', { skip: !Object.create }, function (t) {  var a = { a: 'A' };  var b = Object.create(a);  b.b = 'B';  var c = Object.create(a);  c.b = 'C';  t.deepEqualTest(    b,    c,    'two objects with the same [[Prototype]] but a different own property',    false,    false  );  t.end();});test('Object.create(null)', { skip: !Object.create }, function (t) {  t.deepEqualTest(    Object.create(null),    Object.create(null),    'two empty null objects',    true,    true,    true  );  t.deepEqualTest(    Object.create(null, { a: { value: 'b' } }),    Object.create(null, { a: { value: 'b' } }),    'two null objects with the same property pair',    true,    true,    true  );  t.end();});test('regexes vs dates', function (t) {  var d = new Date(1387585278000);  var r = /abc/;  t.deepEqualTest(d, r, 'Date and RegExp', false, false);  t.end();});test('regexen', function (t) {  t.deepEqualTest(/abc/, /xyz/, 'two different regexes', false, false);  t.deepEqualTest(/abc/, /abc/, 'two abc regexes', true, true, false);  t.deepEqualTest(/xyz/, /xyz/, 'two xyz regexes', true, true, false);  t.end();});test('arrays and objects', function (t) {  t.deepEqualTest([], {}, 'empty array and empty object', true, true);  t.deepEqualTest([], { length: 0 }, 'empty array and empty arraylike object', false, false);  t.deepEqualTest([1], { 0: 1 }, 'array and similar object', true, true);  t.end();});test('functions', function (t) {  function f() {}  t.deepEqualTest(f, f, 'a function and itself', true, true, true);  t.deepEqualTest(function () {}, function () {}, 'two distinct functions', false, false, true);  t.end();});
 |