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