packages/ztd-query-core/tests/Unit/Sql/LexicalPatternTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Sql;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use ZtdQuery\Exception\InvalidDefinitionException;
11use ZtdQuery\Sql\LexicalPattern;
12
13#[CoversClass(LexicalPattern::class)]
14#[UsesClass(InvalidDefinitionException::class)]
15final class LexicalPatternTest extends TestCase
16{
17    public function testMatchAtAnswersWhatThePatternMatchedThere(): void
18    {
19        self::assertSame('12', (new LexicalPattern())->matchAt('/^\d+/', 'x12y', 1));
20    }
21
22    public function testMatchAtIsNothingWhereThePatternMatchedNoCharacterAtAll(): void
23    {
24        self::assertNull((new LexicalPattern())->matchAt('/^\d*/', 'abc', 0));
25    }
26
27    public function testMatchAtIsNothingWhereThePatternDidNotMatch(): void
28    {
29        self::assertNull((new LexicalPattern())->matchAt('/^\d+/', 'abc', 0));
30    }
31
32    public function testMatchAtIsNothingWhereTheDialectDeclaredNoPattern(): void
33    {
34        self::assertNull((new LexicalPattern())->matchAt(null, 'abc', 0));
35    }
36
37    public function testMatchesCharacterReportsACharacterThePatternAccepts(): void
38    {
39        self::assertTrue((new LexicalPattern())->matchesCharacter('/^[a-z]$/', 'a'));
40    }
41
42    public function testMatchesCharacterIsFalseForNoCharacterAtAll(): void
43    {
44        self::assertFalse((new LexicalPattern())->matchesCharacter('/^[a-z]$/', ''));
45    }
46
47    public function testMatchesCharacterIsFalseForACharacterThePatternRefuses(): void
48    {
49        self::assertFalse((new LexicalPattern())->matchesCharacter('/^[a-z]$/', '1'));
50    }
51
52    public function testAssertValidAcceptsThatTheDialectDeclaredNoPattern(): void
53    {
54        (new LexicalPattern())->assertValid(null);
55
56        self::assertNull((new LexicalPattern())->matchAt(null, '', 0));
57    }
58
59    public function testAssertValidLeavesTheErrorHandlerAsItFoundIt(): void
60    {
61        $handled = false;
62        set_error_handler(static function () use (&$handled): bool {
63            $handled = true;
64
65            return true;
66        });
67        try {
68            (new LexicalPattern())->assertValid('/^\d+/');
69            trigger_error('error handler probe', E_USER_WARNING);
70        } finally {
71            restore_error_handler();
72        }
73
74        self::assertTrue($handled);
75    }
76}
77