@@ -27,6 +27,8 @@ class TestThread : XCTestCase {
27
27
( " test_mainThread " , test_mainThread) ,
28
28
( " test_callStackSymbols " , testExpectedToFailOnAndroid ( test_callStackSymbols, " Android doesn't support backtraces at the moment. " ) ) ,
29
29
( " test_callStackReturnAddresses " , testExpectedToFailOnAndroid ( test_callStackReturnAddresses, " Android doesn't support backtraces at the moment. " ) ) ,
30
+ ( " test_sleepForTimeInterval " , test_sleepForTimeInterval) ,
31
+ ( " test_sleepUntilDate " , test_sleepUntilDate) ,
30
32
]
31
33
32
34
#if NS_FOUNDATION_ALLOWS_TESTABLE_IMPORT
@@ -151,4 +153,46 @@ class TestThread : XCTestCase {
151
153
XCTAssertTrue ( addresses. count > 0 )
152
154
XCTAssertTrue ( addresses. count <= 128 )
153
155
}
156
+
157
+ func test_sleepForTimeInterval( ) {
158
+ let measureOversleep = { ( timeInterval: TimeInterval ) -> TimeInterval in
159
+ let start = Date ( )
160
+ Thread . sleep ( forTimeInterval: timeInterval)
161
+
162
+ // Measures time Thread.sleep spends over specified timeInterval value
163
+ return - ( start. timeIntervalSinceNow + timeInterval)
164
+ }
165
+
166
+ // Allow a little early wake-ups. Sleep timer on Windows
167
+ // is more precise than timer used in Date implementation.
168
+ let allowedOversleepRange = - 0.00001 ..< 0.1
169
+
170
+ let oversleep1 = measureOversleep ( TimeInterval ( 0.9 ) )
171
+ XCTAssertTrue ( allowedOversleepRange. contains ( oversleep1) , " Oversleep \( oversleep1) is not in expected range \( allowedOversleepRange) " )
172
+
173
+ let oversleep2 = measureOversleep ( TimeInterval ( 1.2 ) )
174
+ XCTAssertTrue ( allowedOversleepRange. contains ( oversleep2) , " Oversleep \( oversleep2) is not in expected range \( allowedOversleepRange) " )
175
+
176
+ let oversleep3 = measureOversleep ( TimeInterval ( 1.0 ) )
177
+ XCTAssertTrue ( allowedOversleepRange. contains ( oversleep3) , " Oversleep \( oversleep3) is not in expected range \( allowedOversleepRange) " )
178
+ }
179
+
180
+ func test_sleepUntilDate( ) {
181
+ let measureOversleep = { ( date: Date ) -> TimeInterval in
182
+ Thread . sleep ( until: date)
183
+ return - date. timeIntervalSinceNow
184
+ }
185
+
186
+ let allowedOversleepRange = - 0.00001 ..< 0.1
187
+
188
+ let oversleep1 = measureOversleep ( Date ( timeIntervalSinceNow: 0.8 ) )
189
+ XCTAssertTrue ( allowedOversleepRange. contains ( oversleep1) , " Oversleep \( oversleep1) is not in expected range \( allowedOversleepRange) " )
190
+
191
+ let oversleep2 = measureOversleep ( Date ( timeIntervalSinceNow: 1.1 ) )
192
+ XCTAssertTrue ( allowedOversleepRange. contains ( oversleep2) , " Oversleep \( oversleep2) is not in expected range \( allowedOversleepRange) " )
193
+
194
+ let oversleep3 = measureOversleep ( Date ( timeIntervalSinceNow: 1.0 ) )
195
+ XCTAssertTrue ( allowedOversleepRange. contains ( oversleep3) , " Oversleep \( oversleep3) is not in expected range \( allowedOversleepRange) " )
196
+ }
197
+
154
198
}
0 commit comments