Docs : audit doc↔code v1.5.0 — effectifs réels + leçon #63 (§14)

Constats de l'audit systématique (leçon #44 : toute affirmation doit être
vérifiée dans le fichier réel) :
- effectifs de régression RÉELS : 4 classes = 6/6/6/5 = 23 tests (doc
  disait 4 pour la classe 4) → « 160 sans les données locales » (183−23)
  corrigé dans §8, §8.bis, §16, footer et README ; les vieux chiffres
  (44/87 v1.3.x, 150/172 v1.4.x) épinglés comme historiques
- §14 : entrée #63 ajoutée à l'historique des bugs (elle était citée en
  §7.10 mais absente de la liste « à ne pas réintroduire »)
This commit is contained in:
Siphonight 2026-09-11 16:27:46 +02:00
parent 04f6b8bd64
commit dd5a9e3013
2 changed files with 25 additions and 9 deletions

View File

@ -16,7 +16,7 @@ sauvegarde JSON. **100 % local, aucun compte, aucun serveur.**
> à titre informatif — ce ne sont pas des mesures. Fie-toi toujours à tes analyses de > à titre informatif — ce ne sont pas des mesures. Fie-toi toujours à tes analyses de
> sang et aux consignes de ton endocrinologue. > sang et aux consignes de ton endocrinologue.
- **Statut** : v1.5.0 — build Android ✅, **lint vert** ✅, **183 tests unitaires** ✅ (161 sans les données de test locales ; régressions épinglées sur données réelles **non versionnées**), intégration montre = notifications ✅, **dépôt Gitea privé + releases avec APK** ✅ - **Statut** : v1.5.0 — build Android ✅, **lint vert** ✅, **183 tests unitaires** ✅ (160 sans les données de test locales ; régressions épinglées sur données réelles **non versionnées**), intégration montre = notifications ✅, **dépôt Gitea privé + releases avec APK** ✅
- **Journal des versions** : [docs/CHANGELOG.md](docs/CHANGELOG.md) - **Journal des versions** : [docs/CHANGELOG.md](docs/CHANGELOG.md)
- **Guide utilisateur** : [docs/GUIDE_INSTALLATION.md](docs/GUIDE_INSTALLATION.md) - **Guide utilisateur** : [docs/GUIDE_INSTALLATION.md](docs/GUIDE_INSTALLATION.md)
- **Doc de développement** (architecture, maths, décisions, bugs) : [docs/DEVELOPPEMENT.md](docs/DEVELOPPEMENT.md) - **Doc de développement** (architecture, maths, décisions, bugs) : [docs/DEVELOPPEMENT.md](docs/DEVELOPPEMENT.md)
@ -100,7 +100,7 @@ par AGP si les licences sont signées). Le wrapper télécharge Gradle 9.7.1.
git clone <repo> && cd HormoneTrack git clone <repo> && cd HormoneTrack
echo "sdk.dir=/chemin/vers/android-sdk" > local.properties # ou ANDROID_HOME echo "sdk.dir=/chemin/vers/android-sdk" > local.properties # ou ANDROID_HOME
./gradlew assembleDebug # APK : app/build/outputs/apk/debug/app-debug.apk ./gradlew assembleDebug # APK : app/build/outputs/apk/debug/app-debug.apk
./gradlew testDebugUnitTest # 172 tests (150 sans les données locales) ./gradlew testDebugUnitTest # 183 tests (160 sans les données locales)
./gradlew lint # lint vert obligatoire avant release ./gradlew lint # lint vert obligatoire avant release
``` ```

View File

