import { render, waitFor } from "./test-utils"; import ExcalidrawApp from "../excalidraw-app"; import { API } from "./helpers/api"; import { encodePngMetadata, encodeSvgMetadata, decodeSvgMetadata, } from "../data/image"; import { serializeAsJSON } from "../data/json"; const { h } = window; const testElements = [ { ...API.createElement({ type: "text", id: "A", text: "😀", }), // can't get jsdom text measurement to work so this is a temp hack // to ensure the element isn't stripped as invisible width: 16, height: 16, }, ]; // tiny polyfill for TextDecoder.decode on which we depend Object.defineProperty(window, "TextDecoder", { value: class TextDecoder { decode(ab: ArrayBuffer) { return new Uint8Array(ab).reduce( (acc, c) => acc + String.fromCharCode(c), "", ); } }, }); describe("export", () => { beforeEach(async () => { await render(); }); it("export embedded png and reimport", async () => { const pngBlob = await API.loadFile("./fixtures/smiley.png"); const pngBlobEmbedded = await encodePngMetadata({ blob: pngBlob, metadata: serializeAsJSON(testElements, h.state, {}, "local"), }); API.drop(pngBlobEmbedded); await waitFor(() => { expect(h.elements).toEqual([ expect.objectContaining({ type: "text", text: "😀" }), ]); }); }); it("test encoding/decoding scene for SVG export", async () => { const encoded = await encodeSvgMetadata({ text: serializeAsJSON(testElements, h.state, {}, "local"), }); const decoded = JSON.parse(await decodeSvgMetadata({ svg: encoded })); expect(decoded.elements).toEqual([ expect.objectContaining({ type: "text", text: "😀" }), ]); }); it("import embedded png (legacy v1)", async () => { API.drop(await API.loadFile("./fixtures/test_embedded_v1.png")); await waitFor(() => { expect(h.elements).toEqual([ expect.objectContaining({ type: "text", text: "test" }), ]); }); }); it("import embedded png (v2)", async () => { API.drop(await API.loadFile("./fixtures/smiley_embedded_v2.png")); await waitFor(() => { expect(h.elements).toEqual([ expect.objectContaining({ type: "text", text: "😀" }), ]); }); }); it("import embedded svg (legacy v1)", async () => { API.drop(await API.loadFile("./fixtures/test_embedded_v1.svg")); await waitFor(() => { expect(h.elements).toEqual([ expect.objectContaining({ type: "text", text: "test" }), ]); }); }); it("import embedded svg (v2)", async () => { API.drop(await API.loadFile("./fixtures/smiley_embedded_v2.svg")); await waitFor(() => { expect(h.elements).toEqual([ expect.objectContaining({ type: "text", text: "😀" }), ]); }); }); });