5 #import <Foundation/Foundation.h>
6 #import <OCMock/OCMock.h>
7 #import <UIKit/UIKit.h>
8 #import <XCTest/XCTest.h>
9 #include <objc/NSObject.h>
31 - (instancetype)init {
32 if (
self = [super init]) {
49 #pragma mark - FlutterPluginSceneLifeCycleDelegate
51 - (void)testAddFlutterManagedEngine {
59 [delegate addFlutterManagedEngine:mockEngine];
63 - (void)testAddDuplicateFlutterEngine {
71 [delegate addFlutterManagedEngine:mockEngine];
72 [delegate addFlutterManagedEngine:mockEngine];
73 [delegate addFlutterManagedEngine:mockEngine];
77 - (void)testAddMultipleFlutterEngine {
84 [delegate addFlutterManagedEngine:mockEngine];
89 [delegate addFlutterManagedEngine:mockEngine2];
94 - (void)testRemoveFlutterManagedEngine {
99 [delegate addFlutterManagedEngine:mockEngine];
102 [delegate removeFlutterManagedEngine:mockEngine];
106 - (void)testRemoveNotFoundFlutterEngine {
113 [delegate removeFlutterManagedEngine:mockEngine];
117 - (void)testupdateFlutterManagedEnginesInSceneRemovesDeallocatedEngine {
121 id mockWindowScene = OCMClassMock([UIWindowScene
class]);
125 [delegate addFlutterManagedEngine:mockEngine];
133 - (void)testupdateFlutterManagedEnginesInSceneRemovesEngineNotInScene {
138 id mockViewController = OCMClassMock([UIViewController
class]);
139 id mockView = OCMClassMock([UIView
class]);
140 id mockWindow = OCMClassMock([UIWindow
class]);
141 id mockWindowScene = OCMClassMock([UIWindowScene
class]);
144 OCMStub([mockEngine
viewController]).andReturn(mockViewController);
145 OCMStub([mockViewController view]).andReturn(mockView);
146 OCMStub([mockView window]).andReturn(mockWindow);
147 OCMStub([mockWindow windowScene]).andReturn(mockWindowScene);
148 OCMStub([mockWindow windowScene]).andReturn(mockWindowScene);
149 OCMStub([mockWindowScene delegate]).andReturn(mockLifecycleProvider);
152 [delegate addFlutterManagedEngine:mockEngine];
155 id mockWindowScene2 = OCMClassMock([UIWindowScene
class]);
158 OCMVerify(times(1), [mockLifecycleDelegate addFlutterManagedEngine:mockEngine]);
162 - (void)testupdateFlutterManagedEnginesInSceneDoesNotRemoveEngineWithNilScene {
166 id mockWindowScene = OCMClassMock([UIWindowScene
class]);
167 [delegate addFlutterManagedEngine:mockEngine];
174 - (void)testManuallyRegisterSceneLifeCycleWithFlutterEngine {
187 - (void)testManuallyUnregisterSceneLifeCycleWithFlutterEngine {
201 - (void)testManuallyRegisterSceneLifeCycleWithFlutterEngineCannotBeAutoAdded {
206 id mockEngine = OCMPartialMock(
engine);
211 [delegate addFlutterManagedEngine:mockEngine];
216 [delegate addFlutterManagedEngine:mockEngine];
225 - (void)testManuallyRegisterSceneLifeCycleWithFlutterEngineCannotBeAutoRemoved {
234 [delegate removeFlutterManagedEngine:mockEngine];
239 - (void)testManuallyRegisterSceneLifeCycleWithFlutterEngineRemovesAutomatic {
247 [delegate addFlutterManagedEngine:mockEngine];
254 - (void)testAllEnginesContainsManualAndAutomatic {
264 [delegate addFlutterManagedEngine:mockEngine];
269 XCTAssertEqual(delegate.
allEngines.count, 2.0);
270 XCTAssertEqual([delegate.
allEngines objectAtIndex:0], mockEngine);
271 XCTAssertEqual([delegate.
allEngines objectAtIndex:1], mockEngine2);
274 - (void)testEngineReceivedConnectNotificationForSceneBeforeActualEvent {
278 id mocks = [
self mocksForEvents];
279 id mockEngine = mocks[@"mockEngine"];
280 id mockScene = mocks[@"mockScene"];
283 OCMStub([mockLifecycleDelegate scene:[OCMArg any]
284 willConnectToSession:[OCMArg any]
285 options:[OCMArg any]])
288 id mocks2 = [
self mocksForEvents];
289 id mockEngine2 = mocks2[@"mockEngine"];
292 OCMStub([mockLifecycleDelegate2 scene:[OCMArg any]
293 willConnectToSession:[OCMArg any]
294 options:[OCMArg any]])
298 [mockDelegate engine:mockEngine receivedConnectNotificationFor:mockScene];
299 [mockDelegate engine:mockEngine2 receivedConnectNotificationFor:mockScene];
300 OCMVerify(times(1), [mockDelegate addFlutterManagedEngine:mockEngine]);
301 OCMVerify(times(1), [mockDelegate addFlutterManagedEngine:mockEngine2]);
303 OCMVerify(times(0), [mockDelegate scene:[OCMArg any]
304 willConnectToSession:[OCMArg any]
305 options:[OCMArg any]]);
308 id session = OCMClassMock([UISceneSession
class]);
309 id options = OCMClassMock([UISceneConnectionOptions
class]);
311 OCMVerify(times(1), [mockLifecycleDelegate scene:mockScene
312 willConnectToSession:session
314 OCMVerify(times(1), [mockLifecycleDelegate2 scene:mockScene
315 willConnectToSession:session
320 - (void)testEngineReceivedConnectNotificationForSceneAfterActualEvent {
324 id mocks = [
self mocksForEvents];
325 id mockEngine = mocks[@"mockEngine"];
326 id mockScene = mocks[@"mockScene"];
329 OCMStub([mockLifecycleDelegate scene:[OCMArg any]
330 willConnectToSession:[OCMArg any]
331 options:[OCMArg any]])
333 id mocks2 = [
self mocksForEvents];
334 id mockEngine2 = mocks2[@"mockEngine"];
337 OCMStub([mockLifecycleDelegate2 scene:[OCMArg any]
338 willConnectToSession:[OCMArg any]
339 options:[OCMArg any]])
343 id session = OCMClassMock([UISceneSession
class]);
344 id options = OCMClassMock([UISceneConnectionOptions
class]);
345 OCMStub([mockScene session]).andReturn(session);
348 OCMVerify(times(0), [mockLifecycleDelegate scene:mockScene
349 willConnectToSession:session
351 OCMVerify(times(0), [mockLifecycleDelegate2 scene:mockScene
352 willConnectToSession:session
354 OCMStub([mockDelegate connectionOptions]).andReturn(options);
357 [mockDelegate engine:mockEngine receivedConnectNotificationFor:mockScene];
358 [mockDelegate engine:mockEngine2 receivedConnectNotificationFor:mockScene];
360 OCMVerify(times(1), [mockDelegate addFlutterManagedEngine:mockEngine]);
361 OCMVerify(times(1), [mockDelegate addFlutterManagedEngine:mockEngine2]);
363 OCMVerify(times(1), [mockDelegate scene:mockScene willConnectToSession:session options:options]);
364 OCMVerify(times(1), [mockLifecycleDelegate scene:mockScene
365 willConnectToSession:session
367 OCMVerify(times(1), [mockLifecycleDelegate2 scene:mockScene
368 willConnectToSession:session
372 - (void)testSceneWillConnectToSessionOptionsHandledByScenePlugin {
376 id mocks = [
self mocksForEvents];
377 id mockEngine = mocks[@"mockEngine"];
378 id mockScene = mocks[@"mockScene"];
381 OCMStub([mockLifecycleDelegate scene:[OCMArg any]
382 willConnectToSession:[OCMArg any]
383 options:[OCMArg any]])
385 id mockAppLifecycleDelegate = mocks[@"mockAppLifecycleDelegate"];
386 OCMStub([mockAppLifecycleDelegate sceneWillConnectFallback:[OCMArg any]]).andReturn(YES);
388 id session = OCMClassMock([UISceneSession
class]);
389 id options = OCMClassMock([UISceneConnectionOptions
class]);
391 [delegate addFlutterManagedEngine:mockEngine];
395 OCMVerify(times(1), [mockLifecycleDelegate scene:mockScene
396 willConnectToSession:session
398 OCMVerify(times(0), [mockAppLifecycleDelegate sceneWillConnectFallback:options]);
399 OCMVerify(times(0), [mockEngine sendDeepLinkToFramework:[OCMArg any]
400 completionHandler:[OCMArg any]]);
403 - (void)testSceneWillConnectToSessionOptionsHandledByApplicationPlugin {
407 id mocks = [
self mocksForEvents];
408 id mockEngine = mocks[@"mockEngine"];
409 id mockScene = mocks[@"mockScene"];
412 OCMStub([mockLifecycleDelegate scene:[OCMArg any]
413 willConnectToSession:[OCMArg any]
414 options:[OCMArg any]])
416 id mockAppLifecycleDelegate = mocks[@"mockAppLifecycleDelegate"];
417 OCMStub([mockAppLifecycleDelegate sceneWillConnectFallback:[OCMArg any]]).andReturn(YES);
419 id session = OCMClassMock([UISceneSession
class]);
420 id options = OCMClassMock([UISceneConnectionOptions
class]);
422 [delegate addFlutterManagedEngine:mockEngine];
426 OCMVerify(times(1), [mockLifecycleDelegate scene:mockScene
427 willConnectToSession:session
429 OCMVerify(times(1), [mockAppLifecycleDelegate sceneWillConnectFallback:options]);
430 OCMVerify(times(0), [mockEngine sendDeepLinkToFramework:[OCMArg any]
431 completionHandler:[OCMArg any]]);
434 - (void)testSceneWillConnectToSessionOptionsHandledByApplicationPluginMultipleEngines {
438 id mocks = [
self mocksForEvents];
439 id mockEngine = mocks[@"mockEngine"];
440 id mockScene = mocks[@"mockScene"];
443 OCMStub([mockLifecycleDelegate scene:[OCMArg any]
444 willConnectToSession:[OCMArg any]
445 options:[OCMArg any]])
448 id mocks2 = [
self mocksForEvents];
449 id mockEngine2 = mocks2[@"mockEngine"];
452 OCMStub([mockLifecycleDelegate2 scene:[OCMArg any]
453 willConnectToSession:[OCMArg any]
454 options:[OCMArg any]])
457 id mockAppLifecycleDelegate = mocks2[@"mockAppLifecycleDelegate"];
458 OCMStub([mockAppLifecycleDelegate sceneWillConnectFallback:[OCMArg any]]).andReturn(YES);
459 id session = OCMClassMock([UISceneSession
class]);
460 id options = OCMClassMock([UISceneConnectionOptions
class]);
462 [delegate addFlutterManagedEngine:mockEngine];
463 [delegate addFlutterManagedEngine:mockEngine2];
467 OCMVerify(times(1), [mockLifecycleDelegate scene:mockScene
468 willConnectToSession:session
470 OCMVerify(times(1), [mockLifecycleDelegate2 scene:mockScene
471 willConnectToSession:session
473 OCMVerify(times(1), [mockAppLifecycleDelegate sceneWillConnectFallback:options]);
474 OCMVerify(times(0), [mockEngine sendDeepLinkToFramework:[OCMArg any]
475 completionHandler:[OCMArg any]]);
478 - (void)testSceneWillConnectToSessionOptionsHandledByUniversalLinks {
482 id mocks = [
self mocksForEvents];
483 id mockEngine = mocks[@"mockEngine"];
484 id mockScene = mocks[@"mockScene"];
487 OCMStub([mockLifecycleDelegate scene:[OCMArg any]
488 willConnectToSession:[OCMArg any]
489 options:[OCMArg any]])
492 id session = OCMClassMock([UISceneSession
class]);
493 id options = OCMClassMock([UISceneConnectionOptions
class]);
494 id userActivity = OCMClassMock([NSUserActivity
class]);
496 NSURL* url = [NSURL URLWithString:@"example.com"];
497 OCMStub([userActivity webpageURL]).andReturn(url);
498 NSSet<NSUserActivity*>* userActivities = [NSSet setWithObjects:userActivity, nil];
499 OCMStub([options userActivities]).andReturn(userActivities);
500 OCMStub([flutterApp isFlutterDeepLinkingEnabled]).andReturn(YES);
502 [delegate addFlutterManagedEngine:mockEngine];
506 OCMVerify(times(1), [mockEngine sendDeepLinkToFramework:url completionHandler:[OCMArg any]]);
509 - (void)testSceneWillConnectToSessionOptionsHandledByDeepLinks {
513 id mocks = [
self mocksForEvents];
514 id mockEngine = mocks[@"mockEngine"];
515 id mockScene = mocks[@"mockScene"];
518 OCMStub([mockLifecycleDelegate scene:[OCMArg any]
519 willConnectToSession:[OCMArg any]
520 options:[OCMArg any]])
523 id session = OCMClassMock([UISceneSession
class]);
524 id options = OCMClassMock([UISceneConnectionOptions
class]);
526 NSURL* url = [NSURL URLWithString:@"example.com"];
527 OCMStub([flutterApp isFlutterDeepLinkingEnabled]).andReturn(YES);
528 id urlContext = OCMClassMock([UIOpenURLContext
class]);
529 OCMStub([urlContext URL]).andReturn(url);
530 NSSet<UIOpenURLContext*>* urlContexts = [NSSet setWithObjects:urlContext, nil];
531 OCMStub([options URLContexts]).andReturn(urlContexts);
533 [delegate addFlutterManagedEngine:mockEngine];
537 OCMVerify(times(1), [mockEngine sendDeepLinkToFramework:url completionHandler:[OCMArg any]]);
540 - (void)testSceneWillConnectToSessionOptionsHandledByNoPlugin {
544 id mocks = [
self mocksForEvents];
545 id mockEngine = mocks[@"mockEngine"];
546 id mockScene = mocks[@"mockScene"];
549 OCMStub([mockLifecycleDelegate scene:[OCMArg any]
550 willConnectToSession:[OCMArg any]
551 options:[OCMArg any]])
554 id session = OCMClassMock([UISceneSession
class]);
555 id options = OCMClassMock([UISceneConnectionOptions
class]);
556 id userActivity = OCMClassMock([NSUserActivity
class]);
558 NSURL* url = [NSURL URLWithString:@"example.com"];
559 OCMStub([userActivity webpageURL]).andReturn(url);
560 NSSet<NSUserActivity*>* userActivities = [NSSet setWithObjects:userActivity, nil];
561 OCMStub([options userActivities]).andReturn(userActivities);
562 OCMStub([flutterApp isFlutterDeepLinkingEnabled]).andReturn(NO);
564 [delegate addFlutterManagedEngine:mockEngine];
568 OCMVerify(times(0), [mockEngine sendDeepLinkToFramework:url completionHandler:[OCMArg any]]);
571 - (void)testSceneWillConnectToSessionAddsEngineFromRootViewController {
576 id mockScene = OCMClassMock([UIWindowScene
class]);
577 id mockWindow = OCMClassMock([UIWindow
class]);
580 id mockSceneDelegate = OCMProtocolMock(
@protocol(UIWindowSceneDelegate));
582 OCMStub([mockScene delegate]).andReturn(mockSceneDelegate);
583 OCMStub([mockSceneDelegate window]).andReturn(mockWindow);
584 OCMStub([mockWindow rootViewController]).andReturn(mockViewController);
585 OCMStub([mockViewController
engine]).andReturn(mockEngine);
587 id session = OCMClassMock([UISceneSession
class]);
588 id options = OCMClassMock([UISceneConnectionOptions
class]);
592 OCMVerify(times(1), [mockDelegate addFlutterManagedEngine:mockEngine]);
593 OCMVerify(times(1), [mockDelegate scene:mockScene
594 willConnectToSession:session
595 flutterEngine:mockEngine
599 - (void)testSceneWillConnectToSessionAddsEngineFromRootViewControllerAndNotNotification {
604 id mockScene = OCMClassMock([UIWindowScene
class]);
605 id mockWindow = OCMClassMock([UIWindow
class]);
608 id mockSceneDelegate = OCMProtocolMock(
@protocol(UIWindowSceneDelegate));
610 OCMStub([mockScene delegate]).andReturn(mockSceneDelegate);
611 OCMStub([mockSceneDelegate window]).andReturn(mockWindow);
612 OCMStub([mockWindow rootViewController]).andReturn(mockViewController);
613 OCMStub([mockViewController
engine]).andReturn(mockEngine);
615 id session = OCMClassMock([UISceneSession
class]);
616 id options = OCMClassMock([UISceneConnectionOptions
class]);
619 [mockDelegate engine:mockEngine receivedConnectNotificationFor:mockScene];
621 OCMVerify(times(2), [mockDelegate addFlutterManagedEngine:mockEngine]);
623 OCMVerify(times(1), [mockDelegate scene:mockScene
624 willConnectToSession:session
625 flutterEngine:mockEngine
629 - (void)testSceneDidDisconnect {
633 id mocks = [
self mocksForEvents];
634 id mockEngine = mocks[@"mockEngine"];
635 id mockScene = mocks[@"mockScene"];
636 id mockLifecycleDelegate = mocks[@"mockLifecycleDelegate"];
638 [delegate addFlutterManagedEngine:mockEngine];
642 OCMVerify(times(1), [mockLifecycleDelegate sceneDidDisconnect:mockScene]);
645 - (void)testSceneWillEnterForeground {
649 id mocks = [
self mocksForEvents];
650 id mockEngine = mocks[@"mockEngine"];
651 id mockScene = mocks[@"mockScene"];
652 id mockLifecycleDelegate = mocks[@"mockLifecycleDelegate"];
653 id mockAppLifecycleDelegate = mocks[@"mockAppLifecycleDelegate"];
655 [delegate addFlutterManagedEngine:mockEngine];
659 OCMVerify(times(1), [mockLifecycleDelegate sceneWillEnterForeground:mockScene]);
660 OCMVerify(times(1), [mockAppLifecycleDelegate sceneWillEnterForegroundFallback]);
663 - (void)testSceneDidBecomeActive {
667 id mocks = [
self mocksForEvents];
668 id mockEngine = mocks[@"mockEngine"];
669 id mockScene = mocks[@"mockScene"];
670 id mockLifecycleDelegate = mocks[@"mockLifecycleDelegate"];
671 id mockAppLifecycleDelegate = mocks[@"mockAppLifecycleDelegate"];
673 [delegate addFlutterManagedEngine:mockEngine];
677 OCMVerify(times(1), [mockLifecycleDelegate sceneDidBecomeActive:mockScene]);
678 OCMVerify(times(1), [mockAppLifecycleDelegate sceneDidBecomeActiveFallback]);
681 - (void)testSceneWillResignActive {
685 id mocks = [
self mocksForEvents];
686 id mockEngine = mocks[@"mockEngine"];
687 id mockScene = mocks[@"mockScene"];
688 id mockLifecycleDelegate = mocks[@"mockLifecycleDelegate"];
689 id mockAppLifecycleDelegate = mocks[@"mockAppLifecycleDelegate"];
691 [delegate addFlutterManagedEngine:mockEngine];
695 OCMVerify(times(1), [mockLifecycleDelegate sceneWillResignActive:mockScene]);
696 OCMVerify(times(1), [mockAppLifecycleDelegate sceneWillResignActiveFallback]);
699 - (void)testSceneDidEnterBackground {
703 id mocks = [
self mocksForEvents];
704 id mockEngine = mocks[@"mockEngine"];
705 id mockScene = mocks[@"mockScene"];
706 id mockLifecycleDelegate = mocks[@"mockLifecycleDelegate"];
707 id mockAppLifecycleDelegate = mocks[@"mockAppLifecycleDelegate"];
709 [delegate addFlutterManagedEngine:mockEngine];
713 OCMVerify(times(1), [mockLifecycleDelegate sceneDidEnterBackground:mockScene]);
714 OCMVerify(times(1), [mockAppLifecycleDelegate sceneDidEnterBackgroundFallback]);
717 - (void)testSceneOpenURLContextsHandledByScenePlugin {
721 id mocks = [
self mocksForEvents];
722 id mockEngine = mocks[@"mockEngine"];
723 id mockScene = mocks[@"mockScene"];
726 id mockAppLifecycleDelegate = mocks[@"mockAppLifecycleDelegate"];
727 OCMStub([mockLifecycleDelegate scene:[OCMArg any] openURLContexts:[OCMArg any]]).andReturn(YES);
728 OCMStub([mockAppLifecycleDelegate sceneFallbackOpenURLContexts:[OCMArg any]]).andReturn(YES);
730 id urlContext = OCMClassMock([UIOpenURLContext
class]);
731 NSSet<UIOpenURLContext*>* urlContexts = [NSSet setWithObjects:urlContext, nil];
733 [delegate addFlutterManagedEngine:mockEngine];
737 OCMVerify(times(1), [mockLifecycleDelegate scene:mockScene openURLContexts:urlContexts]);
738 OCMVerify(times(0), [mockAppLifecycleDelegate sceneFallbackOpenURLContexts:urlContexts]);
741 - (void)testSceneOpenURLContextsHandledByApplicationPlugin {
745 id mocks = [
self mocksForEvents];
746 id mockEngine = mocks[@"mockEngine"];
747 id mockScene = mocks[@"mockScene"];
750 id mockAppLifecycleDelegate = mocks[@"mockAppLifecycleDelegate"];
751 OCMStub([mockLifecycleDelegate scene:[OCMArg any] openURLContexts:[OCMArg any]]).andReturn(NO);
752 OCMStub([mockAppLifecycleDelegate sceneFallbackOpenURLContexts:[OCMArg any]]).andReturn(YES);
754 id urlContext = OCMClassMock([UIOpenURLContext
class]);
755 NSSet<UIOpenURLContext*>* urlContexts = [NSSet setWithObjects:urlContext, nil];
757 [delegate addFlutterManagedEngine:mockEngine];
761 OCMVerify(times(1), [mockLifecycleDelegate scene:mockScene openURLContexts:urlContexts]);
762 OCMVerify(times(1), [mockAppLifecycleDelegate sceneFallbackOpenURLContexts:urlContexts]);
765 - (void)testSceneOpenURLContextsHandledByDeeplink {
769 id mocks = [
self mocksForEvents];
770 id mockEngine = mocks[@"mockEngine"];
771 id mockScene = mocks[@"mockScene"];
774 id mockAppLifecycleDelegate = mocks[@"mockAppLifecycleDelegate"];
775 OCMStub([mockLifecycleDelegate scene:[OCMArg any] openURLContexts:[OCMArg any]]).andReturn(NO);
776 OCMStub([mockAppLifecycleDelegate sceneFallbackOpenURLContexts:[OCMArg any]]).andReturn(NO);
778 OCMStub([flutterApp isFlutterDeepLinkingEnabled]).andReturn(YES);
780 NSURL* url = [NSURL URLWithString:@"example.com"];
781 id urlContext = OCMClassMock([UIOpenURLContext
class]);
782 OCMStub([urlContext URL]).andReturn(url);
783 NSSet<UIOpenURLContext*>* urlContexts = [NSSet setWithObjects:urlContext, nil];
785 [delegate addFlutterManagedEngine:mockEngine];
789 OCMVerify(times(1), [mockLifecycleDelegate scene:mockScene openURLContexts:urlContexts]);
790 OCMVerify(times(1), [mockAppLifecycleDelegate sceneFallbackOpenURLContexts:urlContexts]);
791 OCMVerify(times(1), [mockEngine sendDeepLinkToFramework:url completionHandler:[OCMArg any]]);
794 - (void)testSceneOpenURLContextsHandledByNoPlugin {
798 id mocks = [
self mocksForEvents];
799 id mockEngine = mocks[@"mockEngine"];
800 id mockScene = mocks[@"mockScene"];
803 id mockAppLifecycleDelegate = mocks[@"mockAppLifecycleDelegate"];
804 OCMStub([mockLifecycleDelegate scene:[OCMArg any] openURLContexts:[OCMArg any]]).andReturn(NO);
805 OCMStub([mockAppLifecycleDelegate sceneFallbackOpenURLContexts:[OCMArg any]]).andReturn(NO);
807 OCMStub([flutterApp isFlutterDeepLinkingEnabled]).andReturn(NO);
809 id urlContext = OCMClassMock([UIOpenURLContext
class]);
810 NSSet<UIOpenURLContext*>* urlContexts = [NSSet setWithObjects:urlContext, nil];
812 [delegate addFlutterManagedEngine:mockEngine];
816 OCMVerify(times(1), [mockLifecycleDelegate scene:mockScene openURLContexts:urlContexts]);
817 OCMVerify(times(1), [mockAppLifecycleDelegate sceneFallbackOpenURLContexts:urlContexts]);
820 - (void)testSceneOpenURLContextsWithMultipleEnginesSomeHandledByPlugin {
824 id mocks = [
self mocksForEvents];
825 id mockScene = mocks[@"mockScene"];
826 id mockAppLifecycleDelegate = mocks[@"mockAppLifecycleDelegate"];
832 OCMStub([mockLifecycleDelegate1 scene:[OCMArg any] openURLContexts:[OCMArg any]]).andReturn(YES);
838 OCMStub([mockLifecycleDelegate2 scene:[OCMArg any] openURLContexts:[OCMArg any]]).andReturn(NO);
841 OCMStub([flutterApp isFlutterDeepLinkingEnabled]).andReturn(YES);
843 NSURL* url = [NSURL URLWithString:@"example.com"];
844 id urlContext = OCMClassMock([UIOpenURLContext
class]);
845 OCMStub([urlContext URL]).andReturn(url);
846 NSSet<UIOpenURLContext*>* urlContexts = [NSSet setWithObjects:urlContext, nil];
848 [delegate addFlutterManagedEngine:mockEngine1];
849 [delegate addFlutterManagedEngine:mockEngine2];
853 OCMVerify(times(1), [mockLifecycleDelegate1 scene:mockScene openURLContexts:urlContexts]);
854 OCMVerify(times(1), [mockLifecycleDelegate2 scene:mockScene openURLContexts:urlContexts]);
855 OCMVerify(times(0), [mockAppLifecycleDelegate sceneFallbackOpenURLContexts:urlContexts]);
856 OCMVerify(times(0), [mockEngine1 sendDeepLinkToFramework:url completionHandler:[OCMArg any]]);
857 OCMVerify(times(1), [mockEngine2 sendDeepLinkToFramework:url completionHandler:[OCMArg any]]);
860 - (void)testSceneOpenURLContextsWithMultipleEnginesHandledByApplication {
864 id mocks = [
self mocksForEvents];
865 id mockScene = mocks[@"mockScene"];
866 id mockAppLifecycleDelegate = mocks[@"mockAppLifecycleDelegate"];
867 OCMStub([mockAppLifecycleDelegate sceneFallbackOpenURLContexts:[OCMArg any]]).andReturn(YES);
873 OCMStub([mockLifecycleDelegate1 scene:[OCMArg any] openURLContexts:[OCMArg any]]).andReturn(NO);
879 OCMStub([mockLifecycleDelegate2 scene:[OCMArg any] openURLContexts:[OCMArg any]]).andReturn(NO);
882 OCMStub([flutterApp isFlutterDeepLinkingEnabled]).andReturn(YES);
884 NSURL* url = [NSURL URLWithString:@"example.com"];
885 id urlContext = OCMClassMock([UIOpenURLContext
class]);
886 OCMStub([urlContext URL]).andReturn(url);
887 NSSet<UIOpenURLContext*>* urlContexts = [NSSet setWithObjects:urlContext, nil];
889 [delegate addFlutterManagedEngine:mockEngine1];
890 [delegate addFlutterManagedEngine:mockEngine2];
894 OCMVerify(times(1), [mockLifecycleDelegate1 scene:mockScene openURLContexts:urlContexts]);
895 OCMVerify(times(1), [mockLifecycleDelegate2 scene:mockScene openURLContexts:urlContexts]);
896 OCMVerify(times(1), [mockAppLifecycleDelegate sceneFallbackOpenURLContexts:urlContexts]);
897 OCMVerify(times(0), [mockEngine1 sendDeepLinkToFramework:url completionHandler:[OCMArg any]]);
898 OCMVerify(times(0), [mockEngine2 sendDeepLinkToFramework:url completionHandler:[OCMArg any]]);
901 - (void)testSceneOpenURLContextsWithMultipleEnginesHandledByDeeplink {
905 id mocks = [
self mocksForEvents];
906 id mockScene = mocks[@"mockScene"];
907 id mockAppLifecycleDelegate = mocks[@"mockAppLifecycleDelegate"];
908 OCMStub([mockAppLifecycleDelegate sceneFallbackOpenURLContexts:[OCMArg any]]).andReturn(NO);
914 OCMStub([mockLifecycleDelegate1 scene:[OCMArg any] openURLContexts:[OCMArg any]]).andReturn(NO);
920 OCMStub([mockLifecycleDelegate2 scene:[OCMArg any] openURLContexts:[OCMArg any]]).andReturn(NO);
923 OCMStub([flutterApp isFlutterDeepLinkingEnabled]).andReturn(YES);
925 NSURL* url = [NSURL URLWithString:@"example.com"];
926 id urlContext = OCMClassMock([UIOpenURLContext
class]);
927 OCMStub([urlContext URL]).andReturn(url);
928 NSSet<UIOpenURLContext*>* urlContexts = [NSSet setWithObjects:urlContext, nil];
930 [delegate addFlutterManagedEngine:mockEngine1];
931 [delegate addFlutterManagedEngine:mockEngine2];
935 OCMVerify(times(1), [mockLifecycleDelegate1 scene:mockScene openURLContexts:urlContexts]);
936 OCMVerify(times(1), [mockLifecycleDelegate2 scene:mockScene openURLContexts:urlContexts]);
937 OCMVerify(times(1), [mockAppLifecycleDelegate sceneFallbackOpenURLContexts:urlContexts]);
938 OCMVerify(times(1), [mockEngine1 sendDeepLinkToFramework:url completionHandler:[OCMArg any]]);
939 OCMVerify(times(1), [mockEngine2 sendDeepLinkToFramework:url completionHandler:[OCMArg any]]);
942 - (void)testSceneContinueUserActivityHandledByScenePlugin {
946 id mocks = [
self mocksForEvents];
947 id mockEngine = mocks[@"mockEngine"];
948 id mockScene = mocks[@"mockScene"];
951 id mockAppLifecycleDelegate = mocks[@"mockAppLifecycleDelegate"];
952 OCMStub([mockLifecycleDelegate scene:[OCMArg any] continueUserActivity:[OCMArg any]])
954 OCMStub([mockAppLifecycleDelegate sceneFallbackContinueUserActivity:[OCMArg any]]).andReturn(YES);
956 id userActivity = OCMClassMock([NSUserActivity
class]);
958 [delegate addFlutterManagedEngine:mockEngine];
962 OCMVerify(times(1), [mockLifecycleDelegate scene:mockScene continueUserActivity:userActivity]);
963 OCMVerify(times(0), [mockAppLifecycleDelegate sceneFallbackContinueUserActivity:userActivity]);
966 - (void)testSceneContinueUserActivityHandledByApplicationPlugin {
970 id mocks = [
self mocksForEvents];
971 id mockEngine = mocks[@"mockEngine"];
972 id mockScene = mocks[@"mockScene"];
975 id mockAppLifecycleDelegate = mocks[@"mockAppLifecycleDelegate"];
976 OCMStub([mockLifecycleDelegate scene:[OCMArg any] continueUserActivity:[OCMArg any]])
978 OCMStub([mockAppLifecycleDelegate sceneFallbackContinueUserActivity:[OCMArg any]]).andReturn(YES);
980 id userActivity = OCMClassMock([NSUserActivity
class]);
982 [delegate addFlutterManagedEngine:mockEngine];
986 OCMVerify(times(1), [mockLifecycleDelegate scene:mockScene continueUserActivity:userActivity]);
987 OCMVerify(times(1), [mockAppLifecycleDelegate sceneFallbackContinueUserActivity:userActivity]);
990 - (void)testSceneContinueUserActivityHandledByUniversalLinks {
994 id mocks = [
self mocksForEvents];
995 id mockEngine = mocks[@"mockEngine"];
996 id mockScene = mocks[@"mockScene"];
999 id mockAppLifecycleDelegate = mocks[@"mockAppLifecycleDelegate"];
1000 OCMStub([mockLifecycleDelegate scene:[OCMArg any] continueUserActivity:[OCMArg any]])
1002 OCMStub([mockAppLifecycleDelegate sceneFallbackContinueUserActivity:[OCMArg any]]).andReturn(NO);
1004 OCMStub([flutterApp isFlutterDeepLinkingEnabled]).andReturn(YES);
1006 NSURL* url = [NSURL URLWithString:@"example.com"];
1007 id userActivity = OCMClassMock([NSUserActivity
class]);
1008 OCMStub([userActivity webpageURL]).andReturn(url);
1010 [delegate addFlutterManagedEngine:mockEngine];
1014 OCMVerify(times(1), [mockLifecycleDelegate scene:mockScene continueUserActivity:userActivity]);
1015 OCMVerify(times(1), [mockAppLifecycleDelegate sceneFallbackContinueUserActivity:userActivity]);
1016 OCMVerify(times(1), [mockEngine sendDeepLinkToFramework:url completionHandler:[OCMArg any]]);
1019 - (void)testStateRestorationActivityForScene {
1023 id mocks = [
self mocksForEvents];
1024 id mockEngine = mocks[@"mockEngine"];
1027 OCMStub([mockEngine
viewController]).andReturn(mockViewController);
1028 OCMStub([mockEngine restorationPlugin]).andReturn(mockRestorationPlugin);
1030 NSString* restorationId =
@"restorationId";
1031 NSString* mockDataString =
@"mockData";
1032 NSString* configName =
@"ConfigurationName";
1033 NSData* mockData = [mockDataString dataUsingEncoding:NSUTF8StringEncoding];
1034 OCMStub([mockViewController restorationIdentifier]).andReturn(restorationId);
1035 OCMStub([mockRestorationPlugin restorationData]).andReturn(mockData);
1037 id mockScene = mocks[@"mockScene"];
1038 id mockSession = OCMClassMock([UISceneSession
class]);
1039 id mockConfiguration = OCMClassMock([UISceneConfiguration
class]);
1040 OCMStub([mockScene session]).andReturn(mockSession);
1041 OCMStub([mockSession configuration]).andReturn(mockConfiguration);
1042 OCMStub([mockConfiguration name]).andReturn(configName);
1044 [delegate addFlutterManagedEngine:mockEngine];
1046 NSUserActivity* state = [delegate stateRestorationActivityForScene:mockScene];
1047 XCTAssertEqual(state.userInfo[restorationId], mockData);
1048 XCTAssertEqual(state.activityType, configName);
1051 - (void)testSceneRestoreInteractionStateWithUserActivity {
1054 id mockBundle = OCMPartialMock([NSBundle mainBundle]);
1055 id mockURL = OCMClassMock([NSURL
class]);
1056 id mockFileDate = OCMClassMock([NSDate
class]);
1057 int64_t mockBundleDateNum = 1;
1059 OCMStub([mockBundle executableURL]).andReturn(mockURL);
1060 OCMStub([mockURL getResourceValue:[OCMArg setTo:mockFileDate]
1061 forKey:NSURLContentModificationDateKey
1062 error:[OCMArg setTo:nil]]);
1063 OCMStub([mockFileDate timeIntervalSince1970]).andReturn(mockBundleDateNum);
1065 id mocks = [
self mocksForEvents];
1066 id mockEngine = mocks[@"mockEngine"];
1069 OCMStub([mockEngine
viewController]).andReturn(mockViewController);
1070 OCMStub([mockEngine restorationPlugin]).andReturn(mockRestorationPlugin);
1072 NSString* restorationId =
@"restorationId";
1073 NSString* mockDataString =
@"teststring";
1074 NSNumber* mockBundleStateDateNum = @1.0;
1075 NSData* mockData = [mockDataString dataUsingEncoding:NSUTF8StringEncoding];
1076 OCMStub([mockViewController restorationIdentifier]).andReturn(restorationId);
1077 OCMStub([mockRestorationPlugin restorationData]).andReturn(mockData);
1079 id mockScene = mocks[@"mockScene"];
1081 id userActivity = OCMClassMock([NSUserActivity
class]);
1082 NSDictionary* mockUserInfo = @{
1083 @"mod-date" : mockBundleStateDateNum,
1084 restorationId : mockData,
1086 OCMStub([userActivity userInfo]).andReturn(mockUserInfo);
1088 [delegate addFlutterManagedEngine:mockEngine];
1090 [delegate scene:mockScene restoreInteractionStateWithUserActivity:userActivity];
1091 OCMVerify(times(1), [mockRestorationPlugin setRestorationData:mockData]);
1092 [mockBundle stopMocking];
1095 - (void)testSceneDoesNotRestoreInteractionStateWithUserActivity {
1098 id mockBundle = OCMPartialMock([NSBundle mainBundle]);
1099 id mockURL = OCMClassMock([NSURL
class]);
1100 id mockFileDate = OCMClassMock([NSDate
class]);
1101 int64_t mockBundleDateNum = 1;
1103 OCMStub([mockBundle executableURL]).andReturn(mockURL);
1104 OCMStub([mockURL getResourceValue:[OCMArg setTo:mockFileDate]
1105 forKey:NSURLContentModificationDateKey
1106 error:[OCMArg setTo:nil]]);
1107 OCMStub([mockFileDate timeIntervalSince1970]).andReturn(mockBundleDateNum);
1109 id mocks = [
self mocksForEvents];
1110 id mockEngine = mocks[@"mockEngine"];
1113 OCMStub([mockEngine
viewController]).andReturn(mockViewController);
1114 OCMStub([mockEngine restorationPlugin]).andReturn(mockRestorationPlugin);
1116 NSString* restorationId =
@"restorationId";
1117 NSString* mockDataString =
@"teststring";
1118 NSNumber* mockBundleStateDateNum = @2.0;
1119 NSData* mockData = [mockDataString dataUsingEncoding:NSUTF8StringEncoding];
1120 OCMStub([mockViewController restorationIdentifier]).andReturn(restorationId);
1121 OCMStub([mockRestorationPlugin restorationData]).andReturn(mockData);
1123 id mockScene = mocks[@"mockScene"];
1125 id userActivity = OCMClassMock([NSUserActivity
class]);
1126 NSDictionary* mockUserInfo = @{
1127 @"mod-date" : mockBundleStateDateNum,
1128 restorationId : mockData,
1130 OCMStub([userActivity userInfo]).andReturn(mockUserInfo);
1132 [delegate addFlutterManagedEngine:mockEngine];
1134 [delegate scene:mockScene restoreInteractionStateWithUserActivity:userActivity];
1135 OCMVerify(times(0), [mockRestorationPlugin setRestorationData:mockData]);
1136 [mockBundle stopMocking];
1139 - (void)testSceneContinueUserActivityHandledByNoPlugin {
1143 id mocks = [
self mocksForEvents];
1144 id mockEngine = mocks[@"mockEngine"];
1145 id mockScene = mocks[@"mockScene"];
1148 id mockAppLifecycleDelegate = mocks[@"mockAppLifecycleDelegate"];
1149 OCMStub([mockLifecycleDelegate scene:[OCMArg any] continueUserActivity:[OCMArg any]])
1151 OCMStub([mockAppLifecycleDelegate sceneFallbackContinueUserActivity:[OCMArg any]]).andReturn(NO);
1153 OCMStub([flutterApp isFlutterDeepLinkingEnabled]).andReturn(NO);
1155 NSURL* url = [NSURL URLWithString:@"example.com"];
1156 id userActivity = OCMClassMock([NSUserActivity
class]);
1157 OCMStub([userActivity webpageURL]).andReturn(url);
1159 [delegate addFlutterManagedEngine:mockEngine];
1163 OCMVerify(times(1), [mockLifecycleDelegate scene:mockScene continueUserActivity:userActivity]);
1164 OCMVerify(times(1), [mockAppLifecycleDelegate sceneFallbackContinueUserActivity:userActivity]);
1165 OCMVerify(times(0), [mockEngine sendDeepLinkToFramework:url completionHandler:[OCMArg any]]);
1168 - (void)testWindowScenePerformActionForShortcutItemHandledByScenePlugin {
1172 id mocks = [
self mocksForEvents];
1173 id mockEngine = mocks[@"mockEngine"];
1174 id mockScene = mocks[@"mockScene"];
1177 id mockAppLifecycleDelegate = mocks[@"mockAppLifecycleDelegate"];
1178 OCMStub([mockLifecycleDelegate windowScene:[OCMArg any]
1179 performActionForShortcutItem:[OCMArg any]
1180 completionHandler:[OCMArg any]])
1182 OCMStub([mockAppLifecycleDelegate sceneFallbackPerformActionForShortcutItem:[OCMArg any]
1183 completionHandler:[OCMArg any]])
1186 id shortcutItem = OCMClassMock([UIApplicationShortcutItem
class]);
1187 id handler = ^(BOOL succeeded) {
1190 [delegate addFlutterManagedEngine:mockEngine];
1196 OCMVerify(times(1), [mockLifecycleDelegate windowScene:mockScene
1197 performActionForShortcutItem:shortcutItem
1198 completionHandler:handler]);
1200 [mockAppLifecycleDelegate sceneFallbackPerformActionForShortcutItem:shortcutItem
1201 completionHandler:handler]);
1204 - (void)testWindowScenePerformActionForShortcutItemHandledByApplicationPlugin {
1208 id mocks = [
self mocksForEvents];
1209 id mockEngine = mocks[@"mockEngine"];
1210 id mockScene = mocks[@"mockScene"];
1213 id mockAppLifecycleDelegate = mocks[@"mockAppLifecycleDelegate"];
1214 OCMStub([mockLifecycleDelegate windowScene:[OCMArg any]
1215 performActionForShortcutItem:[OCMArg any]
1216 completionHandler:[OCMArg any]])
1218 OCMStub([mockAppLifecycleDelegate sceneFallbackPerformActionForShortcutItem:[OCMArg any]
1219 completionHandler:[OCMArg any]])
1222 id shortcutItem = OCMClassMock([UIApplicationShortcutItem
class]);
1223 id handler = ^(BOOL succeeded) {
1226 [delegate addFlutterManagedEngine:mockEngine];
1232 OCMVerify(times(1), [mockLifecycleDelegate windowScene:mockScene
1233 performActionForShortcutItem:shortcutItem
1234 completionHandler:handler]);
1236 [mockAppLifecycleDelegate sceneFallbackPerformActionForShortcutItem:shortcutItem
1237 completionHandler:handler]);
1240 - (void)testWindowScenePerformActionForShortcutItemHandledByNoPlugin {
1244 id mocks = [
self mocksForEvents];
1245 id mockEngine = mocks[@"mockEngine"];
1246 id mockScene = mocks[@"mockScene"];
1249 id mockAppLifecycleDelegate = mocks[@"mockAppLifecycleDelegate"];
1250 OCMStub([mockLifecycleDelegate windowScene:[OCMArg any]
1251 performActionForShortcutItem:[OCMArg any]
1252 completionHandler:[OCMArg any]])
1254 OCMStub([mockAppLifecycleDelegate sceneFallbackPerformActionForShortcutItem:[OCMArg any]
1255 completionHandler:[OCMArg any]])
1258 id shortcutItem = OCMClassMock([UIApplicationShortcutItem
class]);
1259 id handler = ^(BOOL succeeded) {
1262 [delegate addFlutterManagedEngine:mockEngine];
1268 OCMVerify(times(1), [mockLifecycleDelegate windowScene:mockScene
1269 performActionForShortcutItem:shortcutItem
1270 completionHandler:handler]);
1272 [mockAppLifecycleDelegate sceneFallbackPerformActionForShortcutItem:shortcutItem
1273 completionHandler:handler]);
1276 - (NSDictionary*)mocksForEvents {
1281 id mockApplication = OCMClassMock([UIApplication
class]);
1282 OCMStub([mockApplication sharedApplication]).andReturn(mockApplication);
1285 OCMStub([mockApplication delegate]).andReturn(mockAppDelegate);
1288 OCMStub([mockAppDelegate lifeCycleDelegate]).andReturn(mockAppLifecycleDelegate);
1290 id mockScene = OCMClassMock([UIWindowScene
class]);
1293 @"mockEngine" : mockEngine,
1294 @"mockScene" : mockScene,
1295 @"mockLifecycleDelegate" : mockLifecycleDelegate,
1296 @"mockAppLifecycleDelegate" : mockAppLifecycleDelegate,
1300 #pragma mark - FlutterEnginePluginSceneLifeCycleDelegate
1302 - (void)testEngineSceneWillConnectToSession {
1306 NSObject<FlutterSceneLifeCycleDelegate>* mockPlugin =
1308 OCMStub([mockPlugin scene:[OCMArg any] willConnectToSession:[OCMArg any] options:[OCMArg any]])
1310 NSObject<FlutterSceneLifeCycleDelegate>* mockPlugin2 =
1312 OCMStub([mockPlugin2 scene:[OCMArg any] willConnectToSession:[OCMArg any] options:[OCMArg any]])
1318 id mockScene = OCMClassMock([UIWindowScene
class]);
1319 id mockSession = OCMClassMock([UISceneSession
class]);
1320 id mockOptions = OCMClassMock([UISceneConnectionOptions
class]);
1322 XCTAssertTrue([delegate scene:mockScene willConnectToSession:mockSession options:mockOptions]);
1323 OCMVerify(times(1), [mockPlugin scene:mockScene
1324 willConnectToSession:mockSession
1325 options:mockOptions]);
1326 OCMVerify(times(1), [mockPlugin2 scene:mockScene willConnectToSession:mockSession options:nil]);
1329 - (void)testEngineSceneDidDisconnect {
1335 id mockScene = OCMClassMock([UIWindowScene
class]);
1337 OCMVerify([mockPlugin sceneDidDisconnect:mockScene]);
1340 - (void)testEngineSceneWillEnterForeground {
1346 id mockScene = OCMClassMock([UIWindowScene
class]);
1348 OCMVerify([mockPlugin sceneWillEnterForeground:mockScene]);
1351 - (void)testEngineSceneDidBecomeActive {
1357 id mockScene = OCMClassMock([UIWindowScene
class]);
1359 OCMVerify([mockPlugin sceneDidBecomeActive:mockScene]);
1362 - (void)testEngineSceneWillResignActive {
1368 id mockScene = OCMClassMock([UIWindowScene
class]);
1370 OCMVerify([mockPlugin sceneWillResignActive:mockScene]);
1373 - (void)testEngineSceneDidEnterBackground {
1379 id mockScene = OCMClassMock([UIWindowScene
class]);
1381 OCMVerify([mockPlugin sceneDidEnterBackground:mockScene]);
1384 - (void)testEngineSceneOpenURLContexts {
1388 NSObject<FlutterSceneLifeCycleDelegate>* mockPlugin =
1390 OCMStub([mockPlugin scene:[OCMArg any] openURLContexts:[OCMArg any]]).andReturn(YES);
1391 NSObject<FlutterSceneLifeCycleDelegate>* mockPlugin2 =
1393 OCMStub([mockPlugin2 scene:[OCMArg any] openURLContexts:[OCMArg any]]).andReturn(YES);
1398 id mockScene = OCMClassMock([UIWindowScene
class]);
1399 id urlContext = OCMClassMock([UIOpenURLContext
class]);
1400 NSSet<UIOpenURLContext*>* urlContexts = [NSSet setWithObjects:urlContext, nil];
1402 XCTAssertTrue([delegate scene:mockScene openURLContexts:urlContexts]);
1403 OCMVerify(times(1), [mockPlugin scene:mockScene openURLContexts:urlContexts]);
1404 OCMVerify(times(0), [mockPlugin2 scene:mockScene openURLContexts:urlContexts]);
1407 - (void)testEngineSceneContinueUserActivity {
1411 NSObject<FlutterSceneLifeCycleDelegate>* mockPlugin =
1413 OCMStub([mockPlugin scene:[OCMArg any] continueUserActivity:[OCMArg any]]).andReturn(YES);
1414 NSObject<FlutterSceneLifeCycleDelegate>* mockPlugin2 =
1416 OCMStub([mockPlugin2 scene:[OCMArg any] continueUserActivity:[OCMArg any]]).andReturn(YES);
1421 id mockScene = OCMClassMock([UIWindowScene
class]);
1422 id userActivity = OCMClassMock([NSUserActivity
class]);
1424 XCTAssertTrue([delegate scene:mockScene continueUserActivity:userActivity]);
1425 OCMVerify(times(1), [mockPlugin scene:mockScene continueUserActivity:userActivity]);
1426 OCMVerify(times(0), [mockPlugin2 scene:mockScene continueUserActivity:userActivity]);
1429 - (void)testEngineWindowScenePerformActionForShortcutItem {
1433 NSObject<FlutterSceneLifeCycleDelegate>* mockPlugin =
1435 OCMStub([mockPlugin windowScene:[OCMArg any]
1436 performActionForShortcutItem:[OCMArg any]
1437 completionHandler:[OCMArg any]])
1439 NSObject<FlutterSceneLifeCycleDelegate>* mockPlugin2 =
1441 OCMStub([mockPlugin2 windowScene:[OCMArg any]
1442 performActionForShortcutItem:[OCMArg any]
1443 completionHandler:[OCMArg any]])
1449 id mockScene = OCMClassMock([UIWindowScene
class]);
1450 id shortcutItem = OCMClassMock([UIApplicationShortcutItem
class]);
1451 id handler = ^(BOOL succeeded) {
1454 XCTAssertTrue([delegate windowScene:mockScene
1455 performActionForShortcutItem:shortcutItem
1456 completionHandler:handler]);
1457 OCMVerify(times(1), [mockPlugin windowScene:mockScene
1458 performActionForShortcutItem:shortcutItem
1459 completionHandler:handler]);
1460 OCMVerify(times(0), [mockPlugin2 windowScene:mockScene
1461 performActionForShortcutItem:shortcutItem
1462 completionHandler:handler]);
1465 - (void)testFlutterPluginSceneLifeCycleDelegateFromScene {
1466 id mockScene = OCMClassMock([UIWindowScene
class]);
1470 OCMStub([mockScene delegate]).andReturn(mockSceneDelegate);
1474 mockSceneLifeCycleDelegate);
FlutterViewController * viewController
void sceneDidBecomeActive:(UIScene *scene)
void sceneWillEnterForeground:(UIScene *scene)
void sceneWillResignActive:(UIScene *scene)
void addDelegate:(NSObject< FlutterSceneLifeCycleDelegate > *delegate)
void sceneDidEnterBackground:(UIScene *scene)
void sceneDidDisconnect:(UIScene *scene)
void scene:openURLContexts:(UIScene *scene,[openURLContexts] NSSet< UIOpenURLContext * > *URLContexts)
void updateFlutterManagedEnginesInScene:(UIScene *scene)
void scene:willConnectToSession:options:(UIScene *scene,[willConnectToSession] UISceneSession *session,[options] UISceneConnectionOptions *connectionOptions)
NSPointerArray * developerManagedEngines
NSPointerArray * flutterManagedEngines
void sceneWillEnterForeground:(UIScene *scene)
void sceneWillResignActive:(UIScene *scene)
void sceneDidBecomeActive:(UIScene *scene)
void sceneDidEnterBackground:(UIScene *scene)
void sceneDidDisconnect:(UIScene *scene)
void windowScene:performActionForShortcutItem:completionHandler:(UIWindowScene *windowScene,[performActionForShortcutItem] UIApplicationShortcutItem *shortcutItem,[completionHandler] void(^ completionHandler)(BOOL succeeded))
void scene:continueUserActivity:(UIScene *scene,[continueUserActivity] NSUserActivity *userActivity)
FlutterPluginSceneLifeCycleDelegate * sceneLifeCycleDelegate
BOOL unregisterSceneLifeCycleWithFlutterEngine:(FlutterEngine *engine)
BOOL registerSceneLifeCycleWithFlutterEngine:(FlutterEngine *engine)