using Inspectron.Epson.TemplateEngine.Rendering; namespace Inspectron.Epson.TemplateEngine.Tests; public class LayoutEngineTests { private readonly LayoutEngine _engine = new(); [Fact] public void AlignText_Center() { var result = _engine.AlignText("Hello", "center", 20); Assert.Equal(" Hello", result); } [Fact] public void AlignText_Right() { var result = _engine.AlignText("Hello", "right", 20); Assert.Equal(" Hello", result); } [Fact] public void AlignText_Left() { var result = _engine.AlignText("Hello", "left", 20); Assert.Equal("Hello", result); } [Fact] public void AlignText_TextExceedsWidth_NoChange() { var result = _engine.AlignText("Very long text", "center", 5); Assert.Equal("Very long text", result); } [Fact] public void FormatTwoColumns_BasicLayout() { var result = _engine.FormatTwoColumns("Left", "Right", 20); Assert.Equal(20, result.Length); Assert.StartsWith("Left", result); Assert.EndsWith("Right", result); } [Fact] public void FormatTwoColumnsWithWrap_ShortText_SingleLine() { var result = _engine.FormatTwoColumnsWithWrap("Left", "Right", 20); Assert.Single(result); Assert.Contains("Left", result[0]); Assert.Contains("Right", result[0]); } [Fact] public void FormatTwoColumnsWithWrap_LongLeft_MultipleLines() { var result = _engine.FormatTwoColumnsWithWrap( "This is a very long left column text that needs wrapping", "9.50", 30); Assert.True(result.Count >= 1); Assert.Contains("9.50", result[0]); } [Fact] public void WrapText_ShortText_SingleLine() { var result = _engine.WrapText("Hello world", 20); Assert.Single(result); Assert.Equal("Hello world", result[0]); } [Fact] public void WrapText_LongText_MultipleLines() { var result = _engine.WrapText("The quick brown fox jumps over the lazy dog", 20); Assert.True(result.Count > 1); foreach (var line in result) { Assert.True(line.TrimStart().Length <= 20); } } [Fact] public void WrapText_WithIndent() { var result = _engine.WrapText("The quick brown fox jumps over the lazy dog", 20, indent: 4); Assert.True(result.Count > 1); // First line no indent Assert.False(result[0].StartsWith(" ")); // Subsequent lines indented for (int i = 1; i < result.Count; i++) { Assert.StartsWith(" ", result[i]); } } [Fact] public void CreateSeparator() { var result = _engine.CreateSeparator('-', 42); Assert.Equal(new string('-', 42), result); } [Fact] public void CreateSeparator_CustomChar() { var result = _engine.CreateSeparator('*', 20); Assert.Equal(new string('*', 20), result); } [Fact] public void FormatMultiColumn_BasicLayout() { var columns = new List<(string text, int width, string align)> { ("Col1", 10, "left"), ("Col2", 10, "right"), ("Col3", 10, "center") }; var result = _engine.FormatMultiColumn(columns, 30); Assert.Equal(30, result.Length); } [Fact] public void FormatTable_BasicTable() { var columns = new List<(string text, int width, string align)> { ("Name", 10, "left"), ("Value", 10, "right") }; var headers = new List> { new() { "Name", "Value" } }; var data = new List> { new() { "Item1", "100" }, new() { "Item2", "200" } }; var result = _engine.FormatTable(columns, headers, data, 23); // Should have: top border, header row, separator, 2 data rows, bottom border Assert.Equal(6, result.Count); Assert.StartsWith("+", result[0]); Assert.StartsWith("|", result[1]); Assert.StartsWith("+", result[2]); Assert.StartsWith("|", result[3]); Assert.StartsWith("|", result[4]); Assert.StartsWith("+", result[5]); } }