diff --git a/source/Handlebars.Test/Issues/Issue434Tests.cs b/source/Handlebars.Test/Issues/Issue434Tests.cs index c1844278..ffe875b1 100644 --- a/source/Handlebars.Test/Issues/Issue434Tests.cs +++ b/source/Handlebars.Test/Issues/Issue434Tests.cs @@ -14,9 +14,7 @@ public void Issue434_CaseSensitiveLookupWithSameSpellingVariables() data.TEST = "Upper"; data.test = "Lower"; var result = template(data); - var parts = result.Split(' '); - Assert.Equal("Upper", parts[0]); - Assert.Equal("Lower", parts[1]); + Assert.Equal("Upper Lower", result); } } } diff --git a/source/Handlebars.Test/Issues/Issue559Tests.cs b/source/Handlebars.Test/Issues/Issue559Tests.cs new file mode 100644 index 00000000..2f0b2c8e --- /dev/null +++ b/source/Handlebars.Test/Issues/Issue559Tests.cs @@ -0,0 +1,44 @@ +using Xunit; +using Xunit.Abstractions; + +namespace HandlebarsDotNet.Test +{ + public class Issue559Tests + { + private readonly ITestOutputHelper _output; + + public Issue559Tests(ITestOutputHelper output) + { + _output = output; + } + + [Fact] + public void WriteSafeString_ConsistentRegardlessOfRegistrationOrder() + { + HandlebarsHelper link_to = (writer, context, parameters) => + writer.WriteSafeString($"{context["text"]}"); + + string source = "Click here: {{link_to}}"; + var data = new { url = "https://example.com", text = "Click" }; + + // Register BEFORE compile + var h1 = Handlebars.Create(); + h1.RegisterHelper("link_to", link_to); + var t1 = h1.Compile(source); + var result1 = t1(data); + + // Register AFTER compile + var h2 = Handlebars.Create(); + var t2 = h2.Compile(source); + h2.RegisterHelper("link_to", link_to); + var result2 = t2(data); + + _output.WriteLine($"result1 (before compile): {result1}"); + _output.WriteLine($"result2 (after compile): {result2}"); + + // Both should produce identical, unescaped HTML + Assert.Equal(result1, result2); + Assert.Contains("