packages/ztd-query-sqlite/tests/Unit/Shadow/Mutation/Upsert/LogicalExpressionParserTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Shadow\Mutation\Upsert;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use ZtdQuery\Platform\Sqlite\Shadow\Mutation\Upsert\ExpressionCursor;
11use ZtdQuery\Platform\Sqlite\Shadow\Mutation\Upsert\LogicalExpressionParser;
12use ZtdQuery\Platform\Sqlite\Sql\SqliteLexerProfile;
13use ZtdQuery\Sql\SqlTokenStream;
14
15#[CoversClass(LogicalExpressionParser::class)]
16#[UsesClass(\ZtdQuery\Platform\Sqlite\Shadow\Mutation\Upsert\ArithmeticExpressionParser::class)]
17#[UsesClass(\ZtdQuery\Platform\Sqlite\Shadow\Mutation\Upsert\ComparisonExpressionParser::class)]
18#[UsesClass(ExpressionCursor::class)]
19#[UsesClass(\ZtdQuery\Platform\Sqlite\Shadow\Mutation\Upsert\ExpressionTokenDecoder::class)]
20#[UsesClass(\ZtdQuery\Platform\Sqlite\Shadow\Mutation\Upsert\PrimaryExpressionParser::class)]
21#[UsesClass(SqliteLexerProfile::class)]
22final class LogicalExpressionParserTest extends TestCase
23{
24 public function testParseOrHonorsAndPrecedence(): void
25 {
26 $sql = 'TRUE OR FALSE AND FALSE';
27 $cursor = new ExpressionCursor($sql, 'users', SqlTokenStream::tokenize($sql, SqliteLexerProfile::create())->significantTokens());
28 $result = (new LogicalExpressionParser($cursor))->parseOr();
29 self::assertSame(true, $result->evaluate(['count' => 4], ['count' => 3], 'users'));
30 self::assertCount($cursor->index, $cursor->tokens);
31 }
32
33 public function testParseAndCombinesComparisons(): void
34 {
35 $sql = 'count > EXCLUDED.count AND 2 < 3';
36 $cursor = new ExpressionCursor($sql, 'users', SqlTokenStream::tokenize($sql, SqliteLexerProfile::create())->significantTokens());
37 $result = (new LogicalExpressionParser($cursor))->parseAnd();
38 self::assertSame(true, $result->evaluate(['count' => 4], ['count' => 3], 'users'));
39 self::assertCount($cursor->index, $cursor->tokens);
40 }
41
42}
43