packages/sql-catalog/tests/Unit/Core/Evaluation/LiteralTermTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Core\Evaluation;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\DataProvider;
9use PHPUnit\Framework\Attributes\UsesClass;
10use PHPUnit\Framework\TestCase;
11use SqlCatalog\Core\Evaluation\LiteralTerm;
12use SqlCatalog\Core\Text\LiteralText;
13use SqlCatalog\Core\Text\TextPattern;
14use SqlCatalog\Core\Type\TypeShape;
15
16#[CoversClass(LiteralTerm::class)]
17#[UsesClass(LiteralText::class)]
18#[UsesClass(TextPattern::class)]
19#[UsesClass(TypeShape::class)]
20final class LiteralTermTest extends TestCase
21{
22    public function testToPatternResolvesFully(): void
23    {
24        self::assertSame('users', (new LiteralTerm('users'))->toPattern()->text());
25    }
26
27    #[DataProvider('providerToText')]
28    public function testToText(string|int|float|bool|null $value, string $expected): void
29    {
30        self::assertSame($expected, (new LiteralTerm($value))->toText());
31    }
32
33    /**
34     * @return list<array{string|int|float|bool|null, string}>
35     */
36    public static function providerToText(): array
37    {
38        return [
39            ['users', 'users'],
40            [7, '7'],
41            [1.5, '1.5'],
42            [true, '1'],
43            [false, ''],
44            [null, ''],
45        ];
46    }
47
48    #[DataProvider('providerType')]
49    public function testType(string|int|float|bool|null $value, string $expected): void
50    {
51        self::assertSame($expected, (new LiteralTerm($value))->type()->display());
52    }
53
54    /**
55     * @return list<array{string|int|float|bool|null, string}>
56     */
57    public static function providerType(): array
58    {
59        return [
60            ['users', 'string'],
61            [7, 'int'],
62            [1.5, 'float'],
63            [true, 'bool'],
64            [null, 'null'],
65        ];
66    }
67
68    public function testSignatureKeepsNumbersAndTheirStringsApart(): void
69    {
70        self::assertNotSame((new LiteralTerm(1))->signature(), (new LiteralTerm('1'))->signature());
71    }
72}
73