mirror of
https://github.com/archtechx/enums.git
synced 2025-12-12 20:04:03 +00:00
improve Comparable logic
This commit is contained in:
parent
c0a459864b
commit
6f61461c50
4 changed files with 65 additions and 50 deletions
2
.github/workflows/ci.yml
vendored
2
.github/workflows/ci.yml
vendored
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function notIn(array $enums): bool
|
foreach ($iterator as $item) {
|
||||||
|
if ($item === $this) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function notIn(array|object $enums): bool
|
||||||
{
|
{
|
||||||
return ! $this->in($enums);
|
return ! $this->in($enums);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
});
|
});
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue