From b7575e0b6cac00594bfe8869cebe1e36729c6641 Mon Sep 17 00:00:00 2001 From: henzeb Date: Thu, 5 Jan 2023 12:45:21 +0100 Subject: [PATCH] bitmask instance should be treated as a whole --- composer.json | 6 +++++- src/Helpers/Bitmasks/Bitmask.php | 10 ++++++++-- src/Laravel/Mixins/RulesMixin.php | 6 +++--- tests/Unit/Helpers/Bitmasks/BitmaskTest.php | 13 ++++++++++--- 4 files changed, 26 insertions(+), 9 deletions(-) diff --git a/composer.json b/composer.json index 715d9b7..72e450b 100644 --- a/composer.json +++ b/composer.json @@ -47,7 +47,11 @@ "machine", "transition", "validation", - "rules" + "rules", + "bitmask", + "bitmasks", + "macros", + "macroable" ], "homepage": "https://github.com/henzeb/enumhancer", "license": "AGPL-3.0-only", diff --git a/src/Helpers/Bitmasks/Bitmask.php b/src/Helpers/Bitmasks/Bitmask.php index a22ddf1..949a6c1 100644 --- a/src/Helpers/Bitmasks/Bitmask.php +++ b/src/Helpers/Bitmasks/Bitmask.php @@ -41,7 +41,13 @@ public function any(self|UnitEnum|string|int ...$bits): bool return true; } - return ($this->value() & $mask) > 0; + foreach ($bits as $bit) { + if ($this->has($bit)) { + return true; + } + } + + return false; } public function xor(self|UnitEnum|string|int ...$bits): bool @@ -75,7 +81,7 @@ public function none(self|UnitEnum|string|int ...$bits): bool return true; } - return ($this->value() & $mask) === 0; + return !$this->any(...$bits); } public function value(): int diff --git a/src/Laravel/Mixins/RulesMixin.php b/src/Laravel/Mixins/RulesMixin.php index 0e49174..16e90b9 100644 --- a/src/Laravel/Mixins/RulesMixin.php +++ b/src/Laravel/Mixins/RulesMixin.php @@ -7,15 +7,15 @@ use Henzeb\Enumhancer\Contracts\TransitionHook; use Henzeb\Enumhancer\Laravel\Rules\EnumBitmask; use Henzeb\Enumhancer\Laravel\Rules\EnumTransition; -use Henzeb\Enumhancer\Laravel\Rules\IsEnum as UnitEnumRule; +use Henzeb\Enumhancer\Laravel\Rules\IsEnum; use UnitEnum; class RulesMixin { public function isEnum(): Closure { - return function (string $type, Mapper|string|array|null ...$mappers): UnitEnumRule { - return new UnitEnumRule($type, ...$mappers); + return function (string $type, Mapper|string|array|null ...$mappers): IsEnum { + return new IsEnum($type, ...$mappers); }; } diff --git a/tests/Unit/Helpers/Bitmasks/BitmaskTest.php b/tests/Unit/Helpers/Bitmasks/BitmaskTest.php index d1e4f79..5f06744 100644 --- a/tests/Unit/Helpers/Bitmasks/BitmaskTest.php +++ b/tests/Unit/Helpers/Bitmasks/BitmaskTest.php @@ -7,7 +7,6 @@ use Henzeb\Enumhancer\Tests\Fixtures\BackedEnums\Bitmasks\BitmasksIncorrectIntEnum; use Henzeb\Enumhancer\Tests\Fixtures\BackedEnums\Bitmasks\BitmasksIntEnum; use Henzeb\Enumhancer\Tests\Fixtures\EnhancedUnitEnum; -use InvalidArgumentException; use PHPUnit\Framework\TestCase; class BitmaskTest extends TestCase @@ -100,8 +99,8 @@ public function testAny() $this->assertTrue($bitmask->any(new Bitmask(BitmasksIntEnum::class, 0))); $this->assertTrue($bitmask->any(new Bitmask(BitmasksIntEnum::class, 24))); $this->assertFalse($bitmask->any(new Bitmask(BitmasksIntEnum::class, 32))); - $this->assertTrue($bitmask->any(new Bitmask(BitmasksIntEnum::class, 40))); - $this->assertTrue($bitmask->any(new Bitmask(BitmasksIntEnum::class, 56))); + $this->assertFalse($bitmask->any(new Bitmask(BitmasksIntEnum::class, 40))); + $this->assertFalse($bitmask->any(new Bitmask(BitmasksIntEnum::class, 56))); $this->assertTrue($bitmask->any()); $this->assertTrue($bitmask->any(8, 16)); @@ -183,6 +182,14 @@ public function testNone() $this->assertTrue($bitmask->none('Write')); $this->assertTrue($bitmask->none('Read', 'Write')); $this->assertFalse($bitmask->none('Execute', 'Read')); + + $bitmask = new Bitmask(BitmasksIntEnum::class, 40); + + $this->assertTrue( + $bitmask->none( + new Bitmask(BitmasksIntEnum::class, 24), + ) + ); } public function testCases()