// ── 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)") } } }