| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #import <Cocoa/Cocoa.h> | 5 #import <Cocoa/Cocoa.h> |
| 6 | 6 |
| 7 #include "base/message_loop.h" | 7 #include "base/message_loop.h" |
| 8 #include "base/strings/sys_string_conversions.h" | 8 #include "base/strings/sys_string_conversions.h" |
| 9 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
| 10 #include "grit/ui_resources.h" | 10 #include "grit/ui_resources.h" |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 123 } | 123 } |
| 124 | 124 |
| 125 private: | 125 private: |
| 126 const gfx::Font* font_; | 126 const gfx::Font* font_; |
| 127 const int index_; | 127 const int index_; |
| 128 }; | 128 }; |
| 129 | 129 |
| 130 TEST_F(MenuControllerTest, EmptyMenu) { | 130 TEST_F(MenuControllerTest, EmptyMenu) { |
| 131 Delegate delegate; | 131 Delegate delegate; |
| 132 SimpleMenuModel model(&delegate); | 132 SimpleMenuModel model(&delegate); |
| 133 scoped_nsobject<MenuController> menu( | 133 base::scoped_nsobject<MenuController> menu( |
| 134 [[MenuController alloc] initWithModel:&model useWithPopUpButtonCell:NO]); | 134 [[MenuController alloc] initWithModel:&model useWithPopUpButtonCell:NO]); |
| 135 EXPECT_EQ([[menu menu] numberOfItems], 0); | 135 EXPECT_EQ([[menu menu] numberOfItems], 0); |
| 136 } | 136 } |
| 137 | 137 |
| 138 TEST_F(MenuControllerTest, BasicCreation) { | 138 TEST_F(MenuControllerTest, BasicCreation) { |
| 139 Delegate delegate; | 139 Delegate delegate; |
| 140 SimpleMenuModel model(&delegate); | 140 SimpleMenuModel model(&delegate); |
| 141 model.AddItem(1, ASCIIToUTF16("one")); | 141 model.AddItem(1, ASCIIToUTF16("one")); |
| 142 model.AddItem(2, ASCIIToUTF16("two")); | 142 model.AddItem(2, ASCIIToUTF16("two")); |
| 143 model.AddItem(3, ASCIIToUTF16("three")); | 143 model.AddItem(3, ASCIIToUTF16("three")); |
| 144 model.AddSeparator(NORMAL_SEPARATOR); | 144 model.AddSeparator(NORMAL_SEPARATOR); |
| 145 model.AddItem(4, ASCIIToUTF16("four")); | 145 model.AddItem(4, ASCIIToUTF16("four")); |
| 146 model.AddItem(5, ASCIIToUTF16("five")); | 146 model.AddItem(5, ASCIIToUTF16("five")); |
| 147 | 147 |
| 148 scoped_nsobject<MenuController> menu( | 148 base::scoped_nsobject<MenuController> menu( |
| 149 [[MenuController alloc] initWithModel:&model useWithPopUpButtonCell:NO]); | 149 [[MenuController alloc] initWithModel:&model useWithPopUpButtonCell:NO]); |
| 150 EXPECT_EQ([[menu menu] numberOfItems], 6); | 150 EXPECT_EQ([[menu menu] numberOfItems], 6); |
| 151 | 151 |
| 152 // Check the title, tag, and represented object are correct for a random | 152 // Check the title, tag, and represented object are correct for a random |
| 153 // element. | 153 // element. |
| 154 NSMenuItem* itemTwo = [[menu menu] itemAtIndex:2]; | 154 NSMenuItem* itemTwo = [[menu menu] itemAtIndex:2]; |
| 155 NSString* title = [itemTwo title]; | 155 NSString* title = [itemTwo title]; |
| 156 EXPECT_EQ(ASCIIToUTF16("three"), base::SysNSStringToUTF16(title)); | 156 EXPECT_EQ(ASCIIToUTF16("three"), base::SysNSStringToUTF16(title)); |
| 157 EXPECT_EQ([itemTwo tag], 2); | 157 EXPECT_EQ([itemTwo tag], 2); |
| 158 EXPECT_EQ([[itemTwo representedObject] pointerValue], &model); | 158 EXPECT_EQ([[itemTwo representedObject] pointerValue], &model); |
| 159 | 159 |
| 160 EXPECT_TRUE([[[menu menu] itemAtIndex:3] isSeparatorItem]); | 160 EXPECT_TRUE([[[menu menu] itemAtIndex:3] isSeparatorItem]); |
| 161 } | 161 } |
| 162 | 162 |
| 163 TEST_F(MenuControllerTest, Submenus) { | 163 TEST_F(MenuControllerTest, Submenus) { |
| 164 Delegate delegate; | 164 Delegate delegate; |
| 165 SimpleMenuModel model(&delegate); | 165 SimpleMenuModel model(&delegate); |
| 166 model.AddItem(1, ASCIIToUTF16("one")); | 166 model.AddItem(1, ASCIIToUTF16("one")); |
| 167 SimpleMenuModel submodel(&delegate); | 167 SimpleMenuModel submodel(&delegate); |
| 168 submodel.AddItem(2, ASCIIToUTF16("sub-one")); | 168 submodel.AddItem(2, ASCIIToUTF16("sub-one")); |
| 169 submodel.AddItem(3, ASCIIToUTF16("sub-two")); | 169 submodel.AddItem(3, ASCIIToUTF16("sub-two")); |
| 170 submodel.AddItem(4, ASCIIToUTF16("sub-three")); | 170 submodel.AddItem(4, ASCIIToUTF16("sub-three")); |
| 171 model.AddSubMenuWithStringId(5, kTestLabelResourceId, &submodel); | 171 model.AddSubMenuWithStringId(5, kTestLabelResourceId, &submodel); |
| 172 model.AddItem(6, ASCIIToUTF16("three")); | 172 model.AddItem(6, ASCIIToUTF16("three")); |
| 173 | 173 |
| 174 scoped_nsobject<MenuController> menu( | 174 base::scoped_nsobject<MenuController> menu( |
| 175 [[MenuController alloc] initWithModel:&model useWithPopUpButtonCell:NO]); | 175 [[MenuController alloc] initWithModel:&model useWithPopUpButtonCell:NO]); |
| 176 EXPECT_EQ([[menu menu] numberOfItems], 3); | 176 EXPECT_EQ([[menu menu] numberOfItems], 3); |
| 177 | 177 |
| 178 // Inspect the submenu to ensure it has correct properties. | 178 // Inspect the submenu to ensure it has correct properties. |
| 179 NSMenu* submenu = [[[menu menu] itemAtIndex:1] submenu]; | 179 NSMenu* submenu = [[[menu menu] itemAtIndex:1] submenu]; |
| 180 EXPECT_TRUE(submenu); | 180 EXPECT_TRUE(submenu); |
| 181 EXPECT_EQ([submenu numberOfItems], 3); | 181 EXPECT_EQ([submenu numberOfItems], 3); |
| 182 | 182 |
| 183 // Inspect one of the items to make sure it has the correct model as its | 183 // Inspect one of the items to make sure it has the correct model as its |
| 184 // represented object and the proper tag. | 184 // represented object and the proper tag. |
| (...skipping 12 matching lines...) Expand all Loading... |
| 197 EXPECT_EQ([[item representedObject] pointerValue], &model); | 197 EXPECT_EQ([[item representedObject] pointerValue], &model); |
| 198 } | 198 } |
| 199 | 199 |
| 200 TEST_F(MenuControllerTest, EmptySubmenu) { | 200 TEST_F(MenuControllerTest, EmptySubmenu) { |
| 201 Delegate delegate; | 201 Delegate delegate; |
| 202 SimpleMenuModel model(&delegate); | 202 SimpleMenuModel model(&delegate); |
| 203 model.AddItem(1, ASCIIToUTF16("one")); | 203 model.AddItem(1, ASCIIToUTF16("one")); |
| 204 SimpleMenuModel submodel(&delegate); | 204 SimpleMenuModel submodel(&delegate); |
| 205 model.AddSubMenuWithStringId(2, kTestLabelResourceId, &submodel); | 205 model.AddSubMenuWithStringId(2, kTestLabelResourceId, &submodel); |
| 206 | 206 |
| 207 scoped_nsobject<MenuController> menu( | 207 base::scoped_nsobject<MenuController> menu( |
| 208 [[MenuController alloc] initWithModel:&model useWithPopUpButtonCell:NO]); | 208 [[MenuController alloc] initWithModel:&model useWithPopUpButtonCell:NO]); |
| 209 EXPECT_EQ([[menu menu] numberOfItems], 2); | 209 EXPECT_EQ([[menu menu] numberOfItems], 2); |
| 210 } | 210 } |
| 211 | 211 |
| 212 TEST_F(MenuControllerTest, PopUpButton) { | 212 TEST_F(MenuControllerTest, PopUpButton) { |
| 213 Delegate delegate; | 213 Delegate delegate; |
| 214 SimpleMenuModel model(&delegate); | 214 SimpleMenuModel model(&delegate); |
| 215 model.AddItem(1, ASCIIToUTF16("one")); | 215 model.AddItem(1, ASCIIToUTF16("one")); |
| 216 model.AddItem(2, ASCIIToUTF16("two")); | 216 model.AddItem(2, ASCIIToUTF16("two")); |
| 217 model.AddItem(3, ASCIIToUTF16("three")); | 217 model.AddItem(3, ASCIIToUTF16("three")); |
| 218 | 218 |
| 219 // Menu should have an extra item inserted at position 0 that has an empty | 219 // Menu should have an extra item inserted at position 0 that has an empty |
| 220 // title. | 220 // title. |
| 221 scoped_nsobject<MenuController> menu( | 221 base::scoped_nsobject<MenuController> menu( |
| 222 [[MenuController alloc] initWithModel:&model useWithPopUpButtonCell:YES]); | 222 [[MenuController alloc] initWithModel:&model useWithPopUpButtonCell:YES]); |
| 223 EXPECT_EQ([[menu menu] numberOfItems], 4); | 223 EXPECT_EQ([[menu menu] numberOfItems], 4); |
| 224 EXPECT_EQ(base::SysNSStringToUTF16([[[menu menu] itemAtIndex:0] title]), | 224 EXPECT_EQ(base::SysNSStringToUTF16([[[menu menu] itemAtIndex:0] title]), |
| 225 string16()); | 225 string16()); |
| 226 | 226 |
| 227 // Make sure the tags are still correct (the index no longer matches the tag). | 227 // Make sure the tags are still correct (the index no longer matches the tag). |
| 228 NSMenuItem* itemTwo = [[menu menu] itemAtIndex:2]; | 228 NSMenuItem* itemTwo = [[menu menu] itemAtIndex:2]; |
| 229 EXPECT_EQ([itemTwo tag], 1); | 229 EXPECT_EQ([itemTwo tag], 1); |
| 230 } | 230 } |
| 231 | 231 |
| 232 TEST_F(MenuControllerTest, Execute) { | 232 TEST_F(MenuControllerTest, Execute) { |
| 233 Delegate delegate; | 233 Delegate delegate; |
| 234 SimpleMenuModel model(&delegate); | 234 SimpleMenuModel model(&delegate); |
| 235 model.AddItem(1, ASCIIToUTF16("one")); | 235 model.AddItem(1, ASCIIToUTF16("one")); |
| 236 scoped_nsobject<MenuController> menu( | 236 base::scoped_nsobject<MenuController> menu( |
| 237 [[MenuController alloc] initWithModel:&model useWithPopUpButtonCell:NO]); | 237 [[MenuController alloc] initWithModel:&model useWithPopUpButtonCell:NO]); |
| 238 EXPECT_EQ([[menu menu] numberOfItems], 1); | 238 EXPECT_EQ([[menu menu] numberOfItems], 1); |
| 239 | 239 |
| 240 // Fake selecting the menu item, we expect the delegate to be told to execute | 240 // Fake selecting the menu item, we expect the delegate to be told to execute |
| 241 // a command. | 241 // a command. |
| 242 NSMenuItem* item = [[menu menu] itemAtIndex:0]; | 242 NSMenuItem* item = [[menu menu] itemAtIndex:0]; |
| 243 [[item target] performSelector:[item action] withObject:item]; | 243 [[item target] performSelector:[item action] withObject:item]; |
| 244 EXPECT_EQ(delegate.execute_count_, 1); | 244 EXPECT_EQ(delegate.execute_count_, 1); |
| 245 } | 245 } |
| 246 | 246 |
| 247 void Validate(MenuController* controller, NSMenu* menu) { | 247 void Validate(MenuController* controller, NSMenu* menu) { |
| 248 for (int i = 0; i < [menu numberOfItems]; ++i) { | 248 for (int i = 0; i < [menu numberOfItems]; ++i) { |
| 249 NSMenuItem* item = [menu itemAtIndex:i]; | 249 NSMenuItem* item = [menu itemAtIndex:i]; |
| 250 [controller validateUserInterfaceItem:item]; | 250 [controller validateUserInterfaceItem:item]; |
| 251 if ([item hasSubmenu]) | 251 if ([item hasSubmenu]) |
| 252 Validate(controller, [item submenu]); | 252 Validate(controller, [item submenu]); |
| 253 } | 253 } |
| 254 } | 254 } |
| 255 | 255 |
| 256 TEST_F(MenuControllerTest, Validate) { | 256 TEST_F(MenuControllerTest, Validate) { |
| 257 Delegate delegate; | 257 Delegate delegate; |
| 258 SimpleMenuModel model(&delegate); | 258 SimpleMenuModel model(&delegate); |
| 259 model.AddItem(1, ASCIIToUTF16("one")); | 259 model.AddItem(1, ASCIIToUTF16("one")); |
| 260 model.AddItem(2, ASCIIToUTF16("two")); | 260 model.AddItem(2, ASCIIToUTF16("two")); |
| 261 SimpleMenuModel submodel(&delegate); | 261 SimpleMenuModel submodel(&delegate); |
| 262 submodel.AddItem(2, ASCIIToUTF16("sub-one")); | 262 submodel.AddItem(2, ASCIIToUTF16("sub-one")); |
| 263 model.AddSubMenuWithStringId(3, kTestLabelResourceId, &submodel); | 263 model.AddSubMenuWithStringId(3, kTestLabelResourceId, &submodel); |
| 264 | 264 |
| 265 scoped_nsobject<MenuController> menu( | 265 base::scoped_nsobject<MenuController> menu( |
| 266 [[MenuController alloc] initWithModel:&model useWithPopUpButtonCell:NO]); | 266 [[MenuController alloc] initWithModel:&model useWithPopUpButtonCell:NO]); |
| 267 EXPECT_EQ([[menu menu] numberOfItems], 3); | 267 EXPECT_EQ([[menu menu] numberOfItems], 3); |
| 268 | 268 |
| 269 Validate(menu.get(), [menu menu]); | 269 Validate(menu.get(), [menu menu]); |
| 270 } | 270 } |
| 271 | 271 |
| 272 // Tests that items which have a font set actually use that font. | 272 // Tests that items which have a font set actually use that font. |
| 273 TEST_F(MenuControllerTest, LabelFont) { | 273 TEST_F(MenuControllerTest, LabelFont) { |
| 274 Delegate delegate; | 274 Delegate delegate; |
| 275 gfx::Font bold = (gfx::Font()).DeriveFont(0, gfx::Font::BOLD); | 275 gfx::Font bold = (gfx::Font()).DeriveFont(0, gfx::Font::BOLD); |
| 276 FontMenuModel model(&delegate, &bold, 0); | 276 FontMenuModel model(&delegate, &bold, 0); |
| 277 model.AddItem(1, ASCIIToUTF16("one")); | 277 model.AddItem(1, ASCIIToUTF16("one")); |
| 278 model.AddItem(2, ASCIIToUTF16("two")); | 278 model.AddItem(2, ASCIIToUTF16("two")); |
| 279 | 279 |
| 280 scoped_nsobject<MenuController> menu( | 280 base::scoped_nsobject<MenuController> menu( |
| 281 [[MenuController alloc] initWithModel:&model useWithPopUpButtonCell:NO]); | 281 [[MenuController alloc] initWithModel:&model useWithPopUpButtonCell:NO]); |
| 282 EXPECT_EQ([[menu menu] numberOfItems], 2); | 282 EXPECT_EQ([[menu menu] numberOfItems], 2); |
| 283 | 283 |
| 284 Validate(menu.get(), [menu menu]); | 284 Validate(menu.get(), [menu menu]); |
| 285 | 285 |
| 286 EXPECT_TRUE([[[menu menu] itemAtIndex:0] attributedTitle] != nil); | 286 EXPECT_TRUE([[[menu menu] itemAtIndex:0] attributedTitle] != nil); |
| 287 EXPECT_TRUE([[[menu menu] itemAtIndex:1] attributedTitle] == nil); | 287 EXPECT_TRUE([[[menu menu] itemAtIndex:1] attributedTitle] == nil); |
| 288 } | 288 } |
| 289 | 289 |
| 290 TEST_F(MenuControllerTest, DefaultInitializer) { | 290 TEST_F(MenuControllerTest, DefaultInitializer) { |
| 291 Delegate delegate; | 291 Delegate delegate; |
| 292 SimpleMenuModel model(&delegate); | 292 SimpleMenuModel model(&delegate); |
| 293 model.AddItem(1, ASCIIToUTF16("one")); | 293 model.AddItem(1, ASCIIToUTF16("one")); |
| 294 model.AddItem(2, ASCIIToUTF16("two")); | 294 model.AddItem(2, ASCIIToUTF16("two")); |
| 295 model.AddItem(3, ASCIIToUTF16("three")); | 295 model.AddItem(3, ASCIIToUTF16("three")); |
| 296 | 296 |
| 297 scoped_nsobject<MenuController> menu([[MenuController alloc] init]); | 297 base::scoped_nsobject<MenuController> menu([[MenuController alloc] init]); |
| 298 EXPECT_FALSE([menu menu]); | 298 EXPECT_FALSE([menu menu]); |
| 299 | 299 |
| 300 [menu setModel:&model]; | 300 [menu setModel:&model]; |
| 301 [menu setUseWithPopUpButtonCell:NO]; | 301 [menu setUseWithPopUpButtonCell:NO]; |
| 302 EXPECT_TRUE([menu menu]); | 302 EXPECT_TRUE([menu menu]); |
| 303 EXPECT_EQ(3, [[menu menu] numberOfItems]); | 303 EXPECT_EQ(3, [[menu menu] numberOfItems]); |
| 304 | 304 |
| 305 // Check immutability. | 305 // Check immutability. |
| 306 model.AddItem(4, ASCIIToUTF16("four")); | 306 model.AddItem(4, ASCIIToUTF16("four")); |
| 307 EXPECT_EQ(3, [[menu menu] numberOfItems]); | 307 EXPECT_EQ(3, [[menu menu] numberOfItems]); |
| 308 } | 308 } |
| 309 | 309 |
| 310 // Test that menus with dynamic labels actually get updated. | 310 // Test that menus with dynamic labels actually get updated. |
| 311 TEST_F(MenuControllerTest, Dynamic) { | 311 TEST_F(MenuControllerTest, Dynamic) { |
| 312 DynamicDelegate delegate; | 312 DynamicDelegate delegate; |
| 313 | 313 |
| 314 // Create a menu containing a single item whose label is "initial" and who has | 314 // Create a menu containing a single item whose label is "initial" and who has |
| 315 // no icon. | 315 // no icon. |
| 316 string16 initial = ASCIIToUTF16("initial"); | 316 string16 initial = ASCIIToUTF16("initial"); |
| 317 delegate.SetDynamicLabel(initial); | 317 delegate.SetDynamicLabel(initial); |
| 318 SimpleMenuModel model(&delegate); | 318 SimpleMenuModel model(&delegate); |
| 319 model.AddItem(1, ASCIIToUTF16("foo")); | 319 model.AddItem(1, ASCIIToUTF16("foo")); |
| 320 scoped_nsobject<MenuController> menu( | 320 base::scoped_nsobject<MenuController> menu( |
| 321 [[MenuController alloc] initWithModel:&model useWithPopUpButtonCell:NO]); | 321 [[MenuController alloc] initWithModel:&model useWithPopUpButtonCell:NO]); |
| 322 EXPECT_EQ([[menu menu] numberOfItems], 1); | 322 EXPECT_EQ([[menu menu] numberOfItems], 1); |
| 323 // Validate() simulates opening the menu - the item label/icon should be | 323 // Validate() simulates opening the menu - the item label/icon should be |
| 324 // initialized after this so we can validate the menu contents. | 324 // initialized after this so we can validate the menu contents. |
| 325 Validate(menu.get(), [menu menu]); | 325 Validate(menu.get(), [menu menu]); |
| 326 NSMenuItem* item = [[menu menu] itemAtIndex:0]; | 326 NSMenuItem* item = [[menu menu] itemAtIndex:0]; |
| 327 // Item should have the "initial" label and no icon. | 327 // Item should have the "initial" label and no icon. |
| 328 EXPECT_EQ(initial, base::SysNSStringToUTF16([item title])); | 328 EXPECT_EQ(initial, base::SysNSStringToUTF16([item title])); |
| 329 EXPECT_EQ(nil, [item image]); | 329 EXPECT_EQ(nil, [item image]); |
| 330 | 330 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 352 base::MessageLoop message_loop(base::MessageLoop::TYPE_UI); | 352 base::MessageLoop message_loop(base::MessageLoop::TYPE_UI); |
| 353 | 353 |
| 354 // Create the model. | 354 // Create the model. |
| 355 Delegate delegate; | 355 Delegate delegate; |
| 356 SimpleMenuModel model(&delegate); | 356 SimpleMenuModel model(&delegate); |
| 357 model.AddItem(1, ASCIIToUTF16("allays")); | 357 model.AddItem(1, ASCIIToUTF16("allays")); |
| 358 model.AddItem(2, ASCIIToUTF16("i")); | 358 model.AddItem(2, ASCIIToUTF16("i")); |
| 359 model.AddItem(3, ASCIIToUTF16("bf")); | 359 model.AddItem(3, ASCIIToUTF16("bf")); |
| 360 | 360 |
| 361 // Create the controller. | 361 // Create the controller. |
| 362 scoped_nsobject<MenuController> menu( | 362 base::scoped_nsobject<MenuController> menu( |
| 363 [[MenuController alloc] initWithModel:&model useWithPopUpButtonCell:NO]); | 363 [[MenuController alloc] initWithModel:&model useWithPopUpButtonCell:NO]); |
| 364 delegate.menu_to_close_ = [menu menu]; | 364 delegate.menu_to_close_ = [menu menu]; |
| 365 | 365 |
| 366 EXPECT_FALSE([menu isMenuOpen]); | 366 EXPECT_FALSE([menu isMenuOpen]); |
| 367 | 367 |
| 368 // In the event tracking run loop mode of the menu, verify that the controller | 368 // In the event tracking run loop mode of the menu, verify that the controller |
| 369 // resports the menu as open. | 369 // resports the menu as open. |
| 370 CFRunLoopPerformBlock(CFRunLoopGetCurrent(), NSEventTrackingRunLoopMode, ^{ | 370 CFRunLoopPerformBlock(CFRunLoopGetCurrent(), NSEventTrackingRunLoopMode, ^{ |
| 371 EXPECT_TRUE([menu isMenuOpen]); | 371 EXPECT_TRUE([menu isMenuOpen]); |
| 372 }); | 372 }); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 390 // Pump the task that notifies the delegate. | 390 // Pump the task that notifies the delegate. |
| 391 message_loop.RunUntilIdle(); | 391 message_loop.RunUntilIdle(); |
| 392 | 392 |
| 393 // Expect that the delegate got notified properly. | 393 // Expect that the delegate got notified properly. |
| 394 EXPECT_TRUE(delegate.did_close_); | 394 EXPECT_TRUE(delegate.did_close_); |
| 395 } | 395 } |
| 396 | 396 |
| 397 } // namespace | 397 } // namespace |
| 398 | 398 |
| 399 } // namespace ui | 399 } // namespace ui |
| OLD | NEW |