// // TextConverterTests.swift // // // Created by Shadowfacts on 12/22/23. // import XCTest @testable import HTMLStreamer final class TextConverterTests: XCTestCase { private func convert(_ html: String, configuration: TextConverterConfiguration = .init()) -> String { convert(html, configuration: configuration, callbacks: DefaultCallbacks.self) } private func convert(_ html: String, configuration: TextConverterConfiguration = .init(), callbacks _: Callbacks.Type = Callbacks.self) -> String { var converter = TextConverter(configuration: configuration) return converter.convert(html: html) } func testConvertBR() { XCTAssertEqual(convert("a
b"), "a\nb") XCTAssertEqual(convert("a
b"), "a\nb") } func testConvertA() { XCTAssertEqual(convert("link"), "link") } func testIncorrectNesting() { XCTAssertEqual(convert("bold both italic"), "bold both italic") } func testTextAfterBlockElement() { XCTAssertEqual(convert("
wee
after"), "wee\n\nafter") XCTAssertEqual(convert("
wee
after", configuration: .init(insertWhitespace: false)), "wee after") } func testMultipleBlockElements() { XCTAssertEqual(convert("
a
b
"), "a\n\nb") XCTAssertEqual(convert("
a
b
", configuration: .init(insertWhitespace: false)), "a b") } func testElementActionCallback() { struct Callbacks: HTMLConversionCallbacks { static func elementAction(name: String, attributes: [Attribute]) -> ElementAction { let clazz = attributes.attributeValue(for: "class") if clazz == "invisible" { return .skip } else if clazz == "ellipsis" { return .replace("…") } else { return .default } } } let skipped = convert("", callbacks: Callbacks.self) XCTAssertEqual(skipped, "") let skipNested = convert("", callbacks: Callbacks.self) XCTAssertEqual(skipNested, "") let replaced = convert("test", callbacks: Callbacks.self) XCTAssertEqual(replaced, "…") } }