Premiere commit - Omika

This commit is contained in:
2026-10-23 18:46:50 +02:00
commit 8ea76c1b24
2155 changed files with 984301 additions and 0 deletions
@@ -0,0 +1,71 @@
using System.Text.RegularExpressions;
using Omika.App.Navigation;
using Omika.Core.Observability;
namespace Omika.Tests.Observability;
/// <summary>
/// T18 (§71/§72) : le mapping AppPage → ScreenCode est total, stable, au format
/// UPPER_SNAKE_CASE ASCII, sans identifiant métier, sans nom technique de Page/ViewModel.
/// </summary>
public partial class DiagnosticScreenMappingTests
{
[Fact]
public void Resolve_EveryAppPage_HasScreenCode()
{
foreach (AppPage page in Enum.GetValues<AppPage>())
{
Assert.True(
DiagnosticScreenMapping.Resolve(page) is not null,
$"AppPage.{page} n'a pas de ScreenCode : le mapping doit être TOTAL sur l'énumération.");
}
}
[Fact]
public void Resolve_ProducesCatalogValues()
{
var catalog = new HashSet<string>(DiagnosticScreenCodes.All, StringComparer.Ordinal);
foreach (AppPage page in Enum.GetValues<AppPage>())
{
string code = DiagnosticScreenMapping.Resolve(page)!;
Assert.Contains(code, catalog);
}
}
[Fact]
public void Resolve_Agenda_ReturnsAgenda()
{
Assert.Equal(DiagnosticScreenCodes.Agenda, DiagnosticScreenMapping.Resolve(AppPage.Home));
}
[Fact]
public void Resolve_SiteDetail_ReturnsSiteDetail()
{
Assert.Equal(DiagnosticScreenCodes.SiteDetail, DiagnosticScreenMapping.Resolve(AppPage.SiteDetail));
}
[Fact]
public void Resolve_InterventionSearch_ReturnsInterventionSearch()
{
Assert.Equal(DiagnosticScreenCodes.InterventionSearch, DiagnosticScreenMapping.Resolve(AppPage.Interventions));
}
[Fact]
public void ScreenCodes_AreUppercaseSnakeCaseAscii_WithoutIds()
{
var regex = UppercaseSnake();
foreach (string code in DiagnosticScreenCodes.All)
{
Assert.Matches(regex, code);
// §72 : aucun ID métier dynamique (site/rendez-vous/intervention/user/GUID).
Assert.DoesNotContain('-', code); // pas de GUID
Assert.DoesNotContain(code, char.IsDigit); // pas de numéro d'ID
Assert.DoesNotContain(code, char.IsLower); // pas de casse libre
}
}
[GeneratedRegex("^[A-Z][A-Z0-9_]*$")]
private static partial Regex UppercaseSnake();
}