isSetIn($mask)); self::assertTrue(Permission::Write->isSetIn($mask)); } public function testIsSetInReturnsFalseWhenBitIsAbsent(): void { $mask = Permission::combine(Permission::Read, Permission::Write); self::assertFalse(Permission::Delete->isSetIn($mask)); self::assertFalse(Permission::Admin->isSetIn($mask)); } public function testIsSetInReturnsFalseForZeroMask(): void { self::assertFalse(Permission::Read->isSetIn(0)); } // ------------------------------------------------------------------------- // addTo() // ------------------------------------------------------------------------- public function testAddToSetsBit(): void { $mask = Permission::combine(Permission::Read); $mask = Permission::Write->addTo($mask); self::assertSame(3, $mask); self::assertTrue(Permission::Write->isSetIn($mask)); } public function testAddToIsIdempotent(): void { $mask = Permission::combine(Permission::Read); $mask = Permission::Read->addTo($mask); self::assertSame(1, $mask); } public function testAddToOnEmptyMask(): void { self::assertSame(4, Permission::Delete->addTo(0)); } // ------------------------------------------------------------------------- // removeFrom() // ------------------------------------------------------------------------- public function testRemoveFromClearsBit(): void { $mask = Permission::combine(Permission::Read, Permission::Write); $mask = Permission::Write->removeFrom($mask); self::assertSame(1, $mask); self::assertFalse(Permission::Write->isSetIn($mask)); } public function testRemoveFromIsIdempotent(): void { $mask = Permission::combine(Permission::Read); $mask = Permission::Write->removeFrom($mask); self::assertSame(1, $mask); } public function testRemoveFromOnZeroMaskReturnsZero(): void { self::assertSame(0, Permission::Read->removeFrom(0)); } // ------------------------------------------------------------------------- // Workflow: add then remove // ------------------------------------------------------------------------- public function testAddThenRemoveRestoresOriginalMask(): void { $original = Permission::combine(Permission::Read, Permission::Delete); $modified = Permission::Write->addTo($original); $restored = Permission::Write->removeFrom($modified); self::assertSame($original, $restored); } }