simple-deep-clone.spec.ts 2.4 KB

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