Nouveau module webserver.nim : mini-serveur HTTP local (port libre a partir de 38943) qui sert des pages HTML generes en Nim - aide (nouvelle entree de menu tray), statistiques et reglages. La page reglages enregistre via POST (config.json) et l'application recharge la configuration au tick suivant. Menu Aide/Statistiques/Reglages ouvrent le navigateur par defaut, avec repli sur les dialogues natifs si le serveur est indisponible. Refactor config/stats (loadConfigFrom/saveConfigTo, loadStatsFrom/saveStatsTo) pour tester sans toucher aux fichiers reels. 8 suites de tests (60 tests), ajout de test_webserver avec integration HTTP reelle.
7.2 KiB
7.2 KiB
Vérification NimPulse
Table de correspondance entre chaque exigence de la spécification, le contrôle concret effectué, et le résultat observé.
Fonctionnalités principales
| # | Exigence | Contrôle concret | Résultat observé |
|---|---|---|---|
| 1 | Icône system tray (démarre minimisé, pas de fenêtre intrusive) | tests/test_tray_integration.nim : addTrayIcon → Shell_NotifyIcon(NIM_ADD) retourne true |
OK (API réussit, icône ajoutée) |
| 1a | Menu contextuel (Démarrer/Pause/Arrêter, Profils, Paramètres, Statistiques, Quitter) | Construction du menu dans tray.nim (CreatePopupMenu/AppendMenu/TrackPopupMenu) |
Compile ; affichage non inspecté visuellement |
| 1b | Icône dynamique selon l'état (travail/pause courte/pause longue/pause) | tests/test_tray_integration.nim : phaseIcon retourne un HICON non nul pour les 5 phases |
OK (5 icônes GDI générées) |
| 1c | Tooltip temps restant | updateTrayIcon(NIF_TIP) appelé dans le test d'intégration |
OK (NIM_MODIFY sans erreur) |
| 2 | Durées configurables + profils + sauvegarde %APPDATA%\NimPulse |
tests/test_timer.nim (17 tests) + tests/test_config.nim (round-trip JSON, accents UTF-8, champs manquants) |
17 + 9 tests OK |
| 3 | Rappels santé configurables, rotation sans répétition | tests/test_notifications.nim (5 tests) |
5 tests OK |
| 4 | Notifications natives (toast / NIF_INFO) + son optionnel |
tests/test_tray_integration.nim : showToast (NIF_INFO) sans erreur + playSound("SystemAsterisk") retourne true |
OK (API ; rendu toast et son audible non observés) |
| 5 | Statistiques (jour/semaine/total, streak, historique, CSV) | tests/test_stats.nim (10 tests) |
10 tests OK |
| 6 | Démarrage auto (registre Run) |
tests/test_config.nim « setAutostart toggles the Run key and cleans up » |
OK |
| 6b | Mode « Ne pas déranger » | champ doNotDisturb + branche dans onWorkCompleted |
Compile ; logique vérifiée par relecture |
| 6c | Raccourci global (Ctrl+Alt+P, configurable) | tests/test_tray_integration.nim : RegisterHotKey/UnregisterHotKey retournent non-zéro |
OK |
Fonctionnalités ajoutées (v0.2.0)
| # | Exigence | Contrôle concret | Résultat observé |
|---|---|---|---|
| 7 | Mono-instance (mutex nommé) | config.nim acquireSingleInstance ; tests/test_config.nim « acquireSingleInstance detects a second lock » |
OK (première acquisition → false, seconde → true) |
| 8 | Fix du bug cycleCount (reset sur stop) |
tests/test_timer.nim « stop resets cycleCount » |
OK |
| 9 | Sauter / prolonger une pause | tests/test_timer.nim (skipBreak, extendBreak, isBreak) |
4 tests OK |
| 10 | Internationalisation (fr/en) | i18n.nim : deux bundles Strings, détection langue système ; tests/test_config.nim « English defaults » |
OK |
| 11 | Panneau de réglages (wNim) | dialogs.nim (wDialog/wFrame + contrôles wNim) |
Compile + lancement réel de l'app |
| 12 | Objectif journalier | stats.nim goalReached ; tests/test_stats.nim « goalReached is true only when the goal is exactly met » |
OK |
| 13 | Hotkey et son configurables | champs hotkeyModifiers/hotkeyVk/soundName ; tests/test_config.nim round-trip |
OK |
| 14 | Mode portable | configDir() ; tests/test_config.nim « configDir returns exe dir in portable mode » |
OK (mode portable → exe dir, sinon APPDATA) |
| 15 | Mise à jour (comparaison de versions) | tests/test_updater.nim (5 tests) |
5 tests OK |
| 16 | Fenêtre flottante (toujours au-dessus, texte agrandi) | tests/test_floating.nim (show/update/hide une vraie fenêtre Win32) + floatingWindow round-trip |
OK (fenêtre créée/mise à jour/détruite sans erreur) |
Fonctionnalité ajoutée (pages web locales)
| # | Exigence | Contrôle concret | Résultat observé |
|---|---|---|---|
| 17 | Section Aide expliquant le fonctionnement | menu tray « Aide » (IdHelpPage) + page /help générée (fr/en) |
OK (tests/test_webserver.nim : page rendue, GET HTTP réel) |
| 18 | Statistiques présentées en page web locale | page /stats (jour/semaine/streak/total, 7 jours) servie par le serveur local |
OK (GET réel via httpclient dans le test d'intégration) |
| 19 | Réglages en page web locale avec sauvegarde | page /settings (formulaire + rappels santé) ; POST /settings écrit config.json et pose le drapeau de rechargement |
OK (POST réel : valeurs relues dans le fichier, page mise à jour) |
| 20 | Serveur local 127.0.0.1, port libre à partir de 38943 | startWebServer() dans tests/test_webserver.nim |
OK (port 38943, requêtes GET/POST traitées) |
| 21 | Aucune donnée ne quitte l'ordinateur | serveur lié à 127.0.0.1 uniquement |
OK (relecture de code) |
| 22 | Repli sur les dialogues natifs si serveur indisponible | branche gServerPort > 0 dans nimpulse.nim |
Compile ; logique vérifiée par relecture |
Contraintes techniques
| Contrainte | Contrôle concret | Résultat observé |
|---|---|---|
| Nim ≥ 2.0 | Compilé avec Nim 2.2.10 | OK |
| winim | nimble install winim (3.9.4) |
OK |
| Binaire unique < 5 Mo | dir src\nimpulse.exe |
~594 Ko |
nim c -d:release --app:gui |
commande exacte exécutée | compile SuccessX |
Modules (tray/timer/notifications/config/stats/i18n/dialogs/floating/updater) |
ls src/ |
10 modules présents (dialogs basé sur wNim) |
Boucle messages + SetTimer/WM_TIMER |
GetMessage loop + SetTimer/WM_TIMER dans nimpulse.nim |
Compile + timer décrémenté (testé via tick) |
Livrables
| Livrable | Contrôle | Résultat |
|---|---|---|
Structure + nimpulse.nimble |
fichier présent, requires winim |
OK |
| Code source commenté (tous modules) | en-têtes ## de module + commentaires |
OK |
| README + instructions compilation | README.md (compile, config, archi, tests, distribution) |
OK |
| Config exemple + profils par défaut | config.example.json (3 profils, 5 rappels, nouveaux champs) |
OK |
| Script de release (portable) | release.cmd exécuté |
OK (zip créé) |
| Script d'installation | installer/nimpulse.iss présent |
OK (nécessite Inno Setup pour compiler) |
Limites connues de la vérification
- Les codes de retour des API Win32 (ajout/suppression d'icône tray,
génération d'icônes, notification, hotkey, son via
PlaySound) sont vérifiés viatests/test_tray_integration.nim. Seul le rendu visuel (aspect de l'icône, contenu exact du toast, menu déroulant, boîtes de dialogue) et le son audible restent non observables dans l'environnement automatisé. - La mise à jour automatique n'est pas testée en conditions réelles (aucun serveur de version configuré) ; la comparaison de versions est testée unitairement.
- L'avertissement d'édition de liens
multiple non-default manifestsest bénin (manifeste injecté parwinim, documenté dans le README).
Commande de re-vérification
run_tests.cmd
(ou nim c -d:release --app:gui src/nimpulse.nim pour le binaire)
60 tests au total, tous verts (8 suites).