extend.test.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. var assert = require('chai').assert,
  2. lib = require('../lib/deap');
  3. describe('shallow extend', function() {
  4. var shallow = lib.extendShallow;
  5. it('should return a reference to the first argument', function() {
  6. var a = { burp: 'adurp' },
  7. b = { burp: 'zing', grr: 'arghh' };
  8. var result = shallow(a, b);
  9. assert.strictEqual(result, a);
  10. });
  11. it('should copy simple values', function() {
  12. var a = {},
  13. b = { s: 'string', n: 1, b: false, a: [], o: {}};
  14. var c = shallow(a, b);
  15. assert.deepEqual(c, a);
  16. assert.equal(c.s, b.s);
  17. assert.equal(c.n, b.n);
  18. assert.equal(c.b, b.b);
  19. assert.strictEqual(c.a, b.a);
  20. assert.strictEqual(c.o, b.o);
  21. });
  22. it('should only alter first param', function() {
  23. var a = { doom: 'song' },
  24. b = { burp: 'adurp' },
  25. c = { grr: 'argh' };
  26. var result = shallow({}, a, b, c);
  27. assert.deepEqual(a, { doom: 'song' });
  28. assert.deepEqual(b, { burp: 'adurp' });
  29. assert.deepEqual(c, { grr: 'argh' });
  30. assert.sameMembers(Object.keys(result), ['doom', 'burp', 'grr']);
  31. assert.equal(result.doom, a.doom);
  32. assert.equal(result.burp, b.burp);
  33. assert.equal(result.grr, c.grr);
  34. });
  35. it('should preserve object references', function() {
  36. var deep = { foo: 'bar' },
  37. a = { burp: 'adurp' , nested: deep };
  38. var result = shallow({}, a);
  39. assert.strictEqual(result.nested, deep);
  40. });
  41. it('should preserve date references', function() {
  42. var a = { burp: 'adurp', date: new Date() },
  43. date = a.date;
  44. var result = shallow({}, a);
  45. assert.strictEqual(result.date, date);
  46. });
  47. it('should preserve regexp references', function() {
  48. var a = { burp: 'adurp', regexp: /foo/g },
  49. regexp = a.regexp;
  50. var result = shallow({}, a);
  51. assert.strictEqual(result.regexp, regexp);
  52. });
  53. it('should preserve array references', function() {
  54. var a = { burp: 'adurp', array: [] },
  55. array = a.array;
  56. var result = shallow({}, a);
  57. assert.strictEqual(result.array, array);
  58. });
  59. it('should not pick up non-enumberable properties', function() {
  60. var result = shallow({}, function() {});
  61. assert.deepEqual(result, {});
  62. assert.equal(Object.keys(result).length, 0);
  63. assert.equal(Object.getOwnPropertyNames(result).length, 0);
  64. });
  65. });
  66. describe('deep extend', function() {
  67. var deepExtend = lib.extend;
  68. it('should return a reference to the first argument', function() {
  69. var a = { burp: 'adurp' },
  70. b = { burp: 'zing', grr: 'arghh' };
  71. var result = deepExtend(a, b);
  72. assert.strictEqual(result, a);
  73. });
  74. it('should not preserve object references', function() {
  75. var deeper = { boo: 'far' },
  76. deep = { foo: 'bar', nested: deeper },
  77. a = { burp: 'adurp' , nested: deep };
  78. var result = deepExtend({}, a);
  79. assert.deepEqual(result, a);
  80. assert.notStrictEqual(result.nested, deep);
  81. assert.notStrictEqual(result.nested.nested, deeper);
  82. });
  83. it('should not preserve date references', function() {
  84. var a = { burp: 'adurp', date: new Date() },
  85. date = a.date;
  86. var result = deepExtend({}, a);
  87. assert.deepEqual(result, a);
  88. assert.equal(result.date.getTime(), date.getTime()); // added this because deepEqual doesn't work with dates
  89. assert.notStrictEqual(result.date, date);
  90. });
  91. it('should not preserve regexp references', function() {
  92. var a = { burp: 'adurp', regexp: /foo/g },
  93. regexp = a.regexp;
  94. var result = deepExtend({}, a);
  95. assert.deepEqual(result, a);
  96. assert.notStrictEqual(result.regexp, regexp);
  97. });
  98. it('should not preserve array references', function() {
  99. var deeper = { boo: 'far' },
  100. deep = { foo: 'bar', nested: deeper },
  101. a = { burp: 'adurp' , nested: [deep, deeper] };
  102. var result = deepExtend({}, a);
  103. assert.deepEqual(result, a);
  104. assert.notStrictEqual(result.nested, a.nested);
  105. assert.notStrictEqual(result.nested[0], deep);
  106. assert.notStrictEqual(result.nested[0].nested, deeper);
  107. assert.notStrictEqual(result.nested[1], deeper);
  108. assert.deepEqual(result.nested[0].nested, result.nested[1]);
  109. assert.notStrictEqual(result.nested[0].nested, result.nested[1]);
  110. });
  111. });