muse-agent-example/tests/单元/test_上下文范围与预算.py

90 lines
3.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""材料装配的必读优先、UTF-8 字节预算与省略原因;离线纯函数合同。
字节期望值按 UTF-8 逐字写死,不由被测函数自身推算,避免同源计算自证。
"""
import dataclasses
import pytest
from muse.上下文.接口 import 上下文错误, 装配材料
def test_必读优先且可选按原顺序整项加入__1c4a9e() -> None:
材料 = {"可选甲": "甲文", "必读": "必读文", "可选乙": "乙文"}
结果 = 装配材料(材料, ("必读",), 字节上限=64)
assert 结果.入选来源 == ("必读", "可选甲", "可选乙")
assert 结果.文本 == "必读文\n\n甲文\n\n乙文"
assert 结果.字节数 == 25 # 三个片段 9+6+6 字节加两处分隔符
assert 结果.省略 == ()
with pytest.raises(dataclasses.FrozenInstanceError):
结果.文本 = "改写"
def test_中文与emoji按utf8字节计数含分隔符__5d1c47() -> None:
原文 = "第1章:雨。🌧"
仅必读 = 装配材料({"历史": 原文}, ("历史",), 字节上限=20)
assert 仅必读.文本 == 原文
assert 仅必读.字节数 == 20 # 含四字节 emoji
材料 = {"历史": 原文, "旁观": "他站着"}
齐 = 装配材料(材料, ("历史",), 字节上限=31)
assert 齐.入选来源 == ("历史", "旁观")
assert 齐.字节数 == 31 # 20 + 分隔符 2 + 9
assert 齐.文本 == f"{原文}\n\n他站着"
缺一字节 = 装配材料(材料, ("历史",), 字节上限=30)
assert 缺一字节.入选来源 == ("历史",)
assert 缺一字节.文本 == 原文
assert 缺一字节.省略 == (("旁观", "BUDGET_EXCEEDED"),)
@pytest.mark.parametrize(
("材料", "必读"),
[({}, ("孤本第三章",)), ({"孤本第三章": " \n "}, ("孤本第三章",))],
ids=["missing", "blank"],
)
def test_必读缺失或空白拒绝__a7e903(材料: dict[str, str], 必读: tuple[str, ...]) -> None:
with pytest.raises(上下文错误) as 异常:
装配材料(材料, 必读, 字节上限=64)
assert 异常.value.错误码 == "CONTEXT_REQUIRED_MISSING"
assert "孤本第三章" in 异常.value.说明
def test_必读整体超预算拒绝__c9e51f() -> None:
材料 = {"甲": "必读甲", "乙": "必读乙", "可选": "可选丙"}
with pytest.raises(上下文错误) as 异常:
装配材料(材料, ("甲", "乙"), 字节上限=19)
assert 异常.value.错误码 == "CONTEXT_BUDGET_EXCEEDED"
assert "20" in 异常.value.说明
恰好 = 装配材料(材料, ("甲", "乙"), 字节上限=20) # 9 + 分隔符 2 + 9
assert 恰好.入选来源 == ("甲", "乙")
assert 恰好.字节数 == 20
assert 恰好.省略 == (("可选", "BUDGET_EXCEEDED"),)
def test_可选空白与超预算分别给出省略原因__4f8ab2() -> None:
材料 = {"必读": "必读文", "空白": " ", "太长": "长" * 40, "入选": "短文"}
结果 = 装配材料(材料, ("必读",), 字节上限=17) # 9 + 分隔符 2 + 6
assert 结果.入选来源 == ("必读", "入选")
assert 结果.省略 == (("空白", "EMPTY"), ("太长", "BUDGET_EXCEEDED"))
@pytest.mark.parametrize(
("字节上限", "必读"),
[(0, ("必读",)), (-3, ("必读",)), (True, ("必读",)), (64, ("必读", "必读"))],
ids=["zero", "negative", "boolean", "duplicate"],
)
def test_非法预算或重复必读身份拒绝__e2168c(字节上限: int, 必读: tuple[str, ...]) -> None:
with pytest.raises(上下文错误) as 异常:
装配材料({"必读": "必读文"}, 必读, 字节上限=字节上限)
assert 异常.value.错误码 == "CONTEXT_INPUT_INVALID"
def test_原文不裁剪空白且按原字节保留__b4d7a1() -> None:
原文 = " 第1章 \n雨还在下。\t\n"
结果 = 装配材料({"历史": 原文}, ("历史",), 字节上限=29)
assert 结果.文本 == 原文
assert 结果.字节数 == 29