@@ -21,7 +21,7 @@ class TTIObserverExtensionTests: XCTestCase {
2121 try super. setUpWithError ( )
2222 defaultTimeProvider = timeProvider
2323 metricsReceiver = TTIMetricsReceiverStub ( )
24- try PerformanceMonitoring . enable ( config: [ . screenLevelTTI( metricsReceiver) ] , experiments: Experiments ( ) )
24+ try PerformanceMonitoring . enable ( config: [ . screenLevelTTI( metricsReceiver) ] , experiments: Experiments ( observersOnBackgroundQueue : true ) )
2525 }
2626
2727 override func tearDownWithError( ) throws {
@@ -308,6 +308,44 @@ class TTIObserverExtensionTests: XCTestCase {
308308 XCTAssertEqual ( metricsReceiver. ttiMetrics? . tti, . seconds( 2 ) )
309309 XCTAssertEqual ( metricsReceiver. lastController? . title, " vc3 " )
310310 }
311+
312+ func testScreenIsReadyForChildViewController( ) {
313+ let now = DispatchTime ( uptimeNanoseconds: 10_000_000 )
314+ timeProvider. time = now
315+
316+ let vc1 = MyViewController ( )
317+ vc1. title = " vc1 "
318+
319+ let vc2 = UIViewController ( )
320+ vc2. title = " vc2 "
321+
322+ vc1. addChild ( vc2)
323+
324+ timeProvider. time = now. advanced ( by: . seconds( 1 ) )
325+
326+ let exp1 = expectation ( description: " viewDidAppear vc1 " )
327+ vc1. viewAppeared = {
328+ DispatchQueue . main. async {
329+ exp1. fulfill ( )
330+ }
331+ }
332+
333+ let window = makeWindow ( )
334+ window. rootViewController = vc1
335+ window. makeKeyAndVisible ( )
336+
337+ waitForExpectations ( timeout: 3 , handler: nil )
338+
339+ // we call screenIsReady for the child, but it should work for the parent
340+ vc2. screenIsReady ( )
341+
342+ PerformanceMonitoring . queue. sync { }
343+ PerformanceMonitoring . consumerQueue. sync { }
344+
345+ XCTAssertNotNil ( metricsReceiver. ttiMetrics)
346+ XCTAssertEqual ( metricsReceiver. ttiMetrics? . tti, . seconds( 1 ) )
347+ XCTAssertEqual ( metricsReceiver. lastController? . title, " vc1 " )
348+ }
311349}
312350
313351private class MyHostingController < T: View > : UIHostingController < T > {
0 commit comments