Skip to content

Commit bd480f6

Browse files
author
Rastusik
committed
ValueGenerator - added support for enumerations
Signed-off-by: Rastusik <mfris@pixelfederation.com>
1 parent c92e17c commit bd480f6

File tree

3 files changed

+47
-0
lines changed

3 files changed

+47
-0
lines changed

src/Generator/ValueGenerator.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use ArrayObject as SplArrayObject;
66
use Laminas\Code\Exception\InvalidArgumentException;
77
use Laminas\Stdlib\ArrayObject as StdlibArrayObject;
8+
use UnitEnum;
89

910
use function addcslashes;
1011
use function array_keys;
@@ -43,6 +44,7 @@ class ValueGenerator extends AbstractGenerator
4344
public const TYPE_ARRAY_LONG = 'array_long';
4445
public const TYPE_CONSTANT = 'constant';
4546
public const TYPE_NULL = 'null';
47+
public const TYPE_ENUM = 'enum';
4648
public const TYPE_OBJECT = 'object';
4749
public const TYPE_OTHER = 'other';
4850
/**#@-*/
@@ -264,6 +266,7 @@ protected function getValidatedType($type)
264266
self::TYPE_ARRAY_LONG,
265267
self::TYPE_CONSTANT,
266268
self::TYPE_NULL,
269+
self::TYPE_ENUM,
267270
self::TYPE_OBJECT,
268271
self::TYPE_OTHER,
269272
];
@@ -304,6 +307,10 @@ public function getAutoDeterminedType($value)
304307
case 'NULL':
305308
return self::TYPE_NULL;
306309
case 'object':
310+
if ($value instanceof UnitEnum) {
311+
return self::TYPE_ENUM;
312+
}
313+
// enums are typed as objects, so this fall through is intentional
307314
case 'resource':
308315
case 'unknown type':
309316
default:
@@ -418,6 +425,13 @@ public function generate()
418425
}
419426
$output .= $endArray;
420427
break;
428+
case self::TYPE_ENUM:
429+
if (! is_object($value)) {
430+
throw new Exception\RuntimeException('Value is not an object.');
431+
}
432+
433+
$output = sprintf('%s::%s', get_class($value), (string) $value->name);
434+
break;
421435
case self::TYPE_OTHER:
422436
default:
423437
throw new Exception\RuntimeException(sprintf(
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
namespace LaminasTest\Code\Generator\TestAsset;
4+
5+
enum TestEnum
6+
{
7+
case Test1;
8+
case Test2;
9+
}

test/Generator/ValueGeneratorTest.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use Laminas\Code\Generator\PropertyValueGenerator;
1313
use Laminas\Code\Generator\ValueGenerator;
1414
use Laminas\Stdlib\ArrayObject as StdlibArrayObject;
15+
use LaminasTest\Code\Generator\TestAsset\TestEnum;
1516
use PHPUnit\Framework\TestCase;
1617

1718
use function fopen;
@@ -388,6 +389,29 @@ public function testPropertyDefaultValueCanHandleBool()
388389
self::assertNotEquals($valueGenerator1->generate(), $valueGenerator2->generate());
389390
}
390391

392+
/** @requires PHP >= 8.1 */
393+
public function testPropertyDefaultValueCanHandleEnums(): void
394+
{
395+
$valueGenerator1 = new ValueGenerator(
396+
TestEnum::Test1,
397+
ValueGenerator::TYPE_AUTO,
398+
ValueGenerator::OUTPUT_MULTIPLE_LINE
399+
);
400+
401+
$valueGenerator2 = new ValueGenerator(
402+
TestEnum::Test2,
403+
ValueGenerator::TYPE_ENUM,
404+
ValueGenerator::OUTPUT_MULTIPLE_LINE
405+
);
406+
407+
$valueGenerator1->initEnvironmentConstants();
408+
$valueGenerator2->initEnvironmentConstants();
409+
410+
self::assertNotEquals($valueGenerator1->generate(), $valueGenerator2->generate());
411+
self::assertEquals(sprintf('%s::%s', TestEnum::class, 'Test1'), $valueGenerator1->generate());
412+
self::assertEquals(sprintf('%s::%s', TestEnum::class, 'Test2'), $valueGenerator2->generate());
413+
}
414+
391415
/**
392416
* @dataProvider simpleArray
393417
* @param string $type

0 commit comments

Comments
 (0)