Files
TUIkit/Tests/TUIkitTests/StringANSITests.swift
T
phranck b8634165fe Chore: Fix SwiftLint warnings and add code review agent
- Fix modifier order (nonisolated before static/public)
- Fix switch case alignment in ContentView.swift
- Fix empty string comparisons (use .isEmpty)
- Fix identical operands in KeyEventTests
- Remove vertical whitespace before closing braces
- Fix trailing whitespace and newlines
- Add swiftlint:disable comments for valid IUO patterns
- Add .claude/commands/review.md code review agent
2026-02-07 13:19:15 +01:00

112 lines
3.1 KiB
Swift

// 🖥️ TUIKit — Terminal UI Kit for Swift
// StringANSITests.swift
//
// Created by LAYERED.work
// License: MIT
import Testing
@testable import TUIkit
@MainActor
@Suite("String ANSI Extension Tests")
struct StringANSITests {
// MARK: - stripped
@Test("stripped removes ANSI codes from text")
func strippedRemovesCodes() {
let styled = "\u{1B}[31mHello\u{1B}[0m"
#expect(styled.stripped == "Hello")
}
@Test("stripped on plain text returns unchanged")
func strippedPlainText() {
#expect("Hello World".stripped == "Hello World")
}
@Test("stripped on empty string returns empty")
func strippedEmpty() {
#expect("".stripped.isEmpty)
}
@Test("stripped removes nested ANSI codes")
func strippedNested() {
let text = "\u{1B}[1m\u{1B}[31mBold Red\u{1B}[0m"
#expect(text.stripped == "Bold Red")
}
@Test("stripped removes multiple codes in one string")
func strippedMultiple() {
let text = "\u{1B}[32mGreen\u{1B}[0m and \u{1B}[34mBlue\u{1B}[0m"
#expect(text.stripped == "Green and Blue")
}
@Test("stripped handles RGB color codes")
func strippedRGB() {
let text = "\u{1B}[38;2;255;0;0mRed\u{1B}[0m"
#expect(text.stripped == "Red")
}
// MARK: - strippedLength
@Test("strippedLength counts visible characters only")
func strippedLengthVisible() {
let styled = "\u{1B}[31mHello\u{1B}[0m"
#expect(styled.strippedLength == 5)
}
@Test("strippedLength on plain text equals count")
func strippedLengthPlain() {
let text = "Hello"
#expect(text.strippedLength == text.count)
}
@Test("strippedLength on empty string is zero")
func strippedLengthEmpty() {
#expect("".strippedLength == 0)
}
// MARK: - padToVisibleWidth
@Test("padToVisibleWidth pads short string")
func padShortString() {
let result = "Hi".padToVisibleWidth(5)
#expect(result == "Hi ")
#expect(result.count == 5)
}
@Test("padToVisibleWidth on exact width returns unchanged")
func padExactWidth() {
let result = "Hello".padToVisibleWidth(5)
#expect(result == "Hello")
}
@Test("padToVisibleWidth on longer string returns unchanged")
func padLongerString() {
let result = "Hello World".padToVisibleWidth(5)
#expect(result == "Hello World")
}
@Test("padToVisibleWidth with ANSI codes pads to visible width")
func padWithANSI() {
let styled = "\u{1B}[31mHi\u{1B}[0m" // "Hi" in red
let result = styled.padToVisibleWidth(5)
// Should pad based on visible width (2), not string length
#expect(result.strippedLength == 5)
#expect(result.stripped == "Hi ")
}
@Test("padToVisibleWidth with zero target")
func padZeroTarget() {
let result = "Hi".padToVisibleWidth(0)
#expect(result == "Hi") // unchanged, already wider
}
@Test("padToVisibleWidth on empty string")
func padEmptyString() {
let result = "".padToVisibleWidth(3)
#expect(result == " ")
}
}