mirror of
https://github.com/YspCoder/clawgo.git
synced 2026-05-08 07:57:30 +08:00
Slim subagent runtime surface and remove legacy interfaces
This commit is contained in:
@@ -7,71 +7,65 @@ import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestMarkdownToTelegramHTMLFormatsChineseAndInlineMarkup(t *testing.T) {
|
||||
got := markdownToTelegramHTML("中文 **加粗** *斜体* `代码`")
|
||||
if strings.Contains(got, "鈹") || strings.Contains(got, "鈥") {
|
||||
t.Fatalf("unexpected mojibake in output: %q", got)
|
||||
}
|
||||
if !strings.Contains(got, "中文 <b>加粗</b> <i>斜体</i> <code>代码</code>") {
|
||||
func TestMarkdownToTelegramHTMLFormatsInlineMarkup(t *testing.T) {
|
||||
got := markdownToTelegramHTML("plain **bold** *italic* `code`")
|
||||
if !strings.Contains(got, "plain <b>bold</b> <i>italic</i> <code>code</code>") {
|
||||
t.Fatalf("unexpected formatted output: %q", got)
|
||||
}
|
||||
}
|
||||
|
||||
func TestMarkdownToTelegramHTMLFormatsQuoteAndListsWithoutMojibake(t *testing.T) {
|
||||
input := "> 引用\n- 列表\n* 另一项\n1. 有序"
|
||||
func TestMarkdownToTelegramHTMLFormatsQuoteAndLists(t *testing.T) {
|
||||
input := "> quote\n- bullet\n* other\n1. ordered"
|
||||
got := markdownToTelegramHTML(input)
|
||||
|
||||
if strings.Contains(got, "鈹") || strings.Contains(got, "鈥") {
|
||||
t.Fatalf("unexpected mojibake in output: %q", got)
|
||||
}
|
||||
if !strings.Contains(got, "> 引用") {
|
||||
if !strings.Contains(got, "> quote") {
|
||||
t.Fatalf("expected escaped quote marker, got %q", got)
|
||||
}
|
||||
if !strings.Contains(got, "• 列表") || !strings.Contains(got, "• 另一项") {
|
||||
if !strings.Contains(got, "• bullet") || !strings.Contains(got, "• other") {
|
||||
t.Fatalf("expected bullet list markers, got %q", got)
|
||||
}
|
||||
if !strings.Contains(got, "1. 有序") {
|
||||
if !strings.Contains(got, "1. ordered") {
|
||||
t.Fatalf("expected ordered list marker preserved, got %q", got)
|
||||
}
|
||||
}
|
||||
|
||||
func TestRenderTelegramStreamChunksDoesNotInjectMojibake(t *testing.T) {
|
||||
chunks := renderTelegramStreamChunks("> 引用\n- 列表\n1. 有序\n中文内容")
|
||||
func TestRenderTelegramStreamChunksDoesNotInjectBrokenPayload(t *testing.T) {
|
||||
chunks := renderTelegramStreamChunksWithFinalize("> quote\n- bullet\n1. ordered\nplain text", false)
|
||||
if len(chunks) == 0 {
|
||||
t.Fatal("expected stream chunks")
|
||||
}
|
||||
for _, chunk := range chunks {
|
||||
if strings.Contains(chunk.payload, "鈹") || strings.Contains(chunk.payload, "鈥") {
|
||||
t.Fatalf("unexpected mojibake chunk payload: %q", chunk.payload)
|
||||
if strings.TrimSpace(chunk.payload) == "" {
|
||||
t.Fatalf("unexpected empty chunk payload: %+v", chunk)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestShouldFlushTelegramStreamSnapshotRejectsUnclosedMarkdown(t *testing.T) {
|
||||
cases := []string{
|
||||
"中文 **加粗",
|
||||
"中文 *斜体",
|
||||
"中文 `代码",
|
||||
"text **bold",
|
||||
"text *italic",
|
||||
"text `code",
|
||||
"```go\nfmt.Println(\"hi\")",
|
||||
"[链接](https://example.com",
|
||||
"[link](https://example.com",
|
||||
}
|
||||
|
||||
for _, input := range cases {
|
||||
if shouldFlushTelegramStreamSnapshot(input) {
|
||||
t.Fatalf("expected unsafe snapshot to be rejected: %q", input)
|
||||
}
|
||||
if chunks := renderTelegramStreamChunks(input); len(chunks) != 0 {
|
||||
if chunks := renderTelegramStreamChunksWithFinalize(input, false); len(chunks) != 0 {
|
||||
t.Fatalf("expected no chunks for unsafe snapshot %q, got %+v", input, chunks)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestShouldFlushTelegramStreamSnapshotAcceptsBalancedMarkdown(t *testing.T) {
|
||||
input := "> 引用\n- 列表\n1. 有序\n中文 **加粗** *斜体* `代码` [链接](https://example.com)"
|
||||
input := "> quote\n- bullet\n1. ordered\ntext **bold** *italic* `code` [link](https://example.com)"
|
||||
if !shouldFlushTelegramStreamSnapshot(input) {
|
||||
t.Fatalf("expected balanced snapshot to flush: %q", input)
|
||||
}
|
||||
chunks := renderTelegramStreamChunks(input)
|
||||
chunks := renderTelegramStreamChunksWithFinalize(input, false)
|
||||
if len(chunks) == 0 {
|
||||
t.Fatalf("expected chunks for balanced snapshot")
|
||||
}
|
||||
@@ -81,7 +75,7 @@ func TestShouldFlushTelegramStreamSnapshotAcceptsBalancedMarkdown(t *testing.T)
|
||||
}
|
||||
|
||||
func TestRenderTelegramStreamChunksFinalizeRecoversRichFormatting(t *testing.T) {
|
||||
input := "> 引用\n- 列表\n中文 **加粗** *斜体* `代码` [链接](https://example.com)"
|
||||
input := "> quote\n- bullet\ntext **bold** *italic* `code` [link](https://example.com)"
|
||||
chunks := renderTelegramStreamChunksWithFinalize(input, true)
|
||||
if len(chunks) == 0 {
|
||||
t.Fatalf("expected finalize chunks")
|
||||
@@ -89,25 +83,25 @@ func TestRenderTelegramStreamChunksFinalizeRecoversRichFormatting(t *testing.T)
|
||||
if chunks[0].parseMode != "HTML" {
|
||||
t.Fatalf("expected finalize chunk to use HTML, got %q", chunks[0].parseMode)
|
||||
}
|
||||
if !strings.Contains(chunks[0].payload, "<b>加粗</b>") {
|
||||
if !strings.Contains(chunks[0].payload, "<b>bold</b>") {
|
||||
t.Fatalf("expected rich formatting restored, got %q", chunks[0].payload)
|
||||
}
|
||||
}
|
||||
|
||||
func TestMarkdownToTelegramHTMLHandlesEdgeFormatting(t *testing.T) {
|
||||
input := "> 第一段引用\n> 第二段引用\n- 列表一\n - 子项\n1. 有序项\n\n```go\nfmt.Println(\"hi\")\nfmt.Println(\"bye\")\n```\n[链接](https://example.com/path?q=1)"
|
||||
input := "> first quote\n> second quote\n- item one\n - child item\n1. ordered\n\n```go\nfmt.Println(\"hi\")\nfmt.Println(\"bye\")\n```\n[link](https://example.com/path?q=1)"
|
||||
got := markdownToTelegramHTML(input)
|
||||
|
||||
if !strings.Contains(got, "> 第一段引用\n> 第二段引用") {
|
||||
if !strings.Contains(got, "> first quote\n> second quote") {
|
||||
t.Fatalf("expected consecutive quote lines to stay stable, got %q", got)
|
||||
}
|
||||
if !strings.Contains(got, "• 列表一") || !strings.Contains(got, "• 子项") {
|
||||
if !strings.Contains(got, "• item one") || !strings.Contains(got, "• child item") {
|
||||
t.Fatalf("expected nested list lines to normalize to bullets, got %q", got)
|
||||
}
|
||||
if !strings.Contains(got, "<pre><code>fmt.Println(\"hi\")\nfmt.Println(\"bye\")\n</code></pre>") {
|
||||
t.Fatalf("expected code block newlines preserved, got %q", got)
|
||||
}
|
||||
if !strings.Contains(got, `<a href="https://example.com/path?q=1">链接</a>`) {
|
||||
if !strings.Contains(got, `<a href="https://example.com/path?q=1">link</a>`) {
|
||||
t.Fatalf("expected link conversion, got %q", got)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user