18 #include "flutter/testing/autoreleasepool_test.h"
19 #include "flutter/testing/testing.h"
20 #include "gtest/gtest.h"
23 @property(nonatomic, readonly) id<FlutterPlugin>
plugin;
34 - (void)addMethodCallDelegate:(nonnull
id<
FlutterPlugin>)delegate
38 [_channel setMethodCallHandler:^(FlutterMethodCall* call, FlutterResult result) {
47 withId:(nonnull NSString*)factoryId {
50 - (void)publish:(nonnull NSObject*)value {
53 - (nonnull NSString*)lookupKeyForAsset:(nonnull NSString*)asset {
57 - (nonnull NSString*)lookupKeyForAsset:(nonnull NSString*)asset
58 fromPackage:(nonnull NSString*)package {
81 FlutterMenuPluginTest::FlutterMenuPluginTest() {
82 view_ = [[NSView alloc] initWithFrame:NSZeroRect];
83 view_.wantsLayer = YES;
88 NSMenu* mainMenu = [[NSMenu alloc] init];
89 NSMenuItem* appNameMenu = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"APP_NAME", nil)
93 [[NSMenu alloc] initWithTitle:NSLocalizedString(@"Prexisting APP_NAME menu", nil)];
94 [submenu addItem:[[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"About APP_NAME", nil)
97 appNameMenu.submenu = submenu;
98 [mainMenu addItem:appNameMenu];
99 [NSApp setMainMenu:mainMenu];
105 NSDictionary* testMenus = @{
108 @"id" : [NSNumber numberWithInt:1],
109 @"label" : @"APP_NAME",
113 @"id" : [NSNumber numberWithInt:3],
114 @"platformProvidedMenu" : @(static_cast<int>(flutter::PlatformProvidedMenu::kQuit)),
118 @"id" : [NSNumber numberWithInt:2],
119 @"label" : @"APP_NAME Info",
121 @"shortcutTrigger" : [NSNumber numberWithUnsignedLongLong:0x61],
122 @"shortcutModifiers" : [NSNumber numberWithUnsignedInt:0],
127 @"id" : [NSNumber numberWithInt:4],
128 @"label" : @"Help for APP_NAME",
132 @"id" : [NSNumber numberWithInt:5],
133 @"label" : @"Help me!",
137 @"id" : [NSNumber numberWithInt:6],
140 @"isDivider" : @(YES),
143 @"id" : [NSNumber numberWithInt:7],
144 @"label" : @"Search help",
152 __block
id available = @NO;
155 result:^(id _Nullable result) {
159 EXPECT_TRUE(available);
163 result:^(id _Nullable result){
166 EXPECT_EQ([NSApp.mainMenu numberOfItems], 2);
167 NSMenuItem* firstMenu = [NSApp.mainMenu itemAtIndex:0];
168 EXPECT_TRUE([[firstMenu title] isEqualToString:
@"flutter_desktop_darwin_unittests"]);
169 EXPECT_EQ([firstMenu tag], 1);
170 EXPECT_TRUE([firstMenu isEnabled]);
171 EXPECT_FALSE([firstMenu isHidden]);
172 EXPECT_TRUE([[firstMenu keyEquivalent] isEqualToString:
@"\0"]);
174 EXPECT_EQ([[firstMenu submenu] numberOfItems], 1);
175 NSMenuItem* firstItem = [[firstMenu submenu] itemAtIndex:0];
176 EXPECT_TRUE([[firstItem title] isEqualToString:
@"flutter_desktop_darwin_unittests Info"]);
177 EXPECT_TRUE([[firstItem keyEquivalent] isEqualToString:
@"a"]);
178 EXPECT_TRUE([firstItem isEnabled]);
179 EXPECT_FALSE([firstItem isHidden]);
181 [NSStringFromSelector([firstItem action]) isEqualToString:
@"flutterMenuItemSelected:"]);
182 EXPECT_EQ([firstItem tag], 2);
184 NSMenuItem* secondMenu = [NSApp.mainMenu itemAtIndex:1];
185 EXPECT_TRUE([[secondMenu title] isEqualToString:
@"Help for flutter_desktop_darwin_unittests"]);
186 EXPECT_EQ([secondMenu tag], 4);
187 EXPECT_TRUE([secondMenu isEnabled]);
188 EXPECT_FALSE([secondMenu isHidden]);
190 EXPECT_EQ([[secondMenu submenu] numberOfItems], 3);
191 NSMenuItem* secondMenuFirst = [[secondMenu submenu] itemAtIndex:0];
192 EXPECT_TRUE([[secondMenuFirst title] isEqualToString:
@"Help me!"]);
193 EXPECT_TRUE([secondMenuFirst isEnabled]);
194 EXPECT_FALSE([secondMenuFirst isHidden]);
196 [NSStringFromSelector([secondMenuFirst action]) isEqualToString:
@"flutterMenuItemSelected:"]);
197 EXPECT_EQ([secondMenuFirst tag], 5);
199 NSMenuItem* secondMenuDivider = [[secondMenu submenu] itemAtIndex:1];
200 EXPECT_TRUE([[secondMenuDivider title] isEqualToString:
@""]);
201 EXPECT_TRUE([[secondMenuDivider keyEquivalent] isEqualToString:
@""]);
202 EXPECT_FALSE([secondMenuDivider isEnabled]);
203 EXPECT_FALSE([secondMenuDivider isHidden]);
204 EXPECT_EQ([secondMenuDivider action], nil);
205 EXPECT_EQ([secondMenuDivider tag], 0);
207 NSMenuItem* secondMenuLast = [[secondMenu submenu] itemAtIndex:2];
208 EXPECT_TRUE([[secondMenuLast title] isEqualToString:
@"Search help"]);
209 EXPECT_FALSE([secondMenuLast isEnabled]);
210 EXPECT_FALSE([secondMenuLast isHidden]);
212 [NSStringFromSelector([secondMenuLast action]) isEqualToString:
@"flutterMenuItemSelected:"]);
213 EXPECT_EQ([secondMenuLast tag], 7);