generated from coulomb/repo-seed
107 lines
3.0 KiB
Python
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
|