Coverage for src / ocarina / custom_invariants / testing / oc_test_campaigns_names.py: 75.00%
8 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-06-04 16:22 +0200
« prev ^ index » next coverage.py v7.13.5, created at 2026-06-04 16:22 +0200
1"""Validation of campaigns names: unique and valid cross-platform filenames."""
3import unicodedata
4from typing import TYPE_CHECKING
6from ocarina.dsl.invariants.assertions import (
7 each,
8 has_unique_elements,
9 is_valid_filename,
10)
11from ocarina.dsl.invariants.validate import FrameworkInvariantValidator
13if TYPE_CHECKING:
14 from collections.abc import Sequence
16 from ocarina.dsl.invariants.internals.validation_chain import (
17 ValidationAssertBlock,
18 ValidationStartBlock,
19 )
20 from ocarina.dsl.testing.oc_test_campaign import TestCampaign
23def _campaigns_names[Driver](
24 chain: ValidationStartBlock[Sequence[TestCampaign[Driver]]],
25 _: Sequence[TestCampaign[Driver]],
26) -> ValidationAssertBlock[Sequence[TestCampaign[Driver]]]:
27 return chain.assert_that(
28 has_unique_elements(
29 key=lambda c: unicodedata.normalize("NFC", c.name).casefold()
30 ),
31 msg="Campaigns names must be unique (case-insensitive).",
32 ).assert_that(
33 each(lambda c: is_valid_filename(c.name)),
34 msg="Test campaigns names must be valid cross-platform filenames.",
35 )
38def validate_campaigns_names[Driver](
39 *, campaigns: Sequence[TestCampaign[Driver]], name: str
40) -> ValidationAssertBlock[Sequence[TestCampaign[Driver]]]:
41 """Validate that campaigns names are unique and valid cross-platform filenames."""
42 return FrameworkInvariantValidator.create(campaigns, name, _campaigns_names)