// ── Urgency Tests ───────────────────────────────────────────── import XCTest @testable import ChronoMind final class UrgencyTests: XCTestCase { // MARK: - UrgencyLevel func testAllCases() { let cases = UrgencyLevel.allCases XCTAssertEqual(cases.count, 5) XCTAssertTrue(cases.contains(.critical)) XCTAssertTrue(cases.contains(.important)) XCTAssertTrue(cases.contains(.standard)) XCTAssertTrue(cases.contains(.gentle)) XCTAssertTrue(cases.contains(.passive)) } func testRawValues() { XCTAssertEqual(UrgencyLevel.critical.rawValue, "critical") XCTAssertEqual(UrgencyLevel.important.rawValue, "important") XCTAssertEqual(UrgencyLevel.standard.rawValue, "standard") XCTAssertEqual(UrgencyLevel.gentle.rawValue, "gentle") XCTAssertEqual(UrgencyLevel.passive.rawValue, "passive") } func testIdentifiable() { let level = UrgencyLevel.critical XCTAssertEqual(level.id, "critical") } func testCodable() throws { let level = UrgencyLevel.important let data = try JSONEncoder().encode(level) let decoded = try JSONDecoder().decode(UrgencyLevel.self, from: data) XCTAssertEqual(decoded, level) } // MARK: - UrgencyConfig func testGetUrgencyConfig() { for level in UrgencyLevel.allCases { let config = getUrgencyConfig(level) XCTAssertEqual(config.level, level) XCTAssertFalse(config.label.isEmpty) XCTAssertFalse(config.colorHex.isEmpty) } } func testCriticalConfig() { let config = getUrgencyConfig(.critical) XCTAssertEqual(config.level, .critical) XCTAssertTrue(config.requireConfirmToDismiss) XCTAssertTrue(config.fullScreenOverlay) XCTAssertTrue(config.soundEnabled) XCTAssertEqual(config.visualIntensity, 1.0) } func testImportantConfig() { let config = getUrgencyConfig(.important) XCTAssertEqual(config.level, .important) XCTAssertFalse(config.fullScreenOverlay) XCTAssertTrue(config.soundEnabled) XCTAssertGreaterThan(config.visualIntensity, 0.5) } func testStandardConfig() { let config = getUrgencyConfig(.standard) XCTAssertEqual(config.level, .standard) XCTAssertFalse(config.requireConfirmToDismiss) XCTAssertTrue(config.soundEnabled) } func testGentleConfig() { let config = getUrgencyConfig(.gentle) XCTAssertEqual(config.level, .gentle) XCTAssertNotNil(config.autoSnoozeMinutes) XCTAssertLessThan(config.visualIntensity, 0.5) } func testPassiveConfig() { let config = getUrgencyConfig(.passive) XCTAssertEqual(config.level, .passive) XCTAssertFalse(config.soundEnabled) XCTAssertNotNil(config.autoSnoozeMinutes) XCTAssertEqual(config.visualIntensity, 0.1) } // MARK: - Notification Styles func testNotificationStylesEscalate() { let criticalConfig = getUrgencyConfig(.critical) let passiveConfig = getUrgencyConfig(.passive) // Critical should have higher visual intensity than passive XCTAssertGreaterThan(criticalConfig.visualIntensity, passiveConfig.visualIntensity) } // MARK: - Vibration Patterns func testVibrationPatternsNotEmpty() { for level in UrgencyLevel.allCases { let config = getUrgencyConfig(level) XCTAssertFalse(config.vibrationPattern.isEmpty, "Vibration pattern for \(level) should not be empty") } } // MARK: - Timer Integration func testTimerCreatedWithUrgency() { for level in UrgencyLevel.allCases { let timer = createAlarm(CreateAlarmParams( label: "Test \(level.rawValue)", targetTime: Date().addingTimeInterval(3600), urgency: level )) XCTAssertEqual(timer.urgency, level) } } func testDefaultUrgencyIsStandard() { let timer = createAlarm(CreateAlarmParams( label: "Default", targetTime: Date().addingTimeInterval(3600) )) XCTAssertEqual(timer.urgency, .standard) } }