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 'split with a level per guide' => [self::rule(2, beginner: true, advanced: true, split: true), []]; yield 'split with more levels than guides' => [self::rule(1, beginner: true, advanced: true, split: true), ['split']]; yield 'split without a level' => [self::rule(2, split: true), ['split']]; 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 $split = false, bool $guiding = false, ): StaffingRule { return (new StaffingRule()) ->setProductCode('DKIMP') ->setGuides($guides) ->setSkiBeginner($beginner) ->setSkiAdvanced($advanced) ->setSplit($split) ->setGuiding($guiding) ; } }