@@ -8,6 +8,16 @@ import Darwin
88
99#if compiler(>=5.5)
1010
11+ func performanceNow( ) -> Double {
12+ return JSObject . global. performance. now. function!( ) . number!
13+ }
14+ 15+ func measure( _ block: ( ) async throws -> Void ) async rethrows -> Double {
16+ let start = performanceNow ( )
17+ try await block ( )
18+ return performanceNow ( ) - start
19+ }
20+ 1121func entrypoint( ) async throws {
1222 struct E : Error , Equatable {
1323 let value : Int
@@ -61,10 +71,10 @@ func entrypoint() async throws {
6171 }
6272
6373 try await asyncTest ( " Task.sleep(_:) " ) {
64- let start = time ( nil )
65- try await Task . sleep ( nanoseconds: 2_000_000_000 )
66- let diff = difftime ( time ( nil ) , start ) ;
67- try expectGTE ( diff, 2 )
74+ let diff = try await measure {
75+ try await Task . sleep ( nanoseconds: 200_000_000 )
76+ }
77+ try expectGTE ( diff, 200 )
6878 }
6979
7080 try await asyncTest ( " Job reordering based on priority " ) {
@@ -102,19 +112,19 @@ func entrypoint() async throws {
102112
103113 try await asyncTest ( " Async JSClosure " ) {
104114 let delayClosure = JSClosure . async { _ -> JSValue in
105- try await Task . sleep ( nanoseconds: 2_000_000_000 )
115+ try await Task . sleep ( nanoseconds: 200_000_000 )
106116 return JSValue . number ( 3 )
107117 }
108118 let delayObject = JSObject . global. Object. function!. new ( )
109119 delayObject. closure = delayClosure. jsValue
110120
111- let start = time ( nil )
112- let promise = JSPromise ( from: delayObject. closure!( ) )
113- try expectNotNil ( promise)
114- let result = try await promise!. value
115- let diff = difftime ( time ( nil ) , start )
116- try expectGTE ( diff , 2 )
117- try expectEqual ( result , . number ( 3 ) )
121+ let diff = try await measure {
122+ let promise = JSPromise ( from: delayObject. closure!( ) )
123+ try expectNotNil ( promise)
124+ let result = try await promise!. value
125+ try expectEqual ( result , . number ( 3 ) )
126+ }
127+ try expectGTE ( diff , 200 )
118128 }
119129
120130 try await asyncTest ( " Async JSPromise: then " ) {
@@ -124,18 +134,18 @@ func entrypoint() async throws {
124134 resolve ( . success( JSValue . number ( 3 ) ) )
125135 return . undefined
126136 } . jsValue,
127- 1_000
137+ 100
128138 )
129139 }
130140 let promise2 = promise. then { result in
131- try await Task . sleep ( nanoseconds: 1_000_000_000 )
141+ try await Task . sleep ( nanoseconds: 100_000_000 )
132142 return String ( result. number!)
133143 }
134- let start = time ( nil )
135- let result = try await promise2. value
136- let diff = difftime ( time ( nil ) , start )
137- try expectGTE ( diff , 2 )
138- try expectEqual ( result , . string ( " 3.0 " ) )
144+ let diff = try await measure {
145+ let result = try await promise2. value
146+ try expectEqual ( result , . string ( " 3.0 " ) )
147+ }
148+ try expectGTE ( diff , 200 )
139149 }
140150
141151 try await asyncTest ( " Async JSPromise: then(success:failure:) " ) {
@@ -145,7 +155,7 @@ func entrypoint() async throws {
145155 resolve ( . failure( JSError ( message: " test " ) . jsValue) )
146156 return . undefined
147157 } . jsValue,
148- 1_000
158+ 100
149159 )
150160 }
151161 let promise2 = promise. then { _ in
@@ -164,26 +174,43 @@ func entrypoint() async throws {
164174 resolve ( . failure( JSError ( message: " test " ) . jsValue) )
165175 return . undefined
166176 } . jsValue,
167- 1_000
177+ 100
168178 )
169179 }
170180 let promise2 = promise. catch { err in
171- try await Task . sleep ( nanoseconds: 1_000_000_000 )
181+ try await Task . sleep ( nanoseconds: 100_000_000 )
172182 return err
173183 }
174- let start = time ( nil )
175- let result = try await promise2. value
176- let diff = difftime ( time ( nil ) , start )
177- try expectGTE ( diff , 2 )
178- try expectEqual ( result . object ? . message , . string ( " test " ) )
184+ let diff = try await measure {
185+ let result = try await promise2. value
186+ try expectEqual ( result . object ? . message , . string ( " test " ) )
187+ }
188+ try expectGTE ( diff , 200 )
179189 }
180190
181- // FIXME(katei): Somehow it doesn't work due to a mysterious unreachable inst
182- // at the end of thunk.
183- // This issue is not only on JS host environment, but also on standalone coop executor.
184191 try await asyncTest ( " Task.sleep(nanoseconds:) " ) {
185- try await Task . sleep ( nanoseconds: 1_000_000_000 )
192+ let diff = try await measure {
193+ try await Task . sleep ( nanoseconds: 100_000_000 )
194+ }
195+ try expectGTE ( diff, 100 )
196+ }
197+ 198+ #if compiler(>=5.7)
199+ try await asyncTest ( " ContinuousClock.sleep " ) {
200+ let diff = try await measure {
201+ let c = ContinuousClock ( )
202+ try await c. sleep ( until: . now + . milliseconds( 100 ) )
203+ }
204+ try expectGTE ( diff, 99 )
205+ }
206+ try await asyncTest ( " SuspendingClock.sleep " ) {
207+ let diff = try await measure {
208+ let c = SuspendingClock ( )
209+ try await c. sleep ( until: . now + . milliseconds( 100 ) )
210+ }
211+ try expectGTE ( diff, 99 )
186212 }
213+ #endif
187214}
188215
189216
0 commit comments