TrayTempo v0.2.0 : minuteur Pomodoro Windows en Nim avec interface intuitive
This commit is contained in:
@@ -0,0 +1,120 @@
|
||||
## test_config.nim
|
||||
## ================
|
||||
## Tests d'intégration de config.nim : valeurs par défaut, résolution de profil,
|
||||
## round-trip JSON (save/load), tolérance aux fichiers corrompus, et
|
||||
## démarrage automatique via la clé de registre Run.
|
||||
|
||||
import std/[unittest, os]
|
||||
import ../src/config
|
||||
|
||||
# Redirige APPDATA vers un répertoire temporaire pour isoler les fichiers.
|
||||
let tmpApd = getTempDir() / "traytempo_test_apd"
|
||||
if dirExists(tmpApd):
|
||||
removeDir(tmpApd)
|
||||
putEnv("APPDATA", tmpApd)
|
||||
|
||||
suite "config":
|
||||
test "defaultConfig has expected values":
|
||||
let c = defaultConfig()
|
||||
check c.workMin == 25
|
||||
check c.shortBreakMin == 5
|
||||
check c.longBreakMin == 15
|
||||
check c.cyclesBeforeLongBreak == 4
|
||||
check c.soundEnabled == true
|
||||
check c.doNotDisturb == false
|
||||
check c.autoStart == false
|
||||
check c.activeProfile == "Classique"
|
||||
check c.floatingWindow == false
|
||||
check c.profiles.len == 3
|
||||
check c.healthReminders.len == 5
|
||||
|
||||
test "getActiveProfile returns the matching profile":
|
||||
let c = defaultConfig()
|
||||
let p = c.getActiveProfile()
|
||||
check p.name == "Classique"
|
||||
check p.workMin == 25
|
||||
check p.cycles == 4
|
||||
|
||||
test "getActiveProfile falls back to defaults for an unknown name":
|
||||
var c = defaultConfig()
|
||||
c.activeProfile = "N'existe pas"
|
||||
let p = c.getActiveProfile()
|
||||
check p.name == "Défaut"
|
||||
check p.workMin == c.workMin
|
||||
|
||||
test "saveConfig then loadConfig round-trips (including accents)":
|
||||
var c = defaultConfig()
|
||||
c.workMin = 42
|
||||
c.doNotDisturb = true
|
||||
c.activeProfile = "Sprint"
|
||||
saveConfig(c)
|
||||
let l = loadConfig()
|
||||
check l.workMin == 42
|
||||
check l.doNotDisturb == true
|
||||
check l.activeProfile == "Sprint"
|
||||
check l.profiles.len == 3
|
||||
check l.healthReminders.len == 5
|
||||
# UTF-8 (accents) doit survivre à l'aller-retour JSON.
|
||||
check l.healthReminders[0].text == "Lève-toi et marche 2 minutes"
|
||||
|
||||
test "loadConfig returns defaults on a corrupt file":
|
||||
ensureConfigDir()
|
||||
writeFile(configPath(), "{ pas du json valide")
|
||||
let l = loadConfig()
|
||||
check l.workMin == 25
|
||||
check l.profiles.len == 3
|
||||
|
||||
test "new fields (lang, dailyGoal, hotkey, sound) round-trip":
|
||||
var c = defaultConfig()
|
||||
c.lang = "en"
|
||||
c.dailyGoal = 8
|
||||
c.hotkeyModifiers = 0x0003'i32
|
||||
c.hotkeyVk = 0x50'i32
|
||||
c.soundName = "SystemExclamation"
|
||||
c.floatingWindow = true
|
||||
saveConfig(c)
|
||||
let l = loadConfig()
|
||||
check l.lang == "en"
|
||||
check l.dailyGoal == 8
|
||||
check l.hotkeyModifiers == 0x0003'i32
|
||||
check l.hotkeyVk == 0x50'i32
|
||||
check l.soundName == "SystemExclamation"
|
||||
check l.floatingWindow == true
|
||||
|
||||
test "English defaults localize profiles and reminders":
|
||||
let c = defaultConfig(langEn)
|
||||
check c.activeProfile == "Classic"
|
||||
check c.profiles[0].name == "Classic"
|
||||
check c.healthReminders[0].text == "Stand up and walk for 2 minutes"
|
||||
|
||||
test "loadConfig keeps defaults for missing new fields":
|
||||
# Un ancien fichier sans les nouveaux champs doit rester lisible.
|
||||
ensureConfigDir()
|
||||
writeFile(configPath(), "{\"workMin\": 30}")
|
||||
let l = loadConfig()
|
||||
check l.workMin == 30
|
||||
check l.lang == "auto"
|
||||
check l.dailyGoal == 0
|
||||
|
||||
test "configDir returns exe dir in portable mode":
|
||||
let exeDir = getAppFilename().parentDir
|
||||
let marker = exeDir / "portable"
|
||||
writeFile(marker, "")
|
||||
check configDir() == exeDir
|
||||
removeFile(marker)
|
||||
check configDir() == (getEnv("APPDATA") / "TrayTempo")
|
||||
|
||||
test "acquireSingleInstance detects a second lock":
|
||||
check not acquireSingleInstance("TrayTempo_Test_Mutex_0.2.0")
|
||||
check acquireSingleInstance("TrayTempo_Test_Mutex_0.2.0")
|
||||
|
||||
suite "autostart registry":
|
||||
test "setAutostart toggles the Run key and cleans up":
|
||||
let before = isAutostartEnabled()
|
||||
check setAutostart(true)
|
||||
check isAutostartEnabled()
|
||||
check setAutostart(false)
|
||||
check not isAutostartEnabled()
|
||||
# Restaure l'état d'origine pour ne rien laisser traîner.
|
||||
if before:
|
||||
discard setAutostart(true)
|
||||
Reference in New Issue
Block a user