5#import <OCMock/OCMock.h>
6#import <XCTest/XCTest.h>
16@protocol TestFlutterPluginWithSceneEvents <NSObject,
17 FlutterApplicationLifeCycleDelegate,
18 FlutterSceneLifeCycleDelegate>
25- (
BOOL)application:(UIApplication*)application
26 didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
30- (
BOOL)application:(UIApplication*)application
32 options:(NSDictionary<UIApplicationOpenURLOptionsKey, id>*)options {
36- (
BOOL)application:(UIApplication*)application
37 continueUserActivity:(NSUserActivity*)userActivity
38 restorationHandler:(void (^)(NSArray*))restorationHandler {
42- (
BOOL)application:(UIApplication*)application
43 performActionForShortcutItem:(UIApplicationShortcutItem*)shortcutItem
44 completionHandler:(void (^)(
BOOL succeeded))completionHandler
54- (
BOOL)application:(UIApplication*)application
56 options:(NSDictionary<UIApplicationOpenURLOptionsKey, id>*)options {
60- (
BOOL)application:(UIApplication*)application
61 continueUserActivity:(NSUserActivity*)userActivity
62 restorationHandler:(void (^)(NSArray*))restorationHandler {
66- (
BOOL)application:(UIApplication*)application
67 performActionForShortcutItem:(UIApplicationShortcutItem*)shortcutItem
68 completionHandler:(void (^)(
BOOL succeeded))completionHandler
73- (
BOOL)application:(UIApplication*)application
74 didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
78- (
BOOL)application:(UIApplication*)application
79 willFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
91 XCTAssertNotNil(delegate);
94- (void)testSceneWillConnectFallback {
97 id mockPlugin = OCMPartialMock(plugin);
100 id mockOptions = OCMClassMock([UISceneConnectionOptions
class]);
101 id mockShortcutItem = OCMClassMock([UIApplicationShortcutItem
class]);
102 OCMStub([mockOptions shortcutItem]).andReturn(mockShortcutItem);
103 OCMStub([mockOptions sourceApplication]).andReturn(
@"bundle_id");
104 id urlContext = OCMClassMock([UIOpenURLContext
class]);
105 NSURL* url = [NSURL URLWithString:@"http://example.com"];
106 OCMStub([urlContext URL]).andReturn(url);
107 NSSet<UIOpenURLContext*>* urlContexts = [NSSet setWithObjects:urlContext, nil];
108 OCMStub([mockOptions URLContexts]).andReturn(urlContexts);
110 NSDictionary<UIApplicationOpenURLOptionsKey, id>* expectedApplicationOptions = @{
111 UIApplicationLaunchOptionsShortcutItemKey : mockShortcutItem,
112 UIApplicationLaunchOptionsSourceApplicationKey :
@"bundle_id",
113 UIApplicationLaunchOptionsURLKey : url,
116 [delegate sceneWillConnectFallback:mockOptions];
117 OCMVerify([mockPlugin application:[UIApplication sharedApplication]
118 didFinishLaunchingWithOptions:expectedApplicationOptions]);
121- (void)testSceneWillConnectFallbackSkippedSupportsScenes {
124 id mockPlugin = OCMPartialMock(plugin);
127 id mockOptions = OCMClassMock([UISceneConnectionOptions
class]);
128 id mockShortcutItem = OCMClassMock([UIApplicationShortcutItem
class]);
129 OCMStub([mockOptions shortcutItem]).andReturn(mockShortcutItem);
130 OCMStub([mockOptions sourceApplication]).andReturn(
@"bundle_id");
131 id urlContext = OCMClassMock([UIOpenURLContext
class]);
132 NSURL* url = [NSURL URLWithString:@"http://example.com"];
133 OCMStub([urlContext URL]).andReturn(url);
134 NSSet<UIOpenURLContext*>* urlContexts = [NSSet setWithObjects:urlContext, nil];
135 OCMStub([mockOptions URLContexts]).andReturn(urlContexts);
137 [delegate sceneWillConnectFallback:mockOptions];
138 OCMReject([mockPlugin application:[OCMArg any] didFinishLaunchingWithOptions:[OCMArg any]]);
141- (void)testSceneWillConnectFallbackSkippedNoOptions {
144 id mockPlugin = OCMPartialMock(plugin);
147 id mockOptions = OCMClassMock([UISceneConnectionOptions
class]);
149 [delegate sceneWillConnectFallback:mockOptions];
150 OCMReject([mockPlugin application:[OCMArg any] didFinishLaunchingWithOptions:[OCMArg any]]);
153- (void)testDidEnterBackground {
154 XCTNSNotificationExpectation* expectation = [[XCTNSNotificationExpectation alloc]
155 initWithName:UIApplicationDidEnterBackgroundNotification];
157 id plugin = OCMProtocolMock(
@protocol(FlutterPlugin));
159 [[NSNotificationCenter defaultCenter]
160 postNotificationName:UIApplicationDidEnterBackgroundNotification
163 [
self waitForExpectations:@[ expectation ] timeout:5.0];
164 OCMVerify([plugin applicationDidEnterBackground:[UIApplication sharedApplication]]);
167- (void)testDidEnterBackgroundWithUIScene {
168 XCTNSNotificationExpectation* expectation = [[XCTNSNotificationExpectation alloc]
169 initWithName:UIApplicationDidEnterBackgroundNotification];
172 OCMStub([mockApplication hasSceneDelegate]).andReturn(YES);
173 id plugin = OCMProtocolMock(
@protocol(FlutterPlugin));
175 [[NSNotificationCenter defaultCenter]
176 postNotificationName:UIApplicationDidEnterBackgroundNotification
179 [
self waitForExpectations:@[ expectation ] timeout:5.0];
180 OCMReject([plugin applicationDidEnterBackground:[OCMArg any]]);
183- (void)testSceneDidEnterBackgroundFallback {
185 id plugin = OCMProtocolMock(
@protocol(FlutterPlugin));
188 [delegate sceneDidEnterBackgroundFallback];
189 OCMVerify([plugin applicationDidEnterBackground:[UIApplication sharedApplication]]);
192- (void)testUnnecessarySceneDidEnterBackgroundFallback {
194 id plugin = OCMProtocolMock(
@protocol(TestFlutterPluginWithSceneEvents));
197 [delegate sceneDidEnterBackgroundFallback];
198 OCMReject([plugin applicationDidEnterBackground:[OCMArg any]]);
201- (void)testWillEnterForeground {
202 XCTNSNotificationExpectation* expectation = [[XCTNSNotificationExpectation alloc]
203 initWithName:UIApplicationWillEnterForegroundNotification];
206 id plugin = OCMProtocolMock(
@protocol(FlutterPlugin));
208 [[NSNotificationCenter defaultCenter]
209 postNotificationName:UIApplicationWillEnterForegroundNotification
211 [
self waitForExpectations:@[ expectation ] timeout:5.0];
212 OCMVerify([plugin applicationWillEnterForeground:[UIApplication sharedApplication]]);
215- (void)testWillEnterForegroundWithUIScene {
216 XCTNSNotificationExpectation* expectation = [[XCTNSNotificationExpectation alloc]
217 initWithName:UIApplicationWillEnterForegroundNotification];
220 OCMStub([mockApplication hasSceneDelegate]).andReturn(YES);
221 id plugin = OCMProtocolMock(
@protocol(FlutterPlugin));
223 [[NSNotificationCenter defaultCenter]
224 postNotificationName:UIApplicationWillEnterForegroundNotification
227 [
self waitForExpectations:@[ expectation ] timeout:5.0];
228 OCMReject([plugin applicationWillEnterForeground:[OCMArg any]]);
231- (void)testSceneWillEnterForegroundFallback {
233 id plugin = OCMProtocolMock(
@protocol(FlutterPlugin));
236 [delegate sceneWillEnterForegroundFallback];
237 OCMVerify([plugin applicationWillEnterForeground:[UIApplication sharedApplication]]);
240- (void)testUnnecessarySceneWillEnterForegroundFallback {
242 id plugin = OCMProtocolMock(
@protocol(TestFlutterPluginWithSceneEvents));
245 [delegate sceneWillEnterForegroundFallback];
246 OCMReject([plugin applicationWillEnterForeground:[OCMArg any]]);
249- (void)testWillResignActive {
250 XCTNSNotificationExpectation* expectation =
251 [[XCTNSNotificationExpectation alloc] initWithName:UIApplicationWillResignActiveNotification];
254 id plugin = OCMProtocolMock(
@protocol(FlutterPlugin));
256 [[NSNotificationCenter defaultCenter]
257 postNotificationName:UIApplicationWillResignActiveNotification
259 [
self waitForExpectations:@[ expectation ] timeout:5.0];
260 OCMVerify([plugin applicationWillResignActive:[UIApplication sharedApplication]]);
263- (void)testWillResignActiveWithUIScene {
264 XCTNSNotificationExpectation* expectation =
265 [[XCTNSNotificationExpectation alloc] initWithName:UIApplicationWillResignActiveNotification];
268 OCMStub([mockApplication hasSceneDelegate]).andReturn(YES);
269 id plugin = OCMProtocolMock(
@protocol(FlutterPlugin));
271 [[NSNotificationCenter defaultCenter]
272 postNotificationName:UIApplicationWillResignActiveNotification
275 [
self waitForExpectations:@[ expectation ] timeout:5.0];
276 OCMReject([plugin applicationWillResignActive:[OCMArg any]]);
279- (void)testSceneWillResignActiveFallback {
281 id plugin = OCMProtocolMock(
@protocol(FlutterPlugin));
284 [delegate sceneWillResignActiveFallback];
285 OCMVerify([plugin applicationWillResignActive:[UIApplication sharedApplication]]);
288- (void)testUnnecessarySceneWillResignActiveFallback {
290 id plugin = OCMProtocolMock(
@protocol(TestFlutterPluginWithSceneEvents));
293 [delegate sceneWillResignActiveFallback];
294 OCMReject([plugin applicationWillResignActive:[OCMArg any]]);
297- (void)testDidBecomeActive {
298 XCTNSNotificationExpectation* expectation =
299 [[XCTNSNotificationExpectation alloc] initWithName:UIApplicationDidBecomeActiveNotification];
302 id plugin = OCMProtocolMock(
@protocol(FlutterPlugin));
304 [[NSNotificationCenter defaultCenter]
305 postNotificationName:UIApplicationDidBecomeActiveNotification
307 [
self waitForExpectations:@[ expectation ] timeout:5.0];
308 OCMVerify([plugin applicationDidBecomeActive:[UIApplication sharedApplication]]);
311- (void)testDidBecomeActiveWithUIScene {
312 XCTNSNotificationExpectation* expectation =
313 [[XCTNSNotificationExpectation alloc] initWithName:UIApplicationDidBecomeActiveNotification];
316 OCMStub([mockApplication hasSceneDelegate]).andReturn(YES);
317 id plugin = OCMProtocolMock(
@protocol(FlutterPlugin));
319 [[NSNotificationCenter defaultCenter]
320 postNotificationName:UIApplicationDidBecomeActiveNotification
323 [
self waitForExpectations:@[ expectation ] timeout:5.0];
324 OCMReject([plugin applicationDidBecomeActive:[OCMArg any]]);
327- (void)testSceneDidBecomeActiveFallback {
329 id plugin = OCMProtocolMock(
@protocol(FlutterPlugin));
332 [delegate sceneDidBecomeActiveFallback];
333 OCMVerify([plugin applicationDidBecomeActive:[UIApplication sharedApplication]]);
336- (void)testUnnecessarySceneDidBecomeActiveFallback {
338 id plugin = OCMProtocolMock(
@protocol(TestFlutterPluginWithSceneEvents));
341 [delegate sceneDidBecomeActiveFallback];
342 OCMReject([plugin applicationDidBecomeActive:[OCMArg any]]);
345- (void)testSceneFallbackOpenURLContexts {
348 id mockPlugin = OCMPartialMock(plugin);
351 id urlContext = OCMClassMock([UIOpenURLContext
class]);
352 NSURL* url = [NSURL URLWithString:@"http://example.com"];
353 OCMStub([urlContext URL]).andReturn(url);
354 NSSet<UIOpenURLContext*>* urlContexts = [NSSet setWithObjects:urlContext, nil];
356 NSDictionary<UIApplicationOpenURLOptionsKey, id>* expectedApplicationOptions = @{
357 UIApplicationOpenURLOptionsOpenInPlaceKey : @(NO),
360 [delegate sceneFallbackOpenURLContexts:urlContexts];
361 OCMVerify([mockPlugin application:[UIApplication sharedApplication]
363 options:expectedApplicationOptions]);
366- (void)testConvertURLOptions {
369 id mockPlugin = OCMPartialMock(plugin);
372 NSString* bundleId =
@"app.bundle.id";
373 id annotation = @{
@"key" :
@"value"};
374 id eventAttribution = OCMClassMock([UIEventAttribution
class]);
376 UIOpenURLContext* urlContext = OCMClassMock([UIOpenURLContext
class]);
377 NSURL* url = [NSURL URLWithString:@"http://example.com"];
378 OCMStub([urlContext URL]).andReturn(url);
379 id sceneOptions = OCMClassMock([UISceneOpenURLOptions
class]);
380 OCMStub([sceneOptions sourceApplication]).andReturn(bundleId);
381 OCMStub([sceneOptions annotation]).andReturn(annotation);
382 OCMStub([sceneOptions openInPlace]).andReturn(YES);
383 OCMStub([sceneOptions eventAttribution]).andReturn(eventAttribution);
385 OCMStub([urlContext options]).andReturn(sceneOptions);
386 NSSet<UIOpenURLContext*>* urlContexts = [NSSet setWithObjects:urlContext, nil];
388 [delegate sceneFallbackOpenURLContexts:urlContexts];
390 NSDictionary<UIApplicationOpenURLOptionsKey, id>* expectedApplicationOptions = @{
391 UIApplicationOpenURLOptionsSourceApplicationKey : bundleId,
392 UIApplicationOpenURLOptionsAnnotationKey : annotation,
393 UIApplicationOpenURLOptionsOpenInPlaceKey : @(YES),
394 UIApplicationOpenURLOptionsEventAttributionKey : eventAttribution,
397 OCMVerify([mockPlugin application:[UIApplication sharedApplication]
399 options:expectedApplicationOptions]);
402- (void)testUnnecessarySceneFallbackOpenURLContexts {
405 id mockPlugin = OCMPartialMock(plugin);
408 id urlContext = OCMClassMock([UIOpenURLContext
class]);
409 NSSet<UIOpenURLContext*>* urlContexts = [NSSet setWithObjects:urlContext, nil];
411 [delegate sceneFallbackOpenURLContexts:urlContexts];
412 OCMReject([mockPlugin application:[OCMArg any] openURL:[OCMArg any] options:[OCMArg any]]);
415- (void)testSceneFallbackContinueUserActivity {
418 id mockPlugin = OCMPartialMock(plugin);
421 id userActivity = OCMClassMock([NSUserActivity
class]);
423 [delegate sceneFallbackContinueUserActivity:userActivity];
424 OCMVerify([mockPlugin application:[UIApplication sharedApplication]
425 continueUserActivity:userActivity
426 restorationHandler:[OCMArg any]]);
429- (void)testUnnecessarySceneFallbackContinueUserActivity {
432 id mockPlugin = OCMPartialMock(plugin);
435 id userActivity = OCMClassMock([NSUserActivity
class]);
437 [delegate sceneFallbackContinueUserActivity:userActivity];
438 OCMReject([mockPlugin application:[UIApplication sharedApplication]
439 continueUserActivity:userActivity
440 restorationHandler:[OCMArg any]]);
443- (void)testSceneFallbackPerformActionForShortcutItem {
446 FakePlugin* mockPlugin = OCMPartialMock(plugin);
449 id shortcut = OCMClassMock([UIApplicationShortcutItem
class]);
453 [delegate sceneFallbackPerformActionForShortcutItem:shortcut completionHandler:handler];
454 OCMVerify([mockPlugin application:[UIApplication sharedApplication]
455 performActionForShortcutItem:shortcut
459- (void)testUnnecessarySceneFallbackPerformActionForShortcutItem {
466 id shortcut = OCMClassMock([UIApplicationShortcutItem
class]);
467 [delegate sceneFallbackPerformActionForShortcutItem:shortcut
468 completionHandler:^(BOOL succeeded){
470 OCMReject([mockPlugin application:[OCMArg any]
471 performActionForShortcutItem:[OCMArg any]
472 completionHandler:[OCMArg any]]);
475- (void)testWillTerminate {
476 XCTNSNotificationExpectation* expectation =
477 [[XCTNSNotificationExpectation alloc] initWithName:UIApplicationWillTerminateNotification];
480 id plugin = OCMProtocolMock(
@protocol(FlutterPlugin));
482 [[NSNotificationCenter defaultCenter] postNotificationName:UIApplicationWillTerminateNotification
484 [
self waitForExpectations:@[ expectation ] timeout:5.0];
485 OCMVerify([plugin applicationWillTerminate:[UIApplication sharedApplication]]);
488- (void)testReleasesPluginOnDealloc {
489 __weak id<FlutterApplicationLifeCycleDelegate> weakPlugin;
493 weakPlugin = fakePlugin;
496 weakDelegate = delegate;
498 XCTAssertNil(weakPlugin);
499 XCTAssertNil(weakDelegate);
502- (void)testApplicationWillFinishLaunchingSceneFallbackForwards {
505 id mockPlugin = OCMPartialMock(plugin);
507 id mockApplication = OCMClassMock([UIApplication
class]);
508 NSDictionary* options = @{};
510 [delegate sceneFallbackWillFinishLaunchingApplication:mockApplication];
511 OCMVerify(times(1), [mockPlugin application:mockApplication
512 willFinishLaunchingWithOptions:options]);
515- (void)testApplicationWillFinishLaunchingSceneFallbackNoForwardAfterWillLaunch {
518 id mockPlugin = OCMPartialMock(plugin);
520 id mockApplication = OCMClassMock([UIApplication
class]);
521 NSDictionary* options = @{
@"key" :
@"value"};
524 [delegate sceneFallbackWillFinishLaunchingApplication:mockApplication];
525 OCMVerify(times(1), [mockPlugin application:mockApplication
526 willFinishLaunchingWithOptions:options]);
529- (void)testApplicationWillFinishLaunchingSceneFallbackNoForwardAfterDidLaunch {
532 id mockPlugin = OCMPartialMock(plugin);
534 id mockApplication = OCMClassMock([UIApplication
class]);
535 NSDictionary* options = @{
@"key" :
@"value"};
538 [delegate sceneFallbackWillFinishLaunchingApplication:mockApplication];
539 OCMVerify(times(0), [mockPlugin application:mockApplication
540 willFinishLaunchingWithOptions:options]);
543- (void)testApplicationDidFinishLaunchingSceneFallbackForwards {
546 id mockPlugin = OCMPartialMock(plugin);
548 id mockApplication = OCMClassMock([UIApplication
class]);
549 NSDictionary* options = @{};
551 [delegate sceneFallbackDidFinishLaunchingApplication:mockApplication];
552 OCMVerify(times(1), [mockPlugin application:mockApplication
553 didFinishLaunchingWithOptions:options]);
556- (void)testApplicationDidFinishLaunchingSceneFallbackNoForward {
559 id mockPlugin = OCMPartialMock(plugin);
561 id mockApplication = OCMClassMock([UIApplication
class]);
562 NSDictionary* options = @{
@"key" :
@"value"};
565 [delegate sceneFallbackDidFinishLaunchingApplication:mockApplication];
566 OCMVerify(times(1), [mockPlugin application:mockApplication
567 didFinishLaunchingWithOptions:options]);
const gchar FlBinaryMessengerMessageHandler handler
BOOL application:didFinishLaunchingWithOptions:(UIApplication *application,[didFinishLaunchingWithOptions] NSDictionary *launchOptions)
BOOL application:willFinishLaunchingWithOptions:(UIApplication *application,[willFinishLaunchingWithOptions] NSDictionary *launchOptions)
void addDelegate:(NSObject< FlutterApplicationLifeCycleDelegate > *delegate)
UITextSmartQuotesType smartQuotesType API_AVAILABLE(ios(11.0))