is-equal.test.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. var util = require('util');
  2. var assert = require('assert');
  3. var _ = require('@sailshq/lodash');
  4. var rttc = require('../');
  5. describe('.isEqual()', function() {
  6. // TODO: test that this doesn't go nuts given circular objects
  7. it('should accurately match strings', function() {
  8. assert(rttc.isEqual('stuff', 'stuff'));
  9. assert(rttc.isEqual('', ''));
  10. });
  11. it('should accurately match numbers', function (){
  12. assert(rttc.isEqual(8232, 8232));
  13. assert(rttc.isEqual(0, -0));
  14. });
  15. it('should accurately match booleans', function (){
  16. assert(rttc.isEqual(false, false));
  17. assert(rttc.isEqual(true, true));
  18. });
  19. it('should accurately match dictionaries', function (){
  20. assert(rttc.isEqual({}, {}));
  21. assert(rttc.isEqual({foo:'bar'}, {foo:'bar'}));
  22. assert(rttc.isEqual({foo:{bar:'baz'}}, {foo:{bar:'baz'}}));
  23. assert(rttc.isEqual({foo:{bar:['baz']}}, {foo:{bar:['baz']}}));
  24. assert(rttc.isEqual({foo:[{bar:['baz']}]}, {foo:[{bar:['baz']}]}));
  25. });
  26. it('should accurately match arrays', function (){
  27. assert(rttc.isEqual([], []));
  28. assert(rttc.isEqual(['Arya Stark', 'Jon Snow'], ['Arya Stark', 'Jon Snow']));
  29. assert(rttc.isEqual([2932,138,11,424], [2932,138,11,424]));
  30. assert(rttc.isEqual([true, true, false], [true, true, false]));
  31. assert(rttc.isEqual([true, true, false, false], [true, true, false, false]));
  32. assert(rttc.isEqual([{species: 'Hopidor maxim', weight: 23821394, isAvailable: true}], [{species: 'Hopidor maxim', weight: 23821394, isAvailable: true}]));
  33. assert(rttc.isEqual([['baz']], [['baz']]));
  34. assert(rttc.isEqual([{foo:[{bar:['baz']}]}], [{foo:[{bar:['baz']}]}]));
  35. });
  36. it('should not care about key order in dictionaries (nested or top-level)', function (){
  37. assert(rttc.isEqual({y: 4, x: 3}, {x: 3, y: 4}));
  38. assert(rttc.isEqual([{y: 4, x: 3}], [{x: 3, y: 4}]));
  39. assert(rttc.isEqual([{y: 4, x: 3}, {y: 3, x: 9}], [{x: 3, y: 4}, {x: 9, y: 3}]));
  40. });
  41. it('should not care about key order in dictionaries (nested or top-level) when using a recursive type schema', function (){
  42. assert(rttc.isEqual({y: 4, x: 3}, {x: 3, y: 4}, {x: 'number', y: 'number'}));
  43. assert(rttc.isEqual([{y: 4, x: 3}], [{x: 3, y: 4}], [{x: 'number', y: 'number'}]));
  44. assert(rttc.isEqual([{y: 4, x: 3}, {y: 3, x: 9}], [{x: 3, y: 4}, {x: 9, y: 3}], [{x: 'number', y: 'number'}]));
  45. });
  46. it('should correctly identify missing keys as inequality when using a faceted dictionary type schemas', function (){
  47. assert(!rttc.isEqual(
  48. {y: 'things'},
  49. {y: 'stuff', x: 'things'},
  50. {x: 'string', y: 'string'}
  51. ));
  52. });
  53. it('should correctly identify missing keys as inequality when using a type schema that has a generic dictionary inside a pattern array', function (){
  54. assert(!rttc.isEqual(
  55. {x: 'abc'},
  56. {x: 'abc', y: []},
  57. {x: 'string', y: [{}]}
  58. ));
  59. assert(!rttc.isEqual(
  60. {x: 'abc', y: []},
  61. {x: 'abc'},
  62. {x: 'string', y: [{}]}
  63. ));
  64. });
  65. it('should fail to match functions when no type schema is provided (nested and at the top-level)', function (){
  66. assert.throws(function (){
  67. assert(rttc.isEqual(function (){}, function (){}));
  68. });
  69. assert.throws(function (){
  70. assert(rttc.isEqual(function foo(){}, function foo(){}));
  71. });
  72. assert.throws(function (){
  73. assert(rttc.isEqual(function foo(x){}, function foo(x){}));
  74. });
  75. assert.throws(function (){
  76. assert(rttc.isEqual(function foo(x){return x+1;}, function foo(x){return x+1;}));
  77. });
  78. assert.throws(function (){
  79. assert(rttc.isEqual([function foo(x){return x+1;}], [function foo(x){return x+1;}]));
  80. });
  81. assert.throws(function (){
  82. 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;}}]));
  83. });
  84. });
  85. it('should accurately match functions (nested and at the top-level) when a type schema is provided', function (){
  86. assert(rttc.isEqual(function (){}, function (){}, 'lamda'));
  87. assert(rttc.isEqual(function foo(){}, function foo(){}, 'lamda'));
  88. assert(rttc.isEqual(function foo(x){}, function foo(x){}, 'lamda'));
  89. assert(rttc.isEqual(function foo(x){return x+1;}, function foo(x){return x+1;}, 'lamda'));
  90. assert(rttc.isEqual([function foo(x){return x+1;}], [function foo(x){return x+1;}], ['lamda']));
  91. assert(rttc.isEqual(
  92. [
  93. {
  94. fn: function foo(x) {
  95. return x + 1;
  96. }
  97. },
  98. {
  99. fn: function bar(x) {
  100. return x + 1;
  101. }
  102. }
  103. ],
  104. [
  105. {
  106. fn: function foo(x) {
  107. return x + 1;
  108. }
  109. },
  110. {
  111. fn: function bar(x) {
  112. return x + 1;
  113. }
  114. }
  115. ],
  116. [
  117. {
  118. fn: 'lamda'
  119. }
  120. ]
  121. ));
  122. // }]), 'expected rttc.isEqual() to accurately declare nested lamda fns as equal when a type schema is provided');
  123. });
  124. });