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