summaryrefslogtreecommitdiff
path: root/tests/ManagerTest.php
diff options
context:
space:
mode:
authorZhineng Li <[email protected]>2026-01-05 16:26:11 +0800
committerZhineng Li <[email protected]>2026-01-05 16:26:11 +0800
commita49763dd739c3c68c4a8322896d594e926ac8e6b (patch)
treeab96cf55ccf828ec3c61d7cf5c440cc8fe837a9b /tests/ManagerTest.php
first commit
Diffstat (limited to 'tests/ManagerTest.php')
-rw-r--r--tests/ManagerTest.php70
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();
+ }
+}