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