using Omika.Core.Observability; namespace Omika.Tests.Observability; /// /// Instrumentation de chaque bouton (T18 étendu) : le FeatureCode est dérivé de façon /// STABLE depuis le nom de la commande ([RelayCommand] → [CallerMemberName]) — suffixe /// Async retiré, conversion en UPPER_SNAKE_CASE, codes canoniques (déjà avec '_') /// préservés, entrées vides → ACTION. Ces transformations sont pures et déterministes. /// public class DiagnosticFeatureCodesTests { [Theory] [InlineData("SaveAsync", "SAVE")] [InlineData("Save", "SAVE")] [InlineData("Delete", "DELETE")] [InlineData("DeleteDocumentAsync", "DELETE_DOCUMENT")] [InlineData("NavigateToIntervention", "NAVIGATE_TO_INTERVENTION")] [InlineData("LoadPdf", "LOAD_PDF")] [InlineData("EmailSend", "EMAIL_SEND")] [InlineData("EMAIL_SEND", "EMAIL_SEND")] [InlineData("ReportGenerate", "REPORT_GENERATE")] [InlineData("INTERVENTION_SEARCH_RUN", "INTERVENTION_SEARCH_RUN")] [InlineData("RotateRight", "ROTATE_RIGHT")] [InlineData("ZoomIn", "ZOOM_IN")] [InlineData("GoBackAsync", "GO_BACK")] [InlineData("", "ACTION")] [InlineData(" ", "ACTION")] [InlineData(null, "ACTION")] public void FromCommandName_NormalizesToStableFeatureCode(string? input, string expected) { Assert.Equal(expected, DiagnosticFeatureCodes.FromCommandName(input)); } }