using System.Reflection; using System.Runtime.InteropServices; using System.Xml.Linq; using Avalonia.Layout; using System.Threading; using Avalonia; using Avalonia.Controls; using Avalonia.Controls.Presenters; using Avalonia.Controls.Templates; using Avalonia.Headless; using Avalonia.Interactivity; using Avalonia.Media; using Avalonia.Styling; using Avalonia.Threading; using Avalonia.VisualTree; using Omika.App.Controls; using Omika.App.Local.Abstractions; using Omika.App.Local.Models; using Omika.App.Local.Services; using Omika.App.Services; using Omika.App.ViewModels; using Omika.App.Views; using Omika.Core.Contracts.Documents; using Omika.Tests.Mobile; // ============================================================================ // Vérification, dans un processus console x64 : // // 1. rejoue les tests [Fact] du champ de dictée déclarés dans Omika.Tests ; // 2. vérifie que les écrans de notes (internes, administratives, photo) // contiennent bien un champ de dictée vocale ; // 3. vérifie la lecture traduite : puce de langue À CÔTÉ du libellé (et non // « ⇄ Traduire »), texte traduit affiché SEUL — sans aucun titre ; // 4. vérifie que chaque écran où un texte peut être traduit porte bien ce // contrôle ; // 5. vérifie que le cadre de signature garde son bouton « Effacer » ; // 6. vérifie que le libellé de chaque bouton est centré dans son cadre ; // 7. vérifie la carte « Langues » : « Actualiser la liste » en tête de carte // et « Annuler » uniquement dans la ligne de la langue téléchargée ; // 8. vérifie que le bloc « Suivi par » a la même charpente qu'une ligne de // contact, boutons téléphone et courriel compris ; // 9. vérifie la préparation de traduction : nombre masqué en même longueur, // fin de phrase ancrée, valeurs réelles restituées (doublon supprimé). // // Aucun test n'est réécrit ici : les méthodes sont découvertes par réflexion et // invoquées sur une instance neuve (comme le fait xunit). // // Sortie : une ligne [OK] / [ECHEC] par contrôle + un bilan, code 1 si un // contrôle échoue. // ============================================================================ int total = 0; int echecs = 0; // ---- 1. Tests du champ de dictée, rejoués depuis le projet de tests -------- const string TypeChampDictee = "Omika.Tests.Mobile.DictationTextFieldTests"; Assembly assemblyTests = typeof(DictationTextFieldTests).Assembly; Type? typeChamp = assemblyTests.GetType(TypeChampDictee); Console.WriteLine("=== Champ de dictée vocale (tests du projet Omika.Tests) ==="); if (typeChamp is null) { Console.WriteLine($"[ECHEC] type de test introuvable : {TypeChampDictee}"); echecs++; } else { MethodInfo[] faits = [.. typeChamp .GetMethods(BindingFlags.Public | BindingFlags.Instance) .Where(m => m.GetCustomAttributes() .Any(a => string.Equals(a.GetType().Name, "FactAttribute", StringComparison.Ordinal))) .OrderBy(m => m.Name, StringComparer.Ordinal)]; Console.WriteLine($"{faits.Length} test(s)"); foreach (MethodInfo fait in faits) { total++; LancerTest(typeChamp, fait); } } // ---- 2. Écrans de notes : le micro de dictée doit être présent ------------- Console.WriteLine(); Console.WriteLine("=== Écrans de notes : champ de dictée vocale ==="); (string Nom, Type Vue)[] ecrans = [ ("Notes internes", typeof(InterventionNotesView)), ("Notes administratives", typeof(InterventionNotesAdministrativesView)), ("Notes d'une photo", typeof(PhotoViewerView)) ]; using (var session = HeadlessUnitTestSession.StartNew(typeof(LayoutTestAppBuilder))) { foreach ((string nom, Type vue) in ecrans) { total++; try { // Moteur de dictée factice « disponible » : c'est la condition dans // laquelle le micro doit apparaître sur le téléphone. PlatformDictation.Current = new MoteurDicteePresent(); session.Dispatch( () => { var ecran = (UserControl)Activator.CreateInstance(vue)!; var fenetre = new Window { Width = 420, Height = 800, Content = ecran }; fenetre.Show(); Dispatcher.UIThread.RunJobs(); DictationTextField[] champs = [.. ecran .GetVisualDescendants() .OfType()]; if (champs.Length == 0) { throw new InvalidOperationException( "aucun champ de dictée trouvé : la note ne peut pas être dictée."); } Button? micro = champs[0].FindControl