using System;
using System.Linq;
using Xunit;
namespace Server.Tests;
///
/// Tests for the Html.EscapeHtml extension methods.
/// These tests verify correct HTML entity escaping and edge cases.
///
[Collection("Sequential Server Tests")]
public class HtmlEscapeTests
{
[Theory(DisplayName = "No escaping needed")]
[InlineData("")]
[InlineData("Hello World")]
[InlineData("Plain text without special characters")]
[InlineData("123456789")]
[InlineData("!@#$%^*()_+-=[]{}|;:,.?")]
public void EscapeHtml_NoSpecialCharacters_ReturnsUnchanged(string input)
{
var result = input.EscapeHtml();
Assert.Equal(input, result);
}
[Theory(DisplayName = "Single character escaping")]
[InlineData("<", "<")]
[InlineData(">", ">")]
[InlineData("&", "&")]
[InlineData("\"", """)]
[InlineData("'", "'")]
public void EscapeHtml_SingleSpecialCharacter_EscapesCorrectly(string input, string expected)
{
var result = input.EscapeHtml();
Assert.Equal(expected, result);
}
[Theory(DisplayName = "Complex mixed scenarios")]
[InlineData("
Hello & goodbye
", "<p>Hello & goodbye</p>")]
[InlineData("<already>", "<already>")]
[InlineData("", "<tag attr="value" data='test'>")]
[InlineData("ac&d\"e'f", "a<b>c&d"e'f")]
[InlineData(" ", " ")]
public void EscapeHtml_ComplexScenarios_EscapesAllSpecialCharacters(string input, string expected)
{
var result = input.EscapeHtml();
Assert.Equal(expected, result);
}
[Fact(DisplayName = "Null string input")]
public void EscapeHtml_NullString_ReturnsEmpty()
{
string? input = null;
var result = input.EscapeHtml();
Assert.Empty(result);
}
[Fact(DisplayName = "Consecutive special characters")]
public void EscapeHtml_ConsecutiveSpecialCharacters_EscapesAll()
{
const string input = "<<>>&&\"\"''";
const string expected = "<<>>&&""''";
var result = input.EscapeHtml();
Assert.Equal(expected, result);
}
[Fact(DisplayName = "Performance: long string with special characters")]
public void EscapeHtml_LongStringWithSpecialCharacters_HandlesCorrectly()
{
var input = $"Start{new string('<', 100)}End{new string('&', 100)}Final";
var expected =
$"Start{string.Join("", Enumerable.Repeat("<", 100))}End{string.Join("", Enumerable.Repeat("&", 100))}Final";
var result = input.EscapeHtml();
Assert.Equal(expected, result);
}
[Fact(DisplayName = "Unicode characters")]
public void EscapeHtml_UnicodeCharacters_PreservedWithSpecialCharsEscaped()
{
const string input = "Hello δΈη & π";
const string expected = "Hello δΈη <test> & π";
var result = input.EscapeHtml();
Assert.Equal(expected, result);
}
}