From e78611f4bf5146ef4fd7244fa5f40ffd233e8b65 Mon Sep 17 00:00:00 2001 From: Ahmet Gunay Date: Mon, 4 Dec 2023 11:33:10 +0400 Subject: [PATCH 1/4] Advance to some virtual time to be able to test non-published variables at given test time. --- .../TestScheduler/TestScheduler.swift | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/Sources/EntwineTest/TestScheduler/TestScheduler.swift b/Sources/EntwineTest/TestScheduler/TestScheduler.swift index 954fe0e..d8d18bc 100644 --- a/Sources/EntwineTest/TestScheduler/TestScheduler.swift +++ b/Sources/EntwineTest/TestScheduler/TestScheduler.swift @@ -196,6 +196,32 @@ public class TestScheduler { lastTaskId += 1 return lastTaskId } + + /// Performs all the actions in the scheduler's queue until reaches to the duration that is added as virtual time from now + /// - Parameters: + /// - duration: The `CombineTestTimeInterval` that are going to be performed all tasks until by adding interval from now + public func advance(by duration: VirtualTimeInterval) { + advance(to: now.advanced(by: duration)) + } + + /// Performs all the actions in the scheduler's queue, in time until reaches to the duration + /// - Parameters: + /// - instant: The `CombineTestTime` that are going to be performed all tasks until + public func advance(to instant: VirtualTime) { + while now <= instant { + guard + let next = findNext(), + instant >= next.time + else { + currentTime = instant + return + } + + currentTime = next.time + schedulerQueue.remove(next) + next.action() + } + } } // MARK: - TestScheduler Scheduler conformance From 15257bb263b6ed29be8acfd0d1d247e650058eb1 Mon Sep 17 00:00:00 2001 From: Ahmet Gunay Date: Mon, 4 Dec 2023 11:38:39 +0400 Subject: [PATCH 2/4] add test specs for advance(to:) and advance(by:) --- .../EntwineTestTests/TestSchedulerTests.swift | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/Tests/EntwineTestTests/TestSchedulerTests.swift b/Tests/EntwineTestTests/TestSchedulerTests.swift index a308aaa..52b33a1 100644 --- a/Tests/EntwineTestTests/TestSchedulerTests.swift +++ b/Tests/EntwineTestTests/TestSchedulerTests.swift @@ -77,7 +77,36 @@ final class TestSchedulerTests: XCTestCase { XCTAssertEqual(times, [100, 200, 300,]) } - + + func testSchedulerAdvancesToTasksTime() { + + let subject = TestScheduler(initialClock: 0) + var changedValue = 0 + + subject.schedule(after: 300) { changedValue = 300 } + subject.schedule(after: 200) { changedValue = 200 } + subject.schedule(after: 100) { changedValue = 100 } + + subject.advance(to: 200) + + XCTAssertEqual(changedValue, 200) + } + + func testSchedulerAdvancesToTasksByTimeInterval() { + + let subject = TestScheduler(initialClock: 0) + var changedValue = 0 + + subject.schedule(after: 300) { changedValue = 300 } + subject.schedule(after: 200) { changedValue = 200 } + subject.schedule(after: 100) { changedValue = 100 } + + subject.advance(to: 100) + XCTAssertEqual(changedValue, 100) + subject.advance(by: 100) + XCTAssertEqual(changedValue, 200) + } + func testSchedulerInvokesDeferredTask() { let subject = TestScheduler(initialClock: 0) From 4eee08205771c6d1c0f61e810018ba4617791e48 Mon Sep 17 00:00:00 2001 From: Ahmet Gunay Date: Mon, 4 Dec 2023 11:55:45 +0400 Subject: [PATCH 3/4] comment fix --- Sources/EntwineTest/TestScheduler/TestScheduler.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/EntwineTest/TestScheduler/TestScheduler.swift b/Sources/EntwineTest/TestScheduler/TestScheduler.swift index d8d18bc..5252d11 100644 --- a/Sources/EntwineTest/TestScheduler/TestScheduler.swift +++ b/Sources/EntwineTest/TestScheduler/TestScheduler.swift @@ -199,14 +199,14 @@ public class TestScheduler { /// Performs all the actions in the scheduler's queue until reaches to the duration that is added as virtual time from now /// - Parameters: - /// - duration: The `CombineTestTimeInterval` that are going to be performed all tasks until by adding interval from now + /// - duration: The `VirtualTimeInterval` that are going to be performed all tasks until by adding interval from now public func advance(by duration: VirtualTimeInterval) { advance(to: now.advanced(by: duration)) } /// Performs all the actions in the scheduler's queue, in time until reaches to the duration /// - Parameters: - /// - instant: The `CombineTestTime` that are going to be performed all tasks until + /// - instant: The `VirtualTime` that are going to be performed all tasks until public func advance(to instant: VirtualTime) { while now <= instant { guard From 0f555ca7fab95f94ca1bdcc0eda30d6451cd336f Mon Sep 17 00:00:00 2001 From: Ahmet Gunay Date: Mon, 4 Dec 2023 12:02:02 +0400 Subject: [PATCH 4/4] add fresh test specs to allTests --- Tests/EntwineTestTests/TestSchedulerTests.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Tests/EntwineTestTests/TestSchedulerTests.swift b/Tests/EntwineTestTests/TestSchedulerTests.swift index 52b33a1..5d1a8eb 100644 --- a/Tests/EntwineTestTests/TestSchedulerTests.swift +++ b/Tests/EntwineTestTests/TestSchedulerTests.swift @@ -337,7 +337,9 @@ final class TestSchedulerTests: XCTestCase { ("testTrampolinesImmediatelyScheduledTasks", testTrampolinesImmediatelyScheduledTasks), ("testSchedulesRepeatingTask", testSchedulesAndCancelsRepeatingTask), ("testIgnoresTasksAfterMaxClock", testIgnoresTasksAfterMaxClock), - ("testRemovesTaskCancelledWithinOwnAction", testRemovesTaskCancelledWithinOwnAction) + ("testRemovesTaskCancelledWithinOwnAction", testRemovesTaskCancelledWithinOwnAction), + ("testSchedulerAdvancesToTasksTime", testSchedulerAdvancesToTasksTime), + ("testSchedulerAdvancesToTasksByTimeInterval", testSchedulerAdvancesToTasksByTimeInterval) ] }