test(04-01): add failing tests for WandSelectionStore pure-data store
This commit is contained in:
@@ -0,0 +1,114 @@
|
||||
package com.mythlane.gravityflip.wand;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
/**
|
||||
* Pure-data tests for {@link WandSelectionStore} — no Hytale runtime dependency.
|
||||
* Covers set/get per UUID, overwrite semantics, unknown UUID default, clear,
|
||||
* and concurrent writes.
|
||||
*/
|
||||
class WandSelectionStoreTest {
|
||||
|
||||
@Test
|
||||
void setPos1AndPos2_thenGet_returnsBothCoords() {
|
||||
WandSelectionStore store = new WandSelectionStore();
|
||||
UUID u = UUID.randomUUID();
|
||||
store.setPos1(u, 1, 2, 3);
|
||||
store.setPos2(u, 4, 5, 6);
|
||||
|
||||
WandSelectionStore.Selection sel = store.get(u);
|
||||
assertNotNull(sel);
|
||||
assertArrayEquals(new int[]{1, 2, 3}, sel.pos1);
|
||||
assertArrayEquals(new int[]{4, 5, 6}, sel.pos2);
|
||||
assertTrue(sel.isComplete());
|
||||
}
|
||||
|
||||
@Test
|
||||
void independentPerUuid() {
|
||||
WandSelectionStore store = new WandSelectionStore();
|
||||
UUID a = UUID.randomUUID();
|
||||
UUID b = UUID.randomUUID();
|
||||
store.setPos1(a, 10, 10, 10);
|
||||
store.setPos2(b, 20, 20, 20);
|
||||
|
||||
WandSelectionStore.Selection selA = store.get(a);
|
||||
WandSelectionStore.Selection selB = store.get(b);
|
||||
assertArrayEquals(new int[]{10, 10, 10}, selA.pos1);
|
||||
assertNull(selA.pos2);
|
||||
assertNull(selB.pos1);
|
||||
assertArrayEquals(new int[]{20, 20, 20}, selB.pos2);
|
||||
}
|
||||
|
||||
@Test
|
||||
void setPos1_overwritesPreviousPos1_withoutTouchingPos2() {
|
||||
WandSelectionStore store = new WandSelectionStore();
|
||||
UUID u = UUID.randomUUID();
|
||||
store.setPos1(u, 1, 1, 1);
|
||||
store.setPos2(u, 2, 2, 2);
|
||||
store.setPos1(u, 9, 9, 9);
|
||||
|
||||
WandSelectionStore.Selection sel = store.get(u);
|
||||
assertArrayEquals(new int[]{9, 9, 9}, sel.pos1);
|
||||
assertArrayEquals(new int[]{2, 2, 2}, sel.pos2);
|
||||
}
|
||||
|
||||
@Test
|
||||
void get_unknownUuid_returnsEmptySelection() {
|
||||
WandSelectionStore store = new WandSelectionStore();
|
||||
WandSelectionStore.Selection sel = store.get(UUID.randomUUID());
|
||||
assertNotNull(sel);
|
||||
assertNull(sel.pos1);
|
||||
assertNull(sel.pos2);
|
||||
assertFalse(sel.isComplete());
|
||||
}
|
||||
|
||||
@Test
|
||||
void clear_removesSelectionForUuid() {
|
||||
WandSelectionStore store = new WandSelectionStore();
|
||||
UUID u = UUID.randomUUID();
|
||||
store.setPos1(u, 1, 2, 3);
|
||||
store.setPos2(u, 4, 5, 6);
|
||||
store.clear(u);
|
||||
|
||||
WandSelectionStore.Selection sel = store.get(u);
|
||||
assertNull(sel.pos1);
|
||||
assertNull(sel.pos2);
|
||||
}
|
||||
|
||||
@Test
|
||||
void concurrentSetPos1AndPos2_noLostWrites() throws InterruptedException {
|
||||
WandSelectionStore store = new WandSelectionStore();
|
||||
UUID u = UUID.randomUUID();
|
||||
CountDownLatch start = new CountDownLatch(1);
|
||||
CountDownLatch done = new CountDownLatch(2);
|
||||
|
||||
Thread t1 = new Thread(() -> {
|
||||
try { start.await(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); return; }
|
||||
store.setPos1(u, 7, 7, 7);
|
||||
done.countDown();
|
||||
});
|
||||
Thread t2 = new Thread(() -> {
|
||||
try { start.await(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); return; }
|
||||
store.setPos2(u, 8, 8, 8);
|
||||
done.countDown();
|
||||
});
|
||||
t1.start();
|
||||
t2.start();
|
||||
start.countDown();
|
||||
assertTrue(done.await(2, TimeUnit.SECONDS));
|
||||
|
||||
WandSelectionStore.Selection sel = store.get(u);
|
||||
assertArrayEquals(new int[]{7, 7, 7}, sel.pos1);
|
||||
assertArrayEquals(new int[]{8, 8, 8}, sel.pos2);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user