using Inspectron.Epson.TemplateEngine.Parsing; namespace Inspectron.Epson.TemplateEngine.Tests; public class TemplateParserTests { private readonly TemplateParser _parser = new(); [Fact] public void Parse_EmptyReceipt() { var result = _parser.Parse(""); Assert.NotNull(result); Assert.Empty(result.Children); } [Fact] public void Parse_InvalidXml_Throws() { Assert.Throws(() => _parser.Parse("not xml")); } [Fact] public void Parse_WrongRoot_Throws() { Assert.Throws(() => _parser.Parse("
")); } [Fact] public void Parse_UnknownElement_Throws() { Assert.Throws(() => _parser.Parse("")); } [Fact] public void Parse_Line_BasicText() { var result = _parser.Parse("Hello"); Assert.Single(result.Children); var line = Assert.IsType(result.Children[0]); Assert.Equal("Hello", line.Text); } [Fact] public void Parse_Line_WithFormatting() { var result = _parser.Parse( """Text"""); var line = Assert.IsType(result.Children[0]); Assert.True(line.Bold); Assert.True(line.Big); Assert.True(line.Tall); Assert.True(line.Red); Assert.Equal("center", line.Align); } [Fact] public void Parse_Line_WithWrap() { var result = _parser.Parse( """Long text"""); var line = Assert.IsType(result.Children[0]); Assert.True(line.Wrap); Assert.Equal(4, line.WrapIndent); } [Fact] public void Parse_Line_WithLineSpacing() { var result = _parser.Parse( """Text"""); var line = Assert.IsType(result.Children[0]); Assert.Equal(50, line.LineSpacing); } [Fact] public void Parse_EmptyLine() { var result = _parser.Parse(""); var line = Assert.IsType(result.Children[0]); Assert.Equal("", line.Text); } [Fact] public void Parse_Columns() { var result = _parser.Parse( """"""); var col = Assert.IsType(result.Children[0]); Assert.Equal("Name", col.Left); Assert.Equal("Price", col.Right); Assert.True(col.Bold); } [Fact] public void Parse_Row_WithColumns() { var result = _parser.Parse(""" Name Value """); var row = Assert.IsType(result.Children[0]); Assert.True(row.Bold); Assert.Equal(2, row.Columns.Count); Assert.Equal("Name", row.Columns[0].Text); Assert.Equal(10, row.Columns[0].Width); Assert.Equal("left", row.Columns[0].Align); Assert.Equal("Value", row.Columns[1].Text); Assert.Equal(10, row.Columns[1].Width); Assert.Equal("right", row.Columns[1].Align); } [Fact] public void Parse_Separator() { var result = _parser.Parse(""); var sep = Assert.IsType(result.Children[0]); Assert.Equal('-', sep.Character); } [Fact] public void Parse_Separator_CustomChar() { var result = _parser.Parse(""""""); var sep = Assert.IsType(result.Children[0]); Assert.Equal('*', sep.Character); } [Fact] public void Parse_Cut() { var result = _parser.Parse(""); Assert.IsType(result.Children[0]); } [Fact] public void Parse_Feed() { var result = _parser.Parse(""""""); var feed = Assert.IsType(result.Children[0]); Assert.Equal(3, feed.Lines); } [Fact] public void Parse_Feed_Default() { var result = _parser.Parse(""); var feed = Assert.IsType(result.Children[0]); Assert.Equal(1, feed.Lines); } [Fact] public void Parse_Foreach() { var result = _parser.Parse(""" {{item.Name}} """); var fe = Assert.IsType(result.Children[0]); Assert.Equal("Items", fe.Items); Assert.Equal("item", fe.Var); Assert.Single(fe.Children); Assert.IsType(fe.Children[0]); } [Fact] public void Parse_Foreach_MissingItems_Throws() { Assert.Throws(() => _parser.Parse("""""")); } [Fact] public void Parse_Foreach_MissingVar_Throws() { Assert.Throws(() => _parser.Parse("""""")); } [Fact] public void Parse_If() { var result = _parser.Parse(""" Has name """); var ifNode = Assert.IsType(result.Children[0]); Assert.Equal("Name", ifNode.Test); Assert.Single(ifNode.Children); } [Fact] public void Parse_If_MissingTest_Throws() { Assert.Throws(() => _parser.Parse("")); } [Fact] public void Parse_IfElse() { var result = _parser.Parse(""" Yes No """); Assert.Equal(2, result.Children.Count); Assert.IsType(result.Children[0]); Assert.IsType(result.Children[1]); } [Fact] public void Parse_NestedForeach() { var result = _parser.Parse(""" {{dish.Name}} """); var outer = Assert.IsType(result.Children[0]); Assert.Equal("Gangs", outer.Items); var inner = Assert.IsType(outer.Children[0]); Assert.Equal("gang.Dishes", inner.Items); } [Fact] public void Parse_Table() { var result = _parser.Parse(""" Header1Header2
"""); var table = Assert.IsType(result.Children[0]); Assert.Equal("Data", table.Items); Assert.Equal("row", table.Var); Assert.Equal(2, table.Columns.Count); } [Fact] public void Parse_ComplexTemplate() { var result = _parser.Parse(""" Title {{item.Name}} DISCOUNT """); Assert.Equal(5, result.Children.Count); Assert.IsType(result.Children[0]); Assert.IsType(result.Children[1]); Assert.IsType(result.Children[2]); Assert.IsType(result.Children[3]); Assert.IsType(result.Children[4]); } }