merge.test.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. var lib = require('../lib/deap'),
  2. assert = require('chai').assert;
  3. describe('shallow merge', function() {
  4. var shallowMerge = lib.mergeShallow;
  5. it('should merge everything into an empty object', function() {
  6. var a = { foo: 'bar' },
  7. result = shallowMerge({}, a);
  8. assert.deepEqual(result, a);
  9. });
  10. it('should return a reference to the first argument', function() {
  11. var a = { burp: 'adurp' },
  12. b = { burp: 'zing', grr: 'arghh' };
  13. var result = shallowMerge(a, b);
  14. assert.strictEqual(result, a);
  15. });
  16. it('should not replace existing values', function() {
  17. var a = { burp: 'adurp' },
  18. b = { burp: 'zing', grr: 'arghh' };
  19. var result = shallowMerge(a, b);
  20. assert.deepEqual(result, { burp: 'adurp', grr: 'arghh' });
  21. assert.equal(result.burp, a.burp);
  22. });
  23. });
  24. describe('deep merge', function() {
  25. var deepMerge = lib.merge;
  26. it('should return a reference to the first argument', function() {
  27. var a = { burp: 'adurp' },
  28. b = { burp: 'zing', grr: 'arghh' };
  29. var result = deepMerge(a, b);
  30. assert.strictEqual(result, a);
  31. });
  32. it('should merge a nested object one level deep', function() {
  33. var a = { foo: 'bar', deep: { foo: 'bar', baz: 'buzz' }},
  34. b = { foo: 'bop', deep: { foo: 'beep', biz: 'baz' } };
  35. var result = deepMerge(a, b);
  36. assert.equal(result.foo, 'bar');
  37. assert.equal(result.deep.foo, 'bar');
  38. assert.equal(result.deep.baz, 'buzz');
  39. assert.equal(result.deep.biz, 'baz');
  40. });
  41. it('should merge a nested object two levels deep', function() {
  42. var a = { foo: 'bar', deep: { hi: 'hello', deeper: { foo: 'bar', baz: 'buzz' }}},
  43. b = { foo: 'baz', deep: { hi: 'bye', bye: 'hi', deeper: { foo: 'beep', bop: 'boop' } } };
  44. var result = deepMerge({}, a, b);
  45. assert.equal(result.foo, a.foo);
  46. assert.isObject(result.deep);
  47. assert.equal(result.deep.hi, a.deep.hi);
  48. assert.equal(result.deep.bye, b.deep.bye);
  49. assert.isObject(result.deep.deeper);
  50. assert.equal(result.deep.deeper.foo, a.deep.deeper.foo);
  51. assert.equal(result.deep.deeper.baz, a.deep.deeper.baz);
  52. assert.equal(result.deep.deeper.bop, b.deep.deeper.bop);
  53. });
  54. it('should merge properties from multiple objects', function() {
  55. var a = { foo: ['one'], boo: 'far', poo: 'tar' },
  56. b = { foo: ['two', 'three'], zoo: 'car' },
  57. c = { boo: 'star', two: 'czar' };
  58. var result = deepMerge({}, a, b, c);
  59. assert.deepEqual(result, {
  60. foo: a.foo,
  61. boo: a.boo,
  62. poo: a.poo,
  63. zoo: b.zoo,
  64. two: c.two
  65. });
  66. });
  67. it('should not preserve nested object references', function() {
  68. var a = { foo: 'bar' },
  69. nested = { grr: 'argh' },
  70. newFoo = { burp: nested },
  71. b = { foo: newFoo, foo2: newFoo };
  72. var result = deepMerge(a, b);
  73. assert.equal(a.foo, 'bar');
  74. assert.deepEqual(a.foo2.burp, b.foo2.burp);
  75. assert.notStrictEqual(a.foo2.burp, nested);
  76. });
  77. it('should not override a string with an object', function() {
  78. var a = { foo: 'bar' },
  79. b = { foo: { biz: 'baz' } };
  80. var result = deepMerge(a, b);
  81. assert.deepEqual(a, { foo: 'bar' });
  82. });
  83. it('should preserve array references', function() {
  84. var a = { nested: [{ foo: 'bar' }] },
  85. b = { nested: [{ boo: 'far' }] },
  86. deep = a.nested;
  87. var result = deepMerge(a, b);
  88. assert.deepEqual(result.nested, a.nested);
  89. assert.notStrictEqual(result.nested, b.nested);
  90. assert.strictEqual(result.nested, deep);
  91. });
  92. it('should not preserve references in arrays', function() {
  93. var a = { nested: [{ foo: 'bar' }] },
  94. b = { nested: [{ boo: 'far' }] },
  95. deeper = a.nested[0];
  96. var result = deepMerge({}, a, b);
  97. assert.deepEqual(result.nested, a.nested);
  98. assert.notStrictEqual(result.nested[0], deeper);
  99. });
  100. });