packages/sql-formatter/tests/Unit/Core/Syntax/ExpressionsTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Core\Syntax;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9use SqlFormatter\Core\Syntax\Document;
10use SqlFormatter\Core\Syntax\Expressions;
11
12#[CoversClass(Expressions::class)]
13#[CoversClass(Document::class)]
14#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFormatter\Core\Formatter::class)]
15#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFormatter\Core\Compact\Settings::class)]
16#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFormatter\Platform\MySql\Dialect::class)]
17#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFormatter\Platform\PostgreSql\Dialect::class)]
18#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFormatter\Platform\Sqlite\Dialect::class)]
19#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFormatter\Facade\DialectFactory::class)]
20final class ExpressionsTest extends TestCase
21{
22 public function testMarkDistinguishesRangeAndBooleanConjunctions(): void
23 {
24 $document = new Document('');
25 $expressions = new Expressions($document, (new \SqlFormatter\Platform\Sqlite\Dialect())->syntaxRules());
26 $expressions->mark('expr', 0, 4, [1 => 'BETWEEN', 3 => 'AND']);
27 $expressions->mark('expr', 0, 8, [5 => 'AND']);
28 self::assertSame([5 => true], $document->logical);
29 }
30
31 public function testMarkRecordsCaseAndUnarySign(): void
32 {
33 $document = new Document('');
34 $expressions = new Expressions($document, (new \SqlFormatter\Platform\Sqlite\Dialect())->syntaxRules());
35 $expressions->mark('expr', 0, 8, [0 => 'CASE', 8 => 'END']);
36 $expressions->mark('expr', 2, 3, [2 => '-']);
37 self::assertSame([0 => 8], $document->casePairs);
38 self::assertSame([2 => true], $document->unary);
39 }
40}
41