diff --git a/tests/Fixtures/Remove/ObjectWithAdderRemover.php b/tests/Fixtures/Remove/ObjectWithAdderRemover.php new file mode 100644 index 0000000..f438f76 --- /dev/null +++ b/tests/Fixtures/Remove/ObjectWithAdderRemover.php @@ -0,0 +1,49 @@ + + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +namespace Rekalogika\Mapper\Tests\Fixtures\Remove; + +use Rekalogika\Mapper\Attribute\AllowDelete; + +class ObjectWithAdderRemover +{ + /** + * @var array + */ + #[AllowDelete] + private array $members = []; + + /** + * @return array + */ + public function getMembers(): array + { + return $this->members; + } + + public function addMember(Member $member): void + { + if (!in_array($member, $this->members, true)) { + $this->members[] = $member; + } + } + + public function removeMember(Member $member): void + { + $key = array_search($member, $this->members, true); + + if (false !== $key) { + unset($this->members[$key]); + } + } +} diff --git a/tests/IntegrationTest/RemoveTest.php b/tests/IntegrationTest/RemoveTest.php index 50c1401..cc6199e 100644 --- a/tests/IntegrationTest/RemoveTest.php +++ b/tests/IntegrationTest/RemoveTest.php @@ -16,6 +16,7 @@ use Rekalogika\Mapper\Tests\Common\FrameworkTestCase; use Rekalogika\Mapper\Tests\Fixtures\Remove\MemberDto; use Rekalogika\Mapper\Tests\Fixtures\Remove\MemberRepository; +use Rekalogika\Mapper\Tests\Fixtures\Remove\ObjectWithAdderRemover; use Rekalogika\Mapper\Tests\Fixtures\Remove\ObjectWithArray; use Rekalogika\Mapper\Tests\Fixtures\Remove\ObjectWithArrayDto; use Rekalogika\Mapper\Tests\Fixtures\Remove\ObjectWithArrayWithoutAllowDeleteAttribute; @@ -53,7 +54,7 @@ public function testAdd(): void $this->assertSame($this->repository->get('3'), $objectWithArray->members[2]); } - public function testRemove(): void + public function testRemoveFromArray(): void { $objectWithArrayDto = new ObjectWithArrayDto(); $objectWithArrayDto->members[] = new MemberDto('1'); @@ -98,4 +99,26 @@ public function testNoRemovalWithoutAllowDeleteAttribute(): void $this->assertSame($this->repository->get('2'), $objectWithArray->members[1]); $this->assertSame($this->repository->get('3'), $objectWithArray->members[2]); } + + public function testRemoveUsingRemover(): void + { + $objectWithArrayDto = new ObjectWithArrayDto(); + $objectWithArrayDto->members[] = new MemberDto('1'); + $objectWithArrayDto->members[] = new MemberDto('2'); + // 3 is missing, and this should remove 3 from the target object + + $objectWithArray = new ObjectWithAdderRemover(); + $objectWithArray->addMember($this->repository->get('1')); + $objectWithArray->addMember($this->repository->get('2')); + $objectWithArray->addMember($this->repository->get('3')); + $this->assertCount(3, $objectWithArray->getMembers()); + + $this->mapper->map($objectWithArrayDto, $objectWithArray); + + $this->assertCount(2, $objectWithArray->getMembers()); + $this->assertSame('1', $objectWithArray->getMembers()[0]->getId()); + $this->assertSame('2', $objectWithArray->getMembers()[1]->getId()); + $this->assertSame($this->repository->get('1'), $objectWithArray->getMembers()[0]); + $this->assertSame($this->repository->get('2'), $objectWithArray->getMembers()[1]); + } }