|
JustAnotherDnDGame 0.1.0
Jeu de rôle tactique au d20, vue de dessus, en C++/Qt
|
Statut : fait (vérification automatisée : build /W4 /WX sans avertissement, ctest à 943/943, clang-format, lint d'exigences, lint des lots, cahier de test et Doxygen verts). Prérequis : aucun. Prérequis du LOT-32.
Écrire une routine de lecture JSON avant que la filière contenu n'en ajoute quinze, et créer la capacité de test paramétré que la suite n'avait pas.
Le §10 de la feuille de route attribuait ces deux travaux au LOT-32 — mais son périmètre ne livre que des schémas, un script Python et un test d'énumérations : personne ne portait le travail C++. C'est l'audit qui l'a trouvé, et ce lot qui le fait.
Six réimplémentations de loadFromFile, chacune avec sa validation écrite à la main : hmi::SkinCatalog, hmi::AnimationCatalog, hmi::SoundCatalog, hmi::PixelPalette, core::LevelLoader, core::LevelSequenceLoader. Toutes répétaient la même séquence — accept() puis parse(), racine objet, champ de version absent valant 1, version supérieure refusée — et quatre d'entre elles redéfinissaient les mêmes cinq catégories d'échec sous quatre noms différents.
Aucune ne disait où était l'erreur. nlohmann ne rapporte qu'un décalage en octets, et les six lecteurs le jetaient : le message était « JSON malformé », devant un catalogue de mille lignes.
core::JsonDocument (Source/Core/Data/JsonDocument.{h,cpp}) :
Les six lecteurs migrés. Chacun garde son énumération publique, documentée pour son format, et traduit depuis la catégorie partagée par un switch exhaustif et sans default : ajouter une catégorie d'un côté fait échouer la compilation plutôt que de tomber dans un cas par défaut. C'est la même discipline que TileTypeName.cpp.
La capacité de test paramétré. Source/Test/ ne comptait aucun TEST_P ni aucun parcours de dossier de fixtures. Le lot en pose le premier : Source/Test/Fixtures/Json/ porte six fichiers — valide, tronqué, virgule en trop, racine tableau, version future, version non entière — et un TEST_P vérifie que chacun produit la catégorie annoncée par son nom. Un test supplémentaire vérifie qu'aucune fixture du dossier n'est orpheline : un fichier de fixture qu'aucun test ne lit ne protège de rien.
C'est la capacité qui compte plus que ces six cas : un catalogue de 176 créatures se teste en balayant un dossier, pas en écrivant 176 TEST.
nlohmann_json devient une dépendance PUBLIC de Core. JsonDocument.h expose l'arbre parsé à ses appelants : la bibliothèque fait donc partie de l'interface de Core, et non de son implémentation. La seule façon de l'éviter aurait été d'écrire une façade typée par-dessus nlohmann — soit un second modèle d'arbre à maintenir, pour ne rien gagner d'observable.
La brique parse en laissant l'exception se produire, à l'intérieur. Le mode non-lançant de nlohmann renvoie « document rejeté » sans dire où. L'exception est donc capturée dans la brique pour en extraire la position, et aucune ne franchit la frontière — la garantie d'EX-NFR-040 est tenue au même endroit pour les six lecteurs, au lieu de six fois.
Le défaut de version absente passe de 0 à 1 pour LevelSequenceLoader. Sans effet observable : la version gérée valant 1, les deux valeurs franchissent la même garde. C'est noté ici parce qu'un changement sans effet aujourd'hui en a un le jour où la version gérée monte.