From 2d96fe2da77d14d79b3fcc2e5d0e35983f3d269e Mon Sep 17 00:00:00 2001 From: Zixuan Chen Date: Fri, 7 Jun 2024 14:24:03 +0800 Subject: [PATCH] test: update loro-crdt --- 01_basic.test.ts | 16 +++---- 02_text.test.ts | 15 ++++++- 03_version.test.ts | 2 +- 04_time_travel.test.ts | 10 ++--- 05_save_and_load.test.ts | 12 ++--- 06_event.test.ts | 2 +- 07_list.test.ts | 44 +++++++++---------- 08_map.test.ts | 10 ++--- 09_composition.test.ts | 6 +-- ..._and_change.ts => 10_op_and_change.test.ts | 2 +- 11_tree_move.test.ts | 15 +++++++ deno.lock | 22 ++++++++++ 12 files changed, 103 insertions(+), 53 deletions(-) rename 10_op_and_change.ts => 10_op_and_change.test.ts (99%) create mode 100644 11_tree_move.test.ts diff --git a/01_basic.test.ts b/01_basic.test.ts index ed80e8f..b28e7fb 100644 --- a/01_basic.test.ts +++ b/01_basic.test.ts @@ -1,4 +1,4 @@ -import { Loro, LoroList, LoroMap, LoroText } from "npm:loro-crdt@0.15.0" +import { Loro, LoroList, LoroMap, LoroText } from "npm:loro-crdt@0.16.4-alpha.0" import { expect } from "npm:expect@29.7.0" Deno.test("Basic usage", () => { @@ -15,14 +15,14 @@ Deno.test("Basic usage", () => { const map: LoroMap = doc.getMap("map"); // map can only has string key map.set("key", "value"); - expect(doc.toJson()).toStrictEqual({ + expect(doc.toJSON()).toStrictEqual({ list: ["A", "B", "C"], map: { key: "value" } }); // delete 2 element at index 0 list.delete(0, 2) - expect(doc.toJson()).toStrictEqual({ + expect(doc.toJSON()).toStrictEqual({ list: ["C"], map: { key: "value" } }); @@ -39,11 +39,11 @@ Deno.test("Sub containers", () => { // insert a List container at index 0, and get the handler to that list const subList = list.insertContainer(0, new LoroList()); subList.insert(0, "A"); - expect(list.toJson()).toStrictEqual([["A"]]); + expect(list.toJSON()).toStrictEqual([["A"]]); // create a Text container inside the Map container const subtext = map.setContainer("text", new LoroText()); subtext.insert(0, "Hi"); - expect(map.toJson()).toStrictEqual({ text: "Hi" }); + expect(map.toJSON()).toStrictEqual({ text: "Hi" }); }); Deno.test("Sync", () => { @@ -58,7 +58,7 @@ Deno.test("Sync", () => { listA.insert(2, "C"); // B import the ops from A docB.import(docA.exportFrom()); - expect(docB.toJson()).toStrictEqual({ + expect(docB.toJSON()).toStrictEqual({ list: ["A", "B", "C"] }) @@ -68,8 +68,8 @@ Deno.test("Sync", () => { // A import the missing ops from B docA.import(docB.exportFrom(docA.version())) // list at A is now ["A", "C"], with the same state as B - expect(docA.toJson()).toStrictEqual({ + expect(docA.toJSON()).toStrictEqual({ list: ["A", "C"] }); - expect(docA.toJson()).toStrictEqual(docB.toJson()); + expect(docA.toJSON()).toStrictEqual(docB.toJSON()); }) diff --git a/02_text.test.ts b/02_text.test.ts index 77228cb..2dc847a 100644 --- a/02_text.test.ts +++ b/02_text.test.ts @@ -1,6 +1,19 @@ -import { Delta, Loro } from "npm:loro-crdt@0.15.0"; +import { Delta, Loro } from "npm:loro-crdt@0.15.2"; import { expect } from "npm:expect@29.7.0"; +Deno.test("Long text", () => { + /** + * Loro supports text manipulation. + */ + const doc = new Loro(); + const text = doc.getText("text"); + for (let i = 0; i < 1_000_000; i += 1) { + text.insert(i, i.toString()) + } + doc.exportFrom(); + doc.exportSnapshot(); +}); + Deno.test("Text", () => { /** * Loro supports text manipulation. diff --git a/03_version.test.ts b/03_version.test.ts index 7492530..1dd395e 100644 --- a/03_version.test.ts +++ b/03_version.test.ts @@ -1,4 +1,4 @@ -import { Loro, OpId } from "npm:loro-crdt@0.15.0"; +import { Loro, OpId } from "npm:loro-crdt@0.16.4-alpha.0"; import { expect } from "npm:expect@29.7.0"; diff --git a/04_time_travel.test.ts b/04_time_travel.test.ts index 4ba7a26..07ce285 100644 --- a/04_time_travel.test.ts +++ b/04_time_travel.test.ts @@ -1,4 +1,4 @@ -import { Loro } from "npm:loro-crdt@0.15.0"; +import { Loro } from "npm:loro-crdt@0.16.4-alpha.0"; import { expect } from "npm:expect@29.7.0"; Deno.test("Time Travel", () => { @@ -11,24 +11,24 @@ Deno.test("Time Travel", () => { text.insert(0, "Hello"); doc.commit(); text.insert(5, " world"); - expect(doc.toJson()).toStrictEqual({ + expect(doc.toJSON()).toStrictEqual({ text: "Hello world" }); // Every unicode char insertion is a single operation for Text container doc.checkout([{ peer: "0", counter: 0 }]); - expect(doc.toJson()).toStrictEqual({ + expect(doc.toJSON()).toStrictEqual({ text: "H" }); doc.checkout([{ peer: "0", counter: 4 }]); - expect(doc.toJson()).toStrictEqual({ + expect(doc.toJSON()).toStrictEqual({ text: "Hello" }); // Returns to the latest version doc.attach(); - expect(doc.toJson()).toStrictEqual({ + expect(doc.toJSON()).toStrictEqual({ text: "Hello world" }); }) diff --git a/05_save_and_load.test.ts b/05_save_and_load.test.ts index f2fb8b6..05edeb1 100644 --- a/05_save_and_load.test.ts +++ b/05_save_and_load.test.ts @@ -1,4 +1,4 @@ -import { Loro } from "npm:loro-crdt@0.15.0"; +import { Loro } from "npm:loro-crdt@0.16.4-alpha.0"; import { expect } from "npm:expect@29.7.0"; Deno.test("Save and load", () => { @@ -10,7 +10,7 @@ Deno.test("Save and load", () => { const newDoc = new Loro(); newDoc.import(data); - expect(newDoc.toJson()).toStrictEqual({ + expect(newDoc.toJSON()).toStrictEqual({ text: "Hello world!" }); }) @@ -37,19 +37,19 @@ Deno.test("Save and load incrementally", () => { // import the snapshot const newDoc = new Loro(); newDoc.import(data); - expect(newDoc.toJson()).toStrictEqual({ + expect(newDoc.toJSON()).toStrictEqual({ text: "Hello world!" }); // import update0 newDoc.import(update0) - expect(newDoc.toJson()).toStrictEqual({ + expect(newDoc.toJSON()).toStrictEqual({ text: "✨Hello world!" }); // import update1 newDoc.import(update1) - expect(newDoc.toJson()).toStrictEqual({ + expect(newDoc.toJSON()).toStrictEqual({ text: "😶‍🌫️✨Hello world!" }); } @@ -60,7 +60,7 @@ Deno.test("Save and load incrementally", () => { */ const newDoc = new Loro(); newDoc.importUpdateBatch([update1, update0, data]) - expect(newDoc.toJson()).toStrictEqual({ + expect(newDoc.toJSON()).toStrictEqual({ text: "😶‍🌫️✨Hello world!" }); } diff --git a/06_event.test.ts b/06_event.test.ts index dd6439b..cda4454 100644 --- a/06_event.test.ts +++ b/06_event.test.ts @@ -1,4 +1,4 @@ -import { Loro, LoroMap, LoroText, getType } from "npm:loro-crdt@0.15.0"; +import { Loro, LoroMap, LoroText, getType } from "npm:loro-crdt@0.16.4-alpha.0"; import { expect } from "npm:expect@29.7.0"; Deno.test("Event have delta that contains Container", async () => { diff --git a/07_list.test.ts b/07_list.test.ts index 2fc975a..21d5dc4 100644 --- a/07_list.test.ts +++ b/07_list.test.ts @@ -1,4 +1,4 @@ -import { Cursor, Loro } from "npm:loro-crdt@0.15.0"; +import { Cursor, Loro } from "npm:loro-crdt@0.16.4-alpha.0"; import { expect } from "npm:expect@29.7.0"; Deno.test("List", () => { @@ -17,15 +17,15 @@ Deno.test("List", () => { // Concurrently docA and docB update element at index 2 // docA updates it to 8 // docB updates it to 9 - // docA.toJson() should return { list: [0, 1, 8] } - // docB.toJson() should return { list: [0, 1, 9] } + // docA.toJSON() should return { list: [0, 1, 8] } + // docB.toJSON() should return { list: [0, 1, 9] } listB.delete(2, 1); listB.insert(2, 9); - expect(docB.toJson()).toStrictEqual({ list: [0, 1, 9] }); + expect(docB.toJSON()).toStrictEqual({ list: [0, 1, 9] }); listA.delete(2, 1); listA.insert(2, 8); - expect(docA.toJson()).toStrictEqual({ list: [0, 1, 8] }); + expect(docA.toJSON()).toStrictEqual({ list: [0, 1, 8] }); } { @@ -34,8 +34,8 @@ Deno.test("List", () => { docB.import(docA.exportFrom(docB.version())); } - expect(docA.toJson()).toStrictEqual({ list: [0, 1, 8, 9] }); - expect(docB.toJson()).toStrictEqual({ list: [0, 1, 8, 9] }); + expect(docA.toJSON()).toStrictEqual({ list: [0, 1, 8, 9] }); + expect(docB.toJSON()).toStrictEqual({ list: [0, 1, 8, 9] }); }) Deno.test("MovableList", () => { @@ -54,13 +54,13 @@ Deno.test("MovableList", () => { // Concurrently docA and docB update element at index 2 // docA updates it to 8 // docB updates it to 9 - // docA.toJson() should return { list: [0, 1, 8] } - // docB.toJson() should return { list: [0, 1, 9] } + // docA.toJSON() should return { list: [0, 1, 8] } + // docB.toJSON() should return { list: [0, 1, 9] } listA.set(2, 8); - expect(docA.toJson()).toStrictEqual({ list: [0, 1, 8] }); + expect(docA.toJSON()).toStrictEqual({ list: [0, 1, 8] }); listB.set(2, 9); - expect(docB.toJson()).toStrictEqual({ list: [0, 1, 9] }); + expect(docB.toJSON()).toStrictEqual({ list: [0, 1, 9] }); } { @@ -70,20 +70,20 @@ Deno.test("MovableList", () => { } // Converge to [0, 1, 9] because docB has larger peerId thus larger logical time - expect(docA.toJson()).toStrictEqual({ list: [0, 1, 9] }); - expect(docB.toJson()).toStrictEqual({ list: [0, 1, 9] }); + expect(docA.toJSON()).toStrictEqual({ list: [0, 1, 9] }); + expect(docB.toJSON()).toStrictEqual({ list: [0, 1, 9] }); { // Concurrently docA and docB move element at index 0 // docA moves it to 2 // docB moves it to 1 - // docA.toJson() should return { list: [1, 9, 0] } - // docB.toJson() should return { list: [1, 0, 9] } + // docA.toJSON() should return { list: [1, 9, 0] } + // docB.toJSON() should return { list: [1, 0, 9] } listA.move(0, 2); listB.move(0, 1); - expect(docA.toJson()).toStrictEqual({ list: [1, 9, 0] }); - expect(docB.toJson()).toStrictEqual({ list: [1, 0, 9] }); + expect(docA.toJSON()).toStrictEqual({ list: [1, 9, 0] }); + expect(docB.toJSON()).toStrictEqual({ list: [1, 0, 9] }); } { @@ -93,8 +93,8 @@ Deno.test("MovableList", () => { } // Converge to [1, 0, 9] because docB has larger peerId thus larger logical time - expect(docA.toJson()).toStrictEqual({ list: [1, 0, 9] }); - expect(docB.toJson()).toStrictEqual({ list: [1, 0, 9] }); + expect(docA.toJSON()).toStrictEqual({ list: [1, 0, 9] }); + expect(docB.toJSON()).toStrictEqual({ list: [1, 0, 9] }); }) @@ -119,7 +119,7 @@ Deno.test("List Cursors", () => { const listB = docB.getList("list"); docB.import(exported); listB.insert(0, "Foo"); - expect(docB.toJson()).toStrictEqual({ list: ["Foo", "Hello", "World"] }); + expect(docB.toJSON()).toStrictEqual({ list: ["Foo", "Hello", "World"] }); const cursorB = Cursor.decode(encodedCursor); { // The cursor position is shifted to the right by 1 @@ -127,14 +127,14 @@ Deno.test("List Cursors", () => { expect(pos.offset).toBe(2); } listB.insert(1, "Bar"); - expect(docB.toJson()).toStrictEqual({ list: ["Foo", "Bar", "Hello", "World"] }); + expect(docB.toJSON()).toStrictEqual({ list: ["Foo", "Bar", "Hello", "World"] }); { // The cursor position is shifted to the right by 1 const pos = docB.getCursorPos(cursorB); expect(pos.offset).toBe(3); } listB.delete(3, 1); - expect(docB.toJson()).toStrictEqual({ list: ["Foo", "Bar", "Hello"] }); + expect(docB.toJSON()).toStrictEqual({ list: ["Foo", "Bar", "Hello"] }); { // The position cursor points to is now deleted, // but it should still get the position diff --git a/08_map.test.ts b/08_map.test.ts index 0702f96..e6f6510 100644 --- a/08_map.test.ts +++ b/08_map.test.ts @@ -1,4 +1,4 @@ -import { Loro, LoroText } from "npm:loro-crdt@0.15.0"; +import { Loro, LoroText } from "npm:loro-crdt@0.16.4-alpha.0"; import { expect } from "npm:expect@29.7.0"; Deno.test("LoroMap", () => { @@ -14,13 +14,13 @@ Deno.test("LoroMap", () => { const textB = mapB.setContainer("a", new LoroText()); textB.insert(0, "Hi"); - expect(docA.toJson()).toStrictEqual({ map: { a: 1 } }); - expect(docB.toJson()).toStrictEqual({ map: { a: "Hi" } }); + expect(docA.toJSON()).toStrictEqual({ map: { a: 1 } }); + expect(docB.toJSON()).toStrictEqual({ map: { a: "Hi" } }); docA.import(docB.exportSnapshot()); docB.import(docA.exportSnapshot()); - expect(docA.toJson()).toStrictEqual({ map: { a: "Hi" } }); - expect(docB.toJson()).toStrictEqual({ map: { a: "Hi" } }); + expect(docA.toJSON()).toStrictEqual({ map: { a: "Hi" } }); + expect(docB.toJSON()).toStrictEqual({ map: { a: "Hi" } }); }); diff --git a/09_composition.test.ts b/09_composition.test.ts index 6c871c9..9603554 100644 --- a/09_composition.test.ts +++ b/09_composition.test.ts @@ -1,4 +1,4 @@ -import { Loro, LoroList, LoroText } from "npm:loro-crdt@0.15.0"; +import { Loro, LoroList, LoroText } from "npm:loro-crdt@0.16.4-alpha.0"; import { expect } from "npm:expect@29.7.0"; Deno.test("Composition", async () => { @@ -18,7 +18,7 @@ Deno.test("Composition", async () => { // Create a sub container for list // { map: { list: [0, 1, LoroText] } } const text = list.insertContainer(2, new LoroText()); - expect(doc.toJson()).toStrictEqual({ map: { list: [0, 1, ""] } }); + expect(doc.toJSON()).toStrictEqual({ map: { list: [0, 1, ""] } }); { // Commit will trigger the event, because list is a sub container of map doc.commit(); @@ -28,7 +28,7 @@ Deno.test("Composition", async () => { text.insert(0, "Hello, "); text.insert(7, "World!"); - expect(doc.toJson()).toStrictEqual({ map: { list: [0, 1, "Hello, World!"] } }); + expect(doc.toJSON()).toStrictEqual({ map: { list: [0, 1, "Hello, World!"] } }); { // Commit will trigger the event, because text is a descendant of map doc.commit(); diff --git a/10_op_and_change.ts b/10_op_and_change.test.ts similarity index 99% rename from 10_op_and_change.ts rename to 10_op_and_change.test.ts index ef252dd..6259c95 100644 --- a/10_op_and_change.ts +++ b/10_op_and_change.test.ts @@ -1,4 +1,4 @@ -import { Change, Loro, LoroList, LoroText } from "npm:loro-crdt@0.15.0"; +import { Change, Loro, LoroList, LoroText } from "npm:loro-crdt@0.16.4-alpha.0"; import { expect } from "npm:expect@29.7.0"; Deno.test("op and change", () => { diff --git a/11_tree_move.test.ts b/11_tree_move.test.ts new file mode 100644 index 0000000..85126d9 --- /dev/null +++ b/11_tree_move.test.ts @@ -0,0 +1,15 @@ +import { Change, Loro, LoroList, LoroText } from "npm:loro-crdt@0.16.4-alpha.0"; +import { expect } from "npm:expect@29.7.0"; + +Deno.test("Tree move", () => { + const docA = new Loro(); + + const treeA = docA.getTree("tree"); + const node0 = treeA.createNode() + const node1 = treeA.createNode(node0.id, 0); + const node2 = treeA.createNode(node0.id, 1); + node2.moveBefore(node1); + expect(node2.index()).toBe(0); + expect(node1.index()).toBe(1); +}); + diff --git a/deno.lock b/deno.lock index ff2fb9e..4b42bfc 100644 --- a/deno.lock +++ b/deno.lock @@ -4,6 +4,8 @@ "specifiers": { "npm:expect@29.7.0": "npm:expect@29.7.0", "npm:loro-crdt@0.15.0": "npm:loro-crdt@0.15.0", + "npm:loro-crdt@0.15.2": "npm:loro-crdt@0.15.2", + "npm:loro-crdt@0.16.4-alpha.0": "npm:loro-crdt@0.16.4-alpha.0", "npm:loro-crdt@0.6.2": "npm:loro-crdt@0.6.2", "npm:loro-crdt@0.6.3": "npm:loro-crdt@0.6.3" }, @@ -250,6 +252,18 @@ "loro-wasm": "loro-wasm@0.15.0" } }, + "loro-crdt@0.15.2": { + "integrity": "sha512-nIonaOOJezG8GvX784dppfN/jUacXkiJkuVpKRjDxEjdFH8jsCJiZSeZ0B5rzPTX6d/XhQ/SzvkayLZNoHDJYg==", + "dependencies": { + "loro-wasm": "loro-wasm@0.15.2" + } + }, + "loro-crdt@0.16.4-alpha.0": { + "integrity": "sha512-vQP1ONERGYyuoP1xT+DA1ygyMtzv/OQMETVSo3t5zAzU8Gwle6tSWhXGF8t8iZ76MfjlQsGVgYh2l3qIt1/9HQ==", + "dependencies": { + "loro-wasm": "loro-wasm@0.16.4-alpha.0" + } + }, "loro-crdt@0.6.2": { "integrity": "sha512-OsNnZbtWhRMItGKJcpxC+NAXVhXiRrbSh7D07oiAyPUkH2sEXwgRXmS0JN7Qt8JU9BsreOUgsthpyesX95OGXg==", "dependencies": { @@ -266,6 +280,14 @@ "integrity": "sha512-BYVs3z/zs7fW2BXTwHPbVxitJ2l/EdCheT4MhH2ZQGCmi7SKHUoUZ5svW0sksuVmS9potDRcXAgtVvNtfWvCSw==", "dependencies": {} }, + "loro-wasm@0.15.2": { + "integrity": "sha512-HnmEO/q7lRCqbsKzXXFvfIeQR2sPZmL7P5mERJIFymnRoOIaZVImMsp6X+5JkhnjwuHmykIcPpo96UR2duN69Q==", + "dependencies": {} + }, + "loro-wasm@0.16.4-alpha.0": { + "integrity": "sha512-XFJViVwbDo6Ol5yvGYeL6FMaE5tJCn8XtFLicRHc0CvnJTkiRgWDRVtoIUUIsn6/tH0GyaZaAvoqEZmTRA7LWQ==", + "dependencies": {} + }, "loro-wasm@0.6.1": { "integrity": "sha512-rpkUMmbHdoDoWGE28p40Q1fxzWSxdefpqirKglHqEqlkmcU5e5aSarLltklPbf1jtT8E988v8Qx0aA98Z47emw==", "dependencies": {}