learning_ai_clock/ios/ChronoMindTests/AccessibilityTests.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)")
}
}
}