add a persistent settings store
This commit is contained in:
@@ -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));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user