packages/sql-catalog/tests/Unit/Core/Sql/StatementKindTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Core\Sql;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\DataProvider;
9use PHPUnit\Framework\TestCase;
10use SqlCatalog\Core\Sql\StatementKind;
11
12#[CoversClass(StatementKind::class)]
13final class StatementKindTest extends TestCase
14{
15    public function testEveryKindIsCoveredByBothQuestions(): void
16    {
17        self::assertCount(count(StatementKind::cases()), array_unique(array_merge(
18            array_map(static fn (array $case): string => $case[0]->value, self::providerIsWrite()),
19        )));
20        self::assertCount(count(StatementKind::cases()), array_unique(array_merge(
21            array_map(static fn (array $case): string => $case[0]->value, self::providerIsSchema()),
22        )));
23    }
24
25    #[DataProvider('providerIsWrite')]
26    public function testIsWrite(StatementKind $kind, bool $expected): void
27    {
28        self::assertSame($expected, $kind->isWrite());
29    }
30
31    /**
32     * @return list<array{StatementKind, bool}>
33     */
34    public static function providerIsWrite(): array
35    {
36        return [
37            [StatementKind::Insert, true],
38            [StatementKind::Update, true],
39            [StatementKind::Delete, true],
40            [StatementKind::Replace, true],
41            [StatementKind::Merge, true],
42            [StatementKind::Truncate, true],
43            [StatementKind::Select, false],
44            [StatementKind::Create, false],
45            [StatementKind::Alter, false],
46            [StatementKind::Drop, false],
47            [StatementKind::Call, false],
48            [StatementKind::Show, false],
49            [StatementKind::Explain, false],
50            [StatementKind::Transaction, false],
51            [StatementKind::Other, false],
52            [StatementKind::Unknown, false],
53        ];
54    }
55
56    #[DataProvider('providerIsSchema')]
57    public function testIsSchema(StatementKind $kind, bool $expected): void
58    {
59        self::assertSame($expected, $kind->isSchema());
60    }
61
62    /**
63     * @return list<array{StatementKind, bool}>
64     */
65    public static function providerIsSchema(): array
66    {
67        return [
68            [StatementKind::Create, true],
69            [StatementKind::Alter, true],
70            [StatementKind::Drop, true],
71            [StatementKind::Truncate, true],
72            [StatementKind::Select, false],
73            [StatementKind::Insert, false],
74            [StatementKind::Update, false],
75            [StatementKind::Delete, false],
76            [StatementKind::Replace, false],
77            [StatementKind::Merge, false],
78            [StatementKind::Call, false],
79            [StatementKind::Show, false],
80            [StatementKind::Explain, false],
81            [StatementKind::Transaction, false],
82            [StatementKind::Other, false],
83            [StatementKind::Unknown, false],
84        ];
85    }
86}
87