diff --git a/tests/unit/test_documentation_consistency.py b/tests/unit/test_documentation_consistency.py index 163ab56..53acfa1 100644 --- a/tests/unit/test_documentation_consistency.py +++ b/tests/unit/test_documentation_consistency.py @@ -133,6 +133,7 @@ TRAINING_M41_RELEASE_INDEX_GUARD_TEST_INVENTORY = ( "test_training_m70_release_index_source_shape_fixture_guard_methods_constant_inventory_source_exactness_bridge_duplicate_guard_positive_diagnostic_self_lock", "test_training_m71_release_index_source_shape_fixture_guard_methods_constant_exactness_bridge_triplet_source_shape_self_lock", "test_training_m72_release_index_source_shape_fixture_guard_methods_constant_exactness_bridge_triplet_rejects_dynamic_sources", + "test_training_m73_release_index_source_shape_fixture_guard_methods_constant_exactness_bridge_triplet_diagnostics_are_locked", "test_training_m53_release_index_doc_category_coverage_is_exact", "test_training_case_product_doc_reflects_current_m40_maturity", ) @@ -639,6 +640,9 @@ class DocumentationConsistencyTests(unittest.TestCase): "required_snippet_inventory_source_shape_fixture_constant_exactness_bridge_triplet_negative_sources": ( "test_training_m72_release_index_source_shape_fixture_guard_methods_constant_exactness_bridge_triplet_rejects_dynamic_sources" ), + "required_snippet_inventory_source_shape_fixture_constant_exactness_bridge_triplet_diagnostics": ( + "test_training_m73_release_index_source_shape_fixture_guard_methods_constant_exactness_bridge_triplet_diagnostics_are_locked" + ), "per_doc_helper_exact_category_coverage": ( "test_training_m53_release_index_doc_category_coverage_is_exact" ), @@ -806,6 +810,7 @@ class DocumentationConsistencyTests(unittest.TestCase): "test_training_m70_release_index_source_shape_fixture_guard_methods_constant_inventory_source_exactness_bridge_duplicate_guard_positive_diagnostic_self_lock", "test_training_m71_release_index_source_shape_fixture_guard_methods_constant_exactness_bridge_triplet_source_shape_self_lock", "test_training_m72_release_index_source_shape_fixture_guard_methods_constant_exactness_bridge_triplet_rejects_dynamic_sources", + "test_training_m73_release_index_source_shape_fixture_guard_methods_constant_exactness_bridge_triplet_diagnostics_are_locked", "test_training_m53_release_index_doc_category_coverage_is_exact", "test_training_case_product_doc_reflects_current_m40_maturity", ) @@ -1486,6 +1491,68 @@ class DocumentationConsistencyTests(unittest.TestCase): source ) + def test_training_m73_release_index_source_shape_fixture_guard_methods_constant_exactness_bridge_triplet_diagnostics_are_locked( + self, + ) -> None: + constant_name = "TRAINING_M41_RELEASE_INDEX_EXACTNESS_BRIDGE_GUARD_METHODS" + guard_name = ( + "test_training_m73_release_index_source_shape_fixture_guard_methods_constant_exactness_bridge_triplet_diagnostics_are_locked" + ) + literal_methods = ( + "literal_bridge_alpha", + "literal_bridge_beta", + "literal_bridge_gamma", + ) + valid_triplet_source = ( + f"({literal_methods[0]!r}, {literal_methods[1]!r}, " + f"{literal_methods[2]!r})" + ) + invalid_sources = { + "missing_assignment": ( + "UNRELATED_BRIDGE_GUARD_METHODS = ('literal_bridge_alpha',)", + "must have one assignment", + ), + "duplicate_top_level_assignment": ( + f"{constant_name} = {valid_triplet_source}\n" + f"{constant_name} = {valid_triplet_source}", + "must have one assignment", + ), + "multiple_assignment_targets": ( + f"{constant_name} = bridge_methods = {valid_triplet_source}", + "must use one simple assignment", + ), + "empty_tuple": ( + f"{constant_name} = ()", + "must be a literal triplet tuple assignment", + ), + "two_item_tuple": ( + f"{constant_name} = ({literal_methods[0]!r}, {literal_methods[1]!r})", + "must be a literal triplet tuple assignment", + ), + "four_item_tuple": ( + f"{constant_name} = (" + f"{literal_methods[0]!r}, {literal_methods[1]!r}, " + f"{literal_methods[2]!r}, 'literal_bridge_delta')", + "must be a literal triplet tuple assignment", + ), + "integer_literal_method_name": ( + f"{constant_name} = ({literal_methods[0]!r}, 123, {literal_methods[2]!r})", + "must use literal method names", + ), + "none_literal_method_name": ( + f"{constant_name} = ({literal_methods[0]!r}, None, {literal_methods[2]!r})", + "must use literal method names", + ), + } + + self.assertIn(guard_name, TRAINING_M41_RELEASE_INDEX_GUARD_TEST_INVENTORY) + for fixture_name, (source, error_snippet) in invalid_sources.items(): + with self.subTest(fixture_name=fixture_name): + with self.assertRaisesRegex(AssertionError, re.escape(error_snippet)): + self._release_index_exactness_bridge_guard_method_names_from_source( + source + ) + def test_training_m47_release_index_per_doc_helper_inventory_self_lock_is_current(self) -> None: helper_name = "_release_index_missing_required_snippets_by_doc" docs_guard_name = "test_training_readmes_expose_m1_m40_release_index_without_raw_test_modules"