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.
		
		
		
		
		
			
		
			
				
					220 lines
				
				5.5 KiB
			
		
		
			
		
	
	
					220 lines
				
				5.5 KiB
			| 
											2 years ago
										 | var assert = require('assert'); | ||
|  | var traverse = require('traverse'); | ||
|  | 
 | ||
|  | exports.deepDates = function () { | ||
|  |     assert.ok( | ||
|  |         traverse.deepEqual( | ||
|  |             { d : new Date, x : [ 1, 2, 3 ] }, | ||
|  |             { d : new Date, x : [ 1, 2, 3 ] } | ||
|  |         ), | ||
|  |         'dates should be equal' | ||
|  |     ); | ||
|  |      | ||
|  |     var d0 = new Date; | ||
|  |     setTimeout(function () { | ||
|  |         assert.ok( | ||
|  |             !traverse.deepEqual( | ||
|  |                 { d : d0, x : [ 1, 2, 3 ], }, | ||
|  |                 { d : new Date, x : [ 1, 2, 3 ] } | ||
|  |             ), | ||
|  |             'microseconds should count in date equality' | ||
|  |         ); | ||
|  |     }, 5); | ||
|  | }; | ||
|  | 
 | ||
|  | exports.deepCircular = function () { | ||
|  |     var a = [1]; | ||
|  |     a.push(a); // a = [ 1, *a ]
 | ||
|  |      | ||
|  |     var b = [1]; | ||
|  |     b.push(a); // b = [ 1, [ 1, *a ] ]
 | ||
|  |      | ||
|  |     assert.ok( | ||
|  |         !traverse.deepEqual(a, b), | ||
|  |         'circular ref mount points count towards equality' | ||
|  |     ); | ||
|  |      | ||
|  |     var c = [1]; | ||
|  |     c.push(c); // c = [ 1, *c ]
 | ||
|  |     assert.ok( | ||
|  |         traverse.deepEqual(a, c), | ||
|  |         'circular refs are structurally the same here' | ||
|  |     ); | ||
|  |      | ||
|  |     var d = [1]; | ||
|  |     d.push(a); // c = [ 1, [ 1, *d ] ]
 | ||
|  |     assert.ok( | ||
|  |         traverse.deepEqual(b, d), | ||
|  |         'non-root circular ref structural comparison' | ||
|  |     ); | ||
|  | }; | ||
|  | 
 | ||
|  | exports.deepInstances = function () { | ||
|  |     assert.ok( | ||
|  |         !traverse.deepEqual([ new Boolean(false) ], [ false ]), | ||
|  |         'boolean instances are not real booleans' | ||
|  |     ); | ||
|  |      | ||
|  |     assert.ok( | ||
|  |         !traverse.deepEqual([ new String('x') ], [ 'x' ]), | ||
|  |         'string instances are not real strings' | ||
|  |     ); | ||
|  |      | ||
|  |     assert.ok( | ||
|  |         !traverse.deepEqual([ new Number(4) ], [ 4 ]), | ||
|  |         'number instances are not real numbers' | ||
|  |     ); | ||
|  |      | ||
|  |     assert.ok( | ||
|  |         traverse.deepEqual([ new RegExp('x') ], [ /x/ ]), | ||
|  |         'regexp instances are real regexps' | ||
|  |     ); | ||
|  |      | ||
|  |     assert.ok( | ||
|  |         !traverse.deepEqual([ new RegExp(/./) ], [ /../ ]), | ||
|  |         'these regexps aren\'t the same' | ||
|  |     ); | ||
|  |      | ||
|  |     assert.ok( | ||
|  |         !traverse.deepEqual( | ||
|  |             [ function (x) { return x * 2 } ], | ||
|  |             [ function (x) { return x * 2 } ] | ||
|  |         ), | ||
|  |         'functions with the same .toString() aren\'t necessarily the same' | ||
|  |     ); | ||
|  |      | ||
|  |     var f = function (x) { return x * 2 }; | ||
|  |     assert.ok( | ||
|  |         traverse.deepEqual([ f ], [ f ]), | ||
|  |         'these functions are actually equal' | ||
|  |     ); | ||
|  | }; | ||
|  | 
 | ||
|  | exports.deepEqual = function () { | ||
|  |     assert.ok( | ||
|  |         !traverse.deepEqual([ 1, 2, 3 ], { 0 : 1, 1 : 2, 2 : 3 }), | ||
|  |         'arrays are not objects' | ||
|  |     ); | ||
|  | }; | ||
|  | 
 | ||