@ -514,9 +514,9 @@ MAIS passant par tous les points ».
## 8. Tests unitaires ## 8. Tests unitaires
**183 tests JVM, tous verts** (`./gradlew testDebugUnitTest`) — **161 sans **183 tests JVM, tous verts** (`./gradlew testDebugUnitTest`) — **160 sans
les données de test locales** (cf §8.bis : les 3 classes de régression, les données de test locales** (cf §8.bis : les 4 classes de régression,
6 tests chacune, sont skippées via `Assume`). Dépendance : JUnit 4.13.2. 6/6/6/5 tests, sont skippées via `Assume`). Dépendance : JUnit 4.13.2.
Emplacement : `app/src/test/java/com/hormonetrack/`. Répertoire de travail d'exécution = Emplacement : `app/src/test/java/com/hormonetrack/`. Répertoire de travail d'exécution =
`app/` → l'asset est lu via `src/main/assets/pk_profiles.json` (fallback `app/src/…`). `app/` → l'asset est lu via `src/main/assets/pk_profiles.json` (fallback `app/src/…`).
@ -589,7 +589,8 @@ dépôt (ni maintenant, ni si le repo devient public un jour).
dans le code (le scanner refuserait, et ce serait une fuite). dans le code (le scanner refuserait, et ce serait une fuite).
- les tests font `Assume.assumeTrue(file.exists())` dans le `@Before` : **sans le - les tests font `Assume.assumeTrue(file.exists())` dans le `@Before` : **sans le
fichier, la classe est IGNORÉE** (skipped, pas failed) — un clone neuf ou une CI fichier, la classe est IGNORÉE** (skipped, pas failed) — un clone neuf ou une CI
exécute 44 tests au lieu de 87 ; exécute 160 tests au lieu de 183 (v1.5.0 ; chiffres historiques : 44/87 à v1.3.x,
150/172 à v1.4.x) ;
- le workdir des tests Gradle est le dossier du module (`app/`) → les tests - le workdir des tests Gradle est le dossier du module (`app/`) → les tests
cherchent les fichiers à plusieurs chemins (`../local-test-data/…` en premier) ; cherchent les fichiers à plusieurs chemins (`../local-test-data/…` en premier) ;
- **pour les lancer** : exporter un backup JSON depuis l'app → l'enregistrer sous - **pour les lancer** : exporter un backup JSON depuis l'app → l'enregistrer sous
@ -1343,6 +1344,21 @@ l'exemple) :**
seulement au boot/save). Leçon : toute logique de scheduling doit vivre seulement au boot/save). Leçon : toute logique de scheduling doit vivre
au MOTEUR (testable JVM), pas dans les composants Android. au MOTEUR (testable JVM), pas dans les composants Android.
63. **Légende du graphique dupliquée + chip coupé hors fenêtre** (v1.5.0,
constat émulateur §16.ter) : l'ajout de la série « Tracé labs »
(clé `"LAB"` dans la liste `curves`) tombait dans le `else` de la
boucle de légende → la légende « E2/T Transfem Science » s'imprimait
une 2ᵉ fois ; et le 4ᵉ chip de la rangée modèles sortait de la
fenêtre sur écran 1080 px (rangée à largeur fixe, absent du dump
uiautomator — même famille que #57 : un ajout de rangée doit être
testé par dump, pas seulement par le code). FIX : (a) branche
explicite `"LAB" -> {}` dans la boucle de légende (légende dédiée
plus bas) ; (b) `horizontalScroll(rememberScrollState())` CONFINÉ à
la RANGÉE de chips (le pan/pinch du graphique reste sur le Card — le
fix #62 visait un scroll VERTICAL parent ; ici le scroll est local,
pas de conflit). Leçon : quand une liste clé→série reçoit une nouvelle
clé, GREPPER chaque consommateur de la liste (légende, stats, styles).
**Leçons** : (a) ne jamais croire un build « probablement bon » sans l'avoir lancé ; **Leçons** : (a) ne jamais croire un build « probablement bon » sans l'avoir lancé ;
(b) les tests sémantiques attrapent ce que la compilation ne voit pas ; (c) se méfier des (b) les tests sémantiques attrapent ce que la compilation ne voit pas ; (c) se méfier des
constantes stdlib « de mémoire » (`ln2`), des mélanges Float/Double, et des APIs M3 constantes stdlib « de mémoire » (`ln2`), des mélanges Float/Double, et des APIs M3
@ -1492,8 +1508,8 @@ vérifie pas en tests JVM).
1. **Bumper la version** dans `app/build.gradle.kts` : `versionCode = N+1`, 1. **Bumper la version** dans `app/build.gradle.kts` : `versionCode = N+1`,
`versionName = "X.Y.Z+1"` (SemVer : fix = Z, feature = Y). `versionName = "X.Y.Z+1"` (SemVer : fix = Z, feature = Y).
2. **Tests verts obligatoires** : `./gradlew testDebugUnitTest` — 183 au 2. **Tests verts obligatoires** : `./gradlew testDebugUnitTest` — 183 au
total, 161 si `local-test-data/` est absent (les 3 classes de régression total, 160 si `local-test-data/` est absent (les 4 classes de régression
réelles sont skippées via `Assume`, 6 tests chacune) ; **lint vert réelles sont skippées via `Assume`, 6/6/6/5 tests) ; **lint vert
obligatoire** : `./gradlew lint` (v1.3.4 — `StringFormatMatches` aurait obligatoire** : `./gradlew lint` (v1.3.4 — `StringFormatMatches` aurait
attrapé les crashs #47/#48 dès v1.3.1). Paliers de test du projet : attrapé les crashs #47/#48 dès v1.3.1). Paliers de test du projet :
chaque commit = tests + lint ; release = + scan confidentialité + APK au chaque commit = tests + lint ; release = + scan confidentialité + APK au
@ -1840,7 +1856,7 @@ Sur le téléphone de test (à compléter par l'utilisatrice) :
tap ; et TOUTES les courbes affichées reflètent la calibration (test) tap ; et TOUTES les courbes affichées reflètent la calibration (test)
--- ---
*Doc mise à jour le 11 sept. 2026 (v1.5.0) — build OK, lint vert, 183/183 tests verts (161 sans *Doc mise à jour le 11 sept. 2026 (v1.5.0) — build OK, lint vert, 183/183 tests verts (160 sans
les données locales), dépôts Gitea (cloudyfy + farewell) avec releases APK, aucune donnée les données locales), dépôts Gitea (cloudyfy + farewell) avec releases APK, aucune donnée
de santé dans le dépôt ni l'historique. Fil des corrections : v1.3.3 = reprise de de santé dans le dépôt ni l'historique. Fil des corrections : v1.3.3 = reprise de
maintenance (permissions agenda, export logs IO, bump de version) ; v1.3.4 = 2 crashs maintenance (permissions agenda, export logs IO, bump de version) ; v1.3.4 = 2 crashs