From 9356f86e5d6e6e9c9749a03a20342ac3e643c8ae Mon Sep 17 00:00:00 2001 From: ysicing Date: Thu, 1 Oct 2026 00:07:49 +0800 Subject: [PATCH] =?UTF-8?q?test(rest):=20=E5=9B=BA=E5=AE=9A=E5=A2=99?= =?UTF-8?q?=E4=B8=8A=E6=97=B6=E9=97=B4=E9=81=BF=E5=85=8D=E5=8D=88=E5=A4=9C?= =?UTF-8?q?=E5=89=8D=E5=90=8E=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 按自然日统计会用真实时刻反推专注段完成时间,测试只伪造了单调时钟, 0:00 至约 1:55 之间运行时,段落会被算到昨天而失败。注入随时钟前进的正午时间。 --- .../XStatsUITests/RestSessionTests.swift | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/Packages/XStatsKit/Tests/XStatsUITests/RestSessionTests.swift b/Packages/XStatsKit/Tests/XStatsUITests/RestSessionTests.swift index 85e1a96..312b30a 100644 --- a/Packages/XStatsKit/Tests/XStatsUITests/RestSessionTests.swift +++ b/Packages/XStatsKit/Tests/XStatsUITests/RestSessionTests.swift @@ -7,6 +7,13 @@ import Foundation import Testing @testable import XStatsUI +/// 墙上时间固定在某天正午,并随伪造的单调时钟前进。 +/// 按自然日统计会用真实时刻反推完成时间,不注入的话,午夜前后运行会把段落算到昨天。 +private func noonClock(_ now: @escaping () -> UInt64) -> () -> Date { + let noon = Calendar.current.date(from: DateComponents(year: 2026, month: 9, day: 15, hour: 12))! + return { noon.addingTimeInterval(TimeInterval(now()) / 1_000_000_000) } +} + @Suite struct RestSessionTests { @Test func deadlineDoesNotAccumulateTickError() { let start: UInt64 = 1_000_000_000 @@ -199,7 +206,7 @@ import Testing settings.restMode = .workday var now: UInt64 = 0 let rest = RestController(settings: settings, localDefaults: defaults, - sharedDefaults: defaults, clock: { now }) + sharedDefaults: defaults, clock: { now }, date: noonClock { now }) rest.sync() #expect(!rest.isWorkdayActive && !rest.isRunning && rest.phase == .work) @@ -226,7 +233,7 @@ import Testing settings.restMode = .workday var now: UInt64 = 0 let rest = RestController(settings: settings, localDefaults: defaults, - sharedDefaults: defaults, clock: { now }) + sharedDefaults: defaults, clock: { now }, date: noonClock { now }) rest.sync() rest.startPause() now = 115 * 60_000_000_000 @@ -245,7 +252,7 @@ import Testing settings.restMode = .workday var now: UInt64 = 0 let rest = RestController(settings: settings, localDefaults: defaults, - sharedDefaults: defaults, clock: { now }) + sharedDefaults: defaults, clock: { now }, date: noonClock { now }) rest.sync() rest.startPause() now = 95 * 60_000_000_000 @@ -274,7 +281,7 @@ import Testing settings.restMode = .workday var now: UInt64 = 0 let rest = RestController(settings: settings, localDefaults: defaults, - sharedDefaults: defaults, clock: { now }) + sharedDefaults: defaults, clock: { now }, date: noonClock { now }) rest.sync() rest.startPause() now = 90 * 60_000_000_000 @@ -320,7 +327,7 @@ import Testing settings.restEnabled = true var now: UInt64 = 0 let rest = RestController(settings: settings, localDefaults: defaults, - sharedDefaults: defaults, clock: { now }) + sharedDefaults: defaults, clock: { now }, date: noonClock { now }) rest.sync() rest.startPause() @@ -339,7 +346,7 @@ import Testing settings.restEnabled = true var now: UInt64 = 0 let rest = RestController(settings: settings, localDefaults: defaults, - sharedDefaults: defaults, clock: { now }) + sharedDefaults: defaults, clock: { now }, date: noonClock { now }) rest.sync() rest.startPause() @@ -358,7 +365,7 @@ import Testing settings.restEnabled = true var now: UInt64 = 0 let rest = RestController(settings: settings, localDefaults: defaults, - sharedDefaults: defaults, clock: { now }) + sharedDefaults: defaults, clock: { now }, date: noonClock { now }) rest.sync() rest.startPause() now = 5 * 60_000_000_000 @@ -433,7 +440,7 @@ import Testing settings.restEnabled = true var now: UInt64 = 0 let rest = RestController(settings: settings, localDefaults: defaults, - sharedDefaults: defaults, clock: { now }) + sharedDefaults: defaults, clock: { now }, date: noonClock { now }) var curtainChanges: [Bool] = [] rest.onRestChange = { curtainChanges.append($0) } rest.sync() @@ -468,7 +475,7 @@ import Testing settings.restEnabled = true var now: UInt64 = 0 let rest = RestController(settings: settings, localDefaults: defaults, - sharedDefaults: defaults, clock: { now }) + sharedDefaults: defaults, clock: { now }, date: noonClock { now }) rest.sync() rest.startPause() now = 10 * 60_000_000_000 @@ -527,7 +534,7 @@ import Testing let (defaults, suite, settings) = midnightFixture("RestDoubleSuspendTests") defer { defaults.removePersistentDomain(forName: suite) } var now: UInt64 = 0 - let rest = RestController(settings: settings, localDefaults: defaults, sharedDefaults: defaults, clock: { now }) + let rest = RestController(settings: settings, localDefaults: defaults, sharedDefaults: defaults, clock: { now }, date: noonClock { now }) rest.sync() rest.startPause() now = 10 * 60_000_000_000