assertSame($expected, $condition->isMet(['controlling' => $answer])); } public static function provideAnswers(): iterable { yield 'equals, matching' => [ConditionOperator::EQUALS, 'yes', 'yes', true]; yield 'equals, other option' => [ConditionOperator::EQUALS, 'yes', 'no', false]; yield 'in, listed' => [ConditionOperator::IN, ['bad', 'very_bad'], 'bad', true]; yield 'in, not listed' => [ConditionOperator::IN, ['bad', 'very_bad'], 'good', false]; yield 'lte, below' => [ConditionOperator::LTE, 3, 1, true]; yield 'lte, at the limit' => [ConditionOperator::LTE, 3, 3, true]; yield 'lte, above' => [ConditionOperator::LTE, 3, 4, false]; // A string "2" is not what the form or the stored JSON hands over for a rating, so it // must not open a follow-up by accident. yield 'lte, not an int' => [ConditionOperator::LTE, 3, '2', false]; } /** * An unanswered rating is not "3 or less": the low-rating follow-up must not demand a reason * before a rating was given. */ #[DataProvider('provideOperators')] public function testUnansweredIsNeverMet(ConditionOperator $operator, string|array|int $value): void { $condition = new Condition('controlling', $operator, $value); $this->assertFalse($condition->isMet([])); $this->assertFalse($condition->isMet(['controlling' => null])); } public static function provideOperators(): iterable { yield 'equals' => [ConditionOperator::EQUALS, 'yes']; yield 'in' => [ConditionOperator::IN, ['yes']]; yield 'lte' => [ConditionOperator::LTE, 3]; } }