muse-agent-example/tests/单元/test_分支三方合并.py
zizi cf0f4fb985 W20–W24:保存知识方法、迁移框架、审校修订与案例行为的集成成果
接续 88dd570,保存 W20–W24 已实现的共享接口、业务入口、迁移、工作台、测试与文档。
W20/W22/W23 保持 in_progress,W21/W24 保持 verified;此提交不宣称方法或规则正式启用、多轮返修、真实角色评测完成。

W25 新增实验、标定、逐调用交付与角色执行及其迁移/测试/索引留在实施工作树,原有私人和旧实现保留项不纳入。

验证:离线 571、前端 33 通过;PG 469 项通过、2 项浏览器未启用,2 项误带入的 W25 用例已移出本提交;最终任务与交付边界 37 项通过。make 检查、最终类型、84 项资源及 diff 检查通过。未重跑浏览器或 Pi 宿主,不以合成调用认证外部模型效果。
独立整体审查四维通过;证据保存在 R2-20260909/提交W20-W24。
2026-09-13 16:24:42 +08:00

57 lines
2.3 KiB
Python

"""按共同基线组合独立修改;不推测冲突,不丢掉空白和样式。"""
import pytest
from muse.正式变更.接口 import 变更错误
from muse.正文写作.接口 import 三方合并, 文本节点, 正文草稿, 段落, 段落差异
def 稿(first="开头", last="结尾"):
return 正文草稿(
(
段落("p1", (文本节点(first, ("emphasis",)),)),
段落("p2", ()),
段落("p3", (文本节点(last),)),
)
)
def test_部分选择只合并该项且目标独立修改保持__233001():
base = 稿()
source = 稿("支线开头", "未选择的支线结尾")
target = 稿(last="作者主线结尾")
choices = 段落差异(base, source)
result = 三方合并(base, source, target, (choices[0]["change_id"],))
assert result == 稿("支线开头", "作者主线结尾")
assert result.paragraphs[1] == base.paragraphs[1]
def test_目标插入导致位移仍精确合并原段__233002():
base, source = 稿(), 稿(last="支线结尾")
extra = 段落("extra", (文本节点("作者加的前言🙂e\u0301"),))
target = 正文草稿((extra, *base.paragraphs))
result = 三方合并(base, source, target, (段落差异(base, source)[0]["change_id"],))
assert result == 正文草稿((extra, *source.paragraphs))
assert base == 稿()
@pytest.mark.parametrize("insert", [False, True])
def test_重叠修改或同位插入冲突不替作者决策__233003(insert):
base, source, target = 稿(), 稿("支线开头"), 稿("主线开头")
if insert:
source = 正文草稿(
(base.paragraphs[0], 段落("s", (文本节点("支线插入"),)), *base.paragraphs[1:])
)
target = 正文草稿(
(base.paragraphs[0], 段落("t", (文本节点("主线插入"),)), *base.paragraphs[1:])
)
with pytest.raises(变更错误, match="冲突"):
三方合并(base, source, target, (段落差异(base, source)[0]["change_id"],))
def test_相同修改仅保留一次且未知差异拒绝__233004():
base, edited = 稿(), 稿("两边相同")
assert 三方合并(base, edited, edited, (段落差异(base, edited)[0]["change_id"],)) == edited
with pytest.raises(变更错误):
三方合并(base, edited, base, ("not-a-change",))