simple-deep-clone.spec.ts 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import { simpleDeepClone } from './simple-deep-clone';
  2. describe('simpleDeepClone()', () => {
  3. it('clones a simple flat object', () => {
  4. const target = { a: 1, b: 2 };
  5. const result = simpleDeepClone(target);
  6. expect(result).toEqual(target);
  7. expect(result).not.toBe(target);
  8. });
  9. it('clones a simple deep object', () => {
  10. const target = { a: 1, b: { c: 3, d: [1, 2, 3] } };
  11. const result = simpleDeepClone(target);
  12. expect(result).toEqual(target);
  13. expect(result).not.toBe(target);
  14. });
  15. it('clones a simple flat array', () => {
  16. const target = [1, 2, 3];
  17. const result = simpleDeepClone(target);
  18. expect(result).toEqual(target);
  19. expect(result).not.toBe(target);
  20. });
  21. it('clones a simple deep array', () => {
  22. const target = [1, [2, 3], [4, [5, [6]]]];
  23. const result = simpleDeepClone(target);
  24. expect(result).toEqual(target);
  25. expect(result).not.toBe(target);
  26. });
  27. it('passes through primitive types', () => {
  28. expect(simpleDeepClone(1)).toBe(1);
  29. expect(simpleDeepClone('a')).toBe('a');
  30. expect(simpleDeepClone(true as any)).toBe(true);
  31. expect(simpleDeepClone(null as any)).toBe(null);
  32. expect(simpleDeepClone(undefined as any)).toBe(undefined);
  33. });
  34. it('does not clone class instance', () => {
  35. const target = new Foo();
  36. const result = simpleDeepClone(target);
  37. expect(result).toBe(target);
  38. });
  39. it('does not clone class instance in array', () => {
  40. const foo = new Foo();
  41. const target = [foo];
  42. const result = simpleDeepClone(target);
  43. expect(result).toEqual(target);
  44. expect(result).not.toBe(target);
  45. expect(result[0]).toBe(target[0]);
  46. });
  47. it('does not clone class instance in object', () => {
  48. const foo = new Foo();
  49. const target = { a: foo };
  50. const result = simpleDeepClone(target);
  51. expect(result).toEqual(target);
  52. expect(result).not.toBe(target);
  53. expect(result.a).toBe(target.a);
  54. });
  55. it('clone does not share references with original', () => {
  56. const original = { user: { name: 'mike' } };
  57. const clone = simpleDeepClone(original);
  58. original.user.name = 'pete';
  59. expect(clone.user.name).toEqual('mike');
  60. });
  61. });
  62. class Foo {}