Skip to content

Commit

Permalink
Backed enums (#71)
Browse files Browse the repository at this point in the history
* matcher for native backed enums

* Matcher backedEnumValue method. Correct typing of BackedEnumValueMatcher constructor input.

* Matcher backedEnumCase method.

* CR resolutions

* Moving test enums to subfolder.
  • Loading branch information
LukasZemanNiceCZ authored Nov 27, 2024
1 parent a0a66ed commit 445a62d
Show file tree
Hide file tree
Showing 10 changed files with 238 additions and 5 deletions.
38 changes: 38 additions & 0 deletions src/MockeryTools/Enum/BackedEnumCaseMatcher.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?php declare(strict_types = 1);

namespace BrandEmbassy\MockeryTools\Enum;

use BackedEnum;
use Mockery\Matcher\MatcherInterface;

/**
* @final
*/
class BackedEnumCaseMatcher implements MatcherInterface
{
protected BackedEnum $expected;


public function __construct(BackedEnum $expected)
{
$this->expected = $expected;
}


/**
* @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
* @phpcsSuppress SlevomatCodingStandard.TypeHints.TypeHintDeclaration.MissingParameterTypeHint
*
* @param mixed $actual
*/
public function match(&$actual): bool
{
return $actual === $this->expected;
}


public function __toString(): string
{
return '<EnumValue:' . $this->expected->value . '>';
}
}
58 changes: 58 additions & 0 deletions src/MockeryTools/Enum/BackedEnumCaseMatcherTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
<?php declare(strict_types = 1);

namespace BrandEmbassy\MockeryTools\Enum;

use BackedEnum;
use BrandEmbassy\MockeryTools\Enum\__fixtures__\TestOnlyBackedIntEnum;
use BrandEmbassy\MockeryTools\Enum\__fixtures__\TestOnlyBackedStringAnotherEnum;
use BrandEmbassy\MockeryTools\Enum\__fixtures__\TestOnlyBackedStringEnum;
use PHPUnit\Framework\Assert;
use PHPUnit\Framework\TestCase;

/**
* @final
*/
class BackedEnumCaseMatcherTest extends TestCase
{
/**
* @dataProvider matchingDataProvider
*/
public function testMatching(bool $expectedResult, BackedEnum $expectedEnumCase, BackedEnum $enumToMatch): void
{
$matcher = new BackedEnumCaseMatcher($expectedEnumCase);

$result = $matcher->match($enumToMatch);

Assert::assertSame($expectedResult, $result);
}


/**
* @return array<string, array<string, mixed>>
*/
public static function matchingDataProvider(): array
{
return [
'Matching case (value string)' => [
'expectedResult' => true,
'expectedEnumValue' => TestOnlyBackedStringEnum::STRING_VALUE,
'enumToMatch' => TestOnlyBackedStringEnum::STRING_VALUE,
],
'Matching case (integer case)' => [
'expectedResult' => true,
'expectedEnumValue' => TestOnlyBackedIntEnum::INTEGER_VALUE,
'enumToMatch' => TestOnlyBackedIntEnum::INTEGER_VALUE,
],
'Not matching - same string, different enum' => [
'expectedResult' => false,
'expectedEnumValue' => TestOnlyBackedStringAnotherEnum::STRING_VALUE,
'enumToMatch' => TestOnlyBackedStringEnum::STRING_VALUE,
],
'Not matching - string vs int, different enums' => [
'expectedResult' => false,
'expectedEnumValue' => TestOnlyBackedIntEnum::INTEGER_VALUE,
'enumToMatch' => TestOnlyBackedStringEnum::INTEGER_AS_STRING_VALUE,
],
];
}
}
42 changes: 42 additions & 0 deletions src/MockeryTools/Enum/BackedEnumValueMatcher.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<?php declare(strict_types = 1);

namespace BrandEmbassy\MockeryTools\Enum;

use Mockery\Matcher\MatcherInterface;
use ReflectionEnum;
use function assert;

/**
* @final
*/
class BackedEnumValueMatcher implements MatcherInterface
{
protected int|string $expected;


public function __construct(string|int $expected)
{
$this->expected = $expected;
}


/**
* @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
* @phpcsSuppress SlevomatCodingStandard.TypeHints.TypeHintDeclaration.MissingParameterTypeHint
*
* @param mixed $actual
*/
public function match(&$actual): bool
{
$rEnum = new ReflectionEnum($actual);
assert($rEnum->isBacked());

return $actual->value === $this->expected;
}


public function __toString(): string
{
return '<EnumValue:' . $this->expected . '>';
}
}
57 changes: 57 additions & 0 deletions src/MockeryTools/Enum/BackedEnumValueMatcherTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
<?php declare(strict_types = 1);

namespace BrandEmbassy\MockeryTools\Enum;

use BackedEnum;
use BrandEmbassy\MockeryTools\Enum\__fixtures__\TestOnlyBackedIntEnum;
use BrandEmbassy\MockeryTools\Enum\__fixtures__\TestOnlyBackedStringEnum;
use PHPUnit\Framework\Assert;
use PHPUnit\Framework\TestCase;

/**
* @final
*/
class BackedEnumValueMatcherTest extends TestCase
{
/**
* @dataProvider uuidDataProvider
*/
public function testMatching(bool $expectedResult, string|int $expectedEnumValue, BackedEnum $enumToMatch): void
{
$matcher = new BackedEnumValueMatcher($expectedEnumValue);

$result = $matcher->match($enumToMatch);

Assert::assertSame($expectedResult, $result);
}


/**
* @return array<string, array<string, mixed>>
*/
public static function uuidDataProvider(): array
{
return [
'Matching string value' => [
'expectedResult' => true,
'expectedEnumValue' => TestOnlyBackedStringEnum::STRING_VALUE->value,
'enumToMatch' => TestOnlyBackedStringEnum::STRING_VALUE,
],
'Matching integer value' => [
'expectedResult' => true,
'expectedEnumValue' => TestOnlyBackedIntEnum::INTEGER_VALUE->value,
'enumToMatch' => TestOnlyBackedIntEnum::INTEGER_VALUE,
],
'Not matching string values' => [
'expectedResult' => false,
'expectedEnumValue' => 'another-string-value-1',
'enumToMatch' => TestOnlyBackedStringEnum::STRING_VALUE,
],
'Not matching data types' => [
'expectedResult' => false,
'expectedEnumValue' => TestOnlyBackedIntEnum::INTEGER_VALUE->value,
'enumToMatch' => TestOnlyBackedStringEnum::INTEGER_AS_STRING_VALUE,
],
];
}
}
5 changes: 1 addition & 4 deletions src/MockeryTools/Enum/EnumValueMatcherTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

namespace BrandEmbassy\MockeryTools\Enum;

use BrandEmbassy\MockeryTools\Enum\__fixtures__\TestOnlyEnum;
use MabeEnum\Enum;
use Mockery\Adapter\Phpunit\MockeryPHPUnitIntegration;
use PHPUnit\Framework\Assert;
use PHPUnit\Framework\TestCase;

Expand All @@ -12,9 +12,6 @@
*/
class EnumValueMatcherTest extends TestCase
{
use MockeryPHPUnitIntegration;


/**
* @dataProvider uuidDataProvider
*
Expand Down
8 changes: 8 additions & 0 deletions src/MockeryTools/Enum/__fixtures__/TestOnlyBackedIntEnum.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?php declare(strict_types = 1);

namespace BrandEmbassy\MockeryTools\Enum\__fixtures__;

enum TestOnlyBackedIntEnum: int
{
case INTEGER_VALUE = 551;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?php declare(strict_types = 1);

namespace BrandEmbassy\MockeryTools\Enum\__fixtures__;

enum TestOnlyBackedStringAnotherEnum: string
{
case STRING_VALUE = 'string-value';
case INTEGER_AS_STRING_VALUE = '551';
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?php declare(strict_types = 1);

namespace BrandEmbassy\MockeryTools\Enum\__fixtures__;

enum TestOnlyBackedStringEnum: string
{
case STRING_VALUE = 'string-value';
case INTEGER_AS_STRING_VALUE = '551';
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?php declare(strict_types = 1);

namespace BrandEmbassy\MockeryTools\Enum;
namespace BrandEmbassy\MockeryTools\Enum\__fixtures__;

use MabeEnum\Enum;

Expand Down
15 changes: 15 additions & 0 deletions src/MockeryTools/Matcher/Matcher.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@

namespace BrandEmbassy\MockeryTools\Matcher;

use BackedEnum;
use BrandEmbassy\MockeryTools\DateTime\DateTimeAsAtomMatcher;
use BrandEmbassy\MockeryTools\DateTime\DateTimeAsTimestampMatcher;
use BrandEmbassy\MockeryTools\DateTime\DateTimeZoneNameMatcher;
use BrandEmbassy\MockeryTools\Enum\BackedEnumCaseMatcher;
use BrandEmbassy\MockeryTools\Enum\BackedEnumValueMatcher;
use BrandEmbassy\MockeryTools\Enum\EnumValueMatcher;
use BrandEmbassy\MockeryTools\Http\HttpRequestMatcher;
use BrandEmbassy\MockeryTools\String\StringStartsWithMatcher;
Expand Down Expand Up @@ -52,6 +55,18 @@ public static function uri(string $expectedUri): UriMatcher
}


public static function backedEnumCase(BackedEnum $expectedValue): BackedEnumCaseMatcher
{
return new BackedEnumCaseMatcher($expectedValue);
}


public static function backedEnumValue(string|int $expectedValue): BackedEnumValueMatcher
{
return new BackedEnumValueMatcher($expectedValue);
}


/**
* @param mixed $expectedValue
*/
Expand Down

0 comments on commit 445a62d

Please sign in to comment.