69 lines
3.0 KiB
Java
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);
|
|
}
|
|
}
|