|
5 | 5 | use Composite\Entity\AbstractEntity; |
6 | 6 | use Composite\Entity\Attributes\ListOf; |
7 | 7 | use Composite\Entity\Exceptions\EntityException; |
| 8 | +use Composite\Entity\Tests\TestStand\TestBackedStringEnum; |
8 | 9 | use Composite\Entity\Tests\TestStand\TestEntity; |
9 | 10 | use Composite\Entity\Tests\TestStand\TestSubEntity; |
| 11 | +use Composite\Entity\Tests\TestStand\TestUnitEnum; |
10 | 12 |
|
11 | 13 | final class EntityListColumnTest extends \PHPUnit\Framework\TestCase |
12 | 14 | { |
@@ -119,6 +121,46 @@ public function __construct( |
119 | 121 | $this->assertInstanceOf(ListOf::class, $attribute); |
120 | 122 | } |
121 | 123 |
|
| 124 | + public function test_castWithUnitEnumKey(): void |
| 125 | + { |
| 126 | + $class = new class extends AbstractEntity { |
| 127 | + public function __construct( |
| 128 | + #[ListOf(TestEntity::class, 'unit_enum')] |
| 129 | + public ?array $column = null, |
| 130 | + ) {} |
| 131 | + }; |
| 132 | + |
| 133 | + $entity = $class::fromArray([ |
| 134 | + 'column' => [ |
| 135 | + TestUnitEnum::Foo->name => ['str' => 'UnitFoo', 'unit_enum' => TestUnitEnum::Foo->name], |
| 136 | + TestUnitEnum::Bar->name => ['str' => 'UnitBar', 'unit_enum' => TestUnitEnum::Bar->name], |
| 137 | + ] |
| 138 | + ]); |
| 139 | + $this->assertCount(2, $entity->column); |
| 140 | + $this->assertEquals( 'UnitFoo', $entity->column[TestUnitEnum::Foo->name]->str); |
| 141 | + $this->assertEquals('UnitBar', $entity->column[TestUnitEnum::Bar->name]->str); |
| 142 | + } |
| 143 | + |
| 144 | + public function test_castWithBackedEnumKey(): void |
| 145 | + { |
| 146 | + $class = new class extends AbstractEntity { |
| 147 | + public function __construct( |
| 148 | + #[ListOf(TestEntity::class, 'backed_enum')] |
| 149 | + public ?array $column = null, |
| 150 | + ) {} |
| 151 | + }; |
| 152 | + |
| 153 | + $entity = $class::fromArray([ |
| 154 | + 'column' => [ |
| 155 | + TestBackedStringEnum::Foo->value => ['str' => 'BackedFoo', 'backed_enum' => TestBackedStringEnum::Foo->value], |
| 156 | + TestBackedStringEnum::Bar->value => ['str' => 'BackedBar', 'backed_enum' => TestBackedStringEnum::Bar->value], |
| 157 | + ] |
| 158 | + ]); |
| 159 | + $this->assertCount(2, $entity->column); |
| 160 | + $this->assertEquals( 'BackedFoo', $entity->column[TestBackedStringEnum::Foo->value]->str); |
| 161 | + $this->assertEquals('BackedBar', $entity->column[TestBackedStringEnum::Bar->value]->str); |
| 162 | + } |
| 163 | + |
122 | 164 | public static function uncast_dataProvider(): array |
123 | 165 | { |
124 | 166 | $sub1 = TestSubEntity::fromArray(['str' => 'foo', 'number' => 123]); |
@@ -190,6 +232,46 @@ public function __construct( |
190 | 232 | $this->assertEquals($expected, $actual); |
191 | 233 | } |
192 | 234 |
|
| 235 | + public function test_uncastWithUnitEnumKey(): void |
| 236 | + { |
| 237 | + $value = [ |
| 238 | + TestUnitEnum::Foo->name => new TestEntity(str: 'UnitFoo', unit_enum: TestUnitEnum::Foo), |
| 239 | + TestUnitEnum::Bar->name => new TestEntity(str: 'UnitBar', unit_enum: TestUnitEnum::Bar), |
| 240 | + ]; |
| 241 | + $entity = new class($value) extends AbstractEntity { |
| 242 | + public function __construct( |
| 243 | + #[ListOf(TestEntity::class, 'unit_enum')] |
| 244 | + public array $column, |
| 245 | + ) {} |
| 246 | + }; |
| 247 | + $data = json_decode($entity->toArray()['column'], true); |
| 248 | + |
| 249 | + $this->assertEquals('UnitFoo', $data[TestUnitEnum::Foo->name]['str']); |
| 250 | + $this->assertEquals(TestUnitEnum::Foo->name, $data[TestUnitEnum::Foo->name]['unit_enum']); |
| 251 | + $this->assertEquals('UnitBar', $data[TestUnitEnum::Bar->name]['str']); |
| 252 | + $this->assertEquals(TestUnitEnum::Bar->name, $data[TestUnitEnum::Bar->name]['unit_enum']); |
| 253 | + } |
| 254 | + |
| 255 | + public function test_uncastWithBackedEnumKey(): void |
| 256 | + { |
| 257 | + $value = [ |
| 258 | + TestBackedStringEnum::Foo->value => new TestEntity(str: 'BackedFoo', backed_enum: TestBackedStringEnum::Foo), |
| 259 | + TestBackedStringEnum::Bar->value => new TestEntity(str: 'BackedBar', backed_enum: TestBackedStringEnum::Bar), |
| 260 | + ]; |
| 261 | + $entity = new class($value) extends AbstractEntity { |
| 262 | + public function __construct( |
| 263 | + #[ListOf(TestEntity::class, 'backed_enum')] |
| 264 | + public array $column, |
| 265 | + ) {} |
| 266 | + }; |
| 267 | + $data = json_decode($entity->toArray()['column'], true); |
| 268 | + |
| 269 | + $this->assertEquals('BackedFoo', $data[TestBackedStringEnum::Foo->value]['str']); |
| 270 | + $this->assertEquals(TestBackedStringEnum::Foo->value, $data[TestBackedStringEnum::Foo->value]['backed_enum']); |
| 271 | + $this->assertEquals('BackedBar', $data[TestBackedStringEnum::Bar->value]['str']); |
| 272 | + $this->assertEquals(TestBackedStringEnum::Bar->value, $data[TestBackedStringEnum::Bar->value]['backed_enum']); |
| 273 | + } |
| 274 | + |
193 | 275 | public function test_castException(): void |
194 | 276 | { |
195 | 277 | $entity = new class([]) extends AbstractEntity { |
|
0 commit comments