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

1"""Validation of campaigns names: unique and valid cross-platform filenames.""" 

2 

3import unicodedata 

4from typing import TYPE_CHECKING 

5 

6from ocarina.dsl.invariants.assertions import ( 

7 each, 

8 has_unique_elements, 

9 is_valid_filename, 

10) 

11from ocarina.dsl.invariants.validate import FrameworkInvariantValidator 

12 

13if TYPE_CHECKING: 

14 from collections.abc import Sequence 

15 

16 from ocarina.dsl.invariants.internals.validation_chain import ( 

17 ValidationAssertBlock, 

18 ValidationStartBlock, 

19 ) 

20 from ocarina.dsl.testing.oc_test_campaign import TestCampaign 

21 

22 

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 ) 

36 

37 

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)