5 #import <OCMock/OCMock.h>
6 #import <XCTest/XCTest.h>
24 NSPointerArray* delegates = [
self valueForKey:@"_delegates"];
25 for (NSUInteger i = 0; i < delegates.count; i++) {
26 if ([delegates pointerAtIndex:i] == (__bridge
void*)delegate) {
27 [delegates removePointerAtIndex:i];
44 - (BOOL)application:(UIApplication*)application
45 didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
49 - (BOOL)application:(UIApplication*)application
51 options:(NSDictionary<UIApplicationOpenURLOptionsKey, id>*)options {
55 - (BOOL)application:(UIApplication*)application
56 continueUserActivity:(NSUserActivity*)userActivity
57 restorationHandler:(
void (^)(NSArray*))restorationHandler {
61 - (BOOL)application:(UIApplication*)application
62 performActionForShortcutItem:(UIApplicationShortcutItem*)shortcutItem
63 completionHandler:(
void (^)(BOOL succeeded))completionHandler
73 - (BOOL)application:(UIApplication*)application
75 options:(NSDictionary<UIApplicationOpenURLOptionsKey, id>*)options {
79 - (BOOL)application:(UIApplication*)application
80 continueUserActivity:(NSUserActivity*)userActivity
81 restorationHandler:(
void (^)(NSArray*))restorationHandler {
85 - (BOOL)application:(UIApplication*)application
86 performActionForShortcutItem:(UIApplicationShortcutItem*)shortcutItem
87 completionHandler:(
void (^)(BOOL succeeded))completionHandler
92 - (BOOL)application:(UIApplication*)application
93 didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
97 - (BOOL)application:(UIApplication*)application
98 willFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
110 @property(nonatomic, assign) BOOL shouldAdd;
114 - (BOOL)application:(UIApplication*)application
115 didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
118 [
self.lifecycleDelegate addDelegate:[[
FakePlugin alloc] init]];
121 [(
id)
self.lifecycleDelegate removeDelegate:self];
134 XCTAssertNotNil(delegate);
137 - (void)testSceneWillConnectFallback {
140 id mockPlugin = OCMPartialMock(plugin);
143 id mockOptions = OCMClassMock([UISceneConnectionOptions
class]);
144 id mockShortcutItem = OCMClassMock([UIApplicationShortcutItem
class]);
145 OCMStub([mockOptions shortcutItem]).andReturn(mockShortcutItem);
146 OCMStub([mockOptions sourceApplication]).andReturn(
@"bundle_id");
147 id urlContext = OCMClassMock([UIOpenURLContext
class]);
148 NSURL* url = [NSURL URLWithString:@"http://example.com"];
149 OCMStub([urlContext URL]).andReturn(url);
150 NSSet<UIOpenURLContext*>* urlContexts = [NSSet setWithObjects:urlContext, nil];
151 OCMStub([mockOptions URLContexts]).andReturn(urlContexts);
153 NSDictionary<UIApplicationOpenURLOptionsKey, id>* expectedApplicationOptions = @{
154 UIApplicationLaunchOptionsShortcutItemKey : mockShortcutItem,
155 UIApplicationLaunchOptionsSourceApplicationKey :
@"bundle_id",
156 UIApplicationLaunchOptionsURLKey : url,
159 [delegate sceneWillConnectFallback:mockOptions];
160 OCMVerify([mockPlugin application:[UIApplication sharedApplication]
161 didFinishLaunchingWithOptions:expectedApplicationOptions]);
164 - (void)testSceneWillConnectFallbackSkippedSupportsScenes {
167 id mockPlugin = OCMPartialMock(plugin);
170 id mockOptions = OCMClassMock([UISceneConnectionOptions
class]);
171 id mockShortcutItem = OCMClassMock([UIApplicationShortcutItem
class]);
172 OCMStub([mockOptions shortcutItem]).andReturn(mockShortcutItem);
173 OCMStub([mockOptions sourceApplication]).andReturn(
@"bundle_id");
174 id urlContext = OCMClassMock([UIOpenURLContext
class]);
175 NSURL* url = [NSURL URLWithString:@"http://example.com"];
176 OCMStub([urlContext URL]).andReturn(url);
177 NSSet<UIOpenURLContext*>* urlContexts = [NSSet setWithObjects:urlContext, nil];
178 OCMStub([mockOptions URLContexts]).andReturn(urlContexts);
180 [delegate sceneWillConnectFallback:mockOptions];
181 OCMReject([mockPlugin application:[OCMArg any] didFinishLaunchingWithOptions:[OCMArg any]]);
184 - (void)testSceneWillConnectFallbackSkippedNoOptions {
187 id mockPlugin = OCMPartialMock(plugin);
190 id mockOptions = OCMClassMock([UISceneConnectionOptions
class]);
192 [delegate sceneWillConnectFallback:mockOptions];
193 OCMReject([mockPlugin application:[OCMArg any] didFinishLaunchingWithOptions:[OCMArg any]]);
196 - (void)testDidEnterBackground {
197 XCTNSNotificationExpectation* expectation = [[XCTNSNotificationExpectation alloc]
198 initWithName:UIApplicationDidEnterBackgroundNotification];
202 [[NSNotificationCenter defaultCenter]
203 postNotificationName:UIApplicationDidEnterBackgroundNotification
206 [
self waitForExpectations:@[ expectation ] timeout:5.0];
207 OCMVerify([plugin applicationDidEnterBackground:[UIApplication sharedApplication]]);
210 - (void)testDidEnterBackgroundWithUIScene {
211 XCTNSNotificationExpectation* expectation = [[XCTNSNotificationExpectation alloc]
212 initWithName:UIApplicationDidEnterBackgroundNotification];
215 OCMStub([mockApplication hasSceneDelegate]).andReturn(YES);
218 [[NSNotificationCenter defaultCenter]
219 postNotificationName:UIApplicationDidEnterBackgroundNotification
222 [
self waitForExpectations:@[ expectation ] timeout:5.0];
223 OCMReject([plugin applicationDidEnterBackground:[OCMArg any]]);
226 - (void)testSceneDidEnterBackgroundFallback {
231 [delegate sceneDidEnterBackgroundFallback];
232 OCMVerify([plugin applicationDidEnterBackground:[UIApplication sharedApplication]]);
235 - (void)testUnnecessarySceneDidEnterBackgroundFallback {
240 [delegate sceneDidEnterBackgroundFallback];
241 OCMReject([plugin applicationDidEnterBackground:[OCMArg any]]);
244 - (void)testWillEnterForeground {
245 XCTNSNotificationExpectation* expectation = [[XCTNSNotificationExpectation alloc]
246 initWithName:UIApplicationWillEnterForegroundNotification];
251 [[NSNotificationCenter defaultCenter]
252 postNotificationName:UIApplicationWillEnterForegroundNotification
254 [
self waitForExpectations:@[ expectation ] timeout:5.0];
255 OCMVerify([plugin applicationWillEnterForeground:[UIApplication sharedApplication]]);
258 - (void)testWillEnterForegroundWithUIScene {
259 XCTNSNotificationExpectation* expectation = [[XCTNSNotificationExpectation alloc]
260 initWithName:UIApplicationWillEnterForegroundNotification];
263 OCMStub([mockApplication hasSceneDelegate]).andReturn(YES);
266 [[NSNotificationCenter defaultCenter]
267 postNotificationName:UIApplicationWillEnterForegroundNotification
270 [
self waitForExpectations:@[ expectation ] timeout:5.0];
271 OCMReject([plugin applicationWillEnterForeground:[OCMArg any]]);
274 - (void)testSceneWillEnterForegroundFallback {
279 [delegate sceneWillEnterForegroundFallback];
280 OCMVerify([plugin applicationWillEnterForeground:[UIApplication sharedApplication]]);
283 - (void)testUnnecessarySceneWillEnterForegroundFallback {
288 [delegate sceneWillEnterForegroundFallback];
289 OCMReject([plugin applicationWillEnterForeground:[OCMArg any]]);
292 - (void)testWillResignActive {
293 XCTNSNotificationExpectation* expectation =
294 [[XCTNSNotificationExpectation alloc] initWithName:UIApplicationWillResignActiveNotification];
299 [[NSNotificationCenter defaultCenter]
300 postNotificationName:UIApplicationWillResignActiveNotification
302 [
self waitForExpectations:@[ expectation ] timeout:5.0];
303 OCMVerify([plugin applicationWillResignActive:[UIApplication sharedApplication]]);
306 - (void)testWillResignActiveWithUIScene {
307 XCTNSNotificationExpectation* expectation =
308 [[XCTNSNotificationExpectation alloc] initWithName:UIApplicationWillResignActiveNotification];
311 OCMStub([mockApplication hasSceneDelegate]).andReturn(YES);
314 [[NSNotificationCenter defaultCenter]
315 postNotificationName:UIApplicationWillResignActiveNotification
318 [
self waitForExpectations:@[ expectation ] timeout:5.0];
319 OCMReject([plugin applicationWillResignActive:[OCMArg any]]);
322 - (void)testSceneWillResignActiveFallback {
327 [delegate sceneWillResignActiveFallback];
328 OCMVerify([plugin applicationWillResignActive:[UIApplication sharedApplication]]);
331 - (void)testUnnecessarySceneWillResignActiveFallback {
336 [delegate sceneWillResignActiveFallback];
337 OCMReject([plugin applicationWillResignActive:[OCMArg any]]);
340 - (void)testDidBecomeActive {
341 XCTNSNotificationExpectation* expectation =
342 [[XCTNSNotificationExpectation alloc] initWithName:UIApplicationDidBecomeActiveNotification];
347 [[NSNotificationCenter defaultCenter]
348 postNotificationName:UIApplicationDidBecomeActiveNotification
350 [
self waitForExpectations:@[ expectation ] timeout:5.0];
351 OCMVerify([plugin applicationDidBecomeActive:[UIApplication sharedApplication]]);
354 - (void)testDidBecomeActiveWithUIScene {
355 XCTNSNotificationExpectation* expectation =
356 [[XCTNSNotificationExpectation alloc] initWithName:UIApplicationDidBecomeActiveNotification];
359 OCMStub([mockApplication hasSceneDelegate]).andReturn(YES);
362 [[NSNotificationCenter defaultCenter]
363 postNotificationName:UIApplicationDidBecomeActiveNotification
366 [
self waitForExpectations:@[ expectation ] timeout:5.0];
367 OCMReject([plugin applicationDidBecomeActive:[OCMArg any]]);
370 - (void)testSceneDidBecomeActiveFallback {
375 [delegate sceneDidBecomeActiveFallback];
376 OCMVerify([plugin applicationDidBecomeActive:[UIApplication sharedApplication]]);
379 - (void)testUnnecessarySceneDidBecomeActiveFallback {
384 [delegate sceneDidBecomeActiveFallback];
385 OCMReject([plugin applicationDidBecomeActive:[OCMArg any]]);
388 - (void)testSceneFallbackOpenURLContexts {
391 id mockPlugin = OCMPartialMock(plugin);
394 id urlContext = OCMClassMock([UIOpenURLContext
class]);
395 NSURL* url = [NSURL URLWithString:@"http://example.com"];
396 OCMStub([urlContext URL]).andReturn(url);
397 NSSet<UIOpenURLContext*>* urlContexts = [NSSet setWithObjects:urlContext, nil];
399 NSDictionary<UIApplicationOpenURLOptionsKey, id>* expectedApplicationOptions = @{
400 UIApplicationOpenURLOptionsOpenInPlaceKey : @(NO),
403 [delegate sceneFallbackOpenURLContexts:urlContexts];
404 OCMVerify([mockPlugin application:[UIApplication sharedApplication]
406 options:expectedApplicationOptions]);
409 - (void)testConvertURLOptions {
412 id mockPlugin = OCMPartialMock(plugin);
415 NSString* bundleId =
@"app.bundle.id";
416 id annotation = @{
@"key" :
@"value"};
417 id eventAttribution = OCMClassMock([UIEventAttribution
class]);
419 UIOpenURLContext* urlContext = OCMClassMock([UIOpenURLContext
class]);
420 NSURL* url = [NSURL URLWithString:@"http://example.com"];
421 OCMStub([urlContext URL]).andReturn(url);
422 id sceneOptions = OCMClassMock([UISceneOpenURLOptions
class]);
423 OCMStub([sceneOptions sourceApplication]).andReturn(bundleId);
424 OCMStub([sceneOptions annotation]).andReturn(annotation);
425 OCMStub([sceneOptions openInPlace]).andReturn(YES);
426 OCMStub([sceneOptions eventAttribution]).andReturn(eventAttribution);
428 OCMStub([urlContext options]).andReturn(sceneOptions);
429 NSSet<UIOpenURLContext*>* urlContexts = [NSSet setWithObjects:urlContext, nil];
431 [delegate sceneFallbackOpenURLContexts:urlContexts];
433 NSDictionary<UIApplicationOpenURLOptionsKey, id>* expectedApplicationOptions = @{
434 UIApplicationOpenURLOptionsSourceApplicationKey : bundleId,
435 UIApplicationOpenURLOptionsAnnotationKey : annotation,
436 UIApplicationOpenURLOptionsOpenInPlaceKey : @(YES),
437 UIApplicationOpenURLOptionsEventAttributionKey : eventAttribution,
440 OCMVerify([mockPlugin application:[UIApplication sharedApplication]
442 options:expectedApplicationOptions]);
445 - (void)testUnnecessarySceneFallbackOpenURLContexts {
448 id mockPlugin = OCMPartialMock(plugin);
451 id urlContext = OCMClassMock([UIOpenURLContext
class]);
452 NSSet<UIOpenURLContext*>* urlContexts = [NSSet setWithObjects:urlContext, nil];
454 [delegate sceneFallbackOpenURLContexts:urlContexts];
455 OCMReject([mockPlugin application:[OCMArg any] openURL:[OCMArg any] options:[OCMArg any]]);
458 - (void)testSceneFallbackContinueUserActivity {
461 id mockPlugin = OCMPartialMock(plugin);
464 id userActivity = OCMClassMock([NSUserActivity
class]);
466 [delegate sceneFallbackContinueUserActivity:userActivity];
467 OCMVerify([mockPlugin application:[UIApplication sharedApplication]
468 continueUserActivity:userActivity
469 restorationHandler:[OCMArg any]]);
472 - (void)testUnnecessarySceneFallbackContinueUserActivity {
475 id mockPlugin = OCMPartialMock(plugin);
478 id userActivity = OCMClassMock([NSUserActivity
class]);
480 [delegate sceneFallbackContinueUserActivity:userActivity];
481 OCMReject([mockPlugin application:[UIApplication sharedApplication]
482 continueUserActivity:userActivity
483 restorationHandler:[OCMArg any]]);
486 - (void)testSceneFallbackPerformActionForShortcutItem {
489 FakePlugin* mockPlugin = OCMPartialMock(plugin);
492 id shortcut = OCMClassMock([UIApplicationShortcutItem
class]);
493 id handler = ^(BOOL succeeded) {
496 [delegate sceneFallbackPerformActionForShortcutItem:shortcut completionHandler:handler];
497 OCMVerify([mockPlugin application:[UIApplication sharedApplication]
498 performActionForShortcutItem:shortcut
499 completionHandler:handler]);
502 - (void)testUnnecessarySceneFallbackPerformActionForShortcutItem {
509 id shortcut = OCMClassMock([UIApplicationShortcutItem
class]);
510 [delegate sceneFallbackPerformActionForShortcutItem:shortcut
511 completionHandler:^(BOOL succeeded){
513 OCMReject([mockPlugin application:[OCMArg any]
514 performActionForShortcutItem:[OCMArg any]
515 completionHandler:[OCMArg any]]);
518 - (void)testWillTerminate {
519 XCTNSNotificationExpectation* expectation =
520 [[XCTNSNotificationExpectation alloc] initWithName:UIApplicationWillTerminateNotification];
525 [[NSNotificationCenter defaultCenter] postNotificationName:UIApplicationWillTerminateNotification
527 [
self waitForExpectations:@[ expectation ] timeout:5.0];
528 OCMVerify([plugin applicationWillTerminate:[UIApplication sharedApplication]]);
531 - (void)testReleasesPluginOnDealloc {
532 __weak id<FlutterApplicationLifeCycleDelegate> weakPlugin;
536 weakPlugin = fakePlugin;
539 weakDelegate = delegate;
541 XCTAssertNil(weakPlugin);
542 XCTAssertNil(weakDelegate);
545 - (void)testApplicationWillFinishLaunchingSceneFallbackForwards {
548 id mockPlugin = OCMPartialMock(plugin);
550 id mockApplication = OCMClassMock([UIApplication
class]);
551 NSDictionary* options = @{};
553 [delegate sceneFallbackWillFinishLaunchingApplication:mockApplication];
554 OCMVerify(times(1), [mockPlugin application:mockApplication
555 willFinishLaunchingWithOptions:options]);
558 - (void)testApplicationWillFinishLaunchingSceneFallbackNoForwardAfterWillLaunch {
561 id mockPlugin = OCMPartialMock(plugin);
563 id mockApplication = OCMClassMock([UIApplication
class]);
564 NSDictionary* options = @{
@"key" :
@"value"};
567 [delegate sceneFallbackWillFinishLaunchingApplication:mockApplication];
568 OCMVerify(times(1), [mockPlugin application:mockApplication
569 willFinishLaunchingWithOptions:options]);
572 - (void)testApplicationWillFinishLaunchingSceneFallbackNoForwardAfterDidLaunch {
575 id mockPlugin = OCMPartialMock(plugin);
577 id mockApplication = OCMClassMock([UIApplication
class]);
578 NSDictionary* options = @{
@"key" :
@"value"};
581 [delegate sceneFallbackWillFinishLaunchingApplication:mockApplication];
582 OCMVerify(times(0), [mockPlugin application:mockApplication
583 willFinishLaunchingWithOptions:options]);
586 - (void)testApplicationDidFinishLaunchingSceneFallbackForwards {
589 id mockPlugin = OCMPartialMock(plugin);
591 id mockApplication = OCMClassMock([UIApplication
class]);
592 NSDictionary* options = @{};
594 [delegate sceneFallbackDidFinishLaunchingApplication:mockApplication];
595 OCMVerify(times(1), [mockPlugin application:mockApplication
596 didFinishLaunchingWithOptions:options]);
599 - (void)testApplicationDidFinishLaunchingSceneFallbackNoForward {
602 id mockPlugin = OCMPartialMock(plugin);
604 id mockApplication = OCMClassMock([UIApplication
class]);
605 NSDictionary* options = @{
@"key" :
@"value"};
608 [delegate sceneFallbackDidFinishLaunchingApplication:mockApplication];
609 OCMVerify(times(1), [mockPlugin application:mockApplication
610 didFinishLaunchingWithOptions:options]);
613 - (void)testCanAddDelegateDuringEnumeration {
623 BOOL result = [delegate
application:[UIApplication sharedApplication]
626 XCTAssertTrue(result);
629 - (void)testCanRemoveSelfDuringEnumeration {
639 BOOL result = [delegate
application:[UIApplication sharedApplication]
642 XCTAssertTrue(result);
UITextSmartQuotesType smartQuotesType API_AVAILABLE(ios(11.0))
BOOL application:didFinishLaunchingWithOptions:(UIApplication *application,[didFinishLaunchingWithOptions] NSDictionary *launchOptions)
BOOL application:willFinishLaunchingWithOptions:(UIApplication *application,[willFinishLaunchingWithOptions] NSDictionary *launchOptions)
void addDelegate:(NSObject< FlutterApplicationLifeCycleDelegate > *delegate)
FlutterPluginAppLifeCycleDelegate * lifecycleDelegate