1 // Copyright 2014 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.
5 #include "base/strings/utf_string_conversions.h"
6 #include "chrome/browser/ui/views/menu_test_base.h"
7 #include "ui/views/controls/menu/menu_item_view.h"
8 #include "ui/views/controls/menu/submenu_view.h"
10 using base::ASCIIToUTF16
;
12 // Simple test for clicking a menu item. This template class clicks on an
13 // item and checks that the returned id matches. The index of the item
14 // is the template argument.
16 class MenuItemViewTestBasic
: public MenuTestBase
{
18 MenuItemViewTestBasic() {
21 ~MenuItemViewTestBasic() override
{
24 // MenuTestBase implementation
25 void BuildMenu(views::MenuItemView
* menu
) override
{
26 menu
->AppendMenuItemWithLabel(1, ASCIIToUTF16("item 1"));
27 menu
->AppendMenuItemWithLabel(2, ASCIIToUTF16("item 2"));
28 menu
->AppendSeparator();
29 menu
->AppendMenuItemWithLabel(3, ASCIIToUTF16("item 3"));
32 // Click on item INDEX.
33 void DoTestWithMenuOpen() override
{
34 views::SubmenuView
* submenu
= menu()->GetSubmenu();
36 ASSERT_TRUE(submenu
->IsShowing());
37 ASSERT_EQ(3, submenu
->GetMenuItemCount());
39 // click an item and pass control to the next step
40 views::MenuItemView
* item
= submenu
->GetMenuItemAt(INDEX
);
42 Click(item
, CreateEventTask(this, &MenuItemViewTestBasic::Step2
));
45 // Check the clicked item and complete the test.
47 ASSERT_FALSE(menu()->GetSubmenu()->IsShowing());
48 ASSERT_EQ(INDEX
+ 1, last_command());
53 DISALLOW_COPY_AND_ASSIGN(MenuItemViewTestBasic
);
57 // flaky on Windows - http://crbug.com/523255
58 #define MAYBE_SelectItem2 DISABLED_SelectItem2
59 #define MAYBE_SelectItem0 DISABLED_SelectItem0
61 #define MAYBE_SelectItem2 SelectItem2
62 #define MAYBE_SelectItem0 SelectItem0
65 // Click each item of a 3-item menu (with separator).
66 typedef MenuItemViewTestBasic
<0> MenuItemViewTestBasic0
;
67 typedef MenuItemViewTestBasic
<1> MenuItemViewTestBasic1
;
68 typedef MenuItemViewTestBasic
<2> MenuItemViewTestBasic2
;
69 VIEW_TEST(MenuItemViewTestBasic0
, MAYBE_SelectItem0
)
70 VIEW_TEST(MenuItemViewTestBasic1
, SelectItem1
)
72 VIEW_TEST(MenuItemViewTestBasic2
, MAYBE_SelectItem2
)
74 // Test class for inserting a menu item while the menu is open.
75 template<int INSERT_INDEX
, int SELECT_INDEX
>
76 class MenuItemViewTestInsert
: public MenuTestBase
{
78 MenuItemViewTestInsert() : inserted_item_(NULL
) {
81 ~MenuItemViewTestInsert() override
{
84 // MenuTestBase implementation
85 void BuildMenu(views::MenuItemView
* menu
) override
{
86 menu
->AppendMenuItemWithLabel(1, ASCIIToUTF16("item 1"));
87 menu
->AppendMenuItemWithLabel(2, ASCIIToUTF16("item 2"));
90 // Insert item at INSERT_INDEX and click item at SELECT_INDEX.
91 void DoTestWithMenuOpen() override
{
92 LOG(ERROR
) << "\nDoTestWithMenuOpen\n";
93 views::SubmenuView
* submenu
= menu()->GetSubmenu();
95 ASSERT_TRUE(submenu
->IsShowing());
96 ASSERT_EQ(2, submenu
->GetMenuItemCount());
98 inserted_item_
= menu()->AddMenuItemAt(INSERT_INDEX
,
100 ASCIIToUTF16("inserted item"),
104 views::MenuItemView::NORMAL
,
105 ui::NORMAL_SEPARATOR
);
106 ASSERT_TRUE(inserted_item_
);
107 menu()->ChildrenChanged();
109 // click an item and pass control to the next step
110 views::MenuItemView
* item
= submenu
->GetMenuItemAt(SELECT_INDEX
);
112 Click(item
, CreateEventTask(this, &MenuItemViewTestInsert::Step2
));
115 // Check clicked item and complete test.
117 LOG(ERROR
) << "\nStep2\n";
118 views::SubmenuView
* submenu
= menu()->GetSubmenu();
119 ASSERT_TRUE(submenu
);
120 ASSERT_FALSE(submenu
->IsShowing());
121 ASSERT_EQ(3, submenu
->GetMenuItemCount());
123 if (SELECT_INDEX
== INSERT_INDEX
)
124 ASSERT_EQ(1000, last_command());
125 else if (SELECT_INDEX
< INSERT_INDEX
)
126 ASSERT_EQ(SELECT_INDEX
+ 1, last_command());
128 ASSERT_EQ(SELECT_INDEX
, last_command());
130 LOG(ERROR
) << "\nDone\n";
135 views::MenuItemView
* inserted_item_
;
137 DISALLOW_COPY_AND_ASSIGN(MenuItemViewTestInsert
);
140 // MenuItemViewTestInsertXY inserts an item at index X and selects the
141 // item at index Y (after the insertion). The tests here cover
142 // inserting at the beginning, middle, and end, crossbarred with
143 // selecting the first and last item.
144 typedef MenuItemViewTestInsert
<0,0> MenuItemViewTestInsert00
;
145 typedef MenuItemViewTestInsert
<0,2> MenuItemViewTestInsert02
;
146 typedef MenuItemViewTestInsert
<1,0> MenuItemViewTestInsert10
;
147 typedef MenuItemViewTestInsert
<1,2> MenuItemViewTestInsert12
;
148 typedef MenuItemViewTestInsert
<2,0> MenuItemViewTestInsert20
;
149 typedef MenuItemViewTestInsert
<2,2> MenuItemViewTestInsert22
;
152 // flaky on Windows - http://crbug.com/523255
153 #define MAYBE_InsertItem00 DISABLED_InsertItem00
154 #define MAYBE_InsertItem02 DISABLED_InsertItem02
155 #define MAYBE_InsertItem10 DISABLED_InsertItem10
157 #define MAYBE_InsertItem00 InsertItem00
158 #define MAYBE_InsertItem02 InsertItem02
159 #define MAYBE_InsertItem10 InsertItem10
161 VIEW_TEST(MenuItemViewTestInsert00
, MAYBE_InsertItem00
)
163 VIEW_TEST(MenuItemViewTestInsert02
, MAYBE_InsertItem02
)
164 VIEW_TEST(MenuItemViewTestInsert10
, MAYBE_InsertItem10
)
167 // flaky on Windows - http://crbug.com/523255
168 #define MAYBE_InsertItem12 DISABLED_InsertItem12
170 #define MAYBE_InsertItem12 InsertItem12
172 VIEW_TEST(MenuItemViewTestInsert12
, MAYBE_InsertItem12
)
174 VIEW_TEST(MenuItemViewTestInsert20
, InsertItem20
)
177 // flaky on Windows - http://crbug.com/523255
178 #define MAYBE_InsertItem22 DISABLED_InsertItem22
180 #define MAYBE_InsertItem22 InsertItem22
182 VIEW_TEST(MenuItemViewTestInsert22
, MAYBE_InsertItem22
)
184 // Test class for inserting a menu item while a submenu is open.
185 template<int INSERT_INDEX
>
186 class MenuItemViewTestInsertWithSubmenu
: public MenuTestBase
{
188 MenuItemViewTestInsertWithSubmenu() :
190 inserted_item_(NULL
) {
193 ~MenuItemViewTestInsertWithSubmenu() override
{
196 // MenuTestBase implementation
197 void BuildMenu(views::MenuItemView
* menu
) override
{
198 submenu_
= menu
->AppendSubMenu(1, ASCIIToUTF16("My Submenu"));
199 submenu_
->AppendMenuItemWithLabel(101, ASCIIToUTF16("submenu item 1"));
200 submenu_
->AppendMenuItemWithLabel(101, ASCIIToUTF16("submenu item 2"));
201 menu
->AppendMenuItemWithLabel(2, ASCIIToUTF16("item 2"));
205 void DoTestWithMenuOpen() override
{
207 CreateEventTask(this, &MenuItemViewTestInsertWithSubmenu::Step2
));
210 // Insert item at INSERT_INDEX.
212 inserted_item_
= menu()->AddMenuItemAt(INSERT_INDEX
,
214 ASCIIToUTF16("inserted item"),
218 views::MenuItemView::NORMAL
,
219 ui::NORMAL_SEPARATOR
);
220 ASSERT_TRUE(inserted_item_
);
221 menu()->ChildrenChanged();
223 Click(inserted_item_
,
224 CreateEventTask(this, &MenuItemViewTestInsertWithSubmenu::Step3
));
232 views::MenuItemView
* submenu_
;
233 views::MenuItemView
* inserted_item_
;
235 DISALLOW_COPY_AND_ASSIGN(MenuItemViewTestInsertWithSubmenu
);
238 // MenuItemViewTestInsertWithSubmenuX posts a menu and its submenu,
239 // then inserts an item in the top-level menu at X.
240 typedef MenuItemViewTestInsertWithSubmenu
<0> MenuItemViewTestInsertWithSubmenu0
;
241 typedef MenuItemViewTestInsertWithSubmenu
<1> MenuItemViewTestInsertWithSubmenu1
;
245 // flaky on Windows - http://crbug.com/523255
246 #define MAYBE_InsertItemWithSubmenu0 DISABLED_InsertItemWithSubmenu0
247 #define MAYBE_InsertItemWithSubmenu1 DISABLED_InsertItemWithSubmenu1
249 #define MAYBE_InsertItemWithSubmenu0 InsertItemWithSubmenu0
250 #define MAYBE_InsertItemWithSubmenu1 InsertItemWithSubmenu1
252 VIEW_TEST(MenuItemViewTestInsertWithSubmenu0
, MAYBE_InsertItemWithSubmenu0
)
253 VIEW_TEST(MenuItemViewTestInsertWithSubmenu1
, MAYBE_InsertItemWithSubmenu1
)
255 // Test class for removing a menu item while the menu is open.
256 template<int REMOVE_INDEX
, int SELECT_INDEX
>
257 class MenuItemViewTestRemove
: public MenuTestBase
{
259 MenuItemViewTestRemove() {
262 ~MenuItemViewTestRemove() override
{
265 // MenuTestBase implementation
266 void BuildMenu(views::MenuItemView
* menu
) override
{
267 menu
->AppendMenuItemWithLabel(1, ASCIIToUTF16("item 1"));
268 menu
->AppendMenuItemWithLabel(2, ASCIIToUTF16("item 2"));
269 menu
->AppendMenuItemWithLabel(3, ASCIIToUTF16("item 3"));
272 // Remove item at REMOVE_INDEX and click item at SELECT_INDEX.
273 void DoTestWithMenuOpen() override
{
274 views::SubmenuView
* submenu
= menu()->GetSubmenu();
275 ASSERT_TRUE(submenu
);
276 ASSERT_TRUE(submenu
->IsShowing());
277 ASSERT_EQ(3, submenu
->GetMenuItemCount());
280 menu()->RemoveMenuItemAt(REMOVE_INDEX
);
281 menu()->ChildrenChanged();
284 views::MenuItemView
* item
= submenu
->GetMenuItemAt(SELECT_INDEX
);
286 Click(item
, CreateEventTask(this, &MenuItemViewTestRemove::Step2
));
289 // Check clicked item and complete test.
291 views::SubmenuView
* submenu
= menu()->GetSubmenu();
292 ASSERT_TRUE(submenu
);
293 ASSERT_FALSE(submenu
->IsShowing());
294 ASSERT_EQ(2, submenu
->GetMenuItemCount());
296 if (SELECT_INDEX
< REMOVE_INDEX
)
297 ASSERT_EQ(SELECT_INDEX
+ 1, last_command());
299 ASSERT_EQ(SELECT_INDEX
+ 2, last_command());
305 DISALLOW_COPY_AND_ASSIGN(MenuItemViewTestRemove
);
308 typedef MenuItemViewTestRemove
<0,0> MenuItemViewTestRemove00
;
309 typedef MenuItemViewTestRemove
<0,1> MenuItemViewTestRemove01
;
310 typedef MenuItemViewTestRemove
<1,0> MenuItemViewTestRemove10
;
311 typedef MenuItemViewTestRemove
<1,1> MenuItemViewTestRemove11
;
312 typedef MenuItemViewTestRemove
<2,0> MenuItemViewTestRemove20
;
313 typedef MenuItemViewTestRemove
<2,1> MenuItemViewTestRemove21
;
314 VIEW_TEST(MenuItemViewTestRemove00
, RemoveItem00
)
315 VIEW_TEST(MenuItemViewTestRemove01
, RemoveItem01
)
318 // flaky on Windows - http://crbug.com/523255
319 #define MAYBE_RemoveItem10 DISABLED_RemoveItem10
321 #define MAYBE_RemoveItem10 RemoveItem10
323 VIEW_TEST(MenuItemViewTestRemove10
, MAYBE_RemoveItem10
)
326 // flaky on Windows - http://crbug.com/523255
327 #define MAYBE_RemoveItem11 DISABLED_RemoveItem11
329 #define MAYBE_RemoveItem11 RemoveItem11
331 VIEW_TEST(MenuItemViewTestRemove11
, MAYBE_RemoveItem11
)
334 // flaky on Windows - http://crbug.com/523255
335 #define MAYBE_RemoveItem20 DISABLED_RemoveItem20
337 #define MAYBE_RemoveItem20 RemoveItem20
339 VIEW_TEST(MenuItemViewTestRemove20
, MAYBE_RemoveItem20
)
341 VIEW_TEST(MenuItemViewTestRemove21
, RemoveItem21
)
343 // Test class for removing a menu item while a submenu is open.
344 template<int REMOVE_INDEX
>
345 class MenuItemViewTestRemoveWithSubmenu
: public MenuTestBase
{
347 MenuItemViewTestRemoveWithSubmenu() : submenu_(NULL
) {
350 ~MenuItemViewTestRemoveWithSubmenu() override
{
353 // MenuTestBase implementation
354 void BuildMenu(views::MenuItemView
* menu
) override
{
355 menu
->AppendMenuItemWithLabel(1, ASCIIToUTF16("item 1"));
356 submenu_
= menu
->AppendSubMenu(2, ASCIIToUTF16("My Submenu"));
357 submenu_
->AppendMenuItemWithLabel(101, ASCIIToUTF16("submenu item 1"));
358 submenu_
->AppendMenuItemWithLabel(102, ASCIIToUTF16("submenu item 2"));
362 void DoTestWithMenuOpen() override
{
363 views::SubmenuView
* submenu
= menu()->GetSubmenu();
364 ASSERT_TRUE(submenu
);
365 ASSERT_TRUE(submenu
->IsShowing());
368 CreateEventTask(this, &MenuItemViewTestRemoveWithSubmenu::Step2
));
371 // Remove item at REMOVE_INDEX and press escape to exit the menu loop.
373 views::SubmenuView
* submenu
= menu()->GetSubmenu();
374 ASSERT_TRUE(submenu
);
375 ASSERT_TRUE(submenu
->IsShowing());
376 ASSERT_EQ(2, submenu
->GetMenuItemCount());
379 menu()->RemoveMenuItemAt(REMOVE_INDEX
);
380 menu()->ChildrenChanged();
383 KeyPress(ui::VKEY_ESCAPE
,
384 CreateEventTask(this, &MenuItemViewTestRemoveWithSubmenu::Step3
));
388 views::SubmenuView
* submenu
= menu()->GetSubmenu();
389 ASSERT_TRUE(submenu
);
390 ASSERT_FALSE(submenu
->IsShowing());
391 ASSERT_EQ(1, submenu
->GetMenuItemCount());
397 views::MenuItemView
* submenu_
;
399 DISALLOW_COPY_AND_ASSIGN(MenuItemViewTestRemoveWithSubmenu
);
402 typedef MenuItemViewTestRemoveWithSubmenu
<0> MenuItemViewTestRemoveWithSubmenu0
;
403 typedef MenuItemViewTestRemoveWithSubmenu
<1> MenuItemViewTestRemoveWithSubmenu1
;
405 #if defined(USE_OZONE) || defined(OS_WIN)
406 // ozone bringup - http://crbug.com/401304
407 // flaky on Windows - http://crbug.com/523255
408 #define MAYBE_RemoveItemWithSubmenu0 DISABLED_RemoveItemWithSubmenu0
409 #define MAYBE_RemoveItemWithSubmenu1 DISABLED_RemoveItemWithSubmenu1
411 #define MAYBE_RemoveItemWithSubmenu0 RemoveItemWithSubmenu0
412 #define MAYBE_RemoveItemWithSubmenu1 RemoveItemWithSubmenu1
414 VIEW_TEST(MenuItemViewTestRemoveWithSubmenu0
, MAYBE_RemoveItemWithSubmenu0
)
415 VIEW_TEST(MenuItemViewTestRemoveWithSubmenu1
, MAYBE_RemoveItemWithSubmenu1
)