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