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