from pathlib import Path from click.testing import CliRunner from markitect_tool.cli import main from markitect_tool.content_class import load_content_classes def test_c3_linearization_for_diamond_inheritance(): registry = load_content_classes( { "classes": { "base": {"slots": {"sections": ["Overview"]}}, "left": {"extends": ["base"], "slots": {"sections": ["Left"]}}, "right": {"extends": ["base"], "slots": {"sections": ["Right"]}}, "leaf": {"extends": ["left", "right"], "slots": {"title": "Leaf"}}, } } ) assert registry.linearize("leaf") == ["leaf", "left", "right", "base"] def test_compose_merges_slots_with_explicit_policies(): registry = load_content_classes( { "classes": { "base": { "slots": { "sections": ["Overview"], "assertions": {"tone": "plain", "depth": "short"}, } }, "market": { "extends": ["base"], "slots": { "sections": ["Pricing"], "assertions": {"depth": "detailed"}, }, "merge_policies": { "sections": "append", "assertions": "deep_merge", }, }, "instance": { "extends": ["market"], "slots": {"sections": ["Risks"]}, "merge_policies": {"sections": "append"}, }, } } ) result = registry.compose("instance") assert result.valid assert result.slots["sections"] == ["Overview", "Pricing", "Risks"] assert result.slots["assertions"] == {"tone": "plain", "depth": "detailed"} def test_compose_reports_error_on_conflict(): registry = load_content_classes( { "classes": { "base": {"slots": {"owner": "A"}}, "instance": { "extends": ["base"], "slots": {"owner": "B"}, "merge_policies": {"owner": "error_on_conflict"}, }, } } ) result = registry.compose("instance") assert not result.valid assert result.diagnostics[0].code == "content_class.merge_conflict" def test_mkt_class_resolve_outputs_text(tmp_path: Path): class_file = tmp_path / "classes.yaml" class_file.write_text( """classes: base: slots: sections: - Overview instance: extends: - base slots: sections: - Risks merge_policies: sections: append """, encoding="utf-8", ) result = CliRunner().invoke(main, ["class", "resolve", str(class_file), "instance"]) assert result.exit_code == 0 assert "linearization: instance -> base" in result.output assert "Overview" in result.output assert "Risks" in result.output