@@ -8,6 +8,16 @@ import Darwin
8
8
9
9
#if compiler(>=5.5)
10
10
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
+
11
21
func entrypoint( ) async throws {
12
22
struct E : Error , Equatable {
13
23
let value : Int
@@ -61,10 +71,10 @@ func entrypoint() async throws {
61
71
}
62
72
63
73
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 )
68
78
}
69
79
70
80
try await asyncTest ( " Job reordering based on priority " ) {
@@ -102,19 +112,19 @@ func entrypoint() async throws {
102
112
103
113
try await asyncTest ( " Async JSClosure " ) {
104
114
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 )
106
116
return JSValue . number ( 3 )
107
117
}
108
118
let delayObject = JSObject . global. Object. function!. new ( )
109
119
delayObject. closure = delayClosure. jsValue
110
120
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 )
118
128
}
119
129
120
130
try await asyncTest ( " Async JSPromise: then " ) {
@@ -124,18 +134,18 @@ func entrypoint() async throws {
124
134
resolve ( . success( JSValue . number ( 3 ) ) )
125
135
return . undefined
126
136
} . jsValue,
127
- 1_000
137
+ 100
128
138
)
129
139
}
130
140
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 )
132
142
return String ( result. number!)
133
143
}
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 )
139
149
}
140
150
141
151
try await asyncTest ( " Async JSPromise: then(success:failure:) " ) {
@@ -145,7 +155,7 @@ func entrypoint() async throws {
145
155
resolve ( . failure( JSError ( message: " test " ) . jsValue) )
146
156
return . undefined
147
157
} . jsValue,
148
- 1_000
158
+ 100
149
159
)
150
160
}
151
161
let promise2 = promise. then { _ in
@@ -164,26 +174,43 @@ func entrypoint() async throws {
164
174
resolve ( . failure( JSError ( message: " test " ) . jsValue) )
165
175
return . undefined
166
176
} . jsValue,
167
- 1_000
177
+ 100
168
178
)
169
179
}
170
180
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 )
172
182
return err
173
183
}
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 )
179
189
}
180
190
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.
184
191
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 )
186
212
}
213
+ #endif
187
214
}
188
215
189
216
0 commit comments