packages/bison-parser/tests/Unit/Scanner/TokenTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Scanner;
6
7use BisonParser\Ast\Location;
8use BisonParser\Scanner\Token;
9use BisonParser\Scanner\TokenKind;
10use PHPUnit\Framework\Attributes\CoversClass;
11use PHPUnit\Framework\Attributes\Small;
12use PHPUnit\Framework\Attributes\UsesClass;
13use PHPUnit\Framework\TestCase;
14
15#[CoversClass(Token::class)]
16#[UsesClass(Location::class)]
17#[UsesClass(TokenKind::class)]
18#[Small]
19final class TokenTest extends TestCase
20{
21    public function testIs(): void
22    {
23        $token = new Token(TokenKind::Pipe, '|', new Location(1, 1));
24
25        self::assertTrue($token->is(TokenKind::Pipe));
26        self::assertFalse($token->is(TokenKind::Colon));
27        self::assertSame('', $token->raw);
28    }
29
30    public function testIsDirective(): void
31    {
32        $directive = new Token(TokenKind::Directive, 'token', new Location(1, 1), '%term');
33
34        self::assertTrue($directive->isDirective('token'));
35        self::assertFalse($directive->isDirective('term'));
36        self::assertFalse((new Token(TokenKind::Identifier, 'token', new Location(1, 1)))->isDirective('token'));
37    }
38
39    public function testDescribe(): void
40    {
41        self::assertSame("'%token'", (new Token(TokenKind::Directive, 'token', new Location(1, 1), '%token'))->describe());
42        self::assertSame("'expr'", (new Token(TokenKind::IdentifierColon, 'expr', new Location(1, 1)))->describe());
43        self::assertSame("'expr'", (new Token(TokenKind::Identifier, 'expr', new Location(1, 1)))->describe());
44        self::assertSame("';'", (new Token(TokenKind::Semicolon, ';', new Location(1, 1)))->describe());
45        self::assertSame("'%%'", (new Token(TokenKind::Section, '%%', new Location(1, 1)))->describe());
46        self::assertSame('braced code', (new Token(TokenKind::Code, ' x ', new Location(1, 1)))->describe());
47        self::assertSame('end of file', (new Token(TokenKind::End, '', new Location(1, 1)))->describe());
48    }
49}
50