# 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 via `tests/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 manifests` est bénin (manifeste injecté par `winim`, documenté dans le README). ## Commande de re-vérification ```bash run_tests.cmd ``` (ou `nim c -d:release --app:gui src/nimpulse.nim` pour le binaire) 60 tests au total, tous verts (8 suites).