128 lines
4.2 KiB
Java
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());
|
|
}
|
|
}
|