import Foundation
import Testing
#if canImport(UIKit)
import SwiftUI
import UIKit
#endif
@testable import OpenClawChatUI
struct ChatMarkdownBlockSegmenterTests {
private func segments(_ markdown: String, isComplete: Bool = true) -> [ChatMarkdownBlock] {
ChatMarkdownBlockSegmenter.segments(markdown: markdown, isComplete: isComplete)
}
private func item(
_ content: [ChatMarkdownListItemContent],
checkbox: ChatMarkdownListItem.Checkbox? = nil) -> ChatMarkdownListItem
{
ChatMarkdownListItem(checkbox: checkbox, content: content)
}
// MARK: - Prose
@Test func `plain prose stays one block`() {
let blocks = self.segments("alpha\nbeta\n\ngamma")
#expect(blocks == [.prose("alpha\nbeta\n\ngamma")])
}
@Test func `whitespace only input yields no blocks`() {
#expect(self.segments(" \n\n ") == [])
}
@Test func `crlf input is normalized`() {
let blocks = self.segments("alpha\r\n```\r\ncode\r\n```")
#expect(blocks == [
.prose("alpha"),
.code(ChatCodeBlock(language: nil, code: "code", isComplete: true)),
])
}
// MARK: - Disclosures
@Test @MainActor func `details fold collapsed and expanded blocks`() throws {
let collapsed = try #require(self.segments("""
**Why**
Body
More
Body
**Why**
\n\nBody\n\nDetails
\n\nBody\n\n
Body
Why
- first
- second
```swift
let value = 1
```
X
Example
"""
#expect(self.segments(commented) == [.prose(commented)])
#expect(self.segments(preformatted) == [.prose(preformatted)])
}
@Test func `details after an HTML comment still fold`() {
let comment = """
"""
#expect(self.segments("""
\(comment)
\n
\n