From f015ebb7dd8763c864fc1a94141725071ebe064c Mon Sep 17 00:00:00 2001 From: Anthony Drendel Date: Wed, 29 Apr 2026 23:04:50 +0200 Subject: [PATCH 1/2] Set default nanosecond tolerance to zero --- Sources/DispatchTimer/DispatchTimer.swift | 9 ++++- .../DispatchTimerTests.swift | 38 +++++++++++++++++++ 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/Sources/DispatchTimer/DispatchTimer.swift b/Sources/DispatchTimer/DispatchTimer.swift index 301edd0..c19779e 100644 --- a/Sources/DispatchTimer/DispatchTimer.swift +++ b/Sources/DispatchTimer/DispatchTimer.swift @@ -73,7 +73,7 @@ public final class DispatchTimer: Sendable { } } -private extension DispatchTimer { +extension DispatchTimer { static func defaultTolerance(_ interval: DispatchTimeInterval) -> DispatchTimeInterval { switch interval { case let .seconds(amount): @@ -85,13 +85,18 @@ private extension DispatchTimer { case let .microseconds(amount): guard amount > 0 else { return .never } return .nanoseconds(oneTenthOfOneThousand(of: amount)) - case .nanoseconds, .never: + case let .nanoseconds(amount): + guard amount > 0 else { return .never } + return .nanoseconds(0) + case .never: return .never @unknown default: return .never } } +} +private extension DispatchTimer { func fire() { block() if !isRepeating { source.cancel() } diff --git a/Tests/DispatchTimerTests/DispatchTimerTests.swift b/Tests/DispatchTimerTests/DispatchTimerTests.swift index de37977..3384577 100644 --- a/Tests/DispatchTimerTests/DispatchTimerTests.swift +++ b/Tests/DispatchTimerTests/DispatchTimerTests.swift @@ -55,11 +55,49 @@ final class DispatchTimerTests: XCTestCase { timer.invalidate() } + func testDefaultToleranceForPositiveNanosecondsIsZero() throws { + XCTAssertEqual( + DispatchTimer.defaultTolerance(.nanoseconds(1)), + .nanoseconds(0) + ) + XCTAssertEqual( + DispatchTimer.defaultTolerance(.nanoseconds(50_000_000)), + .nanoseconds(0) + ) + } + + func testDefaultToleranceForNonPositiveNanosecondsIsNever() throws { + XCTAssertEqual( + DispatchTimer.defaultTolerance(.nanoseconds(0)), + .never + ) + XCTAssertEqual( + DispatchTimer.defaultTolerance(.nanoseconds(-1)), + .never + ) + } + + func testDefaultToleranceForNeverIsNever() throws { + XCTAssertEqual( + DispatchTimer.defaultTolerance(.never), + .never + ) + } + static var allTests = [ ("testNonRepeatingTimer", testNonRepeatingTimer), ("testRepeatingTimer", testRepeatingTimer), ("testFireAtTimer", testFireAtTimer), ("testInvalidateCancelsTimer", testInvalidateCancelsTimer), ("testFireAtInPastFiresImmediately", testFireAtInPastFiresImmediately), + ( + "testDefaultToleranceForPositiveNanosecondsIsZero", + testDefaultToleranceForPositiveNanosecondsIsZero + ), + ( + "testDefaultToleranceForNonPositiveNanosecondsIsNever", + testDefaultToleranceForNonPositiveNanosecondsIsNever + ), + ("testDefaultToleranceForNeverIsNever", testDefaultToleranceForNeverIsNever), ] } From 355a373ee1ec26d0ce55f6847ef4774a819f03ca Mon Sep 17 00:00:00 2001 From: Anthony Drendel Date: Wed, 29 Apr 2026 23:10:16 +0200 Subject: [PATCH 2/2] Update GitHub Actions workflow --- .github/workflows/ci.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9e1184b..ee10ff3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,11 +4,11 @@ on: push jobs: test: - runs-on: macos-12 + runs-on: macos-15 steps: - - uses: actions/checkout@v3 - - name: Select Xcode 14 - run: sudo xcode-select -s /Applications/Xcode_14.1.app + - uses: actions/checkout@v4 + - name: Select Xcode 26 + run: sudo xcode-select -s /Applications/Xcode_26.3.app - name: Test run: swift test