116 lines
4.7 KiB
Python
116 lines
4.7 KiB
Python
"""上下文快照身份与输入哈希的确定性;离线纯函数,不连库。
|
||
|
||
哈希期望覆盖键序无关与逐类输入变化,身份期望按 uuid5 惯例稳定派生。
|
||
"""
|
||
|
||
from muse.上下文.接口 import (
|
||
快照身份,
|
||
快照载荷,
|
||
文本哈希,
|
||
材料装配结果,
|
||
来源绑定,
|
||
输入哈希,
|
||
)
|
||
|
||
范围 = {
|
||
"work_id": "work-a",
|
||
"as_of": 2,
|
||
"source_ids": ["doc-1", "plan-1"],
|
||
"documents": [
|
||
{
|
||
"chapter_id": "ch-1",
|
||
"branch_id": "main",
|
||
"revision": 1,
|
||
"document_id": "doc-1",
|
||
"document_hash": "hash-1",
|
||
"position": 1,
|
||
}
|
||
],
|
||
"directory_revision": 3,
|
||
"authorized_by": "author-a",
|
||
"run_purpose": "production",
|
||
"content_purpose": "generation",
|
||
"target_plan": {
|
||
"chapter_id": "ch-3",
|
||
"plan_id": "plan-1",
|
||
"revision": 1,
|
||
"content_hash": "plan-hash",
|
||
},
|
||
}
|
||
|
||
装配 = 材料装配结果(
|
||
入选来源=("目标章细纲", "历史:ch-1"),
|
||
文本="邮差在旧码头确认收信人。\n\n林深停在码头。",
|
||
字节数=59, # 36 + 分隔符 2 + 21,均按 UTF-8 字节
|
||
省略=(("事实:lin-shen", "BUDGET_EXCEEDED"),),
|
||
)
|
||
绑定 = (
|
||
来源绑定("plan-1", "1", "plan-hash", "visible-text-codepoints/v1:production:generation"),
|
||
来源绑定("doc-1", "1", "hash-1", "visible-text-codepoints/v1:production:generation"),
|
||
)
|
||
|
||
|
||
def test_同载荷同哈希且键序无关__b09301() -> None:
|
||
载荷 = 快照载荷("task-1", 范围, 装配, 绑定)
|
||
assert 输入哈希(载荷) == 输入哈希(快照载荷("task-1", 范围, 装配, 绑定))
|
||
# 键序无关:把范围与载荷键按相反顺序重建,哈希不变
|
||
逆序范围 = {键: 范围[键] for 键 in reversed(list(范围))}
|
||
逆序载荷 = {键: 载荷[键] for 键 in reversed(list(载荷))}
|
||
逆序装配节 = {键: 载荷["装配"][键] for 键 in reversed(list(载荷["装配"]))}
|
||
逆序载荷["装配"] = 逆序装配节
|
||
逆序范围["target_plan"] = {
|
||
键: 范围["target_plan"][键] for 键 in reversed(list(范围["target_plan"]))
|
||
}
|
||
assert 输入哈希(逆序载荷) == 输入哈希(载荷)
|
||
assert 输入哈希(快照载荷("task-1", 逆序范围, 装配, 绑定)) == 输入哈希(载荷)
|
||
# 同一任务同一输入派生同一身份;文本哈希按 UTF-8 字节稳定
|
||
哈希 = 输入哈希(载荷)
|
||
assert 快照身份("task-1", 哈希) == 快照身份("task-1", 哈希)
|
||
assert 快照身份("task-1", 哈希) != 快照身份("task-2", 哈希)
|
||
assert 文本哈希(装配.文本) == 文本哈希("邮差在旧码头确认收信人。\n\n林深停在码头。")
|
||
|
||
|
||
def test_任一输入变化产生新哈希与新身份__b09302() -> None:
|
||
基准 = 输入哈希(快照载荷("task-1", 范围, 装配, 绑定))
|
||
基准身份 = 快照身份("task-1", 基准)
|
||
|
||
变化装配省略 = 材料装配结果(
|
||
入选来源=装配.入选来源,
|
||
文本=装配.文本,
|
||
字节数=装配.字节数,
|
||
省略=(("事实:lin-shen", "BUDGET_EXCEEDED"), ("事实:dock-yard", "EMPTY")),
|
||
)
|
||
变化字节与文本 = 材料装配结果(
|
||
入选来源=("目标章细纲",), 文本="邮差在旧码头确认收信人。", 字节数=36, 省略=装配.省略
|
||
)
|
||
变化文本同字节 = 材料装配结果(
|
||
入选来源=装配.入选来源,
|
||
文本="邮差在新码头确认收信人。\n\n林深停在码头。",
|
||
字节数=装配.字节数,
|
||
省略=装配.省略,
|
||
)
|
||
变化绑定 = (来源绑定("plan-1", "2", "plan-hash-2", 绑定[0].投影版本), 绑定[1])
|
||
变化投影版本 = (
|
||
来源绑定(
|
||
绑定[0].来源ID,
|
||
绑定[0].数据版本,
|
||
绑定[0].结构哈希,
|
||
"visible-text-codepoints/v1:evaluation:generation",
|
||
),
|
||
绑定[1],
|
||
)
|
||
变化范围 = dict(范围, directory_revision=4)
|
||
|
||
变化哈希集 = {
|
||
"省略": 输入哈希(快照载荷("task-1", 范围, 变化装配省略, 绑定)),
|
||
"字节数": 输入哈希(快照载荷("task-1", 范围, 变化字节与文本, 绑定)),
|
||
"文本同字节": 输入哈希(快照载荷("task-1", 范围, 变化文本同字节, 绑定)),
|
||
"来源版本": 输入哈希(快照载荷("task-1", 范围, 装配, 变化绑定)),
|
||
"投影版本": 输入哈希(快照载荷("task-1", 范围, 装配, 变化投影版本)),
|
||
"目录版本": 输入哈希(快照载荷("task-1", 变化范围, 装配, 绑定)),
|
||
}
|
||
assert 基准 not in 变化哈希集.values()
|
||
assert len(set(变化哈希集.values())) == len(变化哈希集)
|
||
for 哈希 in 变化哈希集.values():
|
||
assert 快照身份("task-1", 哈希) != 基准身份
|