packages/ztd-query-sqlite/tests/Unit/Shadow/Mutation/Upsert/ComparisonExpressionParserTest.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\ComparisonExpressionParser;
11use ZtdQuery\Platform\Sqlite\Shadow\Mutation\Upsert\ExpressionCursor;
12use ZtdQuery\Platform\Sqlite\Sql\SqliteLexerProfile;
13use ZtdQuery\Shadow\Mutation\UpsertExpressionKind;
14use ZtdQuery\Sql\SqlTokenStream;
15
16#[CoversClass(ComparisonExpressionParser::class)]
17#[UsesClass(\ZtdQuery\Platform\Sqlite\Shadow\Mutation\Upsert\ArithmeticExpressionParser::class)]
18#[UsesClass(ExpressionCursor::class)]
19#[UsesClass(\ZtdQuery\Platform\Sqlite\Shadow\Mutation\Upsert\ExpressionTokenDecoder::class)]
20#[UsesClass(\ZtdQuery\Platform\Sqlite\Shadow\Mutation\Upsert\LogicalExpressionParser::class)]
21#[UsesClass(\ZtdQuery\Platform\Sqlite\Shadow\Mutation\Upsert\PrimaryExpressionParser::class)]
22#[UsesClass(SqliteLexerProfile::class)]
23final class ComparisonExpressionParserTest extends TestCase
24{
25 public function testParseComparisonEvaluatesNotEqual(): void
26 {
27 $sql = 'count <> EXCLUDED.count';
28 $cursor = new ExpressionCursor($sql, 'users', SqlTokenStream::tokenize($sql, SqliteLexerProfile::create())->significantTokens());
29 $result = (new ComparisonExpressionParser($cursor))->parseComparison();
30 self::assertSame(true, $result->evaluate(['count' => 4], ['count' => 3], 'users'));
31 self::assertCount($cursor->index, $cursor->tokens);
32 }
33
34 public function testComparisonOperatorConsumesBothSymbols(): void
35 {
36 $cursor = new ExpressionCursor('>=', 'users', SqlTokenStream::tokenize('>=', SqliteLexerProfile::create())->significantTokens());
37 self::assertSame(UpsertExpressionKind::GreaterOrEqual, (new ComparisonExpressionParser($cursor))->comparisonOperator());
38 self::assertSame(2, $cursor->index);
39 self::assertNull((new ComparisonExpressionParser($cursor))->comparisonOperator());
40 }
41
42}
43