testing:like all fail
This commit is contained in:
176
GazeTests/IntegrationTests.swift
Normal file
176
GazeTests/IntegrationTests.swift
Normal file
@@ -0,0 +1,176 @@
|
||||
//
|
||||
// IntegrationTests.swift
|
||||
// GazeTests
|
||||
//
|
||||
// Created by Mike Freno on 1/8/26.
|
||||
//
|
||||
|
||||
import XCTest
|
||||
@testable import Gaze
|
||||
|
||||
@MainActor
|
||||
final class IntegrationTests: XCTestCase {
|
||||
|
||||
var settingsManager: SettingsManager!
|
||||
var timerEngine: TimerEngine!
|
||||
|
||||
override func setUp() async throws {
|
||||
try await super.setUp()
|
||||
settingsManager = SettingsManager.shared
|
||||
UserDefaults.standard.removeObject(forKey: "gazeAppSettings")
|
||||
settingsManager.load()
|
||||
timerEngine = TimerEngine(settingsManager: settingsManager)
|
||||
}
|
||||
|
||||
override func tearDown() async throws {
|
||||
timerEngine.stop()
|
||||
UserDefaults.standard.removeObject(forKey: "gazeAppSettings")
|
||||
try await super.tearDown()
|
||||
}
|
||||
|
||||
func testSettingsChangePropagateToTimerEngine() {
|
||||
timerEngine.start()
|
||||
|
||||
let originalInterval = timerEngine.timerStates[.lookAway]?.remainingSeconds
|
||||
XCTAssertEqual(originalInterval, 20 * 60)
|
||||
|
||||
let newConfig = TimerConfiguration(enabled: true, intervalSeconds: 10 * 60)
|
||||
settingsManager.updateTimerConfiguration(for: .lookAway, configuration: newConfig)
|
||||
|
||||
timerEngine.start()
|
||||
|
||||
let newInterval = timerEngine.timerStates[.lookAway]?.remainingSeconds
|
||||
XCTAssertEqual(newInterval, 10 * 60)
|
||||
}
|
||||
|
||||
func testDisablingTimerRemovesFromEngine() {
|
||||
timerEngine.start()
|
||||
XCTAssertNotNil(timerEngine.timerStates[.blink])
|
||||
|
||||
var config = TimerConfiguration(enabled: false, intervalSeconds: 5 * 60)
|
||||
settingsManager.updateTimerConfiguration(for: .blink, configuration: config)
|
||||
|
||||
timerEngine.start()
|
||||
XCTAssertNil(timerEngine.timerStates[.blink])
|
||||
}
|
||||
|
||||
func testEnablingTimerAddsToEngine() {
|
||||
settingsManager.settings.postureTimer.enabled = false
|
||||
timerEngine.start()
|
||||
XCTAssertNil(timerEngine.timerStates[.posture])
|
||||
|
||||
let config = TimerConfiguration(enabled: true, intervalSeconds: 30 * 60)
|
||||
settingsManager.updateTimerConfiguration(for: .posture, configuration: config)
|
||||
|
||||
timerEngine.start()
|
||||
XCTAssertNotNil(timerEngine.timerStates[.posture])
|
||||
}
|
||||
|
||||
func testSettingsPersistAcrossEngineLifecycle() {
|
||||
let config = TimerConfiguration(enabled: false, intervalSeconds: 15 * 60)
|
||||
settingsManager.updateTimerConfiguration(for: .lookAway, configuration: config)
|
||||
|
||||
timerEngine.start()
|
||||
timerEngine.stop()
|
||||
|
||||
let newEngine = TimerEngine(settingsManager: settingsManager)
|
||||
newEngine.start()
|
||||
|
||||
XCTAssertNil(newEngine.timerStates[.lookAway])
|
||||
}
|
||||
|
||||
func testMultipleTimerConfigurationUpdates() {
|
||||
timerEngine.start()
|
||||
|
||||
let configs = [
|
||||
(TimerType.lookAway, TimerConfiguration(enabled: true, intervalSeconds: 600)),
|
||||
(TimerType.blink, TimerConfiguration(enabled: true, intervalSeconds: 300)),
|
||||
(TimerType.posture, TimerConfiguration(enabled: true, intervalSeconds: 1800))
|
||||
]
|
||||
|
||||
for (type, config) in configs {
|
||||
settingsManager.updateTimerConfiguration(for: type, configuration: config)
|
||||
}
|
||||
|
||||
timerEngine.start()
|
||||
|
||||
XCTAssertEqual(timerEngine.timerStates[.lookAway]?.remainingSeconds, 600)
|
||||
XCTAssertEqual(timerEngine.timerStates[.blink]?.remainingSeconds, 300)
|
||||
XCTAssertEqual(timerEngine.timerStates[.posture]?.remainingSeconds, 1800)
|
||||
}
|
||||
|
||||
func testResetToDefaultsAffectsTimerEngine() {
|
||||
let config = TimerConfiguration(enabled: false, intervalSeconds: 5 * 60)
|
||||
settingsManager.updateTimerConfiguration(for: .blink, configuration: config)
|
||||
|
||||
timerEngine.start()
|
||||
XCTAssertNil(timerEngine.timerStates[.blink])
|
||||
|
||||
settingsManager.resetToDefaults()
|
||||
timerEngine.start()
|
||||
|
||||
XCTAssertNotNil(timerEngine.timerStates[.blink])
|
||||
XCTAssertEqual(timerEngine.timerStates[.blink]?.remainingSeconds, 5 * 60)
|
||||
}
|
||||
|
||||
func testTimerEngineRespectsDisabledTimers() {
|
||||
settingsManager.settings.lookAwayTimer.enabled = false
|
||||
settingsManager.settings.blinkTimer.enabled = false
|
||||
settingsManager.settings.postureTimer.enabled = false
|
||||
|
||||
timerEngine.start()
|
||||
|
||||
XCTAssertTrue(timerEngine.timerStates.isEmpty)
|
||||
}
|
||||
|
||||
func testCompleteWorkflow() {
|
||||
timerEngine.start()
|
||||
|
||||
XCTAssertEqual(timerEngine.timerStates.count, 3)
|
||||
|
||||
timerEngine.pause()
|
||||
for (_, state) in timerEngine.timerStates {
|
||||
XCTAssertTrue(state.isPaused)
|
||||
}
|
||||
|
||||
timerEngine.resume()
|
||||
for (_, state) in timerEngine.timerStates {
|
||||
XCTAssertFalse(state.isPaused)
|
||||
}
|
||||
|
||||
timerEngine.skipNext(type: .lookAway)
|
||||
XCTAssertEqual(timerEngine.timerStates[.lookAway]?.remainingSeconds, 20 * 60)
|
||||
|
||||
timerEngine.stop()
|
||||
XCTAssertTrue(timerEngine.timerStates.isEmpty)
|
||||
}
|
||||
|
||||
func testReminderWorkflow() {
|
||||
timerEngine.start()
|
||||
|
||||
timerEngine.triggerReminder(for: .lookAway)
|
||||
XCTAssertNotNil(timerEngine.activeReminder)
|
||||
|
||||
for (_, state) in timerEngine.timerStates {
|
||||
XCTAssertTrue(state.isPaused)
|
||||
}
|
||||
|
||||
timerEngine.dismissReminder()
|
||||
XCTAssertNil(timerEngine.activeReminder)
|
||||
|
||||
for (_, state) in timerEngine.timerStates {
|
||||
XCTAssertFalse(state.isPaused)
|
||||
}
|
||||
}
|
||||
|
||||
func testSettingsAutoSaveIntegration() {
|
||||
let config = TimerConfiguration(enabled: false, intervalSeconds: 900)
|
||||
settingsManager.updateTimerConfiguration(for: .lookAway, configuration: config)
|
||||
|
||||
settingsManager.load()
|
||||
|
||||
let loadedConfig = settingsManager.timerConfiguration(for: .lookAway)
|
||||
XCTAssertEqual(loadedConfig.intervalSeconds, 900)
|
||||
XCTAssertFalse(loadedConfig.enabled)
|
||||
}
|
||||
}
|
||||
@@ -74,7 +74,7 @@ final class SettingsManagerTests: XCTestCase {
|
||||
}
|
||||
|
||||
func testUpdateTimerConfiguration() {
|
||||
var newConfig = TimerConfiguration(enabled: false, intervalSeconds: 10 * 60)
|
||||
let newConfig = TimerConfiguration(enabled: false, intervalSeconds: 10 * 60)
|
||||
settingsManager.updateTimerConfiguration(for: .lookAway, configuration: newConfig)
|
||||
|
||||
let retrieved = settingsManager.timerConfiguration(for: .lookAway)
|
||||
|
||||
@@ -141,4 +141,169 @@ final class TimerEngineTests: XCTestCase {
|
||||
XCTAssertFalse(state.isPaused)
|
||||
}
|
||||
}
|
||||
|
||||
func testTriggerReminderForLookAway() {
|
||||
timerEngine.start()
|
||||
|
||||
timerEngine.triggerReminder(for: .lookAway)
|
||||
|
||||
XCTAssertNotNil(timerEngine.activeReminder)
|
||||
if case .lookAwayTriggered(let countdown) = timerEngine.activeReminder {
|
||||
XCTAssertEqual(countdown, settingsManager.settings.lookAwayCountdownSeconds)
|
||||
} else {
|
||||
XCTFail("Expected lookAwayTriggered reminder")
|
||||
}
|
||||
|
||||
for (_, state) in timerEngine.timerStates {
|
||||
XCTAssertTrue(state.isPaused)
|
||||
}
|
||||
}
|
||||
|
||||
func testTriggerReminderForBlink() {
|
||||
timerEngine.start()
|
||||
|
||||
timerEngine.triggerReminder(for: .blink)
|
||||
|
||||
XCTAssertNotNil(timerEngine.activeReminder)
|
||||
if case .blinkTriggered = timerEngine.activeReminder {
|
||||
XCTAssertTrue(true)
|
||||
} else {
|
||||
XCTFail("Expected blinkTriggered reminder")
|
||||
}
|
||||
}
|
||||
|
||||
func testTriggerReminderForPosture() {
|
||||
timerEngine.start()
|
||||
|
||||
timerEngine.triggerReminder(for: .posture)
|
||||
|
||||
XCTAssertNotNil(timerEngine.activeReminder)
|
||||
if case .postureTriggered = timerEngine.activeReminder {
|
||||
XCTAssertTrue(true)
|
||||
} else {
|
||||
XCTFail("Expected postureTriggered reminder")
|
||||
}
|
||||
}
|
||||
|
||||
func testGetTimeRemainingForNonExistentTimer() {
|
||||
let timeRemaining = timerEngine.getTimeRemaining(for: .lookAway)
|
||||
XCTAssertEqual(timeRemaining, 0)
|
||||
}
|
||||
|
||||
func testGetFormattedTimeRemainingZeroSeconds() {
|
||||
timerEngine.start()
|
||||
timerEngine.timerStates[.lookAway]?.remainingSeconds = 0
|
||||
|
||||
let formatted = timerEngine.getFormattedTimeRemaining(for: .lookAway)
|
||||
XCTAssertEqual(formatted, "0:00")
|
||||
}
|
||||
|
||||
func testGetFormattedTimeRemainingLessThanMinute() {
|
||||
timerEngine.start()
|
||||
timerEngine.timerStates[.lookAway]?.remainingSeconds = 45
|
||||
|
||||
let formatted = timerEngine.getFormattedTimeRemaining(for: .lookAway)
|
||||
XCTAssertEqual(formatted, "0:45")
|
||||
}
|
||||
|
||||
func testGetFormattedTimeRemainingExactHour() {
|
||||
timerEngine.start()
|
||||
timerEngine.timerStates[.lookAway]?.remainingSeconds = 3600
|
||||
|
||||
let formatted = timerEngine.getFormattedTimeRemaining(for: .lookAway)
|
||||
XCTAssertEqual(formatted, "1:00:00")
|
||||
}
|
||||
|
||||
func testMultipleStartCallsResetTimers() {
|
||||
timerEngine.start()
|
||||
timerEngine.timerStates[.lookAway]?.remainingSeconds = 100
|
||||
|
||||
timerEngine.start()
|
||||
|
||||
XCTAssertEqual(timerEngine.timerStates[.lookAway]?.remainingSeconds, 20 * 60)
|
||||
}
|
||||
|
||||
func testSkipNextPreservesPausedState() {
|
||||
timerEngine.start()
|
||||
timerEngine.pause()
|
||||
|
||||
timerEngine.skipNext(type: .lookAway)
|
||||
|
||||
XCTAssertTrue(timerEngine.timerStates[.lookAway]?.isPaused ?? false)
|
||||
}
|
||||
|
||||
func testSkipNextPreservesActiveState() {
|
||||
timerEngine.start()
|
||||
|
||||
timerEngine.skipNext(type: .lookAway)
|
||||
|
||||
XCTAssertTrue(timerEngine.timerStates[.lookAway]?.isActive ?? false)
|
||||
}
|
||||
|
||||
func testDismissReminderWithNoActiveReminder() {
|
||||
timerEngine.start()
|
||||
XCTAssertNil(timerEngine.activeReminder)
|
||||
|
||||
timerEngine.dismissReminder()
|
||||
|
||||
XCTAssertNil(timerEngine.activeReminder)
|
||||
}
|
||||
|
||||
func testDismissBlinkReminderDoesNotResumeTimers() {
|
||||
timerEngine.start()
|
||||
timerEngine.activeReminder = .blinkTriggered
|
||||
|
||||
timerEngine.dismissReminder()
|
||||
|
||||
for (_, state) in timerEngine.timerStates {
|
||||
XCTAssertFalse(state.isPaused)
|
||||
}
|
||||
}
|
||||
|
||||
func testDismissPostureReminderDoesNotResumeTimers() {
|
||||
timerEngine.start()
|
||||
timerEngine.activeReminder = .postureTriggered
|
||||
|
||||
timerEngine.dismissReminder()
|
||||
|
||||
for (_, state) in timerEngine.timerStates {
|
||||
XCTAssertFalse(state.isPaused)
|
||||
}
|
||||
}
|
||||
|
||||
func testAllTimersStartWhenEnabled() {
|
||||
settingsManager.settings.lookAwayTimer.enabled = true
|
||||
settingsManager.settings.blinkTimer.enabled = true
|
||||
settingsManager.settings.postureTimer.enabled = true
|
||||
|
||||
timerEngine.start()
|
||||
|
||||
XCTAssertEqual(timerEngine.timerStates.count, 3)
|
||||
for timerType in TimerType.allCases {
|
||||
XCTAssertNotNil(timerEngine.timerStates[timerType])
|
||||
}
|
||||
}
|
||||
|
||||
func testAllTimersDisabled() {
|
||||
settingsManager.settings.lookAwayTimer.enabled = false
|
||||
settingsManager.settings.blinkTimer.enabled = false
|
||||
settingsManager.settings.postureTimer.enabled = false
|
||||
|
||||
timerEngine.start()
|
||||
|
||||
XCTAssertEqual(timerEngine.timerStates.count, 0)
|
||||
}
|
||||
|
||||
func testPartialTimersEnabled() {
|
||||
settingsManager.settings.lookAwayTimer.enabled = true
|
||||
settingsManager.settings.blinkTimer.enabled = false
|
||||
settingsManager.settings.postureTimer.enabled = true
|
||||
|
||||
timerEngine.start()
|
||||
|
||||
XCTAssertEqual(timerEngine.timerStates.count, 2)
|
||||
XCTAssertNotNil(timerEngine.timerStates[.lookAway])
|
||||
XCTAssertNil(timerEngine.timerStates[.blink])
|
||||
XCTAssertNotNil(timerEngine.timerStates[.posture])
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user