is-deep-equal.spec.js 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. import {expect} from 'chai';
  2. import {isDeepEqual} from './is-deep-equal.js';
  3. const check = (a, b, expected) => {
  4. expect(isDeepEqual(a, b)).to.be.eq(expected);
  5. expect(isDeepEqual(b, a)).to.be.eq(expected);
  6. };
  7. describe('isDeepEqual', function () {
  8. describe('string', function () {
  9. it('a non-empty string', function () {
  10. check('str', 'str', true);
  11. check('str', '', false);
  12. check('str', 10, false);
  13. check('str', 0, false);
  14. check('str', -10, false);
  15. check('str', true, false);
  16. check('str', false, false);
  17. check('str', undefined, false);
  18. check('str', null, false);
  19. check('str', {foo: 'bar'}, false);
  20. check('str', {}, false);
  21. check('str', [1, 2, 3], false);
  22. check('str', [], false);
  23. });
  24. it('an empty string', function () {
  25. check('', 'str', false);
  26. check('', '', true);
  27. check('', 10, false);
  28. check('', 0, false);
  29. check('', -10, false);
  30. check('', true, false);
  31. check('', false, false);
  32. check('', undefined, false);
  33. check('', null, false);
  34. check('', {foo: 'bar'}, false);
  35. check('', {}, false);
  36. check('', [1, 2, 3], false);
  37. check('', [], false);
  38. });
  39. });
  40. describe('number', function () {
  41. it('a positive number', function () {
  42. check(10, 'str', false);
  43. check(10, '', false);
  44. check(10, 10, true);
  45. check(10, 0, false);
  46. check(10, -10, false);
  47. check(10, true, false);
  48. check(10, false, false);
  49. check(10, undefined, false);
  50. check(10, null, false);
  51. check(10, {foo: 'bar'}, false);
  52. check(10, {}, false);
  53. check(10, [1, 2, 3], false);
  54. check(10, [], false);
  55. });
  56. it('zero', function () {
  57. check(0, 'str', false);
  58. check(0, '', false);
  59. check(0, 10, false);
  60. check(0, 0, true);
  61. check(0, -10, false);
  62. check(0, true, false);
  63. check(0, false, false);
  64. check(0, undefined, false);
  65. check(0, null, false);
  66. check(0, {foo: 'bar'}, false);
  67. check(0, {}, false);
  68. check(0, [1, 2, 3], false);
  69. check(0, [], false);
  70. });
  71. it('a negative number', function () {
  72. check(-10, 'str', false);
  73. check(-10, '', false);
  74. check(-10, 10, false);
  75. check(-10, 0, false);
  76. check(-10, -10, true);
  77. check(-10, true, false);
  78. check(-10, false, false);
  79. check(-10, undefined, false);
  80. check(-10, null, false);
  81. check(-10, {foo: 'bar'}, false);
  82. check(-10, {}, false);
  83. check(-10, [1, 2, 3], false);
  84. check(-10, [], false);
  85. });
  86. });
  87. describe('boolean', function () {
  88. it('true', function () {
  89. check(true, 'str', false);
  90. check(true, '', false);
  91. check(true, 10, false);
  92. check(true, 0, false);
  93. check(true, -10, false);
  94. check(true, true, true);
  95. check(true, false, false);
  96. check(true, undefined, false);
  97. check(true, null, false);
  98. check(true, {foo: 'bar'}, false);
  99. check(true, {}, false);
  100. check(true, [1, 2, 3], false);
  101. check(true, [], false);
  102. });
  103. it('false', function () {
  104. check(false, 'str', false);
  105. check(false, '', false);
  106. check(false, 10, false);
  107. check(false, 0, false);
  108. check(false, -10, false);
  109. check(false, true, false);
  110. check(false, false, true);
  111. check(false, undefined, false);
  112. check(false, null, false);
  113. check(false, {foo: 'bar'}, false);
  114. check(false, {}, false);
  115. check(false, [1, 2, 3], false);
  116. check(false, [], false);
  117. });
  118. });
  119. describe('array', function () {
  120. it('an array of numbers', function () {
  121. check([1, 2, 3], 'str', false);
  122. check([1, 2, 3], '', false);
  123. check([1, 2, 3], 10, false);
  124. check([1, 2, 3], 0, false);
  125. check([1, 2, 3], -10, false);
  126. check([1, 2, 3], true, false);
  127. check([1, 2, 3], false, false);
  128. check([1, 2, 3], undefined, false);
  129. check([1, 2, 3], null, false);
  130. check([1, 2, 3], {foo: 'bar'}, false);
  131. check([1, 2, 3], {}, false);
  132. check([1, 2, 3], [1, 2, 3], true);
  133. check([1, 2, 3], [], false);
  134. });
  135. it('an empty array', function () {
  136. check([], 'str', false);
  137. check([], '', false);
  138. check([], 10, false);
  139. check([], 0, false);
  140. check([], -10, false);
  141. check([], true, false);
  142. check([], false, false);
  143. check([], undefined, false);
  144. check([], null, false);
  145. check([], {foo: 'bar'}, false);
  146. check([], {}, false);
  147. check([], [1, 2, 3], false);
  148. check([], [], true);
  149. });
  150. });
  151. describe('object', function () {
  152. it('string key and string value', function () {
  153. check({foo: 'bar'}, 'str', false);
  154. check({foo: 'bar'}, '', false);
  155. check({foo: 'bar'}, 10, false);
  156. check({foo: 'bar'}, 0, false);
  157. check({foo: 'bar'}, -10, false);
  158. check({foo: 'bar'}, true, false);
  159. check({foo: 'bar'}, false, false);
  160. check({foo: 'bar'}, undefined, false);
  161. check({foo: 'bar'}, null, false);
  162. check({foo: 'bar'}, {foo: 'bar'}, true);
  163. check({foo: 'bar'}, {}, false);
  164. check({foo: 'bar'}, [1, 2, 3], false);
  165. check({foo: 'bar'}, [], false);
  166. });
  167. it('an empty object', function () {
  168. check({}, 'str', false);
  169. check({}, '', false);
  170. check({}, 10, false);
  171. check({}, 0, false);
  172. check({}, -10, false);
  173. check({}, true, false);
  174. check({}, false, false);
  175. check({}, undefined, false);
  176. check({}, null, false);
  177. check({}, {foo: 'bar'}, false);
  178. check({}, {}, true);
  179. check({}, [1, 2, 3], false);
  180. check({}, [], false);
  181. });
  182. it('null', function () {
  183. check(null, 'str', false);
  184. check(null, '', false);
  185. check(null, 10, false);
  186. check(null, 0, false);
  187. check(null, -10, false);
  188. check(null, true, false);
  189. check(null, false, false);
  190. check(null, undefined, false);
  191. check(null, null, true);
  192. check(null, {foo: 'bar'}, false);
  193. check(null, {}, false);
  194. check(null, [1, 2, 3], false);
  195. check(null, [], false);
  196. });
  197. it('circular reference to itself', function () {
  198. const a = {foo: 'bar'};
  199. const b = {baz: 'qux'};
  200. const c = {foo: 'bar'};
  201. a.itself = a;
  202. b.itself = b;
  203. c.itself = c;
  204. check(a, b, false);
  205. check(a, c, true);
  206. });
  207. });
  208. it('undefined', function () {
  209. check(undefined, 'str', false);
  210. check(undefined, '', false);
  211. check(undefined, 10, false);
  212. check(undefined, 0, false);
  213. check(undefined, -10, false);
  214. check(undefined, true, false);
  215. check(undefined, false, false);
  216. check(undefined, undefined, true);
  217. check(undefined, null, false);
  218. check(undefined, {foo: 'bar'}, false);
  219. check(undefined, {}, false);
  220. check(undefined, [1, 2, 3], false);
  221. check(undefined, [], false);
  222. });
  223. });