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(); } }