clone.test.js 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. var lib = require('../lib/deap'),
  2. assert = require('chai').assert;
  3. describe('shallow clone', function() {
  4. var shallow = lib.cloneShallow;
  5. it('should not return a reference to the first argument', function() {
  6. var a = { burp: 'adurp' },
  7. result = shallow(a);
  8. assert.notStrictEqual(result, a);
  9. });
  10. it('should copy simple values', function() {
  11. var a = { s: 'string', n: 1, b: false, a: [], o: {}},
  12. b = shallow(a);
  13. assert.deepEqual(b, a);
  14. assert.equal(b.s, a.s);
  15. assert.equal(b.n, a.n);
  16. assert.equal(b.b, a.b);
  17. assert.strictEqual(b.a, a.a);
  18. assert.strictEqual(b.o, a.o);
  19. });
  20. it('should preserve object references', function() {
  21. var deep = { foo: 'bar' },
  22. a = { burp: 'adurp' , nested: deep },
  23. result = shallow(a);
  24. assert.strictEqual(result.nested, deep);
  25. });
  26. it('should preserve date references', function() {
  27. var a = { burp: 'adurp', date: new Date() },
  28. date = a.date;
  29. var result = shallow(a);
  30. assert.strictEqual(result.date, date);
  31. });
  32. it('should preserve regexp references', function() {
  33. var a = { burp: 'adurp', regexp: /foo/g },
  34. regexp = a.regexp;
  35. var result = shallow(a);
  36. assert.strictEqual(result.regexp, regexp);
  37. });
  38. it('should preserve array references', function() {
  39. var a = { burp: 'adurp', array: [] },
  40. array = a.array;
  41. var result = shallow(a);
  42. assert.strictEqual(result.array, array);
  43. });
  44. it('should clone Date objects', function() {
  45. var a = new Date();
  46. var result = shallow(a);
  47. assert.equal(result.toString(), a.toString());
  48. assert.notStrictEqual(result, a);
  49. });
  50. it('should clone RegExp objects', function() {
  51. var a = /foo/;
  52. var result = shallow(a);
  53. assert.equal(result.toString(), a.toString());
  54. assert.notStrictEqual(result, a);
  55. });
  56. it('should work for multiple arguments', function() {
  57. var a = { doom: 'song' },
  58. b = { burp: 'adurp' },
  59. c = { grr: { doh: 'argh' } };
  60. var result = shallow(a, b, c);
  61. assert.deepEqual(a, { doom: 'song' });
  62. assert.deepEqual(b, { burp: 'adurp' });
  63. assert.deepEqual(c, { grr: { doh: 'argh' } });
  64. assert.sameMembers(Object.keys(result), ['doom', 'burp', 'grr']);
  65. assert.equal(result.doom, a.doom);
  66. assert.equal(result.burp, b.burp);
  67. assert.deepEqual(result.grr, c.grr);
  68. assert.strictEqual(result.grr, c.grr);
  69. });
  70. describe('on an array', function() {
  71. it('should preserve references', function() {
  72. var a = ['string', 1, false, [], {}];
  73. var result = shallow(a);
  74. assert.deepEqual(result, a);
  75. assert.equal(result[0], a[0]);
  76. assert.equal(result[1], a[1]);
  77. assert.equal(result[2], a[2]);
  78. assert.strictEqual(result[3], a[3]);
  79. assert.strictEqual(result[4], a[4]);
  80. });
  81. });
  82. });
  83. describe('clone', function() {
  84. var clone = lib.clone;
  85. it('should not return a reference to the first argument', function() {
  86. var a = { burp: 'adurp' },
  87. result = clone(a);
  88. assert.notStrictEqual(result, a);
  89. });
  90. it('should copy simple values', function() {
  91. var a = { s: 'string', n: 1, b: false, a: [], o: {}},
  92. b = clone(a);
  93. assert.deepEqual(b, a);
  94. assert.equal(b.s, a.s);
  95. assert.equal(b.n, a.n);
  96. assert.equal(b.b, a.b);
  97. assert.deepEqual(b.a, a.a);
  98. assert.deepEqual(b.o, a.o);
  99. });
  100. it('should not preserve object references', function() {
  101. var deeper = { boo: 'far' },
  102. deep = { foo: 'bar', nested: deeper },
  103. a = { burp: 'adurp' , nested: deep };
  104. var result = clone(a);
  105. assert.deepEqual(result, a);
  106. assert.notStrictEqual(result.nested, deep);
  107. assert.notStrictEqual(result.nested.nested, deeper);
  108. });
  109. it('should not preserve date references', function() {
  110. var a = { burp: 'adurp', date: new Date() },
  111. date = a.date;
  112. var result = clone(a);
  113. assert.deepEqual(result, a);
  114. assert.equal(result.date.getTime(), date.getTime()); // added this because deepEqual doesn't work with dates
  115. assert.notStrictEqual(result.date, date);
  116. });
  117. it('should not preserve regexp references', function() {
  118. var a = { burp: 'adurp', regexp: /foo/g },
  119. regexp = a.regexp;
  120. var result = clone(a);
  121. assert.deepEqual(result, a);
  122. assert.notStrictEqual(result.regexp, regexp);
  123. });
  124. it('should not preserve array references', function() {
  125. var deeper = { boo: 'far' },
  126. deep = { foo: 'bar', nested: deeper },
  127. a = { burp: 'adurp' , nested: [deep, deeper] };
  128. var result = clone(a);
  129. assert.deepEqual(result, a);
  130. assert.notStrictEqual(result.nested, a.nested);
  131. assert.notStrictEqual(result.nested[0], deep);
  132. assert.notStrictEqual(result.nested[0].nested, deeper);
  133. assert.notStrictEqual(result.nested[1], deeper);
  134. assert.deepEqual(result.nested[0].nested, result.nested[1]);
  135. assert.notStrictEqual(result.nested[0].nested, result.nested[1]);
  136. });
  137. it('should clone Date objects', function() {
  138. var a = new Date();
  139. var result = clone(a);
  140. assert.equal(result.toString(), a.toString());
  141. assert.notStrictEqual(result, a);
  142. });
  143. it('should clone RegExp objects', function() {
  144. var a = /foo/;
  145. var result = clone(a);
  146. assert.equal(result.toString(), a.toString());
  147. assert.notStrictEqual(result, a);
  148. });
  149. it('should work for multiple arguments', function() {
  150. var a = { doom: 'song' },
  151. b = { burp: 'adurp' },
  152. c = { grr: { doh: 'argh' } };
  153. var result = clone(a, b, c);
  154. assert.deepEqual(a, { doom: 'song' });
  155. assert.deepEqual(b, { burp: 'adurp' });
  156. assert.deepEqual(c, { grr: { doh: 'argh' } });
  157. assert.sameMembers(Object.keys(result), ['doom', 'burp', 'grr']);
  158. assert.equal(result.doom, a.doom);
  159. assert.equal(result.burp, b.burp);
  160. assert.deepEqual(result.grr, c.grr);
  161. assert.notStrictEqual(result.grr, c.grr);
  162. });
  163. describe('on an array', function() {
  164. it('should not preserve references', function() {
  165. var a = ['string', 1, false, [], {}];
  166. var result = clone(a);
  167. assert.deepEqual(result, a);
  168. assert.equal(result[0], a[0]);
  169. assert.equal(result[1], a[1]);
  170. assert.equal(result[2], a[2]);
  171. assert.notStrictEqual(result[3], a[3]);
  172. assert.notStrictEqual(result[4], a[4]);
  173. });
  174. });
  175. });