diff --git a/Sources/EntwineTest/TestScheduler/TestScheduler.swift b/Sources/EntwineTest/TestScheduler/TestScheduler.swift index 954fe0e..5252d11 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 `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 `VirtualTime` 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 diff --git a/Tests/EntwineTestTests/TestSchedulerTests.swift b/Tests/EntwineTestTests/TestSchedulerTests.swift index a308aaa..5d1a8eb 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) @@ -308,7 +337,9 @@ final class TestSchedulerTests: XCTestCase { ("testTrampolinesImmediatelyScheduledTasks", testTrampolinesImmediatelyScheduledTasks), ("testSchedulesRepeatingTask", testSchedulesAndCancelsRepeatingTask), ("testIgnoresTasksAfterMaxClock", testIgnoresTasksAfterMaxClock), - ("testRemovesTaskCancelledWithinOwnAction", testRemovesTaskCancelledWithinOwnAction) + ("testRemovesTaskCancelledWithinOwnAction", testRemovesTaskCancelledWithinOwnAction), + ("testSchedulerAdvancesToTasksTime", testSchedulerAdvancesToTasksTime), + ("testSchedulerAdvancesToTasksByTimeInterval", testSchedulerAdvancesToTasksByTimeInterval) ] }