5#import <Foundation/Foundation.h>
6#import <OCMock/OCMock.h>
8#import <XCTest/XCTest.h>
9#include <objc/NSObject.h>
32 if (
self = [super init]) {
59#pragma mark - FlutterPluginSceneLifeCycleDelegate
61- (void)testAddFlutterManagedEngine {
67 OCMStub([mockEngine sceneLifeCycleDelegate]).andReturn(mockLifecycleDelegate);
69 [delegate addFlutterManagedEngine:mockEngine];
73- (void)testAddDuplicateFlutterEngine {
79 OCMStub([mockEngine sceneLifeCycleDelegate]).andReturn(mockLifecycleDelegate);
81 [delegate addFlutterManagedEngine:mockEngine];
82 [delegate addFlutterManagedEngine:mockEngine];
83 [delegate addFlutterManagedEngine:mockEngine];
87- (void)testAddMultipleFlutterEngine {
93 OCMStub([mockEngine sceneLifeCycleDelegate]).andReturn(mockLifecycleDelegate);
94 [delegate addFlutterManagedEngine:mockEngine];
98 OCMStub([mockEngine2 sceneLifeCycleDelegate]).andReturn(mockLifecycleDelegate2);
99 [delegate addFlutterManagedEngine:mockEngine2];
104- (void)testRemoveFlutterManagedEngine {
109 [delegate addFlutterManagedEngine:mockEngine];
112 [delegate removeFlutterManagedEngine:mockEngine];
116- (void)testRemoveNotFoundFlutterEngine {
123 [delegate removeFlutterManagedEngine:mockEngine];
127- (void)testupdateFlutterManagedEnginesInSceneRemovesDeallocatedEngine {
131 id mockWindowScene = OCMClassMock([UIWindowScene
class]);
135 [delegate addFlutterManagedEngine:mockEngine];
143- (void)testupdateFlutterManagedEnginesInSceneRemovesEngineNotInScene {
148 id mockViewController = OCMClassMock([UIViewController
class]);
149 id mockView = OCMClassMock([UIView
class]);
150 id mockWindow = OCMClassMock([UIWindow
class]);
151 id mockWindowScene = OCMClassMock([UIWindowScene
class]);
152 id mockLifecycleProvider = OCMProtocolMock(
@protocol(FlutterSceneLifeCycleProvider));
154 OCMStub([mockEngine
viewController]).andReturn(mockViewController);
155 OCMStub([mockViewController
view]).andReturn(mockView);
156 OCMStub([mockView
window]).andReturn(mockWindow);
157 OCMStub([mockWindow windowScene]).andReturn(mockWindowScene);
158 OCMStub([mockWindow windowScene]).andReturn(mockWindowScene);
159 OCMStub([mockWindowScene delegate]).andReturn(mockLifecycleProvider);
160 OCMStub([mockLifecycleProvider sceneLifeCycleDelegate]).andReturn(mockLifecycleDelegate);
162 [delegate addFlutterManagedEngine:mockEngine];
165 id mockWindowScene2 = OCMClassMock([UIWindowScene
class]);
168 OCMVerify(times(1), [mockLifecycleDelegate addFlutterManagedEngine:mockEngine]);
172- (void)testupdateFlutterManagedEnginesInSceneDoesNotRemoveEngineWithNilScene {
176 id mockWindowScene = OCMClassMock([UIWindowScene
class]);
177 [delegate addFlutterManagedEngine:mockEngine];
184- (void)testManuallyRegisterSceneLifeCycleWithFlutterEngine {
190 OCMStub([mockEngine sceneLifeCycleDelegate]).andReturn(mockLifecycleDelegate);
197- (void)testManuallyUnregisterSceneLifeCycleWithFlutterEngine {
203 OCMStub([mockEngine sceneLifeCycleDelegate]).andReturn(mockLifecycleDelegate);
211- (void)testManuallyRegisterSceneLifeCycleWithFlutterEngineCannotBeAutoAdded {
216 id mockEngine = OCMPartialMock(
engine);
218 OCMStub([mockEngine sceneLifeCycleDelegate]).andReturn(mockLifecycleDelegate);
221 [delegate addFlutterManagedEngine:mockEngine];
226 [delegate addFlutterManagedEngine:mockEngine];
235- (void)testManuallyRegisterSceneLifeCycleWithFlutterEngineCannotBeAutoRemoved {
241 OCMStub([mockEngine sceneLifeCycleDelegate]).andReturn(mockLifecycleDelegate);
244 [delegate removeFlutterManagedEngine:mockEngine];
249- (void)testManuallyRegisterSceneLifeCycleWithFlutterEngineRemovesAutomatic {
255 OCMStub([mockEngine sceneLifeCycleDelegate]).andReturn(mockLifecycleDelegate);
257 [delegate addFlutterManagedEngine:mockEngine];
264- (void)testAllEnginesContainsManualAndAutomatic {
270 OCMStub([mockEngine sceneLifeCycleDelegate]).andReturn(mockLifecycleDelegate);
274 [delegate addFlutterManagedEngine:mockEngine];
279 XCTAssertEqual(delegate.
allEngines.count, 2.0);
280 XCTAssertEqual([delegate.
allEngines objectAtIndex:0], mockEngine);
281 XCTAssertEqual([delegate.
allEngines objectAtIndex:1], mockEngine2);
284- (void)testEngineReceivedConnectNotificationForSceneBeforeActualEvent {
288 id mocks = [
self mocksForEvents];
289 id mockEngine = mocks[@"mockEngine"];
290 id mockScene = mocks[@"mockScene"];
293 OCMStub([mockLifecycleDelegate scene:[OCMArg any]
294 willConnectToSession:[OCMArg any]
295 options:[OCMArg any]])
298 id mocks2 = [
self mocksForEvents];
299 id mockEngine2 = mocks2[@"mockEngine"];
302 OCMStub([mockLifecycleDelegate2 scene:[OCMArg any]
303 willConnectToSession:[OCMArg any]
304 options:[OCMArg any]])
308 [mockDelegate engine:mockEngine receivedConnectNotificationFor:mockScene];
309 [mockDelegate engine:mockEngine2 receivedConnectNotificationFor:mockScene];
310 OCMVerify(times(1), [mockDelegate addFlutterManagedEngine:mockEngine]);
311 OCMVerify(times(1), [mockDelegate addFlutterManagedEngine:mockEngine2]);
313 OCMVerify(times(0), [mockDelegate scene:[OCMArg any]
314 willConnectToSession:[OCMArg any]
315 options:[OCMArg any]]);
318 id session = OCMClassMock([UISceneSession
class]);
319 id options = OCMClassMock([UISceneConnectionOptions
class]);
321 OCMVerify(times(1), [mockLifecycleDelegate scene:mockScene
322 willConnectToSession:session
324 OCMVerify(times(1), [mockLifecycleDelegate2 scene:mockScene
325 willConnectToSession:session
330- (void)testEngineReceivedConnectNotificationForSceneAfterActualEvent {
334 id mocks = [
self mocksForEvents];
335 id mockEngine = mocks[@"mockEngine"];
336 id mockScene = mocks[@"mockScene"];
339 OCMStub([mockLifecycleDelegate scene:[OCMArg any]
340 willConnectToSession:[OCMArg any]
341 options:[OCMArg any]])
343 id mocks2 = [
self mocksForEvents];
344 id mockEngine2 = mocks2[@"mockEngine"];
347 OCMStub([mockLifecycleDelegate2 scene:[OCMArg any]
348 willConnectToSession:[OCMArg any]
349 options:[OCMArg any]])
353 id session = OCMClassMock([UISceneSession
class]);
354 id options = OCMClassMock([UISceneConnectionOptions
class]);
355 OCMStub([mockScene session]).andReturn(session);
358 OCMVerify(times(0), [mockLifecycleDelegate scene:mockScene
359 willConnectToSession:session
361 OCMVerify(times(0), [mockLifecycleDelegate2 scene:mockScene
362 willConnectToSession:session
364 OCMStub([mockDelegate connectionOptions]).andReturn(options);
367 [mockDelegate engine:mockEngine receivedConnectNotificationFor:mockScene];
368 [mockDelegate engine:mockEngine2 receivedConnectNotificationFor:mockScene];
370 OCMVerify(times(1), [mockDelegate addFlutterManagedEngine:mockEngine]);
371 OCMVerify(times(1), [mockDelegate addFlutterManagedEngine:mockEngine2]);
373 OCMVerify(times(1), [mockDelegate scene:mockScene willConnectToSession:session options:options]);
374 OCMVerify(times(1), [mockLifecycleDelegate scene:mockScene
375 willConnectToSession:session
377 OCMVerify(times(1), [mockLifecycleDelegate2 scene:mockScene
378 willConnectToSession:session
382- (void)testSceneWillConnectToSessionOptionsHandledByScenePlugin {
386 id mocks = [
self mocksForEvents];
387 id mockEngine = mocks[@"mockEngine"];
388 id mockScene = mocks[@"mockScene"];
391 OCMStub([mockLifecycleDelegate scene:[OCMArg any]
392 willConnectToSession:[OCMArg any]
393 options:[OCMArg any]])
395 id mockAppLifecycleDelegate = mocks[@"mockAppLifecycleDelegate"];
396 OCMStub([mockAppLifecycleDelegate sceneWillConnectFallback:[OCMArg any]]).andReturn(YES);
398 id session = OCMClassMock([UISceneSession
class]);
399 id options = OCMClassMock([UISceneConnectionOptions
class]);
401 [delegate addFlutterManagedEngine:mockEngine];
405 OCMVerify(times(1), [mockLifecycleDelegate scene:mockScene
406 willConnectToSession:session
408 OCMVerify(times(0), [mockAppLifecycleDelegate sceneWillConnectFallback:options]);
409 OCMVerify(times(0), [mockEngine sendDeepLinkToFramework:[OCMArg any]
410 completionHandler:[OCMArg any]]);
413- (void)testSceneWillConnectToSessionOptionsHandledByApplicationPlugin {
417 id mocks = [
self mocksForEvents];
418 id mockEngine = mocks[@"mockEngine"];
419 id mockScene = mocks[@"mockScene"];
422 OCMStub([mockLifecycleDelegate scene:[OCMArg any]
423 willConnectToSession:[OCMArg any]
424 options:[OCMArg any]])
426 id mockAppLifecycleDelegate = mocks[@"mockAppLifecycleDelegate"];
427 OCMStub([mockAppLifecycleDelegate sceneWillConnectFallback:[OCMArg any]]).andReturn(YES);
429 id session = OCMClassMock([UISceneSession
class]);
430 id options = OCMClassMock([UISceneConnectionOptions
class]);
432 [delegate addFlutterManagedEngine:mockEngine];
436 OCMVerify(times(1), [mockLifecycleDelegate scene:mockScene
437 willConnectToSession:session
439 OCMVerify(times(1), [mockAppLifecycleDelegate sceneWillConnectFallback:options]);
440 OCMVerify(times(0), [mockEngine sendDeepLinkToFramework:[OCMArg any]
441 completionHandler:[OCMArg any]]);
444- (void)testSceneWillConnectToSessionOptionsHandledByApplicationPluginMultipleEngines {
448 id mocks = [
self mocksForEvents];
449 id mockEngine = mocks[@"mockEngine"];
450 id mockScene = mocks[@"mockScene"];
453 OCMStub([mockLifecycleDelegate scene:[OCMArg any]
454 willConnectToSession:[OCMArg any]
455 options:[OCMArg any]])
458 id mocks2 = [
self mocksForEvents];
459 id mockEngine2 = mocks2[@"mockEngine"];
462 OCMStub([mockLifecycleDelegate2 scene:[OCMArg any]
463 willConnectToSession:[OCMArg any]
464 options:[OCMArg any]])
467 id mockAppLifecycleDelegate = mocks2[@"mockAppLifecycleDelegate"];
468 OCMStub([mockAppLifecycleDelegate sceneWillConnectFallback:[OCMArg any]]).andReturn(YES);
469 id session = OCMClassMock([UISceneSession
class]);
470 id options = OCMClassMock([UISceneConnectionOptions
class]);
472 [delegate addFlutterManagedEngine:mockEngine];
473 [delegate addFlutterManagedEngine:mockEngine2];
477 OCMVerify(times(1), [mockLifecycleDelegate scene:mockScene
478 willConnectToSession:session
480 OCMVerify(times(1), [mockLifecycleDelegate2 scene:mockScene
481 willConnectToSession:session
483 OCMVerify(times(1), [mockAppLifecycleDelegate sceneWillConnectFallback:options]);
484 OCMVerify(times(0), [mockEngine sendDeepLinkToFramework:[OCMArg any]
485 completionHandler:[OCMArg any]]);
488- (void)testSceneWillConnectToSessionOptionsHandledByUniversalLinks {
492 id mocks = [
self mocksForEvents];
493 id mockEngine = mocks[@"mockEngine"];
494 id mockScene = mocks[@"mockScene"];
497 OCMStub([mockLifecycleDelegate scene:[OCMArg any]
498 willConnectToSession:[OCMArg any]
499 options:[OCMArg any]])
502 id session = OCMClassMock([UISceneSession
class]);
503 id options = OCMClassMock([UISceneConnectionOptions
class]);
504 id userActivity = OCMClassMock([NSUserActivity
class]);
506 NSURL* url = [NSURL URLWithString:@"example.com"];
507 OCMStub([userActivity webpageURL]).andReturn(url);
508 NSSet<NSUserActivity*>* userActivities = [NSSet setWithObjects:userActivity, nil];
509 OCMStub([options userActivities]).andReturn(userActivities);
510 OCMStub([flutterApp isFlutterDeepLinkingEnabled]).andReturn(YES);
512 [delegate addFlutterManagedEngine:mockEngine];
516 OCMVerify(times(1), [mockEngine sendDeepLinkToFramework:url completionHandler:[OCMArg any]]);
519- (void)testSceneWillConnectToSessionOptionsHandledByDeepLinks {
523 id mocks = [
self mocksForEvents];
524 id mockEngine = mocks[@"mockEngine"];
525 id mockScene = mocks[@"mockScene"];
528 OCMStub([mockLifecycleDelegate scene:[OCMArg any]
529 willConnectToSession:[OCMArg any]
530 options:[OCMArg any]])
533 id session = OCMClassMock([UISceneSession
class]);
534 id options = OCMClassMock([UISceneConnectionOptions
class]);
536 NSURL* url = [NSURL URLWithString:@"example.com"];
537 OCMStub([flutterApp isFlutterDeepLinkingEnabled]).andReturn(YES);
538 id urlContext = OCMClassMock([UIOpenURLContext
class]);
539 OCMStub([urlContext URL]).andReturn(url);
540 NSSet<UIOpenURLContext*>* urlContexts = [NSSet setWithObjects:urlContext, nil];
541 OCMStub([options URLContexts]).andReturn(urlContexts);
543 [delegate addFlutterManagedEngine:mockEngine];
547 OCMVerify(times(1), [mockEngine sendDeepLinkToFramework:url completionHandler:[OCMArg any]]);
550- (void)testSceneWillConnectToSessionOptionsHandledByNoPlugin {
554 id mocks = [
self mocksForEvents];
555 id mockEngine = mocks[@"mockEngine"];
556 id mockScene = mocks[@"mockScene"];
559 OCMStub([mockLifecycleDelegate scene:[OCMArg any]
560 willConnectToSession:[OCMArg any]
561 options:[OCMArg any]])
564 id session = OCMClassMock([UISceneSession
class]);
565 id options = OCMClassMock([UISceneConnectionOptions
class]);
566 id userActivity = OCMClassMock([NSUserActivity
class]);
568 NSURL* url = [NSURL URLWithString:@"example.com"];
569 OCMStub([userActivity webpageURL]).andReturn(url);
570 NSSet<NSUserActivity*>* userActivities = [NSSet setWithObjects:userActivity, nil];
571 OCMStub([options userActivities]).andReturn(userActivities);
572 OCMStub([flutterApp isFlutterDeepLinkingEnabled]).andReturn(NO);
574 [delegate addFlutterManagedEngine:mockEngine];
578 OCMVerify(times(0), [mockEngine sendDeepLinkToFramework:url completionHandler:[OCMArg any]]);
581- (void)testSceneWillConnectToSessionAddsEngineFromRootViewController {
586 id mockScene = OCMClassMock([UIWindowScene
class]);
587 id mockWindow = OCMClassMock([UIWindow
class]);
590 id mockSceneDelegate = OCMProtocolMock(
@protocol(UIWindowSceneDelegate));
592 OCMStub([mockScene delegate]).andReturn(mockSceneDelegate);
593 OCMStub([mockSceneDelegate
window]).andReturn(mockWindow);
594 OCMStub([mockWindow rootViewController]).andReturn(mockViewController);
595 OCMStub([mockViewController
engine]).andReturn(mockEngine);
597 id session = OCMClassMock([UISceneSession
class]);
598 id options = OCMClassMock([UISceneConnectionOptions
class]);
602 OCMVerify(times(1), [mockDelegate addFlutterManagedEngine:mockEngine]);
603 OCMVerify(times(1), [mockDelegate scene:mockScene
604 willConnectToSession:session
605 flutterEngine:mockEngine
609- (void)testSceneWillConnectToSessionAddsEngineFromRootViewControllerAndNotNotification {
614 id mockScene = OCMClassMock([UIWindowScene
class]);
615 id mockWindow = OCMClassMock([UIWindow
class]);
618 id mockSceneDelegate = OCMProtocolMock(
@protocol(UIWindowSceneDelegate));
620 OCMStub([mockScene delegate]).andReturn(mockSceneDelegate);
621 OCMStub([mockSceneDelegate
window]).andReturn(mockWindow);
622 OCMStub([mockWindow rootViewController]).andReturn(mockViewController);
623 OCMStub([mockViewController
engine]).andReturn(mockEngine);
625 id session = OCMClassMock([UISceneSession
class]);
626 id options = OCMClassMock([UISceneConnectionOptions
class]);
629 [mockDelegate engine:mockEngine receivedConnectNotificationFor:mockScene];
631 OCMVerify(times(2), [mockDelegate addFlutterManagedEngine:mockEngine]);
633 OCMVerify(times(1), [mockDelegate scene:mockScene
634 willConnectToSession:session
635 flutterEngine:mockEngine
639- (void)testSceneDidDisconnect {
643 id mocks = [
self mocksForEvents];
644 id mockEngine = mocks[@"mockEngine"];
645 id mockScene = mocks[@"mockScene"];
646 id mockLifecycleDelegate = mocks[@"mockLifecycleDelegate"];
648 [delegate addFlutterManagedEngine:mockEngine];
652 OCMVerify(times(1), [mockLifecycleDelegate sceneDidDisconnect:mockScene]);
655- (void)testSceneWillEnterForeground {
659 id mocks = [
self mocksForEvents];
660 id mockEngine = mocks[@"mockEngine"];
661 id mockScene = mocks[@"mockScene"];
662 id mockLifecycleDelegate = mocks[@"mockLifecycleDelegate"];
663 id mockAppLifecycleDelegate = mocks[@"mockAppLifecycleDelegate"];
665 [delegate addFlutterManagedEngine:mockEngine];
669 OCMVerify(times(1), [mockLifecycleDelegate sceneWillEnterForeground:mockScene]);
670 OCMVerify(times(1), [mockAppLifecycleDelegate sceneWillEnterForegroundFallback]);
673- (void)testSceneDidBecomeActive {
677 id mocks = [
self mocksForEvents];
678 id mockEngine = mocks[@"mockEngine"];
679 id mockScene = mocks[@"mockScene"];
680 id mockLifecycleDelegate = mocks[@"mockLifecycleDelegate"];
681 id mockAppLifecycleDelegate = mocks[@"mockAppLifecycleDelegate"];
683 [delegate addFlutterManagedEngine:mockEngine];
687 OCMVerify(times(1), [mockLifecycleDelegate sceneDidBecomeActive:mockScene]);
688 OCMVerify(times(1), [mockAppLifecycleDelegate sceneDidBecomeActiveFallback]);
691- (void)testSceneWillResignActive {
695 id mocks = [
self mocksForEvents];
696 id mockEngine = mocks[@"mockEngine"];
697 id mockScene = mocks[@"mockScene"];
698 id mockLifecycleDelegate = mocks[@"mockLifecycleDelegate"];
699 id mockAppLifecycleDelegate = mocks[@"mockAppLifecycleDelegate"];
701 [delegate addFlutterManagedEngine:mockEngine];
705 OCMVerify(times(1), [mockLifecycleDelegate sceneWillResignActive:mockScene]);
706 OCMVerify(times(1), [mockAppLifecycleDelegate sceneWillResignActiveFallback]);
709- (void)testSceneDidEnterBackground {
713 id mocks = [
self mocksForEvents];
714 id mockEngine = mocks[@"mockEngine"];
715 id mockScene = mocks[@"mockScene"];
716 id mockLifecycleDelegate = mocks[@"mockLifecycleDelegate"];
717 id mockAppLifecycleDelegate = mocks[@"mockAppLifecycleDelegate"];
719 [delegate addFlutterManagedEngine:mockEngine];
723 OCMVerify(times(1), [mockLifecycleDelegate sceneDidEnterBackground:mockScene]);
724 OCMVerify(times(1), [mockAppLifecycleDelegate sceneDidEnterBackgroundFallback]);
727- (void)testSceneOpenURLContextsHandledByScenePlugin {
731 id mocks = [
self mocksForEvents];
732 id mockEngine = mocks[@"mockEngine"];
733 id mockScene = mocks[@"mockScene"];
736 id mockAppLifecycleDelegate = mocks[@"mockAppLifecycleDelegate"];
737 OCMStub([mockLifecycleDelegate scene:[OCMArg any] openURLContexts:[OCMArg any]]).andReturn(YES);
738 OCMStub([mockAppLifecycleDelegate sceneFallbackOpenURLContexts:[OCMArg any]]).andReturn(YES);
740 id urlContext = OCMClassMock([UIOpenURLContext
class]);
741 NSSet<UIOpenURLContext*>* urlContexts = [NSSet setWithObjects:urlContext, nil];
743 [delegate addFlutterManagedEngine:mockEngine];
747 OCMVerify(times(1), [mockLifecycleDelegate scene:mockScene openURLContexts:urlContexts]);
748 OCMVerify(times(0), [mockAppLifecycleDelegate sceneFallbackOpenURLContexts:urlContexts]);
751- (void)testSceneOpenURLContextsHandledByApplicationPlugin {
755 id mocks = [
self mocksForEvents];
756 id mockEngine = mocks[@"mockEngine"];
757 id mockScene = mocks[@"mockScene"];
760 id mockAppLifecycleDelegate = mocks[@"mockAppLifecycleDelegate"];
761 OCMStub([mockLifecycleDelegate scene:[OCMArg any] openURLContexts:[OCMArg any]]).andReturn(NO);
762 OCMStub([mockAppLifecycleDelegate sceneFallbackOpenURLContexts:[OCMArg any]]).andReturn(YES);
764 id urlContext = OCMClassMock([UIOpenURLContext
class]);
765 NSSet<UIOpenURLContext*>* urlContexts = [NSSet setWithObjects:urlContext, nil];
767 [delegate addFlutterManagedEngine:mockEngine];
771 OCMVerify(times(1), [mockLifecycleDelegate scene:mockScene openURLContexts:urlContexts]);
772 OCMVerify(times(1), [mockAppLifecycleDelegate sceneFallbackOpenURLContexts:urlContexts]);
775- (void)testSceneOpenURLContextsHandledByDeeplink {
779 id mocks = [
self mocksForEvents];
780 id mockEngine = mocks[@"mockEngine"];
781 id mockScene = mocks[@"mockScene"];
784 id mockAppLifecycleDelegate = mocks[@"mockAppLifecycleDelegate"];
785 OCMStub([mockLifecycleDelegate scene:[OCMArg any] openURLContexts:[OCMArg any]]).andReturn(NO);
786 OCMStub([mockAppLifecycleDelegate sceneFallbackOpenURLContexts:[OCMArg any]]).andReturn(NO);
788 OCMStub([flutterApp isFlutterDeepLinkingEnabled]).andReturn(YES);
790 NSURL* url = [NSURL URLWithString:@"example.com"];
791 id urlContext = OCMClassMock([UIOpenURLContext
class]);
792 OCMStub([urlContext URL]).andReturn(url);
793 NSSet<UIOpenURLContext*>* urlContexts = [NSSet setWithObjects:urlContext, nil];
795 [delegate addFlutterManagedEngine:mockEngine];
799 OCMVerify(times(1), [mockLifecycleDelegate scene:mockScene openURLContexts:urlContexts]);
800 OCMVerify(times(1), [mockAppLifecycleDelegate sceneFallbackOpenURLContexts:urlContexts]);
801 OCMVerify(times(1), [mockEngine sendDeepLinkToFramework:url completionHandler:[OCMArg any]]);
804- (void)testSceneOpenURLContextsHandledByNoPlugin {
808 id mocks = [
self mocksForEvents];
809 id mockEngine = mocks[@"mockEngine"];
810 id mockScene = mocks[@"mockScene"];
813 id mockAppLifecycleDelegate = mocks[@"mockAppLifecycleDelegate"];
814 OCMStub([mockLifecycleDelegate scene:[OCMArg any] openURLContexts:[OCMArg any]]).andReturn(NO);
815 OCMStub([mockAppLifecycleDelegate sceneFallbackOpenURLContexts:[OCMArg any]]).andReturn(NO);
817 OCMStub([flutterApp isFlutterDeepLinkingEnabled]).andReturn(NO);
819 id urlContext = OCMClassMock([UIOpenURLContext
class]);
820 NSSet<UIOpenURLContext*>* urlContexts = [NSSet setWithObjects:urlContext, nil];
822 [delegate addFlutterManagedEngine:mockEngine];
826 OCMVerify(times(1), [mockLifecycleDelegate scene:mockScene openURLContexts:urlContexts]);
827 OCMVerify(times(1), [mockAppLifecycleDelegate sceneFallbackOpenURLContexts:urlContexts]);
830- (void)testSceneOpenURLContextsWithMultipleEnginesSomeHandledByPlugin {
834 id mocks = [
self mocksForEvents];
835 id mockScene = mocks[@"mockScene"];
836 id mockAppLifecycleDelegate = mocks[@"mockAppLifecycleDelegate"];
841 OCMStub([mockEngine1 sceneLifeCycleDelegate]).andReturn(mockLifecycleDelegate1);
842 OCMStub([mockLifecycleDelegate1 scene:[OCMArg any] openURLContexts:[OCMArg any]]).andReturn(YES);
847 OCMStub([mockEngine2 sceneLifeCycleDelegate]).andReturn(mockLifecycleDelegate2);
848 OCMStub([mockLifecycleDelegate2 scene:[OCMArg any] openURLContexts:[OCMArg any]]).andReturn(NO);
851 OCMStub([flutterApp isFlutterDeepLinkingEnabled]).andReturn(YES);
853 NSURL* url = [NSURL URLWithString:@"example.com"];
854 id urlContext = OCMClassMock([UIOpenURLContext
class]);
855 OCMStub([urlContext URL]).andReturn(url);
856 NSSet<UIOpenURLContext*>* urlContexts = [NSSet setWithObjects:urlContext, nil];
858 [delegate addFlutterManagedEngine:mockEngine1];
859 [delegate addFlutterManagedEngine:mockEngine2];
863 OCMVerify(times(1), [mockLifecycleDelegate1 scene:mockScene openURLContexts:urlContexts]);
864 OCMVerify(times(1), [mockLifecycleDelegate2 scene:mockScene openURLContexts:urlContexts]);
865 OCMVerify(times(0), [mockAppLifecycleDelegate sceneFallbackOpenURLContexts:urlContexts]);
866 OCMVerify(times(0), [mockEngine1 sendDeepLinkToFramework:url completionHandler:[OCMArg any]]);
867 OCMVerify(times(1), [mockEngine2 sendDeepLinkToFramework:url completionHandler:[OCMArg any]]);
870- (void)testSceneOpenURLContextsWithMultipleEnginesHandledByApplication {
874 id mocks = [
self mocksForEvents];
875 id mockScene = mocks[@"mockScene"];
876 id mockAppLifecycleDelegate = mocks[@"mockAppLifecycleDelegate"];
877 OCMStub([mockAppLifecycleDelegate sceneFallbackOpenURLContexts:[OCMArg any]]).andReturn(YES);
882 OCMStub([mockEngine1 sceneLifeCycleDelegate]).andReturn(mockLifecycleDelegate1);
883 OCMStub([mockLifecycleDelegate1 scene:[OCMArg any] openURLContexts:[OCMArg any]]).andReturn(NO);
888 OCMStub([mockEngine2 sceneLifeCycleDelegate]).andReturn(mockLifecycleDelegate2);
889 OCMStub([mockLifecycleDelegate2 scene:[OCMArg any] openURLContexts:[OCMArg any]]).andReturn(NO);
892 OCMStub([flutterApp isFlutterDeepLinkingEnabled]).andReturn(YES);
894 NSURL* url = [NSURL URLWithString:@"example.com"];
895 id urlContext = OCMClassMock([UIOpenURLContext
class]);
896 OCMStub([urlContext URL]).andReturn(url);
897 NSSet<UIOpenURLContext*>* urlContexts = [NSSet setWithObjects:urlContext, nil];
899 [delegate addFlutterManagedEngine:mockEngine1];
900 [delegate addFlutterManagedEngine:mockEngine2];
904 OCMVerify(times(1), [mockLifecycleDelegate1 scene:mockScene openURLContexts:urlContexts]);
905 OCMVerify(times(1), [mockLifecycleDelegate2 scene:mockScene openURLContexts:urlContexts]);
906 OCMVerify(times(1), [mockAppLifecycleDelegate sceneFallbackOpenURLContexts:urlContexts]);
907 OCMVerify(times(0), [mockEngine1 sendDeepLinkToFramework:url completionHandler:[OCMArg any]]);
908 OCMVerify(times(0), [mockEngine2 sendDeepLinkToFramework:url completionHandler:[OCMArg any]]);
911- (void)testSceneOpenURLContextsWithMultipleEnginesHandledByDeeplink {
915 id mocks = [
self mocksForEvents];
916 id mockScene = mocks[@"mockScene"];
917 id mockAppLifecycleDelegate = mocks[@"mockAppLifecycleDelegate"];
918 OCMStub([mockAppLifecycleDelegate sceneFallbackOpenURLContexts:[OCMArg any]]).andReturn(NO);
923 OCMStub([mockEngine1 sceneLifeCycleDelegate]).andReturn(mockLifecycleDelegate1);
924 OCMStub([mockLifecycleDelegate1 scene:[OCMArg any] openURLContexts:[OCMArg any]]).andReturn(NO);
929 OCMStub([mockEngine2 sceneLifeCycleDelegate]).andReturn(mockLifecycleDelegate2);
930 OCMStub([mockLifecycleDelegate2 scene:[OCMArg any] openURLContexts:[OCMArg any]]).andReturn(NO);
933 OCMStub([flutterApp isFlutterDeepLinkingEnabled]).andReturn(YES);
935 NSURL* url = [NSURL URLWithString:@"example.com"];
936 id urlContext = OCMClassMock([UIOpenURLContext
class]);
937 OCMStub([urlContext URL]).andReturn(url);
938 NSSet<UIOpenURLContext*>* urlContexts = [NSSet setWithObjects:urlContext, nil];
940 [delegate addFlutterManagedEngine:mockEngine1];
941 [delegate addFlutterManagedEngine:mockEngine2];
945 OCMVerify(times(1), [mockLifecycleDelegate1 scene:mockScene openURLContexts:urlContexts]);
946 OCMVerify(times(1), [mockLifecycleDelegate2 scene:mockScene openURLContexts:urlContexts]);
947 OCMVerify(times(1), [mockAppLifecycleDelegate sceneFallbackOpenURLContexts:urlContexts]);
948 OCMVerify(times(1), [mockEngine1 sendDeepLinkToFramework:url completionHandler:[OCMArg any]]);
949 OCMVerify(times(1), [mockEngine2 sendDeepLinkToFramework:url completionHandler:[OCMArg any]]);
952- (void)testSceneContinueUserActivityHandledByScenePlugin {
956 id mocks = [
self mocksForEvents];
957 id mockEngine = mocks[@"mockEngine"];
958 id mockScene = mocks[@"mockScene"];
961 id mockAppLifecycleDelegate = mocks[@"mockAppLifecycleDelegate"];
962 OCMStub([mockLifecycleDelegate scene:[OCMArg any] continueUserActivity:[OCMArg any]])
964 OCMStub([mockAppLifecycleDelegate sceneFallbackContinueUserActivity:[OCMArg any]]).andReturn(YES);
966 id userActivity = OCMClassMock([NSUserActivity
class]);
968 [delegate addFlutterManagedEngine:mockEngine];
972 OCMVerify(times(1), [mockLifecycleDelegate scene:mockScene continueUserActivity:userActivity]);
973 OCMVerify(times(0), [mockAppLifecycleDelegate sceneFallbackContinueUserActivity:userActivity]);
976- (void)testSceneContinueUserActivityHandledByApplicationPlugin {
980 id mocks = [
self mocksForEvents];
981 id mockEngine = mocks[@"mockEngine"];
982 id mockScene = mocks[@"mockScene"];
985 id mockAppLifecycleDelegate = mocks[@"mockAppLifecycleDelegate"];
986 OCMStub([mockLifecycleDelegate scene:[OCMArg any] continueUserActivity:[OCMArg any]])
988 OCMStub([mockAppLifecycleDelegate sceneFallbackContinueUserActivity:[OCMArg any]]).andReturn(YES);
990 id userActivity = OCMClassMock([NSUserActivity
class]);
992 [delegate addFlutterManagedEngine:mockEngine];
996 OCMVerify(times(1), [mockLifecycleDelegate scene:mockScene continueUserActivity:userActivity]);
997 OCMVerify(times(1), [mockAppLifecycleDelegate sceneFallbackContinueUserActivity:userActivity]);
1000- (void)testSceneContinueUserActivityHandledByUniversalLinks {
1004 id mocks = [
self mocksForEvents];
1005 id mockEngine = mocks[@"mockEngine"];
1006 id mockScene = mocks[@"mockScene"];
1009 id mockAppLifecycleDelegate = mocks[@"mockAppLifecycleDelegate"];
1010 OCMStub([mockLifecycleDelegate scene:[OCMArg any] continueUserActivity:[OCMArg any]])
1012 OCMStub([mockAppLifecycleDelegate sceneFallbackContinueUserActivity:[OCMArg any]]).andReturn(NO);
1014 OCMStub([flutterApp isFlutterDeepLinkingEnabled]).andReturn(YES);
1016 NSURL* url = [NSURL URLWithString:@"example.com"];
1017 id userActivity = OCMClassMock([NSUserActivity
class]);
1018 OCMStub([userActivity webpageURL]).andReturn(url);
1020 [delegate addFlutterManagedEngine:mockEngine];
1024 OCMVerify(times(1), [mockLifecycleDelegate scene:mockScene continueUserActivity:userActivity]);
1025 OCMVerify(times(1), [mockAppLifecycleDelegate sceneFallbackContinueUserActivity:userActivity]);
1026 OCMVerify(times(1), [mockEngine sendDeepLinkToFramework:url completionHandler:[OCMArg any]]);
1029- (void)testStateRestorationActivityForScene {
1033 id mocks = [
self mocksForEvents];
1034 id mockEngine = mocks[@"mockEngine"];
1037 OCMStub([mockEngine
viewController]).andReturn(mockViewController);
1038 OCMStub([mockEngine restorationPlugin]).andReturn(mockRestorationPlugin);
1040 NSString* restorationId =
@"restorationId";
1041 NSString* mockDataString =
@"mockData";
1042 NSString* configName =
@"ConfigurationName";
1043 NSData* mockData = [mockDataString dataUsingEncoding:NSUTF8StringEncoding];
1044 OCMStub([mockViewController restorationIdentifier]).andReturn(restorationId);
1045 OCMStub([mockRestorationPlugin restorationData]).andReturn(mockData);
1047 id mockScene = mocks[@"mockScene"];
1048 id mockSession = OCMClassMock([UISceneSession
class]);
1049 id mockConfiguration = OCMClassMock([UISceneConfiguration
class]);
1050 OCMStub([mockScene session]).andReturn(mockSession);
1051 OCMStub([mockSession configuration]).andReturn(mockConfiguration);
1052 OCMStub([mockConfiguration
name]).andReturn(configName);
1054 [delegate addFlutterManagedEngine:mockEngine];
1056 NSUserActivity* state = [delegate stateRestorationActivityForScene:mockScene];
1057 XCTAssertEqual(state.userInfo[restorationId], mockData);
1058 XCTAssertEqual(state.activityType, configName);
1061- (void)testSceneRestoreInteractionStateWithUserActivity {
1064 id mockBundle = OCMPartialMock([NSBundle mainBundle]);
1065 id mockURL = OCMClassMock([NSURL
class]);
1066 id mockFileDate = OCMClassMock([NSDate
class]);
1067 int64_t mockBundleDateNum = 1;
1069 OCMStub([mockBundle executableURL]).andReturn(mockURL);
1070 OCMStub([mockURL getResourceValue:[OCMArg setTo:mockFileDate]
1071 forKey:NSURLContentModificationDateKey
1072 error:[OCMArg setTo:nil]]);
1073 OCMStub([mockFileDate timeIntervalSince1970]).andReturn(mockBundleDateNum);
1075 id mocks = [
self mocksForEvents];
1076 id mockEngine = mocks[@"mockEngine"];
1079 OCMStub([mockEngine
viewController]).andReturn(mockViewController);
1080 OCMStub([mockEngine restorationPlugin]).andReturn(mockRestorationPlugin);
1082 NSString* restorationId =
@"restorationId";
1083 NSString* mockDataString =
@"teststring";
1084 NSNumber* mockBundleStateDateNum = @1.0;
1085 NSData* mockData = [mockDataString dataUsingEncoding:NSUTF8StringEncoding];
1086 OCMStub([mockViewController restorationIdentifier]).andReturn(restorationId);
1087 OCMStub([mockRestorationPlugin restorationData]).andReturn(mockData);
1089 id mockScene = mocks[@"mockScene"];
1091 id userActivity = OCMClassMock([NSUserActivity
class]);
1092 NSDictionary* mockUserInfo = @{
1093 @"mod-date" : mockBundleStateDateNum,
1094 restorationId : mockData,
1096 OCMStub([userActivity userInfo]).andReturn(mockUserInfo);
1098 [delegate addFlutterManagedEngine:mockEngine];
1100 [delegate scene:mockScene restoreInteractionStateWithUserActivity:userActivity];
1101 OCMVerify(times(1), [mockRestorationPlugin setRestorationData:mockData]);
1102 [mockBundle stopMocking];
1105- (void)testSceneDoesNotRestoreInteractionStateWithUserActivity {
1108 id mockBundle = OCMPartialMock([NSBundle mainBundle]);
1109 id mockURL = OCMClassMock([NSURL
class]);
1110 id mockFileDate = OCMClassMock([NSDate
class]);
1111 int64_t mockBundleDateNum = 1;
1113 OCMStub([mockBundle executableURL]).andReturn(mockURL);
1114 OCMStub([mockURL getResourceValue:[OCMArg setTo:mockFileDate]
1115 forKey:NSURLContentModificationDateKey
1116 error:[OCMArg setTo:nil]]);
1117 OCMStub([mockFileDate timeIntervalSince1970]).andReturn(mockBundleDateNum);
1119 id mocks = [
self mocksForEvents];
1120 id mockEngine = mocks[@"mockEngine"];
1123 OCMStub([mockEngine
viewController]).andReturn(mockViewController);
1124 OCMStub([mockEngine restorationPlugin]).andReturn(mockRestorationPlugin);
1126 NSString* restorationId =
@"restorationId";
1127 NSString* mockDataString =
@"teststring";
1128 NSNumber* mockBundleStateDateNum = @2.0;
1129 NSData* mockData = [mockDataString dataUsingEncoding:NSUTF8StringEncoding];
1130 OCMStub([mockViewController restorationIdentifier]).andReturn(restorationId);
1131 OCMStub([mockRestorationPlugin restorationData]).andReturn(mockData);
1133 id mockScene = mocks[@"mockScene"];
1135 id userActivity = OCMClassMock([NSUserActivity
class]);
1136 NSDictionary* mockUserInfo = @{
1137 @"mod-date" : mockBundleStateDateNum,
1138 restorationId : mockData,
1140 OCMStub([userActivity userInfo]).andReturn(mockUserInfo);
1142 [delegate addFlutterManagedEngine:mockEngine];
1144 [delegate scene:mockScene restoreInteractionStateWithUserActivity:userActivity];
1145 OCMVerify(times(0), [mockRestorationPlugin setRestorationData:mockData]);
1146 [mockBundle stopMocking];
1149- (void)testSceneContinueUserActivityHandledByNoPlugin {
1153 id mocks = [
self mocksForEvents];
1154 id mockEngine = mocks[@"mockEngine"];
1155 id mockScene = mocks[@"mockScene"];
1158 id mockAppLifecycleDelegate = mocks[@"mockAppLifecycleDelegate"];
1159 OCMStub([mockLifecycleDelegate scene:[OCMArg any] continueUserActivity:[OCMArg any]])
1161 OCMStub([mockAppLifecycleDelegate sceneFallbackContinueUserActivity:[OCMArg any]]).andReturn(NO);
1163 OCMStub([flutterApp isFlutterDeepLinkingEnabled]).andReturn(NO);
1165 NSURL* url = [NSURL URLWithString:@"example.com"];
1166 id userActivity = OCMClassMock([NSUserActivity
class]);
1167 OCMStub([userActivity webpageURL]).andReturn(url);
1169 [delegate addFlutterManagedEngine:mockEngine];
1173 OCMVerify(times(1), [mockLifecycleDelegate scene:mockScene continueUserActivity:userActivity]);
1174 OCMVerify(times(1), [mockAppLifecycleDelegate sceneFallbackContinueUserActivity:userActivity]);
1175 OCMVerify(times(0), [mockEngine sendDeepLinkToFramework:url completionHandler:[OCMArg any]]);
1178- (void)testWindowScenePerformActionForShortcutItemHandledByScenePlugin {
1182 id mocks = [
self mocksForEvents];
1183 id mockEngine = mocks[@"mockEngine"];
1184 id mockScene = mocks[@"mockScene"];
1187 id mockAppLifecycleDelegate = mocks[@"mockAppLifecycleDelegate"];
1188 OCMStub([mockLifecycleDelegate windowScene:[OCMArg any]
1189 performActionForShortcutItem:[OCMArg any]
1190 completionHandler:[OCMArg any]])
1192 OCMStub([mockAppLifecycleDelegate sceneFallbackPerformActionForShortcutItem:[OCMArg any]
1193 completionHandler:[OCMArg any]])
1196 id shortcutItem = OCMClassMock([UIApplicationShortcutItem
class]);
1200 [delegate addFlutterManagedEngine:mockEngine];
1206 OCMVerify(times(1), [mockLifecycleDelegate windowScene:mockScene
1207 performActionForShortcutItem:shortcutItem
1210 [mockAppLifecycleDelegate sceneFallbackPerformActionForShortcutItem:shortcutItem
1214- (void)testWindowScenePerformActionForShortcutItemHandledByApplicationPlugin {
1218 id mocks = [
self mocksForEvents];
1219 id mockEngine = mocks[@"mockEngine"];
1220 id mockScene = mocks[@"mockScene"];
1223 id mockAppLifecycleDelegate = mocks[@"mockAppLifecycleDelegate"];
1224 OCMStub([mockLifecycleDelegate windowScene:[OCMArg any]
1225 performActionForShortcutItem:[OCMArg any]
1226 completionHandler:[OCMArg any]])
1228 OCMStub([mockAppLifecycleDelegate sceneFallbackPerformActionForShortcutItem:[OCMArg any]
1229 completionHandler:[OCMArg any]])
1232 id shortcutItem = OCMClassMock([UIApplicationShortcutItem
class]);
1236 [delegate addFlutterManagedEngine:mockEngine];
1242 OCMVerify(times(1), [mockLifecycleDelegate windowScene:mockScene
1243 performActionForShortcutItem:shortcutItem
1246 [mockAppLifecycleDelegate sceneFallbackPerformActionForShortcutItem:shortcutItem
1250- (void)testWindowScenePerformActionForShortcutItemHandledByNoPlugin {
1254 id mocks = [
self mocksForEvents];
1255 id mockEngine = mocks[@"mockEngine"];
1256 id mockScene = mocks[@"mockScene"];
1259 id mockAppLifecycleDelegate = mocks[@"mockAppLifecycleDelegate"];
1260 OCMStub([mockLifecycleDelegate windowScene:[OCMArg any]
1261 performActionForShortcutItem:[OCMArg any]
1262 completionHandler:[OCMArg any]])
1264 OCMStub([mockAppLifecycleDelegate sceneFallbackPerformActionForShortcutItem:[OCMArg any]
1265 completionHandler:[OCMArg any]])
1268 id shortcutItem = OCMClassMock([UIApplicationShortcutItem
class]);
1272 [delegate addFlutterManagedEngine:mockEngine];
1278 OCMVerify(times(1), [mockLifecycleDelegate windowScene:mockScene
1279 performActionForShortcutItem:shortcutItem
1282 [mockAppLifecycleDelegate sceneFallbackPerformActionForShortcutItem:shortcutItem
1286- (NSDictionary*)mocksForEvents {
1289 OCMStub([mockEngine sceneLifeCycleDelegate]).andReturn(mockLifecycleDelegate);
1291 id mockApplication = OCMClassMock([UIApplication
class]);
1292 OCMStub([mockApplication sharedApplication]).andReturn(mockApplication);
1295 OCMStub([mockApplication delegate]).andReturn(mockAppDelegate);
1298 OCMStub([mockAppDelegate lifeCycleDelegate]).andReturn(mockAppLifecycleDelegate);
1300 id mockScene = OCMClassMock([UIWindowScene
class]);
1303 @"mockEngine" : mockEngine,
1304 @"mockScene" : mockScene,
1305 @"mockLifecycleDelegate" : mockLifecycleDelegate,
1306 @"mockAppLifecycleDelegate" : mockAppLifecycleDelegate,
1310#pragma mark - FlutterEnginePluginSceneLifeCycleDelegate
1312- (void)testEngineSceneWillConnectToSession {
1316 NSObject<FlutterSceneLifeCycleDelegate>* mockPlugin =
1317 OCMProtocolMock(
@protocol(FlutterSceneLifeCycleDelegate));
1318 OCMStub([mockPlugin scene:[OCMArg any] willConnectToSession:[OCMArg any] options:[OCMArg any]])
1320 NSObject<FlutterSceneLifeCycleDelegate>* mockPlugin2 =
1321 OCMProtocolMock(
@protocol(FlutterSceneLifeCycleDelegate));
1322 OCMStub([mockPlugin2 scene:[OCMArg any] willConnectToSession:[OCMArg any] options:[OCMArg any]])
1328 id mockScene = OCMClassMock([UIWindowScene
class]);
1329 id mockSession = OCMClassMock([UISceneSession
class]);
1330 id mockOptions = OCMClassMock([UISceneConnectionOptions
class]);
1332 XCTAssertTrue([delegate scene:mockScene willConnectToSession:mockSession options:mockOptions]);
1333 OCMVerify(times(1), [mockPlugin scene:mockScene
1334 willConnectToSession:mockSession
1335 options:mockOptions]);
1336 OCMVerify(times(1), [mockPlugin2 scene:mockScene willConnectToSession:mockSession options:nil]);
1339- (void)testEngineSceneDidDisconnect {
1343 id mockPlugin = OCMProtocolMock(
@protocol(FlutterSceneLifeCycleDelegate));
1345 id mockScene = OCMClassMock([UIWindowScene
class]);
1347 OCMVerify([mockPlugin sceneDidDisconnect:mockScene]);
1350- (void)testEngineSceneWillEnterForeground {
1354 id mockPlugin = OCMProtocolMock(
@protocol(FlutterSceneLifeCycleDelegate));
1356 id mockScene = OCMClassMock([UIWindowScene
class]);
1358 OCMVerify([mockPlugin sceneWillEnterForeground:mockScene]);
1361- (void)testEngineSceneDidBecomeActive {
1365 id mockPlugin = OCMProtocolMock(
@protocol(FlutterSceneLifeCycleDelegate));
1367 id mockScene = OCMClassMock([UIWindowScene
class]);
1369 OCMVerify([mockPlugin sceneDidBecomeActive:mockScene]);
1372- (void)testEngineSceneWillResignActive {
1376 id mockPlugin = OCMProtocolMock(
@protocol(FlutterSceneLifeCycleDelegate));
1378 id mockScene = OCMClassMock([UIWindowScene
class]);
1380 OCMVerify([mockPlugin sceneWillResignActive:mockScene]);
1383- (void)testEngineSceneDidEnterBackground {
1387 id mockPlugin = OCMProtocolMock(
@protocol(FlutterSceneLifeCycleDelegate));
1389 id mockScene = OCMClassMock([UIWindowScene
class]);
1391 OCMVerify([mockPlugin sceneDidEnterBackground:mockScene]);
1394- (void)testEngineSceneOpenURLContexts {
1398 NSObject<FlutterSceneLifeCycleDelegate>* mockPlugin =
1399 OCMProtocolMock(
@protocol(FlutterSceneLifeCycleDelegate));
1400 OCMStub([mockPlugin scene:[OCMArg any] openURLContexts:[OCMArg any]]).andReturn(YES);
1401 NSObject<FlutterSceneLifeCycleDelegate>* mockPlugin2 =
1402 OCMProtocolMock(
@protocol(FlutterSceneLifeCycleDelegate));
1403 OCMStub([mockPlugin2 scene:[OCMArg any] openURLContexts:[OCMArg any]]).andReturn(YES);
1408 id mockScene = OCMClassMock([UIWindowScene
class]);
1409 id urlContext = OCMClassMock([UIOpenURLContext
class]);
1410 NSSet<UIOpenURLContext*>* urlContexts = [NSSet setWithObjects:urlContext, nil];
1412 XCTAssertTrue([delegate scene:mockScene openURLContexts:urlContexts]);
1413 OCMVerify(times(1), [mockPlugin scene:mockScene openURLContexts:urlContexts]);
1414 OCMVerify(times(0), [mockPlugin2 scene:mockScene openURLContexts:urlContexts]);
1417- (void)testEngineSceneContinueUserActivity {
1421 NSObject<FlutterSceneLifeCycleDelegate>* mockPlugin =
1422 OCMProtocolMock(
@protocol(FlutterSceneLifeCycleDelegate));
1423 OCMStub([mockPlugin scene:[OCMArg any] continueUserActivity:[OCMArg any]]).andReturn(YES);
1424 NSObject<FlutterSceneLifeCycleDelegate>* mockPlugin2 =
1425 OCMProtocolMock(
@protocol(FlutterSceneLifeCycleDelegate));
1426 OCMStub([mockPlugin2 scene:[OCMArg any] continueUserActivity:[OCMArg any]]).andReturn(YES);
1431 id mockScene = OCMClassMock([UIWindowScene
class]);
1432 id userActivity = OCMClassMock([NSUserActivity
class]);
1434 XCTAssertTrue([delegate scene:mockScene continueUserActivity:userActivity]);
1435 OCMVerify(times(1), [mockPlugin scene:mockScene continueUserActivity:userActivity]);
1436 OCMVerify(times(0), [mockPlugin2 scene:mockScene continueUserActivity:userActivity]);
1439- (void)testEngineWindowScenePerformActionForShortcutItem {
1443 NSObject<FlutterSceneLifeCycleDelegate>* mockPlugin =
1444 OCMProtocolMock(
@protocol(FlutterSceneLifeCycleDelegate));
1445 OCMStub([mockPlugin windowScene:[OCMArg any]
1446 performActionForShortcutItem:[OCMArg any]
1447 completionHandler:[OCMArg any]])
1449 NSObject<FlutterSceneLifeCycleDelegate>* mockPlugin2 =
1450 OCMProtocolMock(
@protocol(FlutterSceneLifeCycleDelegate));
1451 OCMStub([mockPlugin2 windowScene:[OCMArg any]
1452 performActionForShortcutItem:[OCMArg any]
1453 completionHandler:[OCMArg any]])
1459 id mockScene = OCMClassMock([UIWindowScene
class]);
1460 id shortcutItem = OCMClassMock([UIApplicationShortcutItem
class]);
1464 XCTAssertTrue([delegate windowScene:mockScene
1465 performActionForShortcutItem:shortcutItem
1467 OCMVerify(times(1), [mockPlugin windowScene:mockScene
1468 performActionForShortcutItem:shortcutItem
1470 OCMVerify(times(0), [mockPlugin2 windowScene:mockScene
1471 performActionForShortcutItem:shortcutItem
1475- (void)testFlutterPluginSceneLifeCycleDelegateFromScene {
1476 id mockScene = OCMClassMock([UIWindowScene
class]);
1480 OCMStub([mockScene delegate]).andReturn(mockSceneDelegate);
1481 OCMStub([mockSceneDelegate sceneLifeCycleDelegate]).andReturn(mockSceneLifeCycleDelegate);
1484 mockSceneLifeCycleDelegate);
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)
const gchar FlBinaryMessengerMessageHandler handler
const uint8_t uint32_t uint32_t GError ** error
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
FlutterViewController * viewController
BOOL unregisterSceneLifeCycleWithFlutterEngine:(FlutterEngine *engine)
BOOL registerSceneLifeCycleWithFlutterEngine:(FlutterEngine *engine)