add a persistent settings store

This commit is contained in:
bea
2026-10-01 23:30:41 +02:00
parent a3c750c479
commit 8b869fe4e9
5 changed files with 436 additions and 0 deletions
@@ -0,0 +1,125 @@
package wtf.beatrice.autosqueal.config;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
class ConfigStoreTest
{
@TempDir
Path tempDir;
private ConfigStore store;
@BeforeEach
void createStore() {
store = new ConfigStore(tempDir.resolve("autosqueal.properties"));
}
@Test
void missingFileYieldsTheDefaults() {
AutoSquealConfig config = store.load();
assertEquals(30, config.getAwayThresholdSeconds());
assertEquals(10, config.getMoveIntervalSeconds());
assertEquals(2, config.getStepDelayMilliseconds());
assertTrue(config.isClickEnabled());
assertEquals(5, config.getClickEveryNMoves());
assertEquals(ScreenArea.PRIMARY, config.getMovementScreen());
assertTrue(config.isStartAutomatically());
assertTrue(config.isHotkeyEnabled());
}
@Test
void savedSettingsLoadBack() {
AutoSquealConfig config = new AutoSquealConfig();
config.setAwayThresholdSeconds(45);
config.setMoveIntervalSeconds(20);
config.setStepDelayMilliseconds(4);
config.setClickEnabled(false);
config.setClickEveryNMoves(7);
config.setMovementScreen(ScreenArea.ALL);
config.setStartAutomatically(false);
config.setHotkeyEnabled(false);
store.save(config);
AutoSquealConfig loaded = store.load();
assertEquals(45, loaded.getAwayThresholdSeconds());
assertEquals(20, loaded.getMoveIntervalSeconds());
assertEquals(4, loaded.getStepDelayMilliseconds());
assertFalse(loaded.isClickEnabled());
assertEquals(7, loaded.getClickEveryNMoves());
assertEquals(ScreenArea.ALL, loaded.getMovementScreen());
assertFalse(loaded.isStartAutomatically());
assertFalse(loaded.isHotkeyEnabled());
}
@Test
void outOfRangeValuesAreClamped() throws IOException {
writeFile(ConfigStore.KEY_AWAY_THRESHOLD_SECONDS + "=0",
ConfigStore.KEY_MOVE_INTERVAL_SECONDS + "=99999999",
ConfigStore.KEY_STEP_DELAY_MILLISECONDS + "=-3",
ConfigStore.KEY_CLICK_EVERY_N_MOVES + "=1000");
AutoSquealConfig config = store.load();
assertEquals(5, config.getAwayThresholdSeconds());
assertEquals(3600, config.getMoveIntervalSeconds());
assertEquals(1, config.getStepDelayMilliseconds());
assertEquals(100, config.getClickEveryNMoves());
}
@Test
void invalidValuesKeepTheDefaults() throws IOException {
writeFile(ConfigStore.KEY_AWAY_THRESHOLD_SECONDS + "=soon",
ConfigStore.KEY_CLICK_ENABLED + "=banana",
ConfigStore.KEY_MOVEMENT_SCREEN + "=THE_MOON",
ConfigStore.KEY_MOVE_INTERVAL_SECONDS + "=15");
AutoSquealConfig config = store.load();
assertEquals(30, config.getAwayThresholdSeconds());
assertTrue(config.isClickEnabled());
assertEquals(ScreenArea.PRIMARY, config.getMovementScreen());
// the one valid value still loads
assertEquals(15, config.getMoveIntervalSeconds());
}
@Test
void settingsSettersClampToo() {
AutoSquealConfig config = new AutoSquealConfig();
config.setAwayThresholdSeconds(-10);
assertEquals(5, config.getAwayThresholdSeconds());
config.setAwayThresholdSeconds(10_000);
assertEquals(600, config.getAwayThresholdSeconds());
config.setMovementScreen(null);
assertEquals(ScreenArea.PRIMARY, config.getMovementScreen());
}
@Test
void savingNeverLeavesTempFilesBehind() throws IOException {
store.save(new AutoSquealConfig());
assertTrue(Files.isRegularFile(tempDir.resolve("autosqueal.properties")));
try (var files = Files.list(tempDir)) {
assertEquals(1, files.count());
}
}
private void writeFile(String... lines) throws IOException {
Files.write(tempDir.resolve("autosqueal.properties"), List.of(lines));
}
}