@@ -115,6 +115,90 @@ final class AgainAtTests: XCTestCase {
115115 XCTAssertEqual ( values, [ 1 , 1 ] )
116116 }
117117
118+ func testRepublishAtFutureDatePublishesAfterConvertedTime( ) {
119+ let scheduler = DispatchQueue . test
120+ let subject = PassthroughSubject < Int , Never > ( )
121+ var values = [ Int] ( )
122+ var republishers = [ DateRepublisher] ( )
123+
124+ let subscription = subject
125+ . againAt ( scheduler: scheduler)
126+ . sink (
127+ receiveCompletion: { _ in } ,
128+ receiveValue: { value, timer in
129+ values. append ( value)
130+ republishers. append { timer. republish ( at: timer. time ( at: $0) ) }
131+ }
132+ )
133+ defer { subscription. cancel ( ) }
134+
135+ subject. send ( 1 )
136+ scheduler. advance ( )
137+
138+ republishers [ 0 ] ( Date ( timeIntervalSinceNow: 1 ) )
139+
140+ scheduler. advance ( by: . milliseconds( 500 ) )
141+ XCTAssertEqual ( values, [ 1 ] )
142+
143+ scheduler. advance ( by: . seconds( 1 ) )
144+ XCTAssertEqual ( values, [ 1 , 1 ] )
145+ }
146+
147+ func testRepublishAtPastDateUsesCurrentSchedulerTime( ) {
148+ let scheduler = DispatchQueue . test
149+ let subject = PassthroughSubject < Int , Never > ( )
150+ var values = [ Int] ( )
151+ var republishers = [ DateRepublisher] ( )
152+ var timerNows = [ DispatchQueue . SchedulerTimeType] ( )
153+
154+ let subscription = subject
155+ . againAt ( scheduler: scheduler)
156+ . sink (
157+ receiveCompletion: { _ in } ,
158+ receiveValue: { value, timer in
159+ values. append ( value)
160+ timerNows. append ( timer. now)
161+ republishers. append { timer. republish ( at: timer. time ( at: $0) ) }
162+ }
163+ )
164+ defer { subscription. cancel ( ) }
165+
166+ subject. send ( 1 )
167+ scheduler. advance ( )
168+
169+ let firstNow = scheduler. now
170+ scheduler. advance ( by: . seconds( 5 ) )
171+ let republishNow = scheduler. now
172+
173+ republishers [ 0 ] ( . distantPast)
174+ scheduler. advance ( )
175+
176+ XCTAssertEqual ( values, [ 1 , 1 ] )
177+ XCTAssertEqual ( timerNows, [ firstNow, republishNow] )
178+ }
179+
180+ func testTimeAtDistantFutureDoesNotOverflow( ) {
181+ let scheduler = DispatchQueue . test
182+ let subject = PassthroughSubject < Int , Never > ( )
183+ var convertedTimes = [ DispatchQueue . SchedulerTimeType] ( )
184+
185+ let subscription = subject
186+ . againAt ( scheduler: scheduler)
187+ . sink (
188+ receiveCompletion: { _ in } ,
189+ receiveValue: { _, timer in
190+ convertedTimes. append ( timer. time ( at: . distantFuture) )
191+ }
192+ )
193+ defer { subscription. cancel ( ) }
194+
195+ subject. send ( 1 )
196+ scheduler. advance ( )
197+
198+ XCTAssertEqual ( convertedTimes. count, 1 )
199+ XCTAssertTrue ( convertedTimes [ 0 ] > scheduler. now)
200+ }
201+
118202 func testRepublishPublishesNewestUpstreamOutputAtFireTime( ) {
119203 let scheduler = DispatchQueue . test
120204 let subject = PassthroughSubject < Int , Never > ( )
@@ -642,6 +726,7 @@ final class AgainAtTests: XCTestCase {
642726}
643727
644728private typealias Republisher = ( DispatchQueue . SchedulerTimeType ) -> Void
729+ private typealias DateRepublisher = ( Date ) -> Void
645730
646731private enum TestError : Error , Equatable {
647732 case failed
0 commit comments