Files
Print_server/Inspectron.Epson.Templates.Tests/Language/LexerTests.cs
2026-01-21 15:56:37 +01:00

172 lines
5.2 KiB
C#

using Inspectron.Epson.Templates.Language;
namespace Inspectron.Epson.Templates.Tests.Language;
public class LexerTests
{
[Fact]
public void Tokenize_PlainText_ReturnsTextToken()
{
var lexer = new Lexer("Hello World");
var result = lexer.Tokenize();
Assert.False(result.HasErrors);
Assert.Contains(result.Tokens, t => t.Type == TokenType.Text && t.Value == "Hello World");
}
[Fact]
public void Tokenize_Binding_ReturnsBindingToken()
{
var lexer = new Lexer("{PropertyName}");
var result = lexer.Tokenize();
Assert.False(result.HasErrors);
Assert.Contains(result.Tokens, t => t.Type == TokenType.Binding && t.Value == "PropertyName");
}
[Fact]
public void Tokenize_BindingWithFormat_ReturnsBindingTokenWithFormat()
{
var lexer = new Lexer("{TransactionDateTime:dd-MMM-yy}");
var result = lexer.Tokenize();
Assert.False(result.HasErrors);
Assert.Contains(result.Tokens, t => t.Type == TokenType.Binding && t.Value == "TransactionDateTime:dd-MMM-yy");
}
[Fact]
public void Tokenize_StyleBlock_ReturnsStyleTokens()
{
var lexer = new Lexer("#bold,center# text #");
var result = lexer.Tokenize();
Assert.False(result.HasErrors);
Assert.Contains(result.Tokens, t => t.Type == TokenType.StyleStart && t.Value == "bold,center");
Assert.Contains(result.Tokens, t => t.Type == TokenType.Text && t.Value == " text ");
Assert.Contains(result.Tokens, t => t.Type == TokenType.StyleEnd);
}
[Fact]
public void Tokenize_DashSeparator_ReturnsSeparatorToken()
{
var lexer = new Lexer("---");
var result = lexer.Tokenize();
Assert.False(result.HasErrors);
Assert.Contains(result.Tokens, t => t.Type == TokenType.DashSeparator);
}
[Fact]
public void Tokenize_EqualsSeparator_ReturnsSeparatorToken()
{
var lexer = new Lexer("===");
var result = lexer.Tokenize();
Assert.False(result.HasErrors);
Assert.Contains(result.Tokens, t => t.Type == TokenType.EqualsSeparator);
}
[Fact]
public void Tokenize_StarSeparator_ReturnsSeparatorToken()
{
var lexer = new Lexer("***");
var result = lexer.Tokenize();
Assert.False(result.HasErrors);
Assert.Contains(result.Tokens, t => t.Type == TokenType.StarSeparator);
}
[Fact]
public void Tokenize_IfDirective_ReturnsIfToken()
{
var lexer = new Lexer("@if condition");
var result = lexer.Tokenize();
Assert.False(result.HasErrors);
Assert.Contains(result.Tokens, t => t.Type == TokenType.If && t.Value == "condition");
}
[Fact]
public void Tokenize_ForeachDirective_ReturnsForeachToken()
{
var lexer = new Lexer("@foreach item in items");
var result = lexer.Tokenize();
Assert.False(result.HasErrors);
Assert.Contains(result.Tokens, t => t.Type == TokenType.Foreach && t.Value == "item in items");
}
[Fact]
public void Tokenize_EndDirective_ReturnsEndToken()
{
var lexer = new Lexer("@end");
var result = lexer.Tokenize();
Assert.False(result.HasErrors);
Assert.Contains(result.Tokens, t => t.Type == TokenType.End);
}
[Fact]
public void Tokenize_RowDirectives_ReturnsRowTokens()
{
var lexer = new Lexer("@row\n@endrow");
var result = lexer.Tokenize();
Assert.False(result.HasErrors);
Assert.Contains(result.Tokens, t => t.Type == TokenType.Row);
Assert.Contains(result.Tokens, t => t.Type == TokenType.EndRow);
}
[Fact]
public void Tokenize_Column_ReturnsColumnToken()
{
var lexer = new Lexer("|20|");
var result = lexer.Tokenize();
Assert.False(result.HasErrors);
Assert.Contains(result.Tokens, t => t.Type == TokenType.Column && t.Value.StartsWith("20"));
}
[Fact]
public void Tokenize_ColumnWithAlignment_ReturnsColumnTokenWithAlignment()
{
var lexer = new Lexer("|20,right|");
var result = lexer.Tokenize();
Assert.False(result.HasErrors);
Assert.Contains(result.Tokens, t => t.Type == TokenType.Column && t.Value == "20,right");
}
[Fact]
public void Tokenize_MultipleLines_PreservesLineStructure()
{
var lexer = new Lexer("Line 1\nLine 2\nLine 3");
var result = lexer.Tokenize();
Assert.False(result.HasErrors);
var newlines = result.Tokens.Count(t => t.Type == TokenType.NewLine);
Assert.Equal(3, newlines);
}
[Fact]
public void Tokenize_ComplexTemplate_ParsesCorrectly()
{
var template = @"#bold,center# {Title} #
---
@if HasItems
@foreach item in Items
{item.Name}
@end
@end";
var lexer = new Lexer(template);
var result = lexer.Tokenize();
Assert.False(result.HasErrors);
Assert.Contains(result.Tokens, t => t.Type == TokenType.StyleStart);
Assert.Contains(result.Tokens, t => t.Type == TokenType.DashSeparator);
Assert.Contains(result.Tokens, t => t.Type == TokenType.If);
Assert.Contains(result.Tokens, t => t.Type == TokenType.Foreach);
Assert.Equal(2, result.Tokens.Count(t => t.Type == TokenType.End));
}
}