resolve( [self::BASEMENT, self::FIRST_FLOOR, self::FULL], [self::BASEMENT, self::FIRST_FLOOR], ); self::assertSame([self::FULL], array_values($resolved)); } public function testSelectingANonExclusiveServiceClearsOnlyTheExclusiveOne(): void { $resolved = $this->resolve( [self::FULL, self::BASEMENT], [self::FULL], ); self::assertSame([self::BASEMENT], array_values($resolved)); } public function testNonExclusiveGroupMembersCanBeCombined(): void { $resolved = $this->resolve( [self::BASEMENT, self::FIRST_FLOOR, self::SECOND_FLOOR], [self::BASEMENT], ); self::assertSame( [self::BASEMENT, self::FIRST_FLOOR, self::SECOND_FLOOR], array_values($resolved), ); } public function testServicesWithoutAnExclusionGroupAreNeverCleared(): void { $resolved = $this->resolve( [self::BREAKFAST, self::BASEMENT, self::FULL], [self::BREAKFAST, self::BASEMENT], ); self::assertSame([self::BREAKFAST, self::FULL], array_values($resolved)); } public function testUnchangedSelectionIsLeftAlone(): void { $resolved = $this->resolve( [self::BASEMENT, self::FULL], [self::BASEMENT, self::FULL], ); self::assertSame([self::BASEMENT, self::FULL], array_values($resolved)); } public function testSubmittedArrayKeysArePreserved(): void { $resolver = new AdditionalServiceExclusionResolver(); $resolved = $resolver->resolve( $this->services(), ['Reinigung' => self::FULL, 'Verpflegung' => self::BREAKFAST, 0 => self::BASEMENT], [self::BASEMENT], ); self::assertSame( ['Reinigung' => self::FULL, 'Verpflegung' => self::BREAKFAST], $resolved, ); } /** * @param list $submittedIds * @param list $previousIds * * @return array */ private function resolve(array $submittedIds, array $previousIds): array { return (new AdditionalServiceExclusionResolver())->resolve( $this->services(), $submittedIds, $previousIds, ); } /** * @return AdditionalService[] */ private function services(): array { return [ $this->service(self::BASEMENT, 'Reinigung', false), $this->service(self::FIRST_FLOOR, 'Reinigung', false), $this->service(self::SECOND_FLOOR, 'Reinigung', false), $this->service(self::FULL, 'Reinigung', true), $this->service(self::BREAKFAST, null, false), ]; } private function service(int $id, ?string $exclusionGroup, bool $isExclusive): AdditionalService { $service = new AdditionalService(); $service->setExclusionGroup($exclusionGroup); $service->setIsExclusive($isExclusive); $property = new \ReflectionProperty(AdditionalService::class, 'id'); $property->setValue($service, $id); return $service; } }