def test_process_interventions_ordering(self) -> None:
        metric_list = [Mock(metric_name="test_metric")]
        validator_list = [
            Mock(requires_metric=["test_metric"],
                 validator_name="test_validator_a"),
            Mock(requires_metric=["test_metric"],
                 validator_name="test_validator_b"),
            Mock(requires_metric=["test_metric"],
                 validator_name="test_validator_c"),
        ]
        intervention_validators = ["test_validator_b", "test_validator_a"]
        ep = ceval.EvaluationPlan(
            metric_list,
            validator_list,
            intervention_validators=intervention_validators)
        validation_res_mock = {
            "test_validator_a":
            validators.ValidatorOutput(False, [30, 31, 32]),
            "test_validator_b":
            validators.ValidatorOutput(False, [20, 21, 22]),
            "test_validator_c":
            validators.ValidatorOutput(False, [10, 11, 12]),
        }

        # The test_validator_b failed ealier than test_validator_a, so it
        # should take precendence
        res = ep.process_interventions(validation_res_mock)
        self.assertTrue(res["test_validator_a"].is_valid_scene)
        self.assertEqual(len(res["test_validator_a"].failed_frames), 0)

        # The test_validator_c is not an intervention validator
        self.assertTrue(res["test_validator_c"].is_valid_scene)
        self.assertEqual(len(res["test_validator_c"].failed_frames), 0)
 def test_inconsistency(self) -> None:
     metric_list = [Mock(metric_name="metric_a")]
     validator_list = [
         Mock(requires_metric=["metric_b"], validator_name="test_validator")
     ]
     with self.assertRaisesRegex(RuntimeError, "required by validator"):
         _ = ceval.EvaluationPlan(metric_list, validator_list)
 def test_attributes(self) -> None:
     test_metric = Mock(metric_name="test_metric")
     test_validator = Mock(requires_metric=["test_metric"],
                           validator_name="test_validator")
     ep = ceval.EvaluationPlan([test_metric], [test_validator])
     self.assertDictEqual(ep.metrics_dict(), {"test_metric": test_metric})
     self.assertDictEqual(ep.validators_dict(),
                          {"test_validator": test_validator})
 def test_repeated_metrics(self) -> None:
     metric_list = [
         Mock(metric_name="metric_a"),
         Mock(metric_name="metric_a")
     ]
     with self.assertRaisesRegex(RuntimeError,
                                 "You cannot have repeated metric names."):
         _ = ceval.EvaluationPlan(metric_list)
 def test_evaluate(self) -> None:
     test_metric = Mock(metric_name="test_metric")
     test_validator = Mock(requires_metric=["test_metric"],
                           validator_name="test_validator")
     ep = ceval.EvaluationPlan([test_metric], [test_validator])
     ret = ep.evaluate(Mock())
     test_metric.compute.assert_called_once()
     test_validator.validate.assert_not_called()
     self.assertIn(test_metric.metric_name, ret)
 def test_interventions_not_found(self) -> None:
     metric_list = [Mock(metric_name="metric_a")]
     validator_list = [Mock(validator_name="validator_a")]
     composite_metric_list = [
         Mock(composite_metric_name="composite_metric_a")
     ]
     intervention_validators = ["validator_not_found"]
     with self.assertRaisesRegex(RuntimeError,
                                 "not found in validators list"):
         _ = ceval.EvaluationPlan(metric_list, validator_list,
                                  composite_metric_list,
                                  intervention_validators)
 def test_repeated_composite_metrics(self) -> None:
     metric_list = [Mock(metric_name="metric_a")]
     validator_list = [Mock(validator_name="validator_a")]
     composite_metric_list = [
         Mock(composite_metric_name="composite_metric_a"),
         Mock(composite_metric_name="composite_metric_a")
     ]
     with self.assertRaisesRegex(
             RuntimeError,
             "You cannot have repeated composite metric names."):
         _ = ceval.EvaluationPlan(metric_list, validator_list,
                                  composite_metric_list)
 def test_evaluate_composite(self) -> None:
     test_metric = Mock(metric_name="test_metric")
     test_validator = Mock(requires_metric=["test_metric"],
                           validator_name="test_validator")
     composite_metric = Mock(requires_metric=["test_metric"],
                             requires_validator=["test_validator"],
                             composite_metric_name="composite_metric")
     ep = ceval.EvaluationPlan([test_metric], [test_validator],
                               [composite_metric])
     ret = ep.evaluate_composite(Mock(), {
         "test_metric": Mock(),
     }, {
         "test_validator": Mock(),
     })
     test_validator.validate.assert_not_called()
     test_metric.compute.assert_not_called()
     composite_metric.compute.assert_called_once()
     self.assertIn(composite_metric.composite_metric_name, ret)
 def test_process_interventions(self) -> None:
     metric_list = [Mock(metric_name="test_metric")]
     validator_list = [
         Mock(requires_metric=["test_metric"],
              validator_name="test_validator_a"),
         Mock(requires_metric=["test_metric"],
              validator_name="test_validator_b"),
     ]
     intervention_validators = ["test_validator_b"]
     ep = ceval.EvaluationPlan(
         metric_list,
         validator_list,
         intervention_validators=intervention_validators)
     validation_res_mock = {
         "test_validator_a": validators.ValidatorOutput(False, [1]),
         "test_validator_b": validators.ValidatorOutput(False, [1]),
     }
     res = ep.process_interventions(validation_res_mock)
     self.assertTrue(res["test_validator_a"].is_valid_scene)
     self.assertEqual(len(res["test_validator_a"].failed_frames), 0)