using Omika.Core.Services; using Xunit; namespace Omika.Tests.Domain; public class RubriqueSubstitutionEngineTests { [Fact] public void Substitute_ReplacesTokensCaseInsensitively() { var values = new Dictionary(StringComparer.OrdinalIgnoreCase) { ["NomClient"] = "ACME", ["DateIntervention"] = "2026-08-06" }; string result = RubriqueSubstitutionEngine.Substitute( "Bonjour $NOMCLIENT$, intervention du $DateIntervention$.", values); Assert.Equal("Bonjour ACME, intervention du 2026-08-06.", result); } [Fact] public void Substitute_LeavesUnknownTokensUntouched() { var values = new Dictionary { ["NomClient"] = "ACME" }; string result = RubriqueSubstitutionEngine.Substitute( "Bonjour $NomClient$ — $Inconnu$", values); Assert.Equal("Bonjour ACME — $Inconnu$", result); } [Fact] public void Substitute_NullOrEmptyTemplate_ReturnsEmpty() { Assert.Equal(string.Empty, RubriqueSubstitutionEngine.Substitute(null, new Dictionary())); Assert.Equal(string.Empty, RubriqueSubstitutionEngine.Substitute(string.Empty, new Dictionary())); } [Fact] public void Substitute_UnclosedTokenIsLeftUntouched() { string result = RubriqueSubstitutionEngine.Substitute( "Bonjour $NomClient", new Dictionary { ["NomClient"] = "ACME" }); Assert.Equal("Bonjour $NomClient", result); } [Fact] public void ExtractTokens_ReturnsOrderedUniqueTokens() { IReadOnlyList tokens = RubriqueSubstitutionEngine.ExtractTokens( "$A$ puis $B$ et encore $a$"); Assert.Equal(["A", "B"], tokens); } [Fact] public void FindUnknownTokens_ReturnsTokensMissingFromValues() { var values = new Dictionary { ["A"] = "1" }; IReadOnlyList unknown = RubriqueSubstitutionEngine.FindUnknownTokens( "$A$ $B$ $A$", values); Assert.Equal(["B"], unknown); } }