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
						
					
					
				| 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, []));
 | |
| };
 |