@benev/slate
Version:
frontend web stuff
107 lines • 4.34 kB
JavaScript
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