3"""Adversarial assertions for MC/DC suppression-control binding."""
5from __future__
import annotations
7from selftest_assert
import expect
8from suppression_model
import Inventory
10EXPECTED_MCDC_FUNCTION_ROWS = 5
11EXPECTED_MALFORMED_MCDC_MACRO_ROWS = 3
14def assert_mcdc_macro_binding(inventory: Inventory, failures: list[str]) ->
None:
15 """Assert each same-line macro owns its literal and invalid calls fail."""
18 for item
in inventory.suppressions
19 if item.family ==
"mcdc-deactivation"
20 and item.path ==
"malformed_mcdc.c"
21 and item.scope ==
"function"
24 len(function_rows) == EXPECTED_MCDC_FUNCTION_ROWS
25 and [item.reason
for item
in function_rows]
27 "fixture function invariant",
28 "valid after invalid",
29 "valid before invalid",
30 "first distinct reason",
31 "second distinct reason",
33 "must fire: each same-line MC/DC macro owns its exact literal reason",
36 malformed_macros = [item
for item
in inventory.findings
if item.code ==
"malformed-mcdc-macro"]
38 len(malformed_macros) == EXPECTED_MALFORMED_MCDC_MACRO_ROWS,
39 "must fire: invalid macros on either side cannot borrow a valid reason",