update.test.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. var lib = require('../lib/deap'),
  2. assert = require('chai').assert;
  3. describe('shallow update', function() {
  4. var shallowUpdate = lib.updateShallow;
  5. it('should not update anything into an empty object', function() {
  6. var result = shallowUpdate({}, { foo: 'bar' });
  7. assert.deepEqual(result, {});
  8. });
  9. it('should return a reference to the first argument', function() {
  10. var a = { burp: 'adurp' },
  11. b = { burp: 'zing', grr: 'arghh' };
  12. var result = shallowUpdate(a, b);
  13. assert.strictEqual(result, a);
  14. });
  15. it('should replace existing values only', function() {
  16. var a = { burp: 'adurp' },
  17. b = { burp: 'zing', grr: 'arghh' };
  18. var result = shallowUpdate(a, b);
  19. assert.deepEqual(result, a);
  20. assert.equal(a.burp, b.burp);
  21. assert.isUndefined(a.grr);
  22. });
  23. });
  24. describe('deep update', function() {
  25. var deepUpdate = lib.update;
  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 = deepUpdate(a, b);
  30. assert.strictEqual(result, a);
  31. });
  32. it('should update a nested object one level deep', function() {
  33. var a = { foo: 'bar', deep: { foo: 'bar', baz: 'buzz' }},
  34. b = { deep: { foo: 'beep' } };
  35. var result = deepUpdate(a, b);
  36. assert.equal(result.foo, a.foo);
  37. assert.equal(result.deep.foo, b.deep.foo);
  38. assert.equal(result.deep.baz, a.deep.baz);
  39. });
  40. it('should update a nested object two levels deep', function() {
  41. var a = { foo: 'bar', deep: { hi: 'hello', deeper: { foo: 'bar', baz: 'buzz' }}},
  42. b = { deep: { deeper: { foo: 'beep' } } };
  43. var result = deepUpdate(a, b);
  44. assert.equal(result.foo, a.foo);
  45. assert.isObject(result.deep);
  46. assert.equal(result.deep.hi, a.deep.hi);
  47. assert.isObject(result.deep.deeper);
  48. assert.equal(result.deep.deeper.foo, b.deep.deeper.foo);
  49. assert.equal(result.deep.deeper.baz, a.deep.deeper.baz);
  50. });
  51. it('should update properties from multiple objects', function() {
  52. var a = { foo: ['one'], boo: 'far', poo: 'tar' },
  53. b = { foo: ['two', 'three'], zoo: 'car' },
  54. c = { boo: 'star', two: 'czar' };
  55. var result = deepUpdate(a, b, c);
  56. assert.deepEqual(result, {
  57. foo: b.foo,
  58. boo: c.boo,
  59. poo: a.poo
  60. });
  61. });
  62. it('should not update properties that are not on the first argument', function() {
  63. var a = { foo: 'bar', deep: { deeper: { foo: 'bar' } } },
  64. b = { boo: 'far', deep: { hi: 'hello', deeper: { foo: 'beep', baz: 'buzz' } } };
  65. var result = deepUpdate(a, b);
  66. assert.isUndefined(result.boo);
  67. assert.isObject(result.deep);
  68. assert.isUndefined(result.deep.hi);
  69. assert.isObject(result.deep.deeper);
  70. assert.isUndefined(result.deep.deeper.baz);
  71. assert.equal(result.deep.deeper.foo, b.deep.deeper.foo);
  72. });
  73. it('should not preserve nested object references', function() {
  74. var a = { foo: 'bar' },
  75. nested = { grr: 'argh' },
  76. newFoo = { burp: nested },
  77. b = { foo: newFoo };
  78. var result = deepUpdate(a, b);
  79. assert.deepEqual(a.foo.burp, b.foo.burp);
  80. assert.notStrictEqual(a.foo.burp, nested);
  81. });
  82. it('should preserve array references', function() {
  83. var a = { nested: [{ foo: 'bar' }] },
  84. b = { nested: [{ boo: 'far' }] },
  85. deep = a.nested;
  86. var result = deepUpdate(a, b);
  87. assert.deepEqual(result.nested, b.nested);
  88. assert.notStrictEqual(result.nested, b.nested);
  89. assert.strictEqual(result.nested, a.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 = deepUpdate(a, b);
  97. assert.deepEqual(result.nested, b.nested);
  98. assert.notStrictEqual(result.nested[0], deeper);
  99. });
  100. });