feat: add lottie for animations
This commit is contained in:
@@ -122,4 +122,101 @@ final class SettingsManagerTests: XCTestCase {
|
||||
config.intervalMinutes = 20
|
||||
XCTAssertEqual(config.intervalSeconds, 1200)
|
||||
}
|
||||
|
||||
func testSettingsAutoSaveOnChange() {
|
||||
var settings = AppSettings.defaults
|
||||
settings.playSounds = false
|
||||
|
||||
settingsManager.settings = settings
|
||||
|
||||
let savedData = UserDefaults.standard.data(forKey: "gazeAppSettings")
|
||||
XCTAssertNotNil(savedData)
|
||||
}
|
||||
|
||||
func testMultipleTimerConfigurationUpdates() {
|
||||
let config1 = TimerConfiguration(enabled: false, intervalSeconds: 600)
|
||||
settingsManager.updateTimerConfiguration(for: .lookAway, configuration: config1)
|
||||
|
||||
let config2 = TimerConfiguration(enabled: true, intervalSeconds: 900)
|
||||
settingsManager.updateTimerConfiguration(for: .blink, configuration: config2)
|
||||
|
||||
let config3 = TimerConfiguration(enabled: false, intervalSeconds: 2400)
|
||||
settingsManager.updateTimerConfiguration(for: .posture, configuration: config3)
|
||||
|
||||
XCTAssertEqual(settingsManager.timerConfiguration(for: .lookAway).intervalSeconds, 600)
|
||||
XCTAssertEqual(settingsManager.timerConfiguration(for: .blink).intervalSeconds, 900)
|
||||
XCTAssertEqual(settingsManager.timerConfiguration(for: .posture).intervalSeconds, 2400)
|
||||
|
||||
XCTAssertFalse(settingsManager.timerConfiguration(for: .lookAway).enabled)
|
||||
XCTAssertTrue(settingsManager.timerConfiguration(for: .blink).enabled)
|
||||
XCTAssertFalse(settingsManager.timerConfiguration(for: .posture).enabled)
|
||||
}
|
||||
|
||||
func testSettingsPersistenceAcrossReloads() {
|
||||
var settings = AppSettings.defaults
|
||||
settings.lookAwayCountdownSeconds = 45
|
||||
settings.playSounds = false
|
||||
|
||||
settingsManager.settings = settings
|
||||
settingsManager.load()
|
||||
|
||||
XCTAssertEqual(settingsManager.settings.lookAwayCountdownSeconds, 45)
|
||||
XCTAssertFalse(settingsManager.settings.playSounds)
|
||||
}
|
||||
|
||||
func testInvalidDataDoesNotCrashLoad() {
|
||||
UserDefaults.standard.set(Data("invalid".utf8), forKey: "gazeAppSettings")
|
||||
|
||||
settingsManager.load()
|
||||
|
||||
XCTAssertEqual(settingsManager.settings, .defaults)
|
||||
}
|
||||
|
||||
func testAllTimerTypesHaveConfiguration() {
|
||||
for timerType in TimerType.allCases {
|
||||
let config = settingsManager.timerConfiguration(for: timerType)
|
||||
XCTAssertNotNil(config)
|
||||
}
|
||||
}
|
||||
|
||||
func testUpdateTimerConfigurationPersists() {
|
||||
let newConfig = TimerConfiguration(enabled: false, intervalSeconds: 7200)
|
||||
settingsManager.updateTimerConfiguration(for: .posture, configuration: newConfig)
|
||||
|
||||
settingsManager.load()
|
||||
|
||||
let retrieved = settingsManager.timerConfiguration(for: .posture)
|
||||
XCTAssertEqual(retrieved.intervalSeconds, 7200)
|
||||
XCTAssertFalse(retrieved.enabled)
|
||||
}
|
||||
|
||||
func testResetToDefaultsClearsAllChanges() {
|
||||
settingsManager.settings.lookAwayTimer.enabled = false
|
||||
settingsManager.settings.lookAwayCountdownSeconds = 60
|
||||
settingsManager.settings.blinkTimer.intervalSeconds = 10 * 60
|
||||
settingsManager.settings.postureTimer.enabled = false
|
||||
settingsManager.settings.hasCompletedOnboarding = true
|
||||
settingsManager.settings.launchAtLogin = true
|
||||
settingsManager.settings.playSounds = false
|
||||
|
||||
settingsManager.resetToDefaults()
|
||||
|
||||
let defaults = AppSettings.defaults
|
||||
XCTAssertEqual(settingsManager.settings, defaults)
|
||||
}
|
||||
|
||||
func testConcurrentAccessDoesNotCrash() {
|
||||
let expectation = XCTestExpectation(description: "Concurrent access")
|
||||
expectation.expectedFulfillmentCount = 10
|
||||
|
||||
for i in 0..<10 {
|
||||
Task { @MainActor in
|
||||
let config = TimerConfiguration(enabled: true, intervalSeconds: 300 * (i + 1))
|
||||
settingsManager.updateTimerConfiguration(for: .lookAway, configuration: config)
|
||||
expectation.fulfill()
|
||||
}
|
||||
}
|
||||
|
||||
wait(for: [expectation], timeout: 2.0)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user