Scape/tests/LexerTest.php

106 lines
3.5 KiB
PHP
Raw Normal View History

<?php
declare(strict_types=1);
namespace Scape\Tests;
use PHPUnit\Framework\TestCase;
use Scape\Parser\Lexer;
use Scape\Parser\TokenType;
class LexerTest extends TestCase
{
public function testTokenizesSimpleText(): void
{
$lexer = new Lexer("Hello World");
$tokens = $lexer->tokenize();
$this->assertCount(2, $tokens); // TEXT + EOF
$this->assertEquals(TokenType::TEXT, $tokens[0]->type);
$this->assertEquals("Hello World", $tokens[0]->value);
}
public function testTokenizesInterpolation(): void
{
$lexer = new Lexer("{{ var }}");
$tokens = $lexer->tokenize();
$this->assertCount(4, $tokens); // START, TEXT, END, EOF
$this->assertEquals(TokenType::INTERPOLATION_START, $tokens[0]->type);
$this->assertEquals(TokenType::TEXT, $tokens[1]->type);
$this->assertEquals(" var ", $tokens[1]->value);
$this->assertEquals(TokenType::INTERPOLATION_END, $tokens[2]->type);
}
public function testTokenizesRawInterpolation(): void
{
$lexer = new Lexer("{{{ raw }}}");
$tokens = $lexer->tokenize();
$this->assertCount(4, $tokens);
$this->assertEquals(TokenType::RAW_START, $tokens[0]->type);
$this->assertEquals(" raw ", $tokens[1]->value);
$this->assertEquals(TokenType::RAW_END, $tokens[2]->type);
}
public function testTokenizesLogicTags(): void
{
$lexer = new Lexer("{( foreach item in items )}content{( endforeach )}");
$tokens = $lexer->tokenize();
$this->assertEquals(TokenType::LOGIC_START, $tokens[0]->type);
$this->assertEquals(" foreach item in items ", $tokens[1]->value);
$this->assertEquals(TokenType::LOGIC_END, $tokens[2]->type);
$this->assertEquals("content", $tokens[3]->value);
}
public function testLogicTagConsumesTrailingNewline(): void
{
// Logic tag followed by newline should consume the newline
$lexer = new Lexer("{( foreach )}\nLine 2");
$tokens = $lexer->tokenize();
// 0: START, 1: TEXT(" foreach "), 2: END, 3: TEXT("Line 2"), 4: EOF
$this->assertEquals("Line 2", $tokens[3]->value);
$this->assertEquals(TokenType::TEXT, $tokens[3]->type);
$this->assertEquals(2, $tokens[3]->line);
}
public function testLogicTagConsumesTrailingNewlineWithHeredoc(): void
{
$template = <<<TEMPLATE
{( foreach )}
Line 2
TEMPLATE;
$lexer = new Lexer($template);
$tokens = $lexer->tokenize();
// 0: START, 1: TEXT(" foreach "), 2: END, 3: TEXT("Line 2"), 4: EOF
$this->assertEquals("Line 2", $tokens[3]->value);
$this->assertEquals(TokenType::TEXT, $tokens[3]->type);
$this->assertEquals(2, $tokens[3]->line);
}
public function testBlockTagConsumesTrailingNewline(): void
{
$lexer = new Lexer("{[ extends 'layout' ]}\nContent");
$tokens = $lexer->tokenize();
$this->assertEquals("Content", $tokens[3]->value);
}
public function testLineNumberTracking(): void
{
$template = "Line 1\n{{ var }}\nLine 3";
$lexer = new Lexer($template);
$tokens = $lexer->tokenize();
$this->assertEquals(1, $tokens[0]->line); // "Line 1\n"
$this->assertEquals(2, $tokens[1]->line); // "{{"
$this->assertEquals(2, $tokens[2]->line); // " var "
$this->assertEquals(2, $tokens[3]->line); // "}}"
$this->assertEquals(3, $tokens[4]->line); // "\nLine 3"
}
}