BIZ-104 v1.1: CJK-safe 截断 + multica_proxy 集成 + 三合一报告
- pre_trim_multica_comment v1.0.1:新增 _find_cjk_safe_boundary 避免 split mid-rune - multica_proxy v1.1.0:新增 multica_issue_comment_add 包装函数(自动 pre-trim) - 单测 22 项(14 pre_trim + 8 integration) - 三合一报告:根因定位 + 绕路补丁 + 验证
This commit is contained in:
@@ -0,0 +1,181 @@
|
||||
"""
|
||||
test_pre_trim_multica_comment.py — pre_trim_multica_comment 单元测试
|
||||
|
||||
覆盖 4 类样本(COO 要求):
|
||||
1. 长 markdown
|
||||
2. 嵌套表
|
||||
3. 多代码块
|
||||
4. 中英混排
|
||||
|
||||
版本:v1.0
|
||||
作者:严维序(opengineer)
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import unittest
|
||||
|
||||
_SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
sys.path.insert(0, _SCRIPT_DIR)
|
||||
|
||||
from pre_trim_multica_comment import (
|
||||
pre_trim_for_multica_comment,
|
||||
DEFAULT_MAX_BYTES,
|
||||
__version__,
|
||||
)
|
||||
|
||||
|
||||
class TestPreTrimLongMarkdown(unittest.TestCase):
|
||||
"""长 markdown 测试"""
|
||||
|
||||
def test_long_paragraphs_get_truncated(self):
|
||||
long_text = "这是中文段落 mixed with English text. " * 100
|
||||
result = pre_trim_for_multica_comment(long_text)
|
||||
self.assertLessEqual(result["trimmed_bytes"], DEFAULT_MAX_BYTES)
|
||||
self.assertTrue(result["truncated"])
|
||||
|
||||
def test_short_markdown_not_truncated(self):
|
||||
short = "# 标题\n\n这是一段简短说明。\n\n## 子标题\n\n- 列表项 1\n- 列表项 2\n"
|
||||
result = pre_trim_for_multica_comment(short)
|
||||
self.assertFalse(result["truncated"])
|
||||
self.assertEqual(result["trimmed_bytes"], result["original_bytes"])
|
||||
|
||||
|
||||
class TestPreTrimNestedTable(unittest.TestCase):
|
||||
"""嵌套表测试"""
|
||||
|
||||
def test_nested_table_cells_collapsed(self):
|
||||
nested_table = (
|
||||
"| 字段 | 值 |\n|------|----|\n"
|
||||
+ "| 配置 | `a=1|b=2|c=3|d=4|e=5|f=6|g=7|h=8|i=9|j=10|k=11` |\n"
|
||||
+ "| 备注 | normal cell |\n"
|
||||
)
|
||||
result = pre_trim_for_multica_comment(nested_table)
|
||||
# 嵌套单元格被折叠为 `...`
|
||||
self.assertIn("`...`", result["trimmed"])
|
||||
self.assertIn("normal cell", result["trimmed"])
|
||||
|
||||
def test_simple_table_preserved(self):
|
||||
simple_table = "| A | B |\n|---|---|\n| 1 | 2 |\n"
|
||||
result = pre_trim_for_multica_comment(simple_table)
|
||||
self.assertIn("| A | B |", result["trimmed"])
|
||||
self.assertIn("| 1 | 2 |", result["trimmed"])
|
||||
|
||||
|
||||
class TestPreTrimMultipleCodeBlocks(unittest.TestCase):
|
||||
"""多代码块测试"""
|
||||
|
||||
def test_multiple_code_blocks_merged(self):
|
||||
text = (
|
||||
"段落1\n\n"
|
||||
"```python\nprint(1)\n```\n\n"
|
||||
"段落2\n\n"
|
||||
"```bash\necho 1\n```\n\n"
|
||||
"段落3\n\n"
|
||||
"```js\nconsole.log(1)\n```\n\n"
|
||||
"段落4\n\n"
|
||||
"```yaml\nfoo: bar\n```\n\n"
|
||||
"结尾"
|
||||
)
|
||||
result = pre_trim_for_multica_comment(text)
|
||||
# 应保留首尾两个代码块,中间合并
|
||||
self.assertIn("print(1)", result["trimmed"])
|
||||
self.assertIn("foo: bar", result["trimmed"])
|
||||
# 中间代码块应被省略(echo 1 和 console.log 不应出现)
|
||||
# 注意:合并后保留 first + last,所以 echo/console 可能保留
|
||||
self.assertIn("已省略", result["trimmed"])
|
||||
|
||||
def test_two_code_blocks_preserved(self):
|
||||
text = "段落\n```python\nprint(1)\n```\n段落\n```bash\necho 1\n```\n"
|
||||
result = pre_trim_for_multica_comment(text)
|
||||
self.assertIn("print(1)", result["trimmed"])
|
||||
self.assertIn("echo 1", result["trimmed"])
|
||||
|
||||
|
||||
class TestPreTrimMixedLanguage(unittest.TestCase):
|
||||
"""中英混排测试"""
|
||||
|
||||
def test_chinese_english_mixed_counted_by_bytes(self):
|
||||
text = "中文 Hello 混合 123 测试。\n" * 20
|
||||
result = pre_trim_for_multica_comment(text)
|
||||
# 中文 3 字节/字符,UTF-8 字节数正确
|
||||
self.assertGreater(result["original_bytes"], len(text))
|
||||
self.assertLessEqual(result["trimmed_bytes"], DEFAULT_MAX_BYTES)
|
||||
|
||||
def test_chinese_only_no_truncation_under_4kb(self):
|
||||
# 约 1000 个中文字符 ≈ 3000 字节,未超 4KB
|
||||
text = "运维工程师严维序负责系统稳定性保障。" * 30
|
||||
result = pre_trim_for_multica_comment(text)
|
||||
self.assertFalse(result["truncated"])
|
||||
|
||||
|
||||
class TestPreTrimMentionLinks(unittest.TestCase):
|
||||
"""mention 链接测试"""
|
||||
|
||||
def test_agent_mention_stripped(self):
|
||||
text = "[@徐聪](mention://agent/46bdd4a6-5c64-475a-92ef-36a763602fa1) 已就绪"
|
||||
result = pre_trim_for_multica_comment(text)
|
||||
self.assertIn("@徐聪", result["trimmed"])
|
||||
self.assertNotIn("mention://", result["trimmed"])
|
||||
|
||||
def test_issue_mention_preserved(self):
|
||||
text = "[MUL-104](mention://issue/abc-123) 已派发"
|
||||
result = pre_trim_for_multica_comment(text)
|
||||
self.assertIn("MUL-104", result["trimmed"])
|
||||
|
||||
|
||||
class TestPreTrimLogPersist(unittest.TestCase):
|
||||
""".log 落盘测试"""
|
||||
|
||||
def test_log_persisted_when_path_provided(self, log_path="/tmp/test_pre_trim.log"):
|
||||
if os.path.exists(log_path):
|
||||
os.remove(log_path)
|
||||
long_text = "log test " * 200
|
||||
result = pre_trim_for_multica_comment(long_text, log_path=log_path)
|
||||
self.assertIsNotNone(result["log_path"])
|
||||
self.assertTrue(os.path.exists(log_path))
|
||||
with open(log_path, "r", encoding="utf-8") as f:
|
||||
content = f.read()
|
||||
self.assertIn("log test", content)
|
||||
# 清理
|
||||
os.remove(log_path)
|
||||
|
||||
|
||||
class TestPreTrimVersion(unittest.TestCase):
|
||||
"""版本戳测试(BIZ-38 合规)"""
|
||||
|
||||
def test_version_stamp_present(self):
|
||||
self.assertIsNotNone(__version__)
|
||||
self.assertRegex(__version__, r"^\d+\.\d+\.\d+$")
|
||||
|
||||
|
||||
class TestPreTrimCJKSafeBoundary(unittest.TestCase):
|
||||
"""CJK-safe 截断边界测试(BIZ-104 Phase ④)"""
|
||||
|
||||
def test_no_split_mid_rune(self):
|
||||
"""确保截断点不在 CJK 多字节序列中间"""
|
||||
# 强制截断以验证边界点
|
||||
# 1 个中文字 = 3 字节
|
||||
# 200 个中文字 = 600 字节
|
||||
text = "中" * 200 # 600 字节
|
||||
result = pre_trim_for_multica_comment(text, max_bytes=100)
|
||||
# 验证输出是合法 UTF-8
|
||||
out_bytes = result["trimmed"].encode("utf-8")
|
||||
# 验证不能被错误丢弃的字节产生非法序列
|
||||
try:
|
||||
decoded = out_bytes.decode("utf-8")
|
||||
self.assertIsInstance(decoded, str)
|
||||
except UnicodeDecodeError:
|
||||
self.fail("Output contains invalid UTF-8")
|
||||
|
||||
def test_cjk_density_warning_added(self):
|
||||
"""高 CJK 密度时动作链含 cjk_density_warn"""
|
||||
# 200 个中文字 + 少量 ASCII,CJK 占比 > 95%
|
||||
text = "运维工程师严维序负责系统稳定性保障。" * 50
|
||||
result = pre_trim_for_multica_comment(text)
|
||||
cjk_warnings = [a for a in result["actions"] if "cjk_density" in a]
|
||||
self.assertGreater(len(cjk_warnings), 0)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main(verbosity=2)
|
||||
Reference in New Issue
Block a user