Files
purpur-heights/src/test/java/games/dmg/spigotheights/StatureQueueTest.java
T
dmg 47d5060dac
Release / release (push) Successful in 2m36s
CI / build (push) Successful in 1m1s
feat(heights): add durable temporary throwable stature
2026-09-10 22:41:20 -04:00

69 lines
3.0 KiB
Java

package games.dmg.spigotheights;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;
import org.junit.jupiter.api.Test;
class StatureQueueTest {
@Test
void capturesNextOperationOnlyAfterDurableCompletionAndNeverWritesOnMain() {
ArrayDeque<Runnable> worker = new ArrayDeque<>();
ArrayDeque<Runnable> main = new ArrayDeque<>();
List<String> events = new ArrayList<>();
double[] scale = {1.0};
StatureQueue queue = new StatureQueue(worker::add, main::add);
for (int i = 0; i < 2; i++) {
queue.submit(() -> {
events.add("capture");
double next = scale[0] - 0.2;
return () -> { events.add("save"); return next; };
}, (result, error) -> { assertNull(error); events.add("apply"); scale[0] = result; });
}
assertEquals(List.of("capture"), events);
assertEquals(1.0, scale[0]);
worker.removeFirst().run();
assertEquals(List.of("capture", "save"), events);
assertEquals(1.0, scale[0]);
main.removeFirst().run();
assertEquals(List.of("capture", "save", "apply", "capture"), events);
worker.removeFirst().run(); main.removeFirst().run();
assertEquals(0.6, scale[0], 0.00001);
}
@Test
void shutdownRejectsPendingAndNewOperationsButAllowsInflightSaveToFinish() {
ArrayDeque<Runnable> worker = new ArrayDeque<>();
ArrayDeque<Runnable> main = new ArrayDeque<>();
List<Exception> failures = new ArrayList<>();
StatureQueue queue = new StatureQueue(worker::add, main::add);
queue.submit(() -> () -> 0.8, (result, error) -> assertNull(error));
queue.submit(() -> () -> 0.6, (result, error) -> failures.add(error));
queue.close();
queue.submit(() -> () -> 0.4, (result, error) -> failures.add(error));
assertEquals(2, failures.size());
failures.forEach(org.junit.jupiter.api.Assertions::assertNotNull);
worker.removeFirst().run(); main.removeFirst().run();
assertEquals(0, worker.size());
}
@Test
void failedPersistenceReportsFailureAndDoesNotStrandNextOperation() {
ArrayDeque<Runnable> worker = new ArrayDeque<>();
ArrayDeque<Runnable> main = new ArrayDeque<>();
List<Double> applied = new ArrayList<>();
StatureQueue queue = new StatureQueue(worker::add, main::add);
queue.submit(() -> () -> { throw new java.io.IOException("disk failure"); },
(result, error) -> { assertNull(result); assertNotNull(error); });
queue.submit(() -> () -> 1.4, (result, error) -> { assertNull(error); applied.add(result); });
assertEquals(1, worker.size());
worker.removeFirst().run(); main.removeFirst().run();
worker.removeFirst().run(); main.removeFirst().run();
assertEquals(List.of(1.4), applied);
}
}