using Omika.App.Local.Models; namespace Omika.Tests.Mobile; /// /// Tests du vocabulaire du modèle (vocab.json) : conversion pièce ↔ /// identifiant et traduction des identifiants du .spm vers ceux du modèle. /// /// /// Les identifiants utilisés sont réels, mesurés sur /// opus-mt-es-fr : dans son vocabulaire, ▁Ho vaut 584 et , /// vaut 3, alors que le fichier .spm du même modèle les numérote 5293 et /// 4. C'est cette divergence qui rend ce fichier indispensable. /// /// public class VocabulaireModeleTests { private const string Json = """ { "": 0, "": 1, "▁de": 2, ",": 3, ".": 4, "▁la": 5, "▁Ho": 584, ">>fra<<": 14666, "": 74821 } """; /// Pièces telles que le .spm les numérote (5293, 4, 5…). private static string? PieceSpm(int id) => id switch { 5293 => "▁Ho", 4 => ",", 5 => "▁la", _ => null }; [Fact] public void DepuisJson_LitLesIdentifiants() { VocabulaireModele? vocabulaire = VocabulaireModele.DepuisJson(Json); Assert.NotNull(vocabulaire); Assert.Equal(9, vocabulaire.Taille); Assert.Equal(584, vocabulaire.IdDePiece("▁Ho")); Assert.Equal(14666, vocabulaire.IdDePiece(">>fra<<")); Assert.Equal(0, vocabulaire.IdFin); Assert.Equal(1, vocabulaire.IdInconnu); } [Theory] [InlineData(null)] [InlineData("")] [InlineData(" ")] [InlineData("{}")] [InlineData("null")] public void DepuisJson_ContenuVideOuNul_EstTraiteCommeAbsent(string? json) { Assert.Null(VocabulaireModele.DepuisJson(json)); } [Fact] public void DepuisJson_JsonInvalide_EstRefuse() { Assert.Throws(() => VocabulaireModele.DepuisJson("{ pas du json")); } [Fact] public void PieceDeId_EstLInverseDeIdDePiece() { VocabulaireModele vocabulaire = VocabulaireModele.DepuisJson(Json)!; Assert.Equal("▁Ho", vocabulaire.PieceDeId(584)); Assert.Equal(">>fra<<", vocabulaire.PieceDeId(14666)); Assert.Null(vocabulaire.PieceDeId(999)); } [Fact] public void MapperIdentifiants_RemplaceLaNumerotationSpmParCelleDuModele() { VocabulaireModele vocabulaire = VocabulaireModele.DepuisJson(Json)!; // La segmentation donne les identifiants du .spm (5293, 4, 5) : le modèle, // lui, attend 584, 3 et 5. Mapper l'identifiant par lui-même donnerait du // charabia, d'où le passage par la pièce. IReadOnlyList mappes = vocabulaire.MapperIdentifiants([5293, 4, 5], PieceSpm); Assert.Equal([584, 3, 5], mappes); } [Fact] public void MapperIdentifiants_PieceInconnue_DevientLeJetonInconnu() { VocabulaireModele vocabulaire = VocabulaireModele.DepuisJson(Json)!; // « ▁inconnu » n'est pas dans le vocabulaire : la position est conservée // avec le jeton inconnu, plutôt que de décaler la suite de la phrase. IReadOnlyList mappes = vocabulaire.MapperIdentifiants( [5, 999], id => id == 5 ? "▁la" : "▁inconnu"); Assert.Equal([5, 1], mappes); } [Fact] public void PiecesDeIds_OmetLesIdentifiantsHorsVocabulaire() { VocabulaireModele vocabulaire = VocabulaireModele.DepuisJson(Json)!; // 74820 est une ligne de remplissage : aucune pièce, donc aucun texte. IReadOnlyList pieces = vocabulaire.PiecesDeIds([584, 74820, 3]); Assert.Equal(["▁Ho", ","], pieces); } }