Skip to content

Commit

Permalink
backed enum support for i, i[], s, s[]
Browse files Browse the repository at this point in the history
  • Loading branch information
mrceperka committed Oct 19, 2022
1 parent b5174b4 commit 13497c7
Show file tree
Hide file tree
Showing 2 changed files with 134 additions and 0 deletions.
13 changes: 13 additions & 0 deletions src/SqlProcessor.php
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,19 @@ public function processModifier(string $type, $value): string
case '_like_':
return $this->platform->formatStringLike((string) $value, 0);
}
} elseif ($value instanceof \BackedEnum) {
$valueType = gettype($value->value);
if ($type === 's') {
if ($valueType === 'string') {
return $this->platform->formatString($value->value);
} elseif ($valueType === 'integer') {
return (string) $value->value;
}
} elseif ($type === 'i') {
if ($valueType === 'integer') {
return (string) $value->value;
}
}
}

break;
Expand Down
121 changes: 121 additions & 0 deletions tests/cases/unit/SqlProcessorTest.backed_enum.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
<?php declare(strict_types = 1);

/**
* @testCase
* @phpVersion >= 8.1
*/

namespace NextrasTests\Dbal;


use Mockery;
use Nextras\Dbal\Exception\InvalidArgumentException;
use Nextras\Dbal\Platforms\IPlatform;
use Nextras\Dbal\SqlProcessor;
use Tester\Assert;


require_once __DIR__ . '/../../bootstrap.php';


enum DirectionEnum: string
{
case LEFT = 'left';
case RIGHT = 'right';
}


enum BinaryEnum: int
{
case ZERO = 0;
case ONE = 1;
}


class SqlProcessorBackedEnumTest extends TestCase
{
/** @var IPlatform|Mockery\MockInterface */
private $platform;

/** @var SqlProcessor */
private $parser;


protected function setUp()
{
parent::setUp();
$this->platform = \Mockery::mock(IPlatform::class);
$this->parser = new SqlProcessor($this->platform);
}


public function testString()
{
$cases = DirectionEnum::cases();
foreach ($cases as $case) {
$this->platform->shouldReceive('formatString')->once()->with($case->value)->andReturn('hit');
Assert::same('hit', $this->parser->processModifier('s', $case));
}

$cases = BinaryEnum::cases();
foreach ($cases as $case) {
Assert::same((string) $case->value, $this->parser->processModifier('s', $case));
}

}


public function testStringArray()
{

$cases = DirectionEnum::cases();
$this->platform->shouldReceive('formatString')->times(count($cases))
->andReturnArg(0);
Assert::same('(left, right)', $this->parser->processModifier('s[]', $cases));

$cases = BinaryEnum::cases();
Assert::same('(0, 1)', $this->parser->processModifier('s[]', $cases));

}


public function testInt()
{
$cases = DirectionEnum::cases();
foreach ($cases as $case) {
Assert::exception(
function () use ($case) {
$this->parser->processModifier('i', $case);
},
InvalidArgumentException::class,
'Modifier %i expects value to be int, NextrasTests\Dbal\DirectionEnum given.');
}

$cases = BinaryEnum::cases();
foreach ($cases as $case) {
Assert::same((string) $case->value, $this->parser->processModifier('i', $case));
}

}


public function testIntArray()
{
$cases = DirectionEnum::cases();
Assert::exception(
function () use ($cases) {
$this->parser->processModifier('i[]', $cases);
},
InvalidArgumentException::class,
'Modifier %i expects value to be int, NextrasTests\Dbal\DirectionEnum given.'
);

$cases = BinaryEnum::cases();
Assert::same('(0, 1)', $this->parser->processModifier('i[]', $cases));

}
}


$test = new SqlProcessorBackedEnumTest();
$test->run();

0 comments on commit 13497c7

Please sign in to comment.