97 lines
2.3 KiB
TypeScript
97 lines
2.3 KiB
TypeScript
import { duplicateElement } from "./newElement";
|
|
import { mutateElement } from "./mutateElement";
|
|
import { API } from "../tests/helpers/api";
|
|
|
|
const isPrimitive = (val: any) => {
|
|
const type = typeof val;
|
|
return val == null || (type !== "object" && type !== "function");
|
|
};
|
|
|
|
const assertCloneObjects = (source: any, clone: any) => {
|
|
for (const key in clone) {
|
|
if (clone.hasOwnProperty(key) && !isPrimitive(clone[key])) {
|
|
expect(clone[key]).not.toBe(source[key]);
|
|
if (source[key]) {
|
|
assertCloneObjects(source[key], clone[key]);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
it("clones arrow element", () => {
|
|
const element = API.createElement({
|
|
type: "arrow",
|
|
x: 0,
|
|
y: 0,
|
|
strokeColor: "#000000",
|
|
backgroundColor: "transparent",
|
|
fillStyle: "hachure",
|
|
strokeWidth: 1,
|
|
strokeStyle: "solid",
|
|
strokeSharpness: "round",
|
|
roughness: 1,
|
|
opacity: 100,
|
|
});
|
|
|
|
// @ts-ignore
|
|
element.__proto__ = { hello: "world" };
|
|
|
|
mutateElement(element, {
|
|
points: [
|
|
[1, 2],
|
|
[3, 4],
|
|
],
|
|
});
|
|
|
|
const copy = duplicateElement(null, new Map(), element);
|
|
|
|
assertCloneObjects(element, copy);
|
|
|
|
// @ts-ignore
|
|
expect(copy.__proto__).toEqual({ hello: "world" });
|
|
expect(copy.hasOwnProperty("hello")).toBe(false);
|
|
|
|
expect(copy.points).not.toBe(element.points);
|
|
expect(copy).not.toHaveProperty("shape");
|
|
expect(copy.id).not.toBe(element.id);
|
|
expect(typeof copy.id).toBe("string");
|
|
expect(copy.seed).not.toBe(element.seed);
|
|
expect(typeof copy.seed).toBe("number");
|
|
expect(copy).toEqual({
|
|
...element,
|
|
id: copy.id,
|
|
seed: copy.seed,
|
|
});
|
|
});
|
|
|
|
it("clones text element", () => {
|
|
const element = API.createElement({
|
|
type: "text",
|
|
x: 0,
|
|
y: 0,
|
|
strokeColor: "#000000",
|
|
backgroundColor: "transparent",
|
|
fillStyle: "hachure",
|
|
strokeWidth: 1,
|
|
strokeStyle: "solid",
|
|
strokeSharpness: "round",
|
|
roughness: 1,
|
|
opacity: 100,
|
|
text: "hello",
|
|
fontSize: 20,
|
|
fontFamily: 1,
|
|
textAlign: "left",
|
|
verticalAlign: "top",
|
|
});
|
|
|
|
const copy = duplicateElement(null, new Map(), element);
|
|
|
|
assertCloneObjects(element, copy);
|
|
|
|
expect(copy).not.toHaveProperty("points");
|
|
expect(copy).not.toHaveProperty("shape");
|
|
expect(copy.id).not.toBe(element.id);
|
|
expect(typeof copy.id).toBe("string");
|
|
expect(typeof copy.seed).toBe("number");
|
|
});
|