Files
spigot-base/src/test/java/games/dmg/spigotbase/YamlBaseStateRepositoryTest.java
T
dmg 259ea9410c
Release / release (push) Successful in 2m16s
CI / build (push) Successful in 1m3s
feat(spawning): add spawnable block overlay
2026-08-10 22:46:02 -04:00

128 lines
4.2 KiB
Java

package games.dmg.spigotbase;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import java.nio.file.Files;
import java.nio.file.Path;
import java.time.Instant;
import java.util.Map;
import java.util.Optional;
import java.util.UUID;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
final class YamlBaseStateRepositoryTest {
@TempDir
Path temporaryDirectory;
@Test
void roundTripsCompletePlayerState() throws Exception {
UUID playerId = UUID.randomUUID();
UUID worldId = UUID.randomUUID();
UUID ownerId = UUID.randomUUID();
BaseLocation base = new BaseLocation(worldId, "world", 12, 70, -8, 90.0F, 5.0F);
PlayerState player = new PlayerState(
playerId, "Alex", Optional.of(base), 4, 3, 2, 3, 4,
500, 500, 1_000, 1_000, 2_000, 3_000,
true, true, false, true,
Optional.of(Instant.ofEpochMilli(1_750_000_000_000L)),
Optional.of(Instant.ofEpochMilli(1_750_000_100_000L)),
Map.of(ownerId, Instant.ofEpochMilli(1_750_001_000_000L)),
true,
2_500,
true
);
PersistentState expected = new PersistentState(Map.of(playerId, player));
YamlBaseStateRepository repository =
new YamlBaseStateRepository(temporaryDirectory.resolve("state.yml"));
repository.save(expected);
assertEquals(expected, repository.load());
}
@Test
void olderStateUsesKnownInBasePlacementsAsTotalPlacementMinimum() throws Exception {
UUID playerId = UUID.randomUUID();
Path stateFile = temporaryDirectory.resolve("state.yml");
Files.writeString(stateFile, """
players:
%s:
name: Alex
blocks-placed-in-base: 225
""".formatted(playerId));
PlayerState player = new YamlBaseStateRepository(stateFile)
.load()
.players()
.get(playerId);
assertEquals(225, player.totalBlocksPlaced());
assertFalse(player.spawnableOverlayEnabled());
}
@Test
void olderStateWithoutBorderPreferenceDefaultsToDisabled() throws Exception {
UUID playerId = UUID.randomUUID();
Path stateFile = temporaryDirectory.resolve("state.yml");
Files.writeString(stateFile, """
players:
%s:
name: Alex
""".formatted(playerId));
PlayerState player = new YamlBaseStateRepository(stateFile)
.load()
.players()
.get(playerId);
assertFalse(player.borderEnabled());
}
@Test
void invalidRecordsCannotGrantProgression() throws Exception {
UUID playerId = UUID.randomUUID();
Path stateFile = temporaryDirectory.resolve("state.yml");
Files.writeString(stateFile, """
players:
%s:
name: Alex
base-level: 99
visitors-enabled: true
""".formatted(playerId));
PersistentState loaded = new YamlBaseStateRepository(stateFile).load();
assertFalse(loaded.players().containsKey(playerId));
}
@Test
void preservesUnknownForwardCompatibleFieldsWhenSaving() throws Exception {
UUID playerId = UUID.randomUUID();
Path stateFile = temporaryDirectory.resolve("state.yml");
Files.writeString(stateFile, """
future-root: retained
players:
%s:
name: Alex
future-player-field: retained
""".formatted(playerId));
YamlBaseStateRepository repository = new YamlBaseStateRepository(stateFile);
repository.save(repository.load());
String saved = Files.readString(stateFile);
org.junit.jupiter.api.Assertions.assertTrue(saved.contains("future-root: retained"));
org.junit.jupiter.api.Assertions.assertTrue(saved.contains("future-player-field: retained"));
}
@Test
void missingFileLoadsEmptyState() throws Exception {
YamlBaseStateRepository repository =
new YamlBaseStateRepository(temporaryDirectory.resolve("missing.yml"));
assertEquals(PersistentState.empty(), repository.load());
}
}