evalstone/evalscope/tests/report/semantics/test_semantics_model.py
sora 13274243a0 Bump vendored EvalScope and add K3-ready DPV4 configs.
Keep K3 suite selection and report-schema scoring in bash, merge K3/vision dataset_args into dpv4 yamls, and pin EvalScope at 735d920ee911 with local patches.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-02 07:30:48 +00:00

61 lines
2.0 KiB
Python

import pytest
from pydantic import ValidationError
from evalscope.api.metric.semantics import MetricDirection, MetricDisplayKind, MetricKind, MetricSemantics, ValueRange
def _accuracy_kwargs(**overrides) -> dict:
kwargs = dict(
semantic_id='quality.accuracy.ratio',
metric_name='Accuracy',
kind=MetricKind.QUALITY,
direction=MetricDirection.HIGHER_IS_BETTER,
value_range=ValueRange(min=0.0, max=1.0),
display_kind=MetricDisplayKind.PERCENT,
display_multiplier=100.0,
display_unit='%',
display_precision=1,
)
kwargs.update(overrides)
return kwargs
def test_quality_and_diagnostic_semantics_are_valid() -> None:
quality = MetricSemantics(**_accuracy_kwargs())
diagnostic = MetricSemantics.diagnostic('Failed Requests')
assert quality.raw_unit is None
assert diagnostic.kind is MetricKind.DIAGNOSTIC
assert diagnostic.direction is MetricDirection.NONE
@pytest.mark.parametrize(
'overrides',
[
{'kind': MetricKind.QUALITY, 'direction': MetricDirection.NONE},
{'kind': MetricKind.DIAGNOSTIC, 'direction': MetricDirection.HIGHER_IS_BETTER},
{'display_name': 'Incorrect rate'},
{'value_range': None},
{'display_multiplier': None},
{'display_multiplier': 0.0},
{'display_precision': -1},
],
)
def test_invalid_semantics_are_rejected(overrides: dict) -> None:
with pytest.raises(ValidationError):
MetricSemantics(**_accuracy_kwargs(**overrides))
@pytest.mark.parametrize('bounds', [(1.0, 1.0), (2.0, 1.0), (0.0, float('inf')), (float('nan'), 1.0)])
def test_invalid_ranges_are_rejected(bounds: tuple) -> None:
with pytest.raises(ValidationError):
ValueRange(min=bounds[0], max=bounds[1])
def test_contract_is_frozen_and_forbids_extra_fields() -> None:
semantics = MetricSemantics(**_accuracy_kwargs())
with pytest.raises(ValidationError):
semantics.display_precision = 3
with pytest.raises(ValidationError):
MetricSemantics(**_accuracy_kwargs(unknown_field='x'))