From 788ae0f3645eac09cc9706201ee56b5ecf294474 Mon Sep 17 00:00:00 2001 From: MrLetsplay Date: Thu, 23 Nov 2023 20:00:03 +0100 Subject: [PATCH] Update Document --- .../document/ArrayCharBag.java | 10 ++++++ .../shareclientcore/document/Char.java | 7 +++- .../shareclientcore/document/CharBag.java | 20 +++++++++++ .../shareclientcore/document/Document.java | 33 ++++++++++++++++++- .../shareclientcore/document/Util.java | 2 +- .../shareclientcore/DocumentTest.java | 31 +++++++++++++++++ 6 files changed, 100 insertions(+), 3 deletions(-) create mode 100644 src/test/java/me/mrletsplay/shareclientcore/DocumentTest.java diff --git a/src/main/java/me/mrletsplay/shareclientcore/document/ArrayCharBag.java b/src/main/java/me/mrletsplay/shareclientcore/document/ArrayCharBag.java index 736de20..9dd8a63 100644 --- a/src/main/java/me/mrletsplay/shareclientcore/document/ArrayCharBag.java +++ b/src/main/java/me/mrletsplay/shareclientcore/document/ArrayCharBag.java @@ -26,6 +26,16 @@ public class ArrayCharBag implements CharBag { return i; } + @Override + public Char get(int index) { + return chars.get(index); + } + + @Override + public int size() { + return chars.size(); + } + @Override public String toString() { return chars.stream() diff --git a/src/main/java/me/mrletsplay/shareclientcore/document/Char.java b/src/main/java/me/mrletsplay/shareclientcore/document/Char.java index d98e793..fcf2338 100644 --- a/src/main/java/me/mrletsplay/shareclientcore/document/Char.java +++ b/src/main/java/me/mrletsplay/shareclientcore/document/Char.java @@ -1,3 +1,8 @@ package me.mrletsplay.shareclientcore.document; -public record Char(Identifier[] position, int lamport, String value) {} +public record Char(Identifier[] position, int lamport, char value) { + + public static final Char START_OF_DOCUMENT = new Char(new Identifier[] { new Identifier(1, 0) }, 0, '^'); + public static final Char END_OF_DOCUMENT = new Char(new Identifier[] { new Identifier(Util.BASE - 1, 0) }, 0, '$'); + +} diff --git a/src/main/java/me/mrletsplay/shareclientcore/document/CharBag.java b/src/main/java/me/mrletsplay/shareclientcore/document/CharBag.java index 83deafe..4be6f88 100644 --- a/src/main/java/me/mrletsplay/shareclientcore/document/CharBag.java +++ b/src/main/java/me/mrletsplay/shareclientcore/document/CharBag.java @@ -20,4 +20,24 @@ public interface CharBag { */ public int remove(Char character); + /** + * Finds the character at the given index and returns it + * @param index The index of the character + * @return The character + */ + public Char get(int index); + + /** + * Returns the number of chars in this bag + * @return The number of chars + */ + public int size(); + + /** + * Collects the chars in this bag ordered by their position into a string + * @return A string containing the chars + */ + @Override + public String toString(); + } diff --git a/src/main/java/me/mrletsplay/shareclientcore/document/Document.java b/src/main/java/me/mrletsplay/shareclientcore/document/Document.java index f7db531..047d44a 100644 --- a/src/main/java/me/mrletsplay/shareclientcore/document/Document.java +++ b/src/main/java/me/mrletsplay/shareclientcore/document/Document.java @@ -3,8 +3,39 @@ package me.mrletsplay.shareclientcore.document; public class Document { private CharBag charBag; + private int site; + private int lamport; - public Document() { + public Document(int site) { + this.charBag = new ArrayCharBag(); + charBag.add(Char.START_OF_DOCUMENT); + charBag.add(Char.END_OF_DOCUMENT); + + this.site = site; + } + + public void localInsert(int index, String str) { + if(index < 0 || index >= charBag.size() - 1) throw new IllegalArgumentException("Index out of bounds"); + + Char charBefore = charBag.get(index); + Char charAfter = charBag.get(index +1); + + for(char c : str.toCharArray()) { + Identifier[] newPos = Util.generatePositionBetween(charBefore.position(), charAfter.position(), site); + lamport++; + Char ch = new Char(newPos, lamport, c); + charBag.add(ch); + charBefore = ch; + } + } + + public CharBag getCharBag() { + return charBag; + } + + public String getContents() { + String contents = charBag.toString(); + return contents.substring(1, contents.length() - 1); } } diff --git a/src/main/java/me/mrletsplay/shareclientcore/document/Util.java b/src/main/java/me/mrletsplay/shareclientcore/document/Util.java index ea883a6..8247b3e 100644 --- a/src/main/java/me/mrletsplay/shareclientcore/document/Util.java +++ b/src/main/java/me/mrletsplay/shareclientcore/document/Util.java @@ -47,7 +47,7 @@ public class Util { throw new RuntimeException("Invalid site order"); } - return null; + return newPosition.toArray(Identifier[]::new); } public static int[] getIncremented(Identifier[] before, Identifier[] after, int offset) { diff --git a/src/test/java/me/mrletsplay/shareclientcore/DocumentTest.java b/src/test/java/me/mrletsplay/shareclientcore/DocumentTest.java new file mode 100644 index 0000000..385acc0 --- /dev/null +++ b/src/test/java/me/mrletsplay/shareclientcore/DocumentTest.java @@ -0,0 +1,31 @@ +package me.mrletsplay.shareclientcore; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import org.junit.jupiter.api.Test; + +import me.mrletsplay.shareclientcore.document.Document; + +public class DocumentTest { + + @Test + public void testLocalInsert() { + Document doc = new Document(1); + doc.localInsert(0, "Hello"); + assertEquals("Hello", doc.getContents()); + doc.localInsert(5, " World"); + assertEquals("Hello World", doc.getContents()); + doc.localInsert(5, " Test"); + assertEquals("Hello Test World", doc.getContents()); + } + + @Test + public void testLocalInsertInvalidIndexFails() { + Document doc = new Document(1); + doc.localInsert(0, "Hello"); + assertThrows(IllegalArgumentException.class, () -> doc.localInsert(-1, "Test")); + assertThrows(IllegalArgumentException.class, () -> doc.localInsert(6, "Test")); + } + +}