UNPKG

@benev/slate

Version:
107 lines 4.34 kB
import { expect } from "cynic"; import { clone } from "./clone.js"; function checkMapOrSetEquality(original, cloned) { const originalEntries = JSON.stringify(Array.from(original)); const clonedEntries = JSON.stringify(Array.from(cloned)); expect(clonedEntries).equals(originalEntries); expect(cloned).not.equals(original); // check for deep cloning } export default { async "clone primitive types"() { expect(clone(123)).equals(123); expect(clone("abc")).equals("abc"); expect(clone(true)).equals(true); }, async "clone arrays"() { const array = [1, 2, 3]; const clonedArray = clone(array); expect(JSON.stringify(clonedArray)).equals(JSON.stringify(array)); expect(clonedArray).not.equals(array); // check for deep cloning }, async "clone plain objects"() { const object = { foo: "bar", baz: 123 }; const clonedObject = clone(object); expect(JSON.stringify(clonedObject)).equals(JSON.stringify(object)); expect(clonedObject).not.equals(object); // check for deep cloning }, async "clone Map"() { const map = new Map(); map.set("key", "value"); const clonedMap = clone(map); expect(map.get("key")).equals("value"); expect(clonedMap).not.equals(map); }, async "clone Set"() { const set = new Set(); set.add("value"); const clonedSet = clone(set); expect(clonedSet.has("value")).ok(); expect(clonedSet).not.equals(set); }, async "clone Date"() { const date = new Date(); const clonedDate = clone(date); expect(clonedDate.getTime()).equals(date.getTime()); expect(clonedDate).not.equals(date); // check for deep cloning }, async "clone objects with circular reference"() { const object = { foo: "bar" }; object.self = object; // create circular reference let error; try { clone(object); } catch (e) { error = e; } expect(error).not.equals(undefined); expect(error instanceof Error).ok(); }, async "clone nested objects"() { const object = { foo: "bar", inner: { baz: 123, deeper: { qux: true } } }; const clonedObject = clone(object); expect(JSON.stringify(clonedObject)).equals(JSON.stringify(object)); expect(clonedObject).not.equals(object); // check for deep cloning expect(clonedObject.inner).not.equals(object.inner); // check for deep cloning expect(clonedObject.inner.deeper).not.equals(object.inner.deeper); // check for deep cloning }, async "clone array of objects"() { const array = [{ foo: "bar" }, { baz: 123 }, { qux: true }]; const clonedArray = clone(array); expect(JSON.stringify(clonedArray)).equals(JSON.stringify(array)); expect(clonedArray).not.equals(array); // check for deep cloning }, async "clone object with array"() { const object = { foo: "bar", array: [1, 2, 3] }; const clonedObject = clone(object); expect(JSON.stringify(clonedObject)).equals(JSON.stringify(object)); expect(clonedObject).not.equals(object); // check for deep cloning }, async "clone object with Map"() { const map = new Map(); map.set("key", "value"); const object = { foo: "bar", map }; const clonedObject = clone(object); expect(JSON.stringify(clonedObject.foo)).equals(JSON.stringify(object.foo)); checkMapOrSetEquality(object.map, clonedObject.map); }, async "clone object with duplicate sibling references"() { const dupeObject = { id: 1, name: "H4CK3RM4N" }; const data = { obj1: dupeObject, obj2: dupeObject }; let didThrow = false; let clonedData = {}; try { clonedData = clone(data); } catch (error) { didThrow = true; } expect(didThrow).not.equals(true); expect(clonedData.obj1).not.equals(clonedData.obj2); expect(clonedData.obj1.id).equals(1); expect(clonedData.obj1.name).equals("H4CK3RM4N"); expect(clonedData.obj2.id).equals(1); expect(clonedData.obj2.name).equals("H4CK3RM4N"); }, }; //# sourceMappingURL=clone.test.js.map