Files
Sybil-2/ios/Packages/Sybil/Tests/SybilTests/MessagePresentationTests.swift
T

55 lines
2.9 KiB
Swift
Raw Normal View History

import MarkdownUI
import SwiftUI
import Testing
import UIKit
@testable import Sybil
@Suite @MainActor
struct MessagePresentationTests {
@Test func userMarkupRemainsLiteral() {
let source = "**bold** [link](https://example.invalid) `code`\n- item\n<script>literal</script>"
let content = SybilMessageText.literalContent(source)
#expect(content.renderPlainText() == source)
#expect(!content.renderHTML().contains("<strong>"))
#expect(!content.renderHTML().contains("<a "))
#expect(!content.renderHTML().contains("<code>"))
#expect(!content.renderHTML().contains("<ul>"))
#expect(content.renderHTML().contains("&lt;script&gt;"))
}
@Test func literalLineBreaksAndParagraphsStayDistinct() {
let content = SybilMessageText.literalContent("First\nSecond\n\nThird")
#expect(content.renderPlainText() == "First\nSecond\n\nThird")
#expect(content.renderHTML() == "<p>First\nSecond</p>\n<p>Third</p>\n")
// Empty paragraphs retain layout space instead of disappearing.
#expect(SybilMessageText.literalContent("\n\nFirst\n\n\n\nLast\n\n").renderHTML().components(separatedBy: "<p>").count == 6)
}
@Test func pastedParagraphBoundariesMatchMarkdown() {
for source in ["First\r\n\r\nSecond", "First\n \nSecond", "First\n\t\nSecond"] {
#expect(SybilMessageText.literalContent(source).renderHTML() == "<p>First</p>\n<p>Second</p>\n")
}
#expect(SybilMessageText.literalContent("First\r\nSecond").renderPlainText() == "First\nSecond")
#expect(SybilMessageText.literalContent(" **literal** \n\nLast").renderPlainText() == " **literal** \n\nLast")
#expect(SybilMessageText.literalContent("First\r\n \r\n\t\r\n\r\nLast") == SybilMessageText.literalContent("First\n\n\n\nLast"))
}
@Test func bothFormatsShareLineParagraphMetricsAndDynamicType() {
func height(_ content: String, _ format: SybilMessageText.Format, _ size: DynamicTypeSize) -> CGFloat {
let host = UIHostingController(rootView: SybilMessageText(content: content, format: format)
.environment(\.dynamicTypeSize, size))
return host.sizeThatFits(in: CGSize(width: 320, height: 10_000)).height
}
let literal = "First line\nSecond line\n\nAnother paragraph"
let markdown = "First line \nSecond line\n\nAnother paragraph"
for size in [DynamicTypeSize.large, .accessibility3] {
#expect(abs(height(literal, .literal, size) - height(markdown, .markdown, size)) < 1)
}
for source in ["First\r\n\r\nSecond", "First\n \nSecond", "First\n\t\nSecond"] {
#expect(abs(height(source, .literal, .large) - height(source, .markdown, .large)) < 1)
}
#expect(height(literal, .literal, .accessibility3) > height(literal, .literal, .large) * 1.5)
#expect(height(markdown, .markdown, .accessibility3) > height(markdown, .markdown, .large) * 1.5)
}
}