learning_ai_clock/ios/ChronoMindTests/UrgencyTests.swift

130 lines
4.3 KiB
Swift

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