Files
markitect-tool/tests/test_content_class_resolution.py

107 lines
3.0 KiB
Python

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