130 lines
5.3 KiB
Swift
130 lines
5.3 KiB
Swift
// ── Accessibility Tests ───────────────────────────────────────
|
|
|
|
import XCTest
|
|
@testable import ChronoMind
|
|
|
|
final class AccessibilityTests: XCTestCase {
|
|
|
|
// MARK: - Timer Descriptions
|
|
|
|
func testActiveTimerDescription() {
|
|
let timer = createAlarm(CreateAlarmParams(
|
|
label: "Morning Standup",
|
|
targetTime: Date().addingTimeInterval(3600),
|
|
urgency: .standard
|
|
))
|
|
let desc = TimerAccessibility.description(for: timer, now: Date())
|
|
XCTAssertTrue(desc.contains("Morning Standup"))
|
|
XCTAssertTrue(desc.contains("Standard"))
|
|
XCTAssertTrue(desc.contains("remaining"))
|
|
}
|
|
|
|
func testFiringTimerDescription() {
|
|
var timer = createAlarm(CreateAlarmParams(
|
|
label: "Critical Alert",
|
|
targetTime: Date().addingTimeInterval(-10),
|
|
urgency: .critical
|
|
))
|
|
timer = fireTimer(timer)
|
|
let desc = TimerAccessibility.description(for: timer, now: Date())
|
|
XCTAssertTrue(desc.contains("firing now"))
|
|
XCTAssertTrue(desc.contains("Critical"))
|
|
XCTAssertTrue(desc.contains("requires attention"))
|
|
}
|
|
|
|
func testPausedTimerDescription() {
|
|
var timer = createCountdown(CreateCountdownParams(label: "Pasta", durationSeconds: 600))
|
|
timer = pauseTimer(timer)
|
|
let desc = TimerAccessibility.description(for: timer, now: Date())
|
|
XCTAssertTrue(desc.contains("paused"))
|
|
XCTAssertTrue(desc.contains("remaining when resumed"))
|
|
}
|
|
|
|
func testWarningTimerDescription() {
|
|
var timer = createAlarm(CreateAlarmParams(
|
|
label: "Meeting",
|
|
targetTime: Date().addingTimeInterval(600),
|
|
urgency: .important
|
|
))
|
|
timer.state = .warning
|
|
timer.warnings = [
|
|
CascadeWarning(id: "w1", minutesBefore: 30, fired: true, firedAt: Date(), scheduledTime: Date()),
|
|
CascadeWarning(id: "w2", minutesBefore: 15, fired: false, firedAt: nil, scheduledTime: Date().addingTimeInterval(300)),
|
|
]
|
|
let desc = TimerAccessibility.description(for: timer, now: Date())
|
|
XCTAssertTrue(desc.contains("warning"))
|
|
XCTAssertTrue(desc.contains("1 of 2"))
|
|
}
|
|
|
|
func testCompletedTimerDescription() {
|
|
var timer = createCountdown(CreateCountdownParams(label: "Done Timer", durationSeconds: 60))
|
|
timer = completeTimer(timer)
|
|
let desc = TimerAccessibility.description(for: timer, now: Date())
|
|
XCTAssertTrue(desc.contains("completed"))
|
|
}
|
|
|
|
func testDismissedTimerDescription() {
|
|
var timer = createCountdown(CreateCountdownParams(label: "Skipped", durationSeconds: 60))
|
|
timer = dismissTimer(timer)
|
|
let desc = TimerAccessibility.description(for: timer, now: Date())
|
|
XCTAssertTrue(desc.contains("dismissed"))
|
|
}
|
|
|
|
func testSnoozedTimerDescription() {
|
|
var timer = createAlarm(CreateAlarmParams(label: "Snoozed", targetTime: Date()))
|
|
timer = fireTimer(timer)
|
|
timer = snoozeTimer(timer, snoozeMinutes: 5)
|
|
let desc = TimerAccessibility.description(for: timer, now: Date())
|
|
XCTAssertTrue(desc.contains("snoozed"))
|
|
}
|
|
|
|
// MARK: - Hints
|
|
|
|
func testActiveTimerHint() {
|
|
let timer = createAlarm(CreateAlarmParams(label: "Test", targetTime: Date().addingTimeInterval(3600)))
|
|
let hint = TimerAccessibility.hint(for: timer)
|
|
XCTAssertTrue(hint.contains("Double tap"))
|
|
}
|
|
|
|
func testFiringTimerHint() {
|
|
var timer = createAlarm(CreateAlarmParams(label: "Test", targetTime: Date()))
|
|
timer = fireTimer(timer)
|
|
let hint = TimerAccessibility.hint(for: timer)
|
|
XCTAssertTrue(hint.contains("dismiss"))
|
|
}
|
|
|
|
func testPausedTimerHint() {
|
|
var timer = createCountdown(CreateCountdownParams(label: "Test", durationSeconds: 600))
|
|
timer = pauseTimer(timer)
|
|
let hint = TimerAccessibility.hint(for: timer)
|
|
XCTAssertTrue(hint.contains("resume"))
|
|
}
|
|
|
|
// MARK: - State Announcements
|
|
|
|
func testStateAnnouncements() {
|
|
XCTAssertTrue(TimerAccessibility.stateAnnouncement(.active).contains("active"))
|
|
XCTAssertTrue(TimerAccessibility.stateAnnouncement(.firing).contains("firing"))
|
|
XCTAssertTrue(TimerAccessibility.stateAnnouncement(.paused).contains("paused"))
|
|
XCTAssertTrue(TimerAccessibility.stateAnnouncement(.completed).contains("completed"))
|
|
XCTAssertTrue(TimerAccessibility.stateAnnouncement(.dismissed).contains("dismissed"))
|
|
XCTAssertTrue(TimerAccessibility.stateAnnouncement(.warning).contains("Warning"))
|
|
XCTAssertTrue(TimerAccessibility.stateAnnouncement(.snoozed).contains("snoozed"))
|
|
}
|
|
|
|
// MARK: - All States Covered
|
|
|
|
func testDescriptionCoversAllStates() {
|
|
let now = Date()
|
|
for state in [CMTimerState.active, .warning, .firing, .paused, .snoozed, .completed, .dismissed, .idle] {
|
|
var timer = createAlarm(CreateAlarmParams(label: "Test", targetTime: now.addingTimeInterval(3600)))
|
|
timer.state = state
|
|
if state == .snoozed {
|
|
timer.snoozedUntil = now.addingTimeInterval(300)
|
|
}
|
|
let desc = TimerAccessibility.description(for: timer, now: now)
|
|
XCTAssertFalse(desc.isEmpty, "Description should not be empty for state \(state)")
|
|
}
|
|
}
|
|
}
|