diff options
| author | Zhineng Li <[email protected]> | 2026-01-05 16:26:11 +0800 |
|---|---|---|
| committer | Zhineng Li <[email protected]> | 2026-01-05 16:26:11 +0800 |
| commit | a49763dd739c3c68c4a8322896d594e926ac8e6b (patch) | |
| tree | ab96cf55ccf828ec3c61d7cf5c440cc8fe837a9b /tests/ManagerTest.php | |
first commit
Diffstat (limited to 'tests/ManagerTest.php')
| -rw-r--r-- | tests/ManagerTest.php | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/tests/ManagerTest.php b/tests/ManagerTest.php new file mode 100644 index 0000000..dc81a06 --- /dev/null +++ b/tests/ManagerTest.php @@ -0,0 +1,70 @@ +<?php + +declare(strict_types=1); + +namespace Zhineng\Snowflake\Tests; + +use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\TestCase; +use Zhineng\Snowflake\Constant; +use Zhineng\Snowflake\Field; +use Zhineng\Snowflake\Manager; +use Zhineng\Snowflake\Sequence; +use Zhineng\Snowflake\Structure; +use Zhineng\Snowflake\Timestamp; + +#[CoversClass(Manager::class)] +final class ManagerTest extends TestCase +{ + public function testNextIdResolution(): void + { + $struct = new Structure; + $struct->add(Sequence::make('sequence', 12)); + $struct->add(Constant::make('instance_id', 10)); + $struct->add(Timestamp::make()); + + $manager = new Manager; + $manager->structureUsing($struct); + $this->assertNotSame($manager->nextId(), $manager->nextId()); + } + + public function testSequenceShouldBeResetWhenAnyOtherFieldChanges(): void + { + $struct = new Structure; + $struct->add(Sequence::make('sequence', 12)); + $struct->add($field = new class ('test', 10) extends Field { + public int $value = 0; + + public function value(): int + { + return $this->value; + } + + public function setValue(int $value): void + { + $this->value = $value; + } + }); + + $manager = new Manager; + $manager->structureUsing($struct); + + $id1 = $manager->nextId(); + $id2 = $manager->nextId(); + $field->setValue(1); + $id3 = $manager->nextId(); + + $sequenceMask = (1 << 12) - 1; + $this->assertSame(0, $id1 & $sequenceMask); + $this->assertSame(1, $id2 & $sequenceMask); + $this->assertSame(0, $id3 & $sequenceMask); + } + + public function testExceptionShouldBeThrownWhenMissingStructure(): void + { + $manager = new Manager; + $this->expectException(\RuntimeException::class); + $this->expectExceptionMessage('ID structure is not defined.'); + $manager->nextId(); + } +} |
