123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- var util = require('util');
- var assert = require('assert');
- var _ = require('@sailshq/lodash');
- var rttc = require('../');
- describe('.isEqual()', function() {
- // TODO: test that this doesn't go nuts given circular objects
- it('should accurately match strings', function() {
- assert(rttc.isEqual('stuff', 'stuff'));
- assert(rttc.isEqual('', ''));
- });
- it('should accurately match numbers', function (){
- assert(rttc.isEqual(8232, 8232));
- assert(rttc.isEqual(0, -0));
- });
- it('should accurately match booleans', function (){
- assert(rttc.isEqual(false, false));
- assert(rttc.isEqual(true, true));
- });
- it('should accurately match dictionaries', function (){
- assert(rttc.isEqual({}, {}));
- assert(rttc.isEqual({foo:'bar'}, {foo:'bar'}));
- assert(rttc.isEqual({foo:{bar:'baz'}}, {foo:{bar:'baz'}}));
- assert(rttc.isEqual({foo:{bar:['baz']}}, {foo:{bar:['baz']}}));
- assert(rttc.isEqual({foo:[{bar:['baz']}]}, {foo:[{bar:['baz']}]}));
- });
- it('should accurately match arrays', function (){
- assert(rttc.isEqual([], []));
- assert(rttc.isEqual(['Arya Stark', 'Jon Snow'], ['Arya Stark', 'Jon Snow']));
- assert(rttc.isEqual([2932,138,11,424], [2932,138,11,424]));
- assert(rttc.isEqual([true, true, false], [true, true, false]));
- assert(rttc.isEqual([true, true, false, false], [true, true, false, false]));
- assert(rttc.isEqual([{species: 'Hopidor maxim', weight: 23821394, isAvailable: true}], [{species: 'Hopidor maxim', weight: 23821394, isAvailable: true}]));
- assert(rttc.isEqual([['baz']], [['baz']]));
- assert(rttc.isEqual([{foo:[{bar:['baz']}]}], [{foo:[{bar:['baz']}]}]));
- });
- it('should not care about key order in dictionaries (nested or top-level)', function (){
- assert(rttc.isEqual({y: 4, x: 3}, {x: 3, y: 4}));
- assert(rttc.isEqual([{y: 4, x: 3}], [{x: 3, y: 4}]));
- assert(rttc.isEqual([{y: 4, x: 3}, {y: 3, x: 9}], [{x: 3, y: 4}, {x: 9, y: 3}]));
- });
- it('should not care about key order in dictionaries (nested or top-level) when using a recursive type schema', function (){
- assert(rttc.isEqual({y: 4, x: 3}, {x: 3, y: 4}, {x: 'number', y: 'number'}));
- assert(rttc.isEqual([{y: 4, x: 3}], [{x: 3, y: 4}], [{x: 'number', y: 'number'}]));
- assert(rttc.isEqual([{y: 4, x: 3}, {y: 3, x: 9}], [{x: 3, y: 4}, {x: 9, y: 3}], [{x: 'number', y: 'number'}]));
- });
- it('should correctly identify missing keys as inequality when using a faceted dictionary type schemas', function (){
- assert(!rttc.isEqual(
- {y: 'things'},
- {y: 'stuff', x: 'things'},
- {x: 'string', y: 'string'}
- ));
- });
- it('should correctly identify missing keys as inequality when using a type schema that has a generic dictionary inside a pattern array', function (){
- assert(!rttc.isEqual(
- {x: 'abc'},
- {x: 'abc', y: []},
- {x: 'string', y: [{}]}
- ));
- assert(!rttc.isEqual(
- {x: 'abc', y: []},
- {x: 'abc'},
- {x: 'string', y: [{}]}
- ));
- });
- it('should fail to match functions when no type schema is provided (nested and at the top-level)', function (){
- assert.throws(function (){
- assert(rttc.isEqual(function (){}, function (){}));
- });
- assert.throws(function (){
- assert(rttc.isEqual(function foo(){}, function foo(){}));
- });
- assert.throws(function (){
- assert(rttc.isEqual(function foo(x){}, function foo(x){}));
- });
- assert.throws(function (){
- assert(rttc.isEqual(function foo(x){return x+1;}, function foo(x){return x+1;}));
- });
- assert.throws(function (){
- assert(rttc.isEqual([function foo(x){return x+1;}], [function foo(x){return x+1;}]));
- });
- assert.throws(function (){
- assert(rttc.isEqual([{fn: function foo(x){return x+1;}}, {fn: function bar(x){return x+1;}}], [{fn:function foo(x){return x+1;}}, {fn: function bar(x){return x+1;}}]));
- });
- });
- it('should accurately match functions (nested and at the top-level) when a type schema is provided', function (){
- assert(rttc.isEqual(function (){}, function (){}, 'lamda'));
- assert(rttc.isEqual(function foo(){}, function foo(){}, 'lamda'));
- assert(rttc.isEqual(function foo(x){}, function foo(x){}, 'lamda'));
- assert(rttc.isEqual(function foo(x){return x+1;}, function foo(x){return x+1;}, 'lamda'));
- assert(rttc.isEqual([function foo(x){return x+1;}], [function foo(x){return x+1;}], ['lamda']));
- assert(rttc.isEqual(
- [
- {
- fn: function foo(x) {
- return x + 1;
- }
- },
- {
- fn: function bar(x) {
- return x + 1;
- }
- }
- ],
- [
- {
- fn: function foo(x) {
- return x + 1;
- }
- },
- {
- fn: function bar(x) {
- return x + 1;
- }
- }
- ],
- [
- {
- fn: 'lamda'
- }
- ]
- ));
- // }]), 'expected rttc.isEqual() to accurately declare nested lamda fns as equal when a type schema is provided');
- });
- });
|