import Foundation import Testing @testable import CardsNative @Suite("Cloze") struct ClozeTests { @Test("Extrahiert distinct Cluster-IDs sortiert") func extractsClusterIds() { let text = "{{c2::a}} und {{c1::b}} sowie {{c2::c}}" #expect(Cloze.extractClusterIds(text) == [1, 2]) } @Test("Leerer Text → leere Cluster-Liste") func noClustersWhenEmpty() { #expect(Cloze.extractClusterIds("Kein Cluster hier") == []) } @Test("subIndexCount entspricht distinct Clustern") func subIndexCountMatchesClusters() { #expect(Cloze.subIndexCount("Nur {{c1::eins}}") == 1) #expect(Cloze.subIndexCount("{{c1::a}} {{c2::b}} {{c3::c}}") == 3) #expect(Cloze.subIndexCount("Nichts") == 0) } @Test("clusterId-für-subIndex mappt aufsteigend") func clusterIdForSubIndex() { let text = "{{c2::a}} {{c1::b}}" #expect(Cloze.clusterId(for: text, subIndex: 0) == 1) #expect(Cloze.clusterId(for: text, subIndex: 1) == 2) #expect(Cloze.clusterId(for: text, subIndex: 2) == nil) } @Test("Prompt ersetzt aktiven Cluster mit Ellipsis") func renderPromptHidesActive() { let text = "Hauptstadt von {{c1::Frankreich}} ist {{c2::Paris}}." let prompt = Cloze.renderPrompt(text, activeClusterId: 2) #expect(prompt == "Hauptstadt von Frankreich ist […].") } @Test("Prompt nutzt Hint wenn vorhanden") func renderPromptUsesHint() { let text = "Die {{c1::Sonne::Stern}} ist heiß." #expect(Cloze.renderPrompt(text, activeClusterId: 1) == "Die [Stern] ist heiß.") } @Test("Answer markiert aktiven Cluster mit Markdown-Bold") func renderAnswerBoldsActive() { let text = "{{c1::A}} und {{c2::B}}" #expect(Cloze.renderAnswer(text, activeClusterId: 1) == "**A** und B") #expect(Cloze.renderAnswer(text, activeClusterId: 2) == "A und **B**") } @Test("Hint-Lookup gibt erstes Vorkommen") func hintLookup() { let text = "{{c1::a}} {{c1::b::tipp}}" #expect(Cloze.hint(for: text, clusterId: 1) == "tipp") #expect(Cloze.hint(for: text, clusterId: 2) == nil) } }