Improve ArrayCharBag
This commit is contained in:
parent
f918093097
commit
941a0973e7
6
pom.xml
6
pom.xml
@ -61,6 +61,12 @@
|
|||||||
<version>5.10.1</version>
|
<version>5.10.1</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.junit.jupiter</groupId>
|
||||||
|
<artifactId>junit-jupiter-params</artifactId>
|
||||||
|
<version>5.10.1</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.java-websocket</groupId>
|
<groupId>org.java-websocket</groupId>
|
||||||
<artifactId>Java-WebSocket</artifactId>
|
<artifactId>Java-WebSocket</artifactId>
|
||||||
|
@ -27,15 +27,40 @@ public class ArrayCharBag implements CharBag {
|
|||||||
this(Collections.emptyList());
|
this(Collections.emptyList());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finds the index of a character if it is contained within the bag, or the index it would be inserted at if it is not contained in the bag.
|
||||||
|
* @param character The character to find
|
||||||
|
* @return The index the character was found or would be inserted at
|
||||||
|
*/
|
||||||
|
private int indexOf(Char character) {
|
||||||
|
int lo = 0, hi = chars.size() - 1;
|
||||||
|
|
||||||
|
while(hi >= lo) {
|
||||||
|
int mid = (lo + hi) / 2;
|
||||||
|
Char c = get(mid);
|
||||||
|
|
||||||
|
int comp = Util.compareChars(c, character);
|
||||||
|
if(comp == 0) return mid;
|
||||||
|
|
||||||
|
if(comp < 0) {
|
||||||
|
lo = mid + 1;
|
||||||
|
}else {
|
||||||
|
hi = mid - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return lo;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int add(Char character) {
|
public int add(Char character) {
|
||||||
int i = 0;
|
int i = indexOf(character);
|
||||||
// TODO: use binary search
|
|
||||||
while(i < chars.size() && Util.compareChars(chars.get(i), character) < 0) i++;
|
|
||||||
if(i < chars.size() && Util.compareChars(chars.get(i), character) == 0) {
|
if(i < chars.size() && Util.compareChars(chars.get(i), character) == 0) {
|
||||||
debugValues.increment(DEBUG_INSERTIONS_DROPPED);
|
debugValues.increment(DEBUG_INSERTIONS_DROPPED);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
chars.add(i, character);
|
chars.add(i, character);
|
||||||
debugValues.increment(DEBUG_INSERTIONS);
|
debugValues.increment(DEBUG_INSERTIONS);
|
||||||
return i;
|
return i;
|
||||||
@ -43,13 +68,12 @@ public class ArrayCharBag implements CharBag {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int remove(Char character) {
|
public int remove(Char character) {
|
||||||
int i = 0;
|
int i = indexOf(character);
|
||||||
// TODO: use binary search
|
|
||||||
while(i < chars.size() && Util.compareChars(chars.get(i), character) < 0) i++;
|
|
||||||
if(i == chars.size() || Util.compareChars(chars.get(i), character) != 0) {
|
if(i == chars.size() || Util.compareChars(chars.get(i), character) != 0) {
|
||||||
debugValues.increment(DEBUG_DELETIONS_DROPPED);
|
debugValues.increment(DEBUG_DELETIONS_DROPPED);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
chars.remove(i);
|
chars.remove(i);
|
||||||
debugValues.increment(DEBUG_DELETIONS);
|
debugValues.increment(DEBUG_DELETIONS);
|
||||||
return i;
|
return i;
|
||||||
|
95
src/test/java/me/mrletsplay/shareclientcore/CharBagTest.java
Normal file
95
src/test/java/me/mrletsplay/shareclientcore/CharBagTest.java
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
package me.mrletsplay.shareclientcore;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.junit.jupiter.params.ParameterizedTest;
|
||||||
|
import org.junit.jupiter.params.provider.ValueSource;
|
||||||
|
|
||||||
|
import me.mrletsplay.shareclientcore.document.ArrayCharBag;
|
||||||
|
import me.mrletsplay.shareclientcore.document.Char;
|
||||||
|
import me.mrletsplay.shareclientcore.document.CharBag;
|
||||||
|
import me.mrletsplay.shareclientcore.document.Identifier;
|
||||||
|
|
||||||
|
public class CharBagTest {
|
||||||
|
|
||||||
|
private CharBag createBag(Class<? extends CharBag> bagClass) {
|
||||||
|
return assertDoesNotThrow(() -> bagClass.getDeclaredConstructor().newInstance());
|
||||||
|
}
|
||||||
|
|
||||||
|
@ParameterizedTest
|
||||||
|
@ValueSource(classes = { ArrayCharBag.class })
|
||||||
|
public void testCharBagAdd(Class<? extends CharBag> bagClass) {
|
||||||
|
CharBag bag = createBag(bagClass);
|
||||||
|
Char c = new Char(new Identifier[] { new Identifier(0, 0) }, 0, (byte) 0);
|
||||||
|
assertEquals(0, bag.add(c));
|
||||||
|
assertEquals(List.of(c), bag.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
@ParameterizedTest
|
||||||
|
@ValueSource(classes = { ArrayCharBag.class })
|
||||||
|
public void testCharBagAddBetween(Class<? extends CharBag> bagClass) {
|
||||||
|
CharBag bag = createBag(bagClass);
|
||||||
|
Char c = new Char(new Identifier[] { new Identifier(0, 0) }, 0, (byte) 0);
|
||||||
|
Char c2 = new Char(new Identifier[] { new Identifier(1, 0) }, 1, (byte) 0);
|
||||||
|
Char cBetween = new Char(new Identifier[] { new Identifier(0, 1) }, 2, (byte) 0);
|
||||||
|
|
||||||
|
bag.add(c);
|
||||||
|
bag.add(c2);
|
||||||
|
|
||||||
|
assertEquals(List.of(c, c2), bag.toList());
|
||||||
|
|
||||||
|
assertEquals(1, bag.add(cBetween));
|
||||||
|
|
||||||
|
assertEquals(List.of(c, cBetween, c2), bag.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
@ParameterizedTest
|
||||||
|
@ValueSource(classes = { ArrayCharBag.class })
|
||||||
|
public void testCharBagRemove(Class<? extends CharBag> bagClass) {
|
||||||
|
CharBag bag = createBag(bagClass);
|
||||||
|
Char c = new Char(new Identifier[] { new Identifier(0, 0) }, 0, (byte) 0);
|
||||||
|
bag.add(c);
|
||||||
|
assertEquals(0, bag.remove(c));
|
||||||
|
assertEquals(Collections.emptyList(), bag.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
@ParameterizedTest
|
||||||
|
@ValueSource(classes = { ArrayCharBag.class })
|
||||||
|
public void testCharBagGet(Class<? extends CharBag> bagClass) {
|
||||||
|
CharBag bag = createBag(bagClass);
|
||||||
|
Char c = new Char(new Identifier[] { new Identifier(0, 0) }, 0, (byte) 0);
|
||||||
|
Char c2 = new Char(new Identifier[] { new Identifier(0, 1) }, 2, (byte) 0);
|
||||||
|
Char c3 = new Char(new Identifier[] { new Identifier(1, 0) }, 1, (byte) 0);
|
||||||
|
|
||||||
|
bag.add(c);
|
||||||
|
bag.add(c3);
|
||||||
|
bag.add(c2);
|
||||||
|
|
||||||
|
assertEquals(List.of(c, c2, c3), bag.toList());
|
||||||
|
assertEquals(c2, bag.get(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ParameterizedTest
|
||||||
|
@ValueSource(classes = { ArrayCharBag.class })
|
||||||
|
public void testCharBagClear(Class<? extends CharBag> bagClass) {
|
||||||
|
CharBag bag = createBag(bagClass);
|
||||||
|
Char c = new Char(new Identifier[] { new Identifier(0, 0) }, 0, (byte) 0);
|
||||||
|
Char c2 = new Char(new Identifier[] { new Identifier(0, 1) }, 2, (byte) 0);
|
||||||
|
Char c3 = new Char(new Identifier[] { new Identifier(1, 0) }, 1, (byte) 0);
|
||||||
|
|
||||||
|
bag.add(c);
|
||||||
|
bag.add(c3);
|
||||||
|
bag.add(c2);
|
||||||
|
|
||||||
|
assertEquals(List.of(c, c2, c3), bag.toList());
|
||||||
|
|
||||||
|
bag.clear();
|
||||||
|
|
||||||
|
assertEquals(Collections.emptyList(), bag.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user