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("""
""");
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]);
}
}