Update Document
This commit is contained in:
parent
aa701961c8
commit
788ae0f364
@ -26,6 +26,16 @@ public class ArrayCharBag implements CharBag {
|
|||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Char get(int index) {
|
||||||
|
return chars.get(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int size() {
|
||||||
|
return chars.size();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return chars.stream()
|
return chars.stream()
|
||||||
|
@ -1,3 +1,8 @@
|
|||||||
package me.mrletsplay.shareclientcore.document;
|
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, '$');
|
||||||
|
|
||||||
|
}
|
||||||
|
@ -20,4 +20,24 @@ public interface CharBag {
|
|||||||
*/
|
*/
|
||||||
public int remove(Char character);
|
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();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -3,8 +3,39 @@ package me.mrletsplay.shareclientcore.document;
|
|||||||
public class Document {
|
public class Document {
|
||||||
|
|
||||||
private CharBag charBag;
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -47,7 +47,7 @@ public class Util {
|
|||||||
throw new RuntimeException("Invalid site order");
|
throw new RuntimeException("Invalid site order");
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return newPosition.toArray(Identifier[]::new);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int[] getIncremented(Identifier[] before, Identifier[] after, int offset) {
|
public static int[] getIncremented(Identifier[] before, Identifier[] after, int offset) {
|
||||||
|
@ -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"));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user