Spaces:
Paused
Paused
import { it, expect } from 'vitest' | |
import { cloneObject } from './cloneObject' | |
it('clones a shallow object', () => { | |
const original = { a: 1, b: 2, c: [1, 2, 3] } | |
const clone = cloneObject(original) | |
expect(clone).toEqual(original) | |
clone.a = 5 | |
clone.b = 6 | |
clone.c = [5, 6, 7] | |
expect(clone).toHaveProperty('a', 5) | |
expect(clone).toHaveProperty('b', 6) | |
expect(clone).toHaveProperty('c', [5, 6, 7]) | |
expect(original).toHaveProperty('a', 1) | |
expect(original).toHaveProperty('b', 2) | |
expect(original).toHaveProperty('c', [1, 2, 3]) | |
}) | |
it('clones a nested object', () => { | |
const original = { a: { b: 1 }, c: { d: { e: 2 } } } | |
const clone = cloneObject(original) | |
expect(clone).toEqual(original) | |
clone.a.b = 10 | |
clone.c.d.e = 20 | |
expect(clone).toHaveProperty(['a', 'b'], 10) | |
expect(clone).toHaveProperty(['c', 'd', 'e'], 20) | |
expect(original).toHaveProperty(['a', 'b'], 1) | |
expect(original).toHaveProperty(['c', 'd', 'e'], 2) | |
}) | |
it('clones a class instance', () => { | |
class Car { | |
public manufacturer: string | |
constructor() { | |
this.manufacturer = 'Audi' | |
} | |
getManufacturer() { | |
return this.manufacturer | |
} | |
} | |
const car = new Car() | |
const clone = cloneObject(car) | |
expect(clone).toHaveProperty('manufacturer', 'Audi') | |
expect(clone).toHaveProperty('getManufacturer') | |
expect(clone.getManufacturer).toBeInstanceOf(Function) | |
expect(clone.getManufacturer()).toEqual('Audi') | |
}) | |
it('ignores nested class instances', () => { | |
class Car { | |
name: string | |
constructor(name: string) { | |
this.name = name | |
} | |
getName() { | |
return this.name | |
} | |
} | |
const original = { | |
a: 1, | |
car: new Car('Audi'), | |
} | |
const clone = cloneObject(original) | |
expect(clone).toEqual(original) | |
expect(clone.car).toBeInstanceOf(Car) | |
expect(clone.car.getName()).toEqual('Audi') | |
clone.car = new Car('BMW') | |
expect(clone.car).toBeInstanceOf(Car) | |
expect(clone.car.getName()).toEqual('BMW') | |
expect(original.car).toBeInstanceOf(Car) | |
expect(original.car.getName()).toEqual('Audi') | |
}) | |
it('clones an object with null prototype', () => { | |
const original = { | |
key: Object.create(null), | |
} | |
const clone = cloneObject(original) | |
expect(clone).toEqual({ | |
key: {}, | |
}) | |
}) | |