import XCTest @testable import readeck final class StringExtensionsTests: XCTestCase { // MARK: - stripHTML Tests func testStripHTML_SimpleTags() { let html = "

Dies ist ein wichtiger Artikel.

" let expected = "Dies ist ein wichtiger Artikel.\n" XCTAssertEqual(html.stripHTML, expected) } func testStripHTML_ComplexNestedTags() { let html = "

Titel

Text mit kursiv und fett.

" let expected = "Titel\nText mit kursiv und fett." XCTAssertEqual(html.stripHTML, expected) } func testStripHTML_WithAttributes() { let html = "

Text mit Attributen

" let expected = "Text mit Attributen\n" XCTAssertEqual(html.stripHTML, expected) } func testStripHTML_EmptyTags() { let html = "

Inhalt
" let expected = "\nInhalt\n" XCTAssertEqual(html.stripHTML, expected) } func testStripHTML_SelfClosingTags() { let html = "

Text mit
Zeilenumbruch und Bild.

" let expected = "Text mit \nZeilenumbruch und Bild.\n" XCTAssertEqual(html.stripHTML, expected) } func testStripHTML_NoTags() { let plainText = "Dies ist normaler Text ohne HTML." XCTAssertEqual(plainText.stripHTML, plainText) } func testStripHTML_EmptyString() { let emptyString = "" XCTAssertEqual(emptyString.stripHTML, emptyString) } func testStripHTML_OnlyTags() { let onlyTags = "

" let expected = "\n" XCTAssertEqual(onlyTags.stripHTML, expected) } // MARK: - stripHTMLSimple Tests func testStripHTMLSimple_BasicTags() { let html = "

Text mit fett.

" let expected = "Text mit fett." XCTAssertEqual(html.stripHTMLSimple, expected) } func testStripHTMLSimple_HTMLEntities() { let html = "

Text mit  Leerzeichen, & Zeichen und "Anführungszeichen".

" let expected = "Text mit Leerzeichen, & Zeichen und \"Anführungszeichen\"." XCTAssertEqual(html.stripHTMLSimple, expected) } func testStripHTMLSimple_MoreEntities() { let html = "

<Tag> und 'Apostroph'

" let expected = " und 'Apostroph'" XCTAssertEqual(html.stripHTMLSimple, expected) } func testStripHTMLSimple_ComplexHTML() { let html = "

Überschrift

Absatz mit kursiv und fett.

" let expected = "Überschrift\nAbsatz mit kursiv und fett.\nListe 1\nListe 2" XCTAssertEqual(html.stripHTMLSimple, expected) } func testStripHTMLSimple_NoTags() { let plainText = "Normaler Text ohne HTML." XCTAssertEqual(plainText.stripHTMLSimple, plainText) } func testStripHTMLSimple_EmptyString() { let emptyString = "" XCTAssertEqual(emptyString.stripHTMLSimple, emptyString) } func testStripHTMLSimple_WhitespaceHandling() { let html = "

Text mit Whitespace

" let expected = "Text mit Whitespace" XCTAssertEqual(html.stripHTMLSimple, expected) } // MARK: - Performance Tests func testStripHTML_Performance() { let largeHTML = String(repeating: "

Dies ist ein Test mit vielen HTML Tags.

", count: 1000) measure { _ = largeHTML.stripHTML } } func testStripHTMLSimple_Performance() { let largeHTML = String(repeating: "

Dies ist ein Test mit vielen HTML Tags.

", count: 1000) measure { _ = largeHTML.stripHTMLSimple } } // MARK: - Edge Cases func testStripHTML_MalformedHTML() { let malformed = "

Unvollständiger Tag" let expected = "Unvollständiger Tag" XCTAssertEqual(malformed.stripHTML, expected) } func testStripHTML_UnicodeCharacters() { let html = "

Text mit Umlauten: äöüß und Emojis: 🚀📱

" let expected = "Text mit Umlauten: äöüß und Emojis: 🚀📱" XCTAssertEqual(html.stripHTML, expected) } func testStripHTML_Newlines() { let html = "

Erste Zeile
Zweite Zeile

" let expected = "Erste Zeile\nZweite Zeile" XCTAssertEqual(html.stripHTML, expected) } func testStripHTML_ListItems() { let html = "" let expected = "Erster Punkt\nZweiter Punkt\nDritter Punkt" XCTAssertEqual(html.stripHTML, expected) } }