packages/sql-semantics/tests/Unit/Core/Binding/IdentitySequenceTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Core\Binding;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\Medium;
9use PHPUnit\Framework\Attributes\UsesClass;
10use PHPUnit\Framework\TestCase;
11use SqlSemantics\Core\SemanticException;
12
13#[CoversClass(\SqlSemantics\Core\Binding\IdentitySequence::class)]
14#[UsesClass(\SqlSemantics\Core\Binding\ExpressionBinder::class)]
15#[UsesClass(\SqlSemantics\Core\Binding\ExpressionRules::class)]
16#[UsesClass(\SqlSemantics\Core\Binding\FromBinder::class)]
17#[UsesClass(\SqlSemantics\Core\Binding\LiteralBinder::class)]
18#[UsesClass(\SqlSemantics\Core\Binding\NullFacts::class)]
19#[UsesClass(\SqlSemantics\Core\Binding\ProjectionBinder::class)]
20#[UsesClass(\SqlSemantics\Core\Binding\SelectBinder::class)]
21#[UsesClass(\SqlSemantics\Core\Binding\SyntaxGuard::class)]
22#[UsesClass(\SqlSemantics\Core\Binding\SelectModifiersBinder::class)]
23#[UsesClass(\SqlSemantics\Core\Binding\TypeResolution::class)]
24#[UsesClass(\SqlSemantics\Core\Binder::class)]
25#[UsesClass(\SqlSemantics\Core\SchemaBuilder::class)]
26#[UsesClass(\SqlSemantics\Core\Ast\DialectParser::class)]
27#[UsesClass(\SqlSemantics\Core\Ast\ColumnReader::class)]
28#[UsesClass(\SqlSemantics\Core\Ast\ConstraintReader::class)]
29#[UsesClass(\SqlSemantics\Core\Ast\Identifiers::class)]
30#[UsesClass(\SqlSemantics\Core\Ast\SchemaReader::class)]
31#[UsesClass(\SqlSemantics\Core\Ast\StatementList::class)]
32#[UsesClass(\SqlSemantics\Core\Ast\TokenGroups::class)]
33#[UsesClass(\SqlSemantics\Core\Ast\Tree::class)]
34#[UsesClass(\SqlSemantics\Core\Ast\TypeReader::class)]
35#[UsesClass(\SqlSemantics\Core\Binding\BoundRelation::class)]
36#[UsesClass(\SqlSemantics\Core\Binding\Scope::class)]
37#[UsesClass(\SqlSemantics\Core\Binding\TableResolver::class)]
38#[UsesClass(\SqlSemantics\Core\Model\ColumnBinding::class)]
39#[UsesClass(\SqlSemantics\Core\Model\Expression::class)]
40#[UsesClass(\SqlSemantics\Core\Model\Join::class)]
41#[UsesClass(\SqlSemantics\Core\Model\Ordering::class)]
42#[UsesClass(\SqlSemantics\Core\Model\OutputColumn::class)]
43#[UsesClass(\SqlSemantics\Core\Model\BoundSelect::class)]
44#[UsesClass(\SqlSemantics\Core\Model\TableUse::class)]
45#[UsesClass(\SqlSemantics\Core\Schema::class)]
46#[UsesClass(\SqlSemantics\Core\Schema\ColumnDefinition::class)]
47#[UsesClass(\SqlSemantics\Core\Schema\TableConstraint::class)]
48#[UsesClass(\SqlSemantics\Core\Schema\TableDefinition::class)]
49#[UsesClass(SemanticException::class)]
50#[UsesClass(\SqlSemantics\Core\Type\TypeDescriptor::class)]
51#[UsesClass(\SqlSemantics\Core\Policy\SyntaxRules::class)]
52#[UsesClass(\SqlSemantics\Platform\PostgreSql\QueryRules::class)]
53#[UsesClass(\SqlSemantics\Platform\PostgreSql\Platform::class)]
54#[UsesClass(\SqlSemantics\Platform\PostgreSql\TypeRules::class)]
55#[UsesClass(\SqlSemantics\Platform\PostgreSql\NameRules::class)]
56#[UsesClass(\SqlSemantics\Platform\PostgreSql\SchemaRules::class)]
57#[UsesClass(\SqlSemantics\Platform\Sqlite\QueryRules::class)]
58#[UsesClass(\SqlSemantics\Platform\Sqlite\Platform::class)]
59#[UsesClass(\SqlSemantics\Platform\Sqlite\TypeRules::class)]
60#[UsesClass(\SqlSemantics\Platform\Sqlite\NameRules::class)]
61#[UsesClass(\SqlSemantics\Platform\Sqlite\SchemaRules::class)]
62#[UsesClass(\SqlSemantics\Platform\MySql\QueryRules::class)]
63#[UsesClass(\SqlSemantics\Platform\MySql\Platform::class)]
64#[UsesClass(\SqlSemantics\Platform\MySql\TypeRules::class)]
65#[UsesClass(\SqlSemantics\Platform\MySql\NameRules::class)]
66#[UsesClass(\SqlSemantics\Platform\MySql\SchemaRules::class)]
67#[Medium]
68final class IdentitySequenceTest extends TestCase
69{
70 public function testRelationAllocatesDeterministicSequence(): void
71 {
72 $ids = new \SqlSemantics\Core\Binding\IdentitySequence();
73 self::assertSame('r0', $ids->relation());
74 self::assertSame('j0', $ids->join());
75 self::assertSame('r1', $ids->relation());
76 self::assertSame('j1', $ids->join());
77 }
78
79 public function testJoinDoesNotConsumeRelationOrdinals(): void
80 {
81 $ids = new \SqlSemantics\Core\Binding\IdentitySequence();
82 self::assertSame('j0', $ids->join());
83 self::assertSame('j1', $ids->join());
84 self::assertSame('r0', $ids->relation());
85 }
86}
87