Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(107)

Side by Side Diff: chrome/browser/ui/views/menu_item_view_test.cc

Issue 168033003: Pass in correct parameter to MenuController::SelectByChar() on Linux Aura (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix BookmarkBarViewTest10.KeyEvents Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/callback.h"
6 #include "base/strings/utf_string_conversions.h"
7 #include "chrome/test/base/interactive_test_utils.h"
8 #include "chrome/test/base/ui_test_utils.h"
9 #include "chrome/test/base/view_event_test_base.h"
10 #include "ui/base/test/ui_controls.h"
11 #include "ui/views/controls/button/menu_button.h"
12 #include "ui/views/controls/button/menu_button_listener.h"
13 #include "ui/views/controls/menu/menu_controller.h"
14 #include "ui/views/controls/menu/menu_item_view.h"
15 #include "ui/views/controls/menu/menu_runner.h"
16 #include "ui/views/controls/menu/submenu_view.h"
17 #include "ui/views/widget/root_view.h"
18 #include "ui/views/widget/widget.h"
19
20 using base::ASCIIToUTF16;
21
22 // This is a convenience base class for all tests to provide some
23 // common functionality. It sets up a MenuButton and a MenuItemView
24 // and clicks the MenuButton.
25 //
26 // Subclasses should implement:
27 // BuildMenu() populate the menu
28 // DoTestOnMessageLoop() initiate the test
29 //
30 // Subclasses can call:
31 // Click() to post a mouse click on a View
32 //
33 // Although it should be possible to post a menu multiple times,
34 // MenuItemView prevents repeated activation of a menu by clicks too
35 // close in time.
36 class MenuItemViewTestBase : public ViewEventTestBase,
37 public views::MenuButtonListener,
38 public views::MenuDelegate {
39 public:
40 MenuItemViewTestBase()
41 : ViewEventTestBase(),
42 button_(NULL),
43 menu_(NULL) {
44 }
45
46 virtual ~MenuItemViewTestBase() {
47 }
48
49 // ViewEventTestBase implementation.
50
51 virtual void SetUp() OVERRIDE {
52 button_ = new views::MenuButton(
53 NULL, ASCIIToUTF16("Menu Test"), this, true);
54 menu_ = new views::MenuItemView(this);
55 BuildMenu(menu_);
56 menu_runner_.reset(new views::MenuRunner(menu_));
57
58 ViewEventTestBase::SetUp();
59 }
60
61 virtual void TearDown() OVERRIDE {
62 menu_runner_.reset(NULL);
63 menu_ = NULL;
64 ViewEventTestBase::TearDown();
65 }
66
67 virtual views::View* CreateContentsView() OVERRIDE {
68 return button_;
69 }
70
71 virtual gfx::Size GetPreferredSize() OVERRIDE {
72 return button_->GetPreferredSize();
73 }
74
75 // views::MenuButtonListener implementation.
76 virtual void OnMenuButtonClicked(views::View* source,
77 const gfx::Point& point) OVERRIDE {
78 gfx::Point screen_location;
79 views::View::ConvertPointToScreen(source, &screen_location);
80 gfx::Rect bounds(screen_location, source->size());
81 ignore_result(menu_runner_->RunMenuAt(
82 source->GetWidget(),
83 button_,
84 bounds,
85 views::MenuItemView::TOPLEFT,
86 ui::MENU_SOURCE_NONE,
87 views::MenuRunner::HAS_MNEMONICS));
88 }
89
90 protected:
91 // Generate a mouse click on the specified view and post a new task.
92 virtual void Click(views::View* view, const base::Closure& next) {
93 ui_test_utils::MoveMouseToCenterAndPress(
94 view,
95 ui_controls::LEFT,
96 ui_controls::DOWN | ui_controls::UP,
97 next);
98 }
99
100 virtual void BuildMenu(views::MenuItemView* menu) {
101 }
102
103 views::MenuButton* button_;
104 views::MenuItemView* menu_;
105 scoped_ptr<views::MenuRunner> menu_runner_;
106 };
107
108 // Simple test for clicking a menu item. This template class clicks on an
109 // item and checks that the returned id matches. The index of the item
110 // is the template argument.
111 template<int INDEX>
112 class MenuItemViewTestBasic : public MenuItemViewTestBase {
113 public:
114 MenuItemViewTestBasic() :
115 last_command_(0) {
116 }
117
118 virtual ~MenuItemViewTestBasic() {
119 }
120
121 // views::MenuDelegate implementation
122 virtual void ExecuteCommand(int id) OVERRIDE {
123 last_command_ = id;
124 }
125
126 // MenuItemViewTestBase implementation
127 virtual void BuildMenu(views::MenuItemView* menu) OVERRIDE {
128 menu->AppendMenuItemWithLabel(1, ASCIIToUTF16("item 1"));
129 menu->AppendMenuItemWithLabel(2, ASCIIToUTF16("item 2"));
130 menu->AppendSeparator();
131 menu->AppendMenuItemWithLabel(3, ASCIIToUTF16("item 3"));
132 }
133
134 // ViewEventTestBase implementation
135 virtual void DoTestOnMessageLoop() OVERRIDE {
136 Click(button_, CreateEventTask(this, &MenuItemViewTestBasic::Step1));
137 }
138
139 // Click on item INDEX.
140 void Step1() {
141 ASSERT_TRUE(menu_);
142
143 views::SubmenuView* submenu = menu_->GetSubmenu();
144 ASSERT_TRUE(submenu);
145 ASSERT_TRUE(submenu->IsShowing());
146 ASSERT_EQ(3, submenu->GetMenuItemCount());
147
148 // click an item and pass control to the next step
149 views::MenuItemView* item = submenu->GetMenuItemAt(INDEX);
150 ASSERT_TRUE(item);
151 Click(item, CreateEventTask(this, &MenuItemViewTestBasic::Step2));
152 }
153
154 // Check the clicked item and complete the test.
155 void Step2() {
156 ASSERT_FALSE(menu_->GetSubmenu()->IsShowing());
157 ASSERT_EQ(INDEX + 1,last_command_);
158 Done();
159 }
160
161 private:
162 int last_command_;
163 };
164
165 // Click each item of a 3-item menu (with separator).
166 typedef MenuItemViewTestBasic<0> MenuItemViewTestBasic0;
167 typedef MenuItemViewTestBasic<1> MenuItemViewTestBasic1;
168 typedef MenuItemViewTestBasic<2> MenuItemViewTestBasic2;
169 VIEW_TEST(MenuItemViewTestBasic0, SelectItem0)
170 VIEW_TEST(MenuItemViewTestBasic1, SelectItem1)
171 VIEW_TEST(MenuItemViewTestBasic2, SelectItem2)
172
173 // Test class for inserting a menu item while the menu is open.
174 template<int INSERT_INDEX, int SELECT_INDEX>
175 class MenuItemViewTestInsert : public MenuItemViewTestBase {
176 public:
177 MenuItemViewTestInsert() :
178 last_command_(0),
179 inserted_item_(NULL) {
180 }
181
182 virtual ~MenuItemViewTestInsert() {
183 }
184
185 // views::MenuDelegate implementation
186 virtual void ExecuteCommand(int id) OVERRIDE {
187 last_command_ = id;
188 }
189
190 // MenuItemViewTestBase implementation
191 virtual void BuildMenu(views::MenuItemView* menu) OVERRIDE {
192 menu->AppendMenuItemWithLabel(1, ASCIIToUTF16("item 1"));
193 menu->AppendMenuItemWithLabel(2, ASCIIToUTF16("item 2"));
194 }
195
196 // ViewEventTestBase implementation
197 virtual void DoTestOnMessageLoop() OVERRIDE {
198 Click(button_, CreateEventTask(this, &MenuItemViewTestInsert::Step1));
199 }
200
201 // Insert item at INSERT_INDEX and click item at SELECT_INDEX.
202 void Step1() {
203 ASSERT_TRUE(menu_);
204
205 views::SubmenuView* submenu = menu_->GetSubmenu();
206 ASSERT_TRUE(submenu);
207 ASSERT_TRUE(submenu->IsShowing());
208 ASSERT_EQ(2, submenu->GetMenuItemCount());
209
210 inserted_item_ = menu_->AddMenuItemAt(INSERT_INDEX,
211 1000,
212 ASCIIToUTF16("inserted item"),
213 base::string16(),
214 base::string16(),
215 gfx::ImageSkia(),
216 views::MenuItemView::NORMAL,
217 ui::NORMAL_SEPARATOR);
218 ASSERT_TRUE(inserted_item_);
219 menu_->ChildrenChanged();
220
221 // click an item and pass control to the next step
222 views::MenuItemView* item = submenu->GetMenuItemAt(SELECT_INDEX);
223 ASSERT_TRUE(item);
224 Click(item, CreateEventTask(this, &MenuItemViewTestInsert::Step2));
225 }
226
227 // Check clicked item and complete test.
228 void Step2() {
229 ASSERT_TRUE(menu_);
230
231 views::SubmenuView* submenu = menu_->GetSubmenu();
232 ASSERT_TRUE(submenu);
233 ASSERT_FALSE(submenu->IsShowing());
234 ASSERT_EQ(3, submenu->GetMenuItemCount());
235
236 if (SELECT_INDEX == INSERT_INDEX)
237 ASSERT_EQ(1000, last_command_);
238 else if (SELECT_INDEX < INSERT_INDEX)
239 ASSERT_EQ(SELECT_INDEX + 1, last_command_);
240 else
241 ASSERT_EQ(SELECT_INDEX, last_command_);
242
243 Done();
244 }
245
246 private:
247 int last_command_;
248 views::MenuItemView* inserted_item_;
249 };
250
251 // MenuItemViewTestInsertXY inserts an item at index X and selects the
252 // item at index Y (after the insertion). The tests here cover
253 // inserting at the beginning, middle, and end, crossbarred with
254 // selecting the first and last item.
255 typedef MenuItemViewTestInsert<0,0> MenuItemViewTestInsert00;
256 typedef MenuItemViewTestInsert<0,2> MenuItemViewTestInsert02;
257 typedef MenuItemViewTestInsert<1,0> MenuItemViewTestInsert10;
258 typedef MenuItemViewTestInsert<1,2> MenuItemViewTestInsert12;
259 typedef MenuItemViewTestInsert<2,0> MenuItemViewTestInsert20;
260 typedef MenuItemViewTestInsert<2,2> MenuItemViewTestInsert22;
261 VIEW_TEST(MenuItemViewTestInsert00, InsertItem00)
262 VIEW_TEST(MenuItemViewTestInsert02, InsertItem02)
263 VIEW_TEST(MenuItemViewTestInsert10, InsertItem10)
264 VIEW_TEST(MenuItemViewTestInsert12, InsertItem12)
265 VIEW_TEST(MenuItemViewTestInsert20, InsertItem20)
266 VIEW_TEST(MenuItemViewTestInsert22, InsertItem22)
267
268 // Test class for inserting a menu item while a submenu is open.
269 template<int INSERT_INDEX>
270 class MenuItemViewTestInsertWithSubmenu : public MenuItemViewTestBase {
271 public:
272 MenuItemViewTestInsertWithSubmenu() :
273 last_command_(0),
274 submenu_(NULL),
275 inserted_item_(NULL) {
276 }
277
278 virtual ~MenuItemViewTestInsertWithSubmenu() {
279 }
280
281 // views::MenuDelegate implementation
282 virtual void ExecuteCommand(int id) OVERRIDE {
283 last_command_ = id;
284 }
285
286 // MenuItemViewTestBase implementation
287 virtual void BuildMenu(views::MenuItemView* menu) OVERRIDE {
288 submenu_ = menu->AppendSubMenu(1, ASCIIToUTF16("My Submenu"));
289 submenu_->AppendMenuItemWithLabel(101, ASCIIToUTF16("submenu item 1"));
290 submenu_->AppendMenuItemWithLabel(101, ASCIIToUTF16("submenu item 2"));
291 menu->AppendMenuItemWithLabel(2, ASCIIToUTF16("item 2"));
292 }
293
294 // ViewEventTestBase implementation
295 virtual void DoTestOnMessageLoop() OVERRIDE {
296 Click(button_,
297 CreateEventTask(this, &MenuItemViewTestInsertWithSubmenu::Step1));
298 }
299
300 // Post submenu.
301 void Step1() {
302 Click(submenu_,
303 CreateEventTask(this, &MenuItemViewTestInsertWithSubmenu::Step2));
304 }
305
306 // Insert item at INSERT_INDEX.
307 void Step2() {
308 inserted_item_ = menu_->AddMenuItemAt(INSERT_INDEX,
309 1000,
310 ASCIIToUTF16("inserted item"),
311 base::string16(),
312 base::string16(),
313 gfx::ImageSkia(),
314 views::MenuItemView::NORMAL,
315 ui::NORMAL_SEPARATOR);
316 ASSERT_TRUE(inserted_item_);
317 menu_->ChildrenChanged();
318
319 Click(inserted_item_,
320 CreateEventTask(this, &MenuItemViewTestInsertWithSubmenu::Step3));
321 }
322
323 void Step3() {
324 Done();
325 }
326
327 private:
328 int last_command_;
329 views::MenuItemView* submenu_;
330 views::MenuItemView* inserted_item_;
331 };
332
333 // MenuItemViewTestInsertWithSubmenuX posts a menu and its submenu,
334 // then inserts an item in the top-level menu at X.
335 typedef MenuItemViewTestInsertWithSubmenu<0> MenuItemViewTestInsertWithSubmenu0;
336 typedef MenuItemViewTestInsertWithSubmenu<1> MenuItemViewTestInsertWithSubmenu1;
337 VIEW_TEST(MenuItemViewTestInsertWithSubmenu0, InsertItemWithSubmenu0)
338 VIEW_TEST(MenuItemViewTestInsertWithSubmenu1, InsertItemWithSubmenu1)
339
340 // Test class for removing a menu item while the menu is open.
341 template<int REMOVE_INDEX, int SELECT_INDEX>
342 class MenuItemViewTestRemove : public MenuItemViewTestBase {
343 public:
344 MenuItemViewTestRemove()
345 : last_command_(0) {
346 }
347
348 virtual ~MenuItemViewTestRemove() {
349 }
350
351 // views::MenuDelegate implementation
352 virtual void ExecuteCommand(int id) OVERRIDE {
353 last_command_ = id;
354 }
355
356 // MenuItemViewTestBase implementation
357 virtual void BuildMenu(views::MenuItemView* menu) OVERRIDE {
358 menu->AppendMenuItemWithLabel(1, ASCIIToUTF16("item 1"));
359 menu->AppendMenuItemWithLabel(2, ASCIIToUTF16("item 2"));
360 menu->AppendMenuItemWithLabel(3, ASCIIToUTF16("item 3"));
361 }
362
363 // ViewEventTestBase implementation
364 virtual void DoTestOnMessageLoop() OVERRIDE {
365 Click(button_, CreateEventTask(this, &MenuItemViewTestRemove::Step1));
366 }
367
368 // Remove item at REMOVE_INDEX and click item at SELECT_INDEX.
369 void Step1() {
370 ASSERT_TRUE(menu_);
371
372 views::SubmenuView* submenu = menu_->GetSubmenu();
373 ASSERT_TRUE(submenu);
374 ASSERT_TRUE(submenu->IsShowing());
375 ASSERT_EQ(3, submenu->GetMenuItemCount());
376
377 // remove
378 menu_->RemoveMenuItemAt(REMOVE_INDEX);
379 menu_->ChildrenChanged();
380
381 // click
382 views::MenuItemView* item = submenu->GetMenuItemAt(SELECT_INDEX);
383 ASSERT_TRUE(item);
384 Click(item, CreateEventTask(this, &MenuItemViewTestRemove::Step2));
385 }
386
387 // Check clicked item and complete test.
388 void Step2() {
389 ASSERT_TRUE(menu_);
390
391 views::SubmenuView* submenu = menu_->GetSubmenu();
392 ASSERT_TRUE(submenu);
393 ASSERT_FALSE(submenu->IsShowing());
394 ASSERT_EQ(2, submenu->GetMenuItemCount());
395
396 if (SELECT_INDEX < REMOVE_INDEX)
397 ASSERT_EQ(SELECT_INDEX + 1, last_command_);
398 else
399 ASSERT_EQ(SELECT_INDEX + 2, last_command_);
400
401 Done();
402 }
403
404 private:
405 int last_command_;
406 };
407
408 typedef MenuItemViewTestRemove<0,0> MenuItemViewTestRemove00;
409 typedef MenuItemViewTestRemove<0,1> MenuItemViewTestRemove01;
410 typedef MenuItemViewTestRemove<1,0> MenuItemViewTestRemove10;
411 typedef MenuItemViewTestRemove<1,1> MenuItemViewTestRemove11;
412 typedef MenuItemViewTestRemove<2,0> MenuItemViewTestRemove20;
413 typedef MenuItemViewTestRemove<2,1> MenuItemViewTestRemove21;
414 VIEW_TEST(MenuItemViewTestRemove00, RemoveItem00)
415 VIEW_TEST(MenuItemViewTestRemove01, RemoveItem01)
416 VIEW_TEST(MenuItemViewTestRemove10, RemoveItem10)
417 VIEW_TEST(MenuItemViewTestRemove11, RemoveItem11)
418 VIEW_TEST(MenuItemViewTestRemove20, RemoveItem20)
419 VIEW_TEST(MenuItemViewTestRemove21, RemoveItem21)
420
421 // Test class for removing a menu item while a submenu is open.
422 template<int REMOVE_INDEX>
423 class MenuItemViewTestRemoveWithSubmenu : public MenuItemViewTestBase {
424 public:
425 MenuItemViewTestRemoveWithSubmenu() :
426 last_command_(0),
427 submenu_(NULL) {
428 }
429
430 virtual ~MenuItemViewTestRemoveWithSubmenu() {
431 }
432
433 // views::MenuDelegate implementation
434 virtual void ExecuteCommand(int id) OVERRIDE {
435 last_command_ = id;
436 }
437
438 // MenuItemViewTestBase implementation
439 virtual void BuildMenu(views::MenuItemView* menu) OVERRIDE {
440 menu->AppendMenuItemWithLabel(1, ASCIIToUTF16("item 1"));
441 submenu_ = menu->AppendSubMenu(2, ASCIIToUTF16("My Submenu"));
442 submenu_->AppendMenuItemWithLabel(101, ASCIIToUTF16("submenu item 1"));
443 submenu_->AppendMenuItemWithLabel(102, ASCIIToUTF16("submenu item 2"));
444 }
445
446 // ViewEventTestBase implementation
447 virtual void DoTestOnMessageLoop() OVERRIDE {
448 Click(button_,
449 CreateEventTask(this, &MenuItemViewTestRemoveWithSubmenu::Step1));
450 }
451
452 // Post submenu.
453 void Step1() {
454 ASSERT_TRUE(menu_);
455
456 views::SubmenuView* submenu = menu_->GetSubmenu();
457 ASSERT_TRUE(submenu);
458 ASSERT_TRUE(submenu->IsShowing());
459
460 Click(submenu_,
461 CreateEventTask(this, &MenuItemViewTestRemoveWithSubmenu::Step2));
462 }
463
464 // Remove item at REMOVE_INDEX and select it to exit the menu loop.
465 void Step2() {
466 ASSERT_TRUE(menu_);
467
468 views::SubmenuView* submenu = menu_->GetSubmenu();
469 ASSERT_TRUE(submenu);
470 ASSERT_TRUE(submenu->IsShowing());
471 ASSERT_EQ(2, submenu->GetMenuItemCount());
472
473 // remove
474 menu_->RemoveMenuItemAt(REMOVE_INDEX);
475 menu_->ChildrenChanged();
476
477 // click
478 Click(button_,
479 CreateEventTask(this, &MenuItemViewTestRemoveWithSubmenu::Step3));
480 }
481
482 void Step3() {
483 ASSERT_TRUE(menu_);
484
485 views::SubmenuView* submenu = menu_->GetSubmenu();
486 ASSERT_TRUE(submenu);
487 ASSERT_FALSE(submenu->IsShowing());
488 ASSERT_EQ(1, submenu->GetMenuItemCount());
489
490 Done();
491 }
492
493 private:
494 int last_command_;
495 views::MenuItemView* submenu_;
496 };
497
498 typedef MenuItemViewTestRemoveWithSubmenu<0> MenuItemViewTestRemoveWithSubmenu0;
499 typedef MenuItemViewTestRemoveWithSubmenu<1> MenuItemViewTestRemoveWithSubmenu1;
500 VIEW_TEST(MenuItemViewTestRemoveWithSubmenu0, RemoveItemWithSubmenu0)
501 VIEW_TEST(MenuItemViewTestRemoveWithSubmenu1, RemoveItemWithSubmenu1)
OLDNEW
« no previous file with comments | « chrome/browser/ui/views/menu_item_view_interactive_uitest.cc ('k') | chrome/browser/ui/views/menu_test_base.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698