Eyrie-Templates/tests/Parser/LexerTest.php
2026-01-06 17:29:10 -06:00

66 lines
2.2 KiB
PHP

<?php
declare(strict_types=1);
namespace Eyrie\Tests\Parser;
use Eyrie\Parser\Lexer;
use Eyrie\Parser\TokenType;
use PHPUnit\Framework\TestCase;
class LexerTest extends TestCase
{
public function testTokenizeTextOnly(): void
{
$lexer = new Lexer('Hello World');
$tokens = $lexer->tokenize();
$this->assertCount(2, $tokens);
$this->assertEquals(TokenType::TEXT, $tokens[0]->type);
$this->assertEquals('Hello World', $tokens[0]->value);
$this->assertEquals(TokenType::EOF, $tokens[1]->type);
}
public function testTokenizeOutput(): void
{
$lexer = new Lexer('<< name >>');
$tokens = $lexer->tokenize();
$this->assertCount(4, $tokens);
$this->assertEquals(TokenType::OUTPUT_START, $tokens[0]->type);
$this->assertEquals(TokenType::IDENTIFIER, $tokens[1]->type);
$this->assertEquals('name', $tokens[1]->value);
$this->assertEquals(TokenType::OUTPUT_END, $tokens[2]->type);
$this->assertEquals(TokenType::EOF, $tokens[3]->type);
}
public function testTokenizeControl(): void
{
$lexer = new Lexer('<( if true )>');
$tokens = $lexer->tokenize();
$this->assertCount(5, $tokens);
$this->assertEquals(TokenType::CONTROL_START, $tokens[0]->type);
$this->assertEquals(TokenType::IDENTIFIER, $tokens[1]->type);
$this->assertEquals('if', $tokens[1]->value);
$this->assertEquals(TokenType::IDENTIFIER, $tokens[2]->type);
$this->assertEquals('true', $tokens[2]->value);
$this->assertEquals(TokenType::CONTROL_END, $tokens[3]->type);
}
public function testTokenizeMixed(): void
{
$lexer = new Lexer('Hello << name >>!');
$tokens = $lexer->tokenize();
$this->assertCount(6, $tokens);
$this->assertEquals(TokenType::TEXT, $tokens[0]->type);
$this->assertEquals('Hello ', $tokens[0]->value);
$this->assertEquals(TokenType::OUTPUT_START, $tokens[1]->type);
$this->assertEquals(TokenType::IDENTIFIER, $tokens[2]->type);
$this->assertEquals(TokenType::OUTPUT_END, $tokens[3]->type);
$this->assertEquals(TokenType::TEXT, $tokens[4]->type);
$this->assertEquals('!', $tokens[4]->value);
}
}