import Testing @testable import NorgKit struct TextHelperTests { @Test func lineSlicesSplitsOnNewlines() { #expect(TextHelper.lineSlices("a\nb\nc").map(String.init) == ["a", "b", "c"]) } @Test func lineSlicesKeepsTrailingEmptyLine() { #expect(TextHelper.lineSlices("a\n").map(String.init) == ["a", ""]) } @Test func lineSlicesHandlesEmptyString() { #expect(TextHelper.lineSlices("").map(String.init) == [""]) } @Test func enumerateLinesProvidesIndices() { var seen: [(String, Int)] = [] TextHelper.enumerateLines(in: "one\ntwo") { line, index in seen.append((String(line), index)) } #expect(seen.map(\.0) == ["one", "two"]) #expect(seen.map(\.1) == [0, 1]) } @Test func enumerateLinesStripsCarriageReturns() { var lines: [String] = [] TextHelper.enumerateLines(in: "a\r\nb\r\n") { line, _ in lines.append(String(line)) } #expect(lines == ["a", "b", ""]) } @Test func lineReturnsRequestedLine() { #expect(TextHelper.line(in: "a\nb\nc", at: 1).map(String.init) == "b") } @Test func lineReturnsLastLineWithoutTrailingNewline() { #expect(TextHelper.line(in: "a\nb", at: 1).map(String.init) == "b") } @Test func lineStripsCarriageReturn() { #expect(TextHelper.line(in: "a\r\nb", at: 0).map(String.init) == "a") } @Test func lineReturnsNilForOutOfRange() { #expect(TextHelper.line(in: "a\nb", at: 5) == nil) } @Test func lineReturnsNilForNegativeIndex() { #expect(TextHelper.line(in: "a", at: -1) == nil) } @Test func whitespaceTrimmedSubstringTrimsBothEnds() { let trimmed = TextHelper.whitespaceTrimmed(" \t hi \t "[...]) #expect(trimmed == "hi") } @Test func whitespaceTrimmedSubstringOfAllWhitespaceIsEmpty() { #expect(TextHelper.whitespaceTrimmed(" \t "[...]).isEmpty) } @Test func whitespaceTrimmedStringTrimsWhenNeeded() { #expect(TextHelper.whitespaceTrimmed(" hi ") == "hi") } @Test func whitespaceTrimmedStringReturnsSameValueWhenAlreadyTrimmed() { let input = "already-clean" #expect(TextHelper.whitespaceTrimmed(input) == input) } }