assertSame('DPWAST', (new StaffingRule())->setProductCode(' dpwast ')->getProductCode()); $this->assertNull((new StaffingRule())->setProductCode(' ')->getProductCode()); } #[DataProvider('combinations')] public function testTheCombinationIsValidated(StaffingRule $rule, array $expectedPaths): void { $violations = Validation::createValidator()->validate($rule, new Callback('validateCombination')); $paths = []; foreach ($violations as $violation) { $paths[] = $violation->getPropertyPath(); } $this->assertSame($expectedPaths, $paths); } public static function combinations(): iterable { yield 'guides only' => [self::rule(2), []]; yield 'both levels taken over, a guide each' => [self::rule(2, beginner: true, advanced: true, splitBeginner: true, splitAdvanced: true), []]; yield 'one guide takes over one of two levels' => [self::rule(1, beginner: true, advanced: true, splitAdvanced: true), []]; yield 'more levels taken over than guides' => [self::rule(1, beginner: true, advanced: true, splitBeginner: true, splitAdvanced: true), ['guides']]; yield 'taking over a level that is off' => [self::rule(2, advanced: true, splitBeginner: true), ['splitBeginner']]; yield 'guiding without a guide' => [self::rule(0, beginner: true, guiding: true), ['guiding']]; yield 'courses without guides' => [self::rule(0, beginner: true), []]; } private static function rule( int $guides, bool $beginner = false, bool $advanced = false, bool $splitBeginner = false, bool $splitAdvanced = false, bool $guiding = false, ): StaffingRule { return (new StaffingRule()) ->setProductCode('DKIMP') ->setGuides($guides) ->setSkiBeginner($beginner) ->setSkiAdvanced($advanced) ->setSplitBeginner($splitBeginner) ->setSplitAdvanced($splitAdvanced) ->setGuiding($guiding) ; } }