|  | exports.falsy = function () { | ||
|  |     assert.ok( | ||
|  |         !traverse.deepEqual([ undefined ], [ null ]), | ||
|  |         'null is not undefined!' | ||
|  |     ); | ||
|  |      | ||
|  |     assert.ok( | ||
|  |         !traverse.deepEqual([ null ], [ undefined ]), | ||
|  |         'undefined is not null!' | ||
|  |     ); | ||
|  |      | ||
|  |     assert.ok( | ||
|  |         !traverse.deepEqual( | ||
|  |             { a : 1, b : 2, c : [ 3, undefined, 5 ] }, | ||
|  |             { a : 1, b : 2, c : [ 3, null, 5 ] } | ||
|  |         ), | ||
|  |         'undefined is not null, however deeply!' | ||
|  |     ); | ||
|  |      | ||
|  |     assert.ok( | ||
|  |         !traverse.deepEqual( | ||
|  |             { a : 1, b : 2, c : [ 3, undefined, 5 ] }, | ||
|  |             { a : 1, b : 2, c : [ 3, null, 5 ] } | ||
|  |         ), | ||
|  |         'null is not undefined, however deeply!' | ||
|  |     ); | ||
|  |      | ||
|  |     assert.ok( | ||
|  |         !traverse.deepEqual( | ||
|  |             { a : 1, b : 2, c : [ 3, undefined, 5 ] }, | ||
|  |             { a : 1, b : 2, c : [ 3, null, 5 ] } | ||
|  |         ), | ||
|  |         'null is not undefined, however deeply!' | ||
|  |     ); | ||
|  | }; | ||
|  | 
 | ||
|  | exports.deletedArrayEqual = function () { | ||
|  |     var xs = [ 1, 2, 3, 4 ]; | ||
|  |     delete xs[2]; | ||
|  |      | ||
|  |     var ys = Object.create(Array.prototype); | ||
|  |     ys[0] = 1; | ||
|  |     ys[1] = 2; | ||
|  |     ys[3] = 4; | ||
|  |      | ||
|  |     assert.ok( | ||
|  |         traverse.deepEqual(xs, ys), | ||
|  |         'arrays with deleted elements are only equal to' | ||
|  |         + ' arrays with similarly deleted elements' | ||
|  |     ); | ||
|  |      | ||
|  |     assert.ok( | ||
|  |         !traverse.deepEqual(xs, [ 1, 2, undefined, 4 ]), | ||
|  |         'deleted array elements cannot be undefined' | ||
|  |     ); | ||
|  |      | ||
|  |     assert.ok( | ||
|  |         !traverse.deepEqual(xs, [ 1, 2, null, 4 ]), | ||
|  |         'deleted array elements cannot be null' | ||
|  |     ); | ||
|  | }; | ||
|  | 
 | ||
|  | exports.deletedObjectEqual = function () { | ||
|  |     var obj = { a : 1, b : 2, c : 3 }; | ||
|  |     delete obj.c; | ||
|  |      | ||
|  |     assert.ok( | ||
|  |         traverse.deepEqual(obj, { a : 1, b : 2 }), | ||
|  |         'deleted object elements should not show up' | ||
|  |     ); | ||
|  |      | ||
|  |     assert.ok( | ||
|  |         !traverse.deepEqual(obj, { a : 1, b : 2, c : undefined }), | ||
|  |         'deleted object elements are not undefined' | ||
|  |     ); | ||
|  |      | ||
|  |     assert.ok( | ||
|  |         !traverse.deepEqual(obj, { a : 1, b : 2, c : null }), | ||
|  |         'deleted object elements are not null' | ||
|  |     ); | ||
|  | }; | ||
|  | 
 | ||
|  | exports.emptyKeyEqual = function () { | ||
|  |     assert.ok(!traverse.deepEqual( | ||
|  |         { a : 1 }, { a : 1, '' : 55 } | ||
|  |     )); | ||
|  | }; | ||
|  | 
 | ||
|  | exports.deepArguments = function () { | ||
|  |     assert.ok( | ||
|  |         !traverse.deepEqual( | ||
|  |             [ 4, 5, 6 ], | ||
|  |             (function () { return arguments })(4, 5, 6) | ||
|  |         ), | ||
|  |         'arguments are not arrays' | ||
|  |     ); | ||
|  |      | ||
|  |     assert.ok( | ||
|  |         traverse.deepEqual( | ||
|  |             (function () { return arguments })(4, 5, 6), | ||
|  |             (function () { return arguments })(4, 5, 6) | ||
|  |         ), | ||
|  |         'arguments should equal' | ||
|  |     ); | ||
|  | }; | ||
|  | 
 | ||
|  | exports.deepUn = function () { | ||
|  |     assert.ok(!traverse.deepEqual({ a : 1, b : 2 }, undefined)); | ||
|  |     assert.ok(!traverse.deepEqual({ a : 1, b : 2 }, {})); | ||
|  |     assert.ok(!traverse.deepEqual(undefined, { a : 1, b : 2 })); | ||
|  |     assert.ok(!traverse.deepEqual({}, { a : 1, b : 2 })); | ||
|  |     assert.ok(traverse.deepEqual(undefined, undefined)); | ||
|  |     assert.ok(traverse.deepEqual(null, null)); | ||
|  |     assert.ok(!traverse.deepEqual(undefined, null)); | ||
|  | }; | ||
|  | 
 | ||
|  | exports.deepLevels = function () { | ||
|  |     var xs = [ 1, 2, [ 3, 4, [ 5, 6 ] ] ]; | ||
|  |     assert.ok(!traverse.deepEqual(xs, [])); | ||
|  | }; |