diff --git a/Packages/XStatsKit/Sources/XStatsUI/State/SettingsDocument.swift b/Packages/XStatsKit/Sources/XStatsUI/State/SettingsDocument.swift index 4697203..aadfb89 100644 --- a/Packages/XStatsKit/Sources/XStatsUI/State/SettingsDocument.swift +++ b/Packages/XStatsKit/Sources/XStatsUI/State/SettingsDocument.swift @@ -125,8 +125,9 @@ extension AppSettings { assign(\.restDailyGoal, option(doc.restDailyGoal, in: Self.restDailyGoalOptions)) if let mode = doc.restMode.flatMap(RestRunMode.init(rawValue:)) { assign(\.restMode, mode) - } else { - assign(\.restCycleEnabled, doc.restCycleEnabled) + } else if let cycle = doc.restCycleEnabled { + // 工作番茄和单次的兼容布尔值均为 false,需比较完整模式才能正确恢复。 + assign(\.restMode, cycle ? .cycle : .single) } assign(\.restSound, doc.restSound.flatMap(RestSound.init(rawValue:))) assign(\.restHUDStyle, doc.restHUDStyle.flatMap(RestHUDStyle.init(rawValue:))) diff --git a/Packages/XStatsKit/Tests/XStatsUITests/RestSessionTests.swift b/Packages/XStatsKit/Tests/XStatsUITests/RestSessionTests.swift index 6fd63f4..85e1a96 100644 --- a/Packages/XStatsKit/Tests/XStatsUITests/RestSessionTests.swift +++ b/Packages/XStatsKit/Tests/XStatsUITests/RestSessionTests.swift @@ -584,6 +584,23 @@ import Testing #expect(target.restHUDStyle == .hourglass) } + @Test(arguments: [false, true, nil] as [Bool?]) + func legacyRestBackupRestoresModeFromWorkday(cycle: Bool?) { + let suite = "RestLegacyBackupTests.\(UUID())" + let defaults = UserDefaults(suiteName: suite)! + defer { defaults.removePersistentDomain(forName: suite) } + let settings = AppSettings(defaults: defaults) + settings.restMode = .workday + var document = SettingsDocument() + document.restCycleEnabled = cycle + + settings.apply(document) + + let expected: RestRunMode = cycle.map { $0 ? .cycle : .single } ?? .workday + #expect(settings.restMode == expected) + #expect(AppSettings(defaults: defaults).restMode == expected) + } + @Test func workdayModeMigratesLegacyCycleAndRoundTripsBackup() { let oldSuite = "RestLegacyModeTests.\(UUID())" let oldDefaults = UserDefaults(suiteName: oldSuite)!