130 lines
4.3 KiB
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)
|
|
}
|
|
}
|