generated from archtechx/template
-
Notifications
You must be signed in to change notification settings - Fork 21
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* feat: comparable enum * test: comparable enum * ci: php-cs-fixer in repository scope * chore: add `Comparable` usage in README * ci: globally use `php-cs-fixer` * improve Comparable logic * test more PHP versions in CI * update ci job name * remove class name quoting in exceptions to match PHP behavior * migrate pest config * add comment to test --------- Co-authored-by: Samuel Štancl <[email protected]> Co-authored-by: Samuel Štancl <[email protected]>
- Loading branch information
1 parent
fb521d2
commit f0ea4c3
Showing
9 changed files
with
188 additions
and
21 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
<?php | ||
|
||
declare(strict_types=1); | ||
|
||
namespace ArchTech\Enums; | ||
|
||
use Exception; | ||
use Iterator; | ||
use IteratorAggregate; | ||
|
||
trait Comparable | ||
{ | ||
public function is(mixed $enum): bool | ||
{ | ||
return $this === $enum; | ||
} | ||
|
||
public function isNot(mixed $enum): bool | ||
{ | ||
return ! $this->is($enum); | ||
} | ||
|
||
public function in(array|object $enums): bool | ||
{ | ||
$iterator = $enums; | ||
|
||
if (! is_array($enums)) { | ||
if ($enums instanceof Iterator) { | ||
$iterator = $enums; | ||
} elseif ($enums instanceof IteratorAggregate) { | ||
$iterator = $enums->getIterator(); | ||
} else { | ||
throw new Exception('in() expects an iterable value'); | ||
} | ||
} | ||
|
||
foreach ($iterator as $item) { | ||
if ($item === $this) { | ||
return true; | ||
} | ||
} | ||
|
||
return false; | ||
} | ||
|
||
public function notIn(array|object $enums): bool | ||
{ | ||
return ! $this->in($enums); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
<?php | ||
|
||
test('the is method checks for equality', function () { | ||
expect(Status::PENDING->is(Status::PENDING))->toBeTrue(); | ||
expect(Status::PENDING->is(Status::DONE))->toBeFalse(); | ||
expect(Role::ADMIN->is(Role::ADMIN))->toBeTrue(); | ||
|
||
expect(Role::ADMIN->is(Role::GUEST))->toBeFalse(); | ||
expect(Role::ADMIN->is('admin'))->toBeFalse(); | ||
}); | ||
|
||
it('the isNot method checks for inequality', function () { | ||
expect(Status::PENDING->isNot(Status::DONE))->toBeTrue(); | ||
expect(Status::PENDING->isNot(Status::PENDING))->toBeFalse(); | ||
expect(Status::PENDING->isNot(Role::ADMIN))->toBeTrue(); | ||
expect(Role::ADMIN->isNot(Role::GUEST))->toBeTrue(); | ||
|
||
expect(Role::ADMIN->isNot(Role::ADMIN))->toBeFalse(); | ||
expect(Role::ADMIN->isNot('admin'))->toBeTrue(); | ||
}); | ||
|
||
it('the in method checks for presence in an array', function () { | ||
expect(Status::PENDING->in([Status::PENDING, Status::DONE]))->toBeTrue(); | ||
expect(Role::ADMIN->in([Role::ADMIN]))->toBeTrue(); | ||
|
||
expect(Status::PENDING->in([Status::DONE]))->toBeFalse(); | ||
expect(Status::PENDING->in([Role::ADMIN, Role::GUEST]))->toBeFalse(); | ||
}); | ||
|
||
it('the not in method checks for absence in an array', function () { | ||
expect(Status::PENDING->notIn([Status::DONE]))->toBeTrue(); | ||
expect(Role::ADMIN->notIn([Role::GUEST]))->toBeTrue(); | ||
|
||
expect(Status::PENDING->notIn([Status::PENDING, Status::DONE]))->toBeFalse(); | ||
expect(Role::ADMIN->notIn([Role::ADMIN, Role::GUEST]))->toBeFalse(); | ||
}); | ||
|
||
test('the in and notIn methods work with Laravel collections', function () { | ||
expect(Status::PENDING->in(collect([Status::PENDING, Status::DONE])))->toBeTrue(); | ||
expect(Role::ADMIN->in(collect([Status::PENDING, Role::GUEST])))->toBeFalse(); | ||
|
||
expect(Status::DONE->notIn(collect([Status::PENDING])))->toBeTrue(); | ||
expect(Role::ADMIN->notIn(collect([Role::ADMIN, Status::PENDING])))->toBeFalse(); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters