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