feat(save): SaveService disk persistence (atomic write, list, load)

This commit is contained in:
2026-06-01 14:44:32 +02:00
parent 1172f7c3fd
commit 8eb433e02d
2 changed files with 167 additions and 0 deletions

View File

@@ -0,0 +1,63 @@
package thb.jeanluc.adventure.save;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import thb.jeanluc.adventure.game.GameSession;
import thb.jeanluc.adventure.loader.WorldLoader;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertThrows;
class SaveServiceTest {
private GameSession freshSession(String slot) {
WorldLoader.LoadResult r = new WorldLoader().load();
return new GameSession(r.world(), r.player(), slot);
}
@Test
void saveThenLoadReproducesState(@TempDir Path dir) {
SaveService svc = new SaveService(dir);
GameSession s = freshSession("my-game");
s.getState().set("power_on");
s.getPlayer().setGold(4);
s.setTurn(9);
svc.save(s);
GameSession loaded = svc.load("my-game");
assertThat(loaded.getState().isSet("power_on")).isTrue();
assertThat(loaded.getPlayer().getGold()).isEqualTo(4);
assertThat(loaded.getTurn()).isEqualTo(9);
assertThat(loaded.getSlotName()).isEqualTo("my-game");
}
@Test
void listReturnsSlotMetadata(@TempDir Path dir) {
SaveService svc = new SaveService(dir);
GameSession s = freshSession("Alpha Run");
s.setTurn(3);
svc.save(s);
List<SaveSlotInfo> slots = svc.list();
assertThat(slots).hasSize(1);
assertThat(slots.getFirst().slotName()).isEqualTo("Alpha Run");
assertThat(slots.getFirst().turn()).isEqualTo(3);
}
@Test
void listSkipsCorruptFiles(@TempDir Path dir) throws Exception {
Files.writeString(dir.resolve("broken.json"), "{ not json");
assertThat(new SaveService(dir).list()).isEmpty();
}
@Test
void loadCorruptFileThrowsSaveException(@TempDir Path dir) throws Exception {
Files.writeString(dir.resolve("bad.json"), "{ not json");
SaveService svc = new SaveService(dir);
assertThrows(SaveException.class, () -> svc.load("bad"));
}
}