1
0
Fork 0
mirror of https://github.com/archtechx/enums.git synced 2025-12-12 08:04:04 +00:00

improve Comparable logic

This commit is contained in:
Samuel Štancl 2024-01-12 21:23:50 +01:00
parent c0a459864b
commit 6f61461c50
4 changed files with 65 additions and 50 deletions

View file

@ -16,7 +16,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
strategy: strategy:
matrix: matrix:
laravel: [9, 10] laravel: [10]
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2

View file

@ -23,10 +23,10 @@
"php": "^8.1" "php": "^8.1"
}, },
"require-dev": { "require-dev": {
"orchestra/testbench": "^7.0|^8.0", "orchestra/testbench": "^8.0",
"nunomaduro/larastan": "^1.0|^2.4", "larastan/larastan": "^2.4",
"pestphp/pest": "^1.2|^2.0", "pestphp/pest": "^2.0",
"pestphp/pest-plugin-laravel": "^1.0|^2.0" "pestphp/pest-plugin-laravel": "^2.0"
}, },
"minimum-stability": "dev", "minimum-stability": "dev",
"prefer-stable": true, "prefer-stable": true,

View file

@ -4,6 +4,10 @@ declare(strict_types=1);
namespace ArchTech\Enums; namespace ArchTech\Enums;
use Exception;
use Iterator;
use IteratorAggregate;
trait Comparable trait Comparable
{ {
public function is(mixed $enum): bool public function is(mixed $enum): bool
@ -16,12 +20,30 @@ trait Comparable
return ! $this->is($enum); return ! $this->is($enum);
} }
public function in(array $enums): bool public function in(array|object $enums): bool
{ {
return [] !== array_filter($enums, fn (mixed $enum) => $this->is($enum)); $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 $enums): bool public function notIn(array|object $enums): bool
{ {
return ! $this->in($enums); return ! $this->in($enums);
} }

View file

@ -1,51 +1,44 @@
<?php <?php
it('compare equal enum', function () { test('the is method checks for equality', function () {
expect(Status::PENDING->is(Status::PENDING)) expect(Status::PENDING->is(Status::PENDING))->toBeTrue();
->toBeTrue() expect(Status::PENDING->is(Status::DONE))->toBeFalse();
->and(Status::PENDING->is(Status::DONE)) expect(Role::ADMIN->is(Role::ADMIN))->toBeTrue();
->toBeFalse()
->and(Role::ADMIN->is(Role::ADMIN)) expect(Role::ADMIN->is(Role::GUEST))->toBeFalse();
->toBeTrue() expect(Role::ADMIN->is('admin'))->toBeFalse();
->and(Role::ADMIN->is(Role::GUEST))
->toBeFalse()
->and(Role::ADMIN->is('admin'))
->toBeFalse();
}); });
it('compare not equal enum', function () { it('the isNot method checks for inequality', function () {
expect(Status::PENDING->isNot(Status::DONE)) expect(Status::PENDING->isNot(Status::DONE))->toBeTrue();
->toBeTrue() expect(Status::PENDING->isNot(Status::PENDING))->toBeFalse();
->and(Status::PENDING->isNot(Status::PENDING)) expect(Status::PENDING->isNot(Role::ADMIN))->toBeTrue();
->toBeFalse() expect(Role::ADMIN->isNot(Role::GUEST))->toBeTrue();
->and(Status::PENDING->isNot(Role::ADMIN))
->toBeTrue() expect(Role::ADMIN->isNot(Role::ADMIN))->toBeFalse();
->and(Role::ADMIN->isNot(Role::GUEST)) expect(Role::ADMIN->isNot('admin'))->toBeTrue();
->toBeTrue()
->and(Role::ADMIN->isNot(Role::ADMIN))
->toBeFalse()
->and(Role::ADMIN->isNot('admin'))
->toBeTrue();
}); });
it('compare in enums', function () { it('the in method checks for presence in an array', function () {
expect(Status::PENDING->in([Status::PENDING, Status::DONE])) expect(Status::PENDING->in([Status::PENDING, Status::DONE]))->toBeTrue();
->toBeTrue() expect(Role::ADMIN->in([Role::ADMIN]))->toBeTrue();
->and(Status::PENDING->in([Status::DONE]))
->toBeFalse() expect(Status::PENDING->in([Status::DONE]))->toBeFalse();
->and(Status::PENDING->in([Role::ADMIN, Role::GUEST])) expect(Status::PENDING->in([Role::ADMIN, Role::GUEST]))->toBeFalse();
->toBeFalse()
->and(Role::ADMIN->in([Role::ADMIN]))
->toBeTrue();
}); });
it('compare not in enums', function () { it('the not in method checks for absence in an array', function () {
expect(Status::PENDING->notIn([Status::DONE])) expect(Status::PENDING->notIn([Status::DONE]))->toBeTrue();
->toBeTrue() expect(Role::ADMIN->notIn([Role::GUEST]))->toBeTrue();
->and(Status::PENDING->notIn([Status::PENDING, Status::DONE]))
->toBeFalse() expect(Status::PENDING->notIn([Status::PENDING, Status::DONE]))->toBeFalse();
->and(Role::ADMIN->notIn([Role::GUEST])) expect(Role::ADMIN->notIn([Role::ADMIN, Role::GUEST]))->toBeFalse();
->toBeTrue() });
->and(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();
}); });