Skip to content

Commit

Permalink
BackedEnum support for i, i[], s, s[] (#187)
Browse files Browse the repository at this point in the history
  • Loading branch information
mrceperka committed Oct 20, 2022
1 parent b5174b4 commit f0a1f97
Show file tree
Hide file tree
Showing 2 changed files with 138 additions and 0 deletions.
4 changes: 4 additions & 0 deletions src/SqlProcessor.php
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,10 @@ function ($matches) use ($args, &$j, $last): string {
*/
public function processModifier(string $type, $value): string
{
if ($value instanceof \BackedEnum) {
$value = $value->value;
}

if ($type === 'any') {
$type = $this->detectType($value) ?? 'any';
}
Expand Down
134 changes: 134 additions & 0 deletions tests/cases/unit/SqlProcessorTest.backed_enum.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
<?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::exception(
function () use ($case) {
$this->parser->processModifier('s', $case);
},
InvalidArgumentException::class,
'Modifier %s expects value to be string, integer given.'
);
}

}


public function testStringArray()
{

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

Assert::exception(
function () {
$cases = BinaryEnum::cases();
$this->parser->processModifier('s[]', $cases);
},
InvalidArgumentException::class,
'Modifier %s expects value to be string, integer given.'
);

}


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, string 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, string given.'
);

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

}
}


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

0 comments on commit f0a1f97

Please sign in to comment.