generated from coulomb/repo-seed
extension for ref resolve, explode, implode, weave, tangle
This commit is contained in:
106
tests/test_content_class_resolution.py
Normal file
106
tests/test_content_class_resolution.py
Normal file
@@ -0,0 +1,106 @@
|
||||
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
|
||||
Reference in New Issue
Block a user