on xenial help sign in
more test fixes
commitf776d67d3d4093a145fdb2b463cf7451c5933b2d authorNick Dedekind <nick.dedekind@canonical.com> dateFri 7 Oct 2016, 13:22 (10 years ago) parentf7a888f
11 files changed+317−311
qml/ApplicationMenus/MenuBarLoader.qml → qml/ApplicationMenus/MenuBar.qml+5−3 qml/ApplicationMenus/MenuItemLoader.qml → qml/ApplicationMenus/MenuItem.qml+3−1 qml/ApplicationMenus/MenuLoader.qml → qml/ApplicationMenus/MenuPopup.qml+27−5 qml/Panel/Panel.qml+1−1 qml/Stage/WindowDecoration.qml+1−1 tests/qmltests/ApplicationMenuDataLoader.qml+17 tests/qmltests/ApplicationMenus/tst_MenuBar.qml+55−38 tests/qmltests/ApplicationMenus/tst_MenuPage.qml−258 tests/qmltests/ApplicationMenus/tst_MenuPopup.qml+204 tests/qmltests/CMakeLists.txt+1−1 tests/qmltests/Stage/tst_WindowDecoration.qml+3−3
qml/ApplicationMenus/MenuBarLoader.qml → qml/ApplicationMenus/MenuBar.qmlrenamed+5−3
@@ -21,6 +21,7 @@ import Ubuntu.Components 1.3
2121
2222Item {
2323 id: root
24+ objectName: "menuBar"
2425
2526 property alias unityMenuModel: rowRepeater.model
2627
@@ -94,7 +95,7 @@ Item {
9495
9596 Item {
9697 id: visualItem
97− objectName: "menuBarItem"
98+ objectName: root.objectName + "-item" + __index
9899
99100 readonly property int __index: index
100101 property Item __popup: null;
@@ -108,7 +109,7 @@ Item {
108109
109110 function show() {
110111 if (!__popup) {
111− __popup = menuComponent.createObject(root);
112+ __popup = menuComponent.createObject(root, { objectName: visualItem.objectName + "-menu" });
112113 } else {
113114 __popup.visible = true;
114115 }
@@ -133,7 +134,7 @@ Item {
133134
134135 Component {
135136 id: menuComponent
136− MenuLoader {
137+ MenuPopup {
137138 x: visualItem.x - units.gu(1)
138139 anchors.top: parent.bottom
139140 unityMenuModel: root.unityMenuModel.submenu(visualItem.__index)
@@ -203,6 +204,7 @@ Item {
203204
204205 QtObject {
205206 id: d
207+ objectName: "d"
206208
207209 property Item currentItem: null
208210 property Item hoveredItem: null
qml/ApplicationMenus/MenuItemLoader.qml → qml/ApplicationMenus/MenuItem.qmlrenamed+3−1
@@ -41,12 +41,14 @@ ActionItem {
4141 }
4242
4343 readonly property bool hasSubmenu: menuData ? menuData.hasSubmenu : false
44− readonly property bool _checked : action && action.parameterType === Action.Bool && action.state == true
44+ readonly property bool _checked : action && action.checkable ? action.checked : false
4545
4646 enabled: menuData ? menuData.sensitive : false
4747
4848 action: Action {
4949 text: menuData.label.replace("_", "&")
50+ checkable: menuData.isCheck || menuData.isRadio
51+ // TODO - exclusive groups.
5052 }
5153
5254 width: {
qml/ApplicationMenus/MenuLoader.qml → qml/ApplicationMenus/MenuPopup.qmlrenamed+27−5
@@ -23,6 +23,7 @@ import "../Components"
2323
2424UbuntuShape {
2525 id: root
26+ objectName: "menu"
2627 backgroundColor: theme.palette.normal.overlay
2728
2829 property alias unityMenuModel: listView.model
@@ -43,6 +44,10 @@ UbuntuShape {
4344 d.select(index)
4445 }
4546
47+ function dismiss() {
48+ d.dismissAll()
49+ }
50+
4651 implicitWidth: container.width
4752 implicitHeight: MathUtils.clamp(listView.contentHeight, __ajustedMinimumHeight, __maximumHeight)
4853
@@ -65,12 +70,14 @@ UbuntuShape {
6570
6671 QtObject {
6772 id: d
73+ objectName: "d"
6874
6975 property Item currentItem: null
7076 property Item hoveredItem: null
7177 readonly property int currentIndex: currentItem ? currentItem.__ownIndex : -1
7278
7379 signal select(int index)
80+ signal dismissAll()
7481
7582 onCurrentItemChanged: {
7683 if (currentItem) {
@@ -253,6 +260,7 @@ UbuntuShape {
253260
254261 delegate: Loader {
255262 id: loader
263+ objectName: root.objectName + "-item" + __ownIndex
256264
257265 property int __ownIndex: index
258266
@@ -271,9 +279,10 @@ UbuntuShape {
271279
272280 Component {
273281 id: menuItemComponent
274− MenuItemLoader {
282+ MenuItem {
275283 id: menuItem
276284 menuData: model
285+ objectName: loader.objectName + "-actionItem"
277286
278287 action.onTriggered: {
279288 d.currentItem = loader;
@@ -282,9 +291,10 @@ UbuntuShape {
282291 if (!popup) {
283292 var model = root.unityMenuModel.submenu(__ownIndex);
284293 popup = submenuComponent.createObject(root, {
285− "unityMenuModel": model,
286− "x": Qt.binding(function() { return root.width }),
287− "y": Qt.binding(function() { return loader.y })
294+ objectName: loader.objectName + "-",
295+ unityMenuModel: model,
296+ x: Qt.binding(function() { return root.width }),
297+ y: Qt.binding(function() { return loader.y })
288298 });
289299 } else if (popup) {
290300 popup.visible = true;
@@ -314,6 +324,7 @@ UbuntuShape {
314324 Component {
315325 id: separatorComponent
316326 ListItems.ThinDivider {
327+ objectName: loader.objectName + "-separator"
317328 }
318329 }
319330 }
@@ -361,7 +372,7 @@ UbuntuShape {
361372 id: submenuComponent
362373 Loader {
363374 id: submenuLoader
364− source: "MenuLoader.qml"
375+ source: "MenuPopup.qml"
365376
366377 property var unityMenuModel: null
367378 signal dismiss()
@@ -372,6 +383,17 @@ UbuntuShape {
372383 value: submenuLoader.unityMenuModel
373384 }
374385
386+ Binding {
387+ target: item
388+ property: "objectName"
389+ value: submenuLoader.objectName + "menu"
390+ }
391+
392+ Connections {
393+ target: d
394+ onDismissAll: submenuLoader.dismiss()
395+ }
396+
375397 Keys.onLeftPressed: dismiss()
376398
377399 Component.onCompleted: item.select(0);
qml/Panel/Panel.qml+1−1
@@ -336,7 +336,7 @@ Item {
336336
337337 property bool menusRequested: menuBarLoader.item ? menuBarLoader.item.showRequested : false
338338
339− sourceComponent: MenuBarLoader {
339+ sourceComponent: MenuBar {
340340 id: bar
341341 height: menuBarLoader.height
342342 enableKeyFilter: valid && PanelState.decorationsVisible
qml/Stage/WindowDecoration.qml+1−1
@@ -141,7 +141,7 @@ MouseArea {
141141
142142 Component {
143143 id: menuBarComponent
144− MenuBarLoader {
144+ MenuBar {
145145 id: menuBar
146146 height: menuBarLoader.height
147147 enableKeyFilter: priv.enableMenus
tests/qmltests/ApplicationMenuDataLoader.qml+17
@@ -52,4 +52,21 @@ Object {
5252 }
5353 return data;
5454 }
55+
56+ // Test Data
57+ property var singleCheckable: [{
58+ "rowData": { // 1
59+ "label": "checkable1",
60+ "sensitive": true,
61+ "isSeparator": false,
62+ "icon": "",
63+ "ext": {},
64+ "action": "checkable1",
65+ "actionState": {},
66+ "isCheck": true,
67+ "isRadio": false,
68+ "isToggled": false,
69+ "shortcut": "Alt+F"
70+ }
71+ }]
5572}
tests/qmltests/ApplicationMenus/tst_MenuBar.qml+55−38
@@ -24,7 +24,7 @@ import Unity.Test 0.1
2424import Utils 0.1
2525
2626import "../../../qml/ApplicationMenus"
27−import "../Stages"
27+import ".."
2828
2929Item {
3030 id: root
@@ -42,7 +42,7 @@ Item {
4242 value: false
4343 }
4444
45− DesktopMenuData { id: desktopMenuData }
45+ ApplicationMenuDataLoader { id: appMenuData }
4646
4747 Rectangle {
4848 anchors {
@@ -54,13 +54,13 @@ Item {
5454 height: units.gu(3)
5555 color: "grey"
5656
57− MenuBarLoader {
57+ MenuBar {
5858 id: menuBar
5959 anchors.fill: parent
6060
6161 unityMenuModel: UnityMenuModel {
6262 id: menuBackend
63− modelData: desktopMenuData.testData
63+ modelData: appMenuData.generateTestData(7,5,2,3,"menu")
6464 }
6565 }
6666 }
@@ -73,65 +73,82 @@ Item {
7373
7474 UnityTestCase {
7575 id: testCase
76− name: "MenuPage"
76+ name: "MenuBar"
7777 when: windowShown
7878
7979 property bool clickNavigate: true
8080
8181 function init() {
82− menuBar.closePopup();
83− menuBackend.modelData = desktopMenuData.generateTestData(3, 2, 0);
82+ menuBar.dismiss();
83+ menuBackend.modelData = appMenuData.generateTestData(5,5,2,3,"menu")
8484 activatedSpy.clear();
8585 }
8686
87− function test_mnemonics_data() {
88− return [
89− { tag: "a" },
90− { tag: "b" },
91− ]
92− }
87+ function test_keyboardNavigation_RightKeySelectsNextMenuItem(data) {
88+ menuBackend.modelData = appMenuData.generateTestData(3,3,0,0,"menu");
89+ var priv = findInvisibleChild(menuBar, "d");
9390
94− function test_mnemonics(data) {
95− menuBackend.modelData = desktopMenuData.generateTestData(3, 2, 0);
91+ var menuItem0 = findChild(menuBar, "menuBar-item0"); verify(menuItem0);
92+ var menuItem1 = findChild(menuBar, "menuBar-item1"); verify(menuItem1);
93+ var menuItem2 = findChild(menuBar, "menuBar-item2"); verify(menuItem2);
9694
97− keyPress(data.tag, Qt.AltModifier, 100);
98− tryCompareFunction(function() { return menuBar.openItem !== undefined; }, true);
99− }
100−
101− function test_navigateRight(data) {
102− var menuItem0 = findChild(menuBar, "menuBar-menu0"); verify(menuItem0);
103− var menuItem1 = findChild(menuBar, "menuBar-menu1"); verify(menuItem1);
104− var menuItem2 = findChild(menuBar, "menuBar-menu2"); verify(menuItem2);
105−
106− menuBar.open(menuItem0, true);
107− compare(menuBar.openItem, menuItem0);
95+ menuItem0.show();
96+ compare(priv.currentItem, menuItem0, "CurrentItem should be set to item 0");
97+ compare(priv.currentItem.popupVisible, true, "Popup should be visible");
10898
10999 keyClick(Qt.Key_Right, Qt.NoModifier);
110− compare(menuBar.openItem, menuItem1);
100+ compare(priv.currentItem, menuItem1, "CurrentItem should have moved to item 1");
101+ compare(menuItem1.popupVisible, true, "Popup should be visible");
111102
112103 keyClick(Qt.Key_Right, Qt.NoModifier);
113− compare(menuBar.openItem, menuItem2);
104+ compare(priv.currentItem, menuItem2, "CurrentItem should have moved to item 2");
105+ compare(menuItem2.popupVisible, true, "Popup should be visible");
114106
115107 keyClick(Qt.Key_Right, Qt.NoModifier);
116− compare(menuBar.openItem, menuItem0);
108+ compare(priv.currentItem, menuItem0, "CurrentItem should have moved back to item 0");
109+ compare(menuItem0.popupVisible, true, "Popup should be visible");
117110 }
118111
119− function test_navigateLeft(data) {
120− var menuItem0 = findChild(menuBar, "menuBar-menu0"); verify(menuItem0);
121− var menuItem1 = findChild(menuBar, "menuBar-menu1"); verify(menuItem1);
122− var menuItem2 = findChild(menuBar, "menuBar-menu2"); verify(menuItem2);
112+ function test_keyboardNavigation_LeftKeySelectsPreviousMenuItem(data) {
113+ menuBackend.modelData = appMenuData.generateTestData(3,3,0,0,"menu");
114+ var priv = findInvisibleChild(menuBar, "d");
123115
124− menuBar.open(menuItem0, true);
125− compare(menuBar.openItem, menuItem0);
116+ var menuItem0 = findChild(menuBar, "menuBar-item0"); verify(menuItem0);
117+ var menuItem1 = findChild(menuBar, "menuBar-item1"); verify(menuItem1);
118+ var menuItem2 = findChild(menuBar, "menuBar-item2"); verify(menuItem2);
119+
120+ menuItem0.show();
121+ compare(priv.currentItem, menuItem0, "CurrentItem should be set to item 0");
122+ compare(priv.currentItem.popupVisible, true, "Popup should be visible");
126123
127124 keyClick(Qt.Key_Left, Qt.NoModifier);
128− compare(menuBar.openItem, menuItem2);
125+ compare(priv.currentItem, menuItem2, "CurrentItem should have moved to item 2");
126+ compare(menuItem2.popupVisible, true, "Popup should be visible");
129127
130128 keyClick(Qt.Key_Left, Qt.NoModifier);
131− compare(menuBar.openItem, menuItem1);
129+ compare(priv.currentItem, menuItem1, "CurrentItem should have moved to item 1");
130+ compare(menuItem1.popupVisible, true, "Popup should be visible");
132131
133132 keyClick(Qt.Key_Left, Qt.NoModifier);
134− compare(menuBar.openItem, menuItem0);
133+ compare(priv.currentItem, menuItem0, "CurrentItem should have moved back to item 0");
134+ compare(menuItem0.popupVisible, true, "Popup should be visible");
135+ }
136+
137+ function test_mnemonics_data() {
138+ return [
139+ { tag: "a", expectedItem: "menuBar-item0" },
140+ { tag: "c", expectedItem: "menuBar-item2" },
141+ ]
142+ }
143+
144+ function test_mnemonics(data) {
145+ menuBackend.modelData = appMenuData.generateTestData(3,3,0,0,"menu");
146+ var priv = findInvisibleChild(menuBar, "d");
147+
148+ var menuItem = findChild(menuBar, data.expectedItem); verify(menuItem);
149+
150+ keyPress(data.tag, Qt.AltModifier, 100);
151+ tryCompare(priv, "currentItem", menuItem);
135152 }
136153 }
137154}
tests/qmltests/ApplicationMenus/tst_MenuPage.qmldeleted−258
@@ -1,258 +0,0 @@
1−/*
2− * Copyright (C) 2016 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.4
18−import QtTest 1.0
19−import Ubuntu.Components 1.3
20−import Ubuntu.Components.ListItems 1.3
21−import Unity.Application 0.1
22−import QMenuModel 0.1
23−import Unity.Test 0.1
24−import Utils 0.1
25−
26−import "../../../qml/ApplicationMenus"
27−import "../Stages"
28−
29−Item {
30− id: root
31− width: Math.max(units.gu(100), page.width + units.gu(6))
32− height: Math.max(units.gu(50), page.height + units.gu(6))
33−
34− Binding {
35− target: MouseTouchAdaptor
36− property: "enabled"
37− value: false
38− }
39−
40− DesktopMenuData { id: desktopMenuData }
41−
42− Keys.onEscapePressed: {
43− page.closePopup(true);
44− }
45−
46− MenuPage {
47− id: page
48− focus: true
49−
50− anchors {
51− left: parent.left
52− top: parent.top
53− leftMargin: units.gu(3)
54− topMargin: units.gu(3)
55− }
56−
57− delegateModel: rootDelegate.submenuItems
58− MenuItemDelegateBase {
59− id: rootDelegate
60− menuModel: UnityMenuModel {
61− id: menuBackend
62− modelData: desktopMenuData.generateTestData(3, 3, 0);
63− }
64− }
65− }
66−
67− SignalSpy {
68− id: activatedSpy
69− target: menuBackend
70− signalName: "activated"
71− }
72−
73− UnityTestCase {
74− id: testCase
75− name: "MenuPage"
76− when: windowShown
77−
78− property bool clickNavigate: true
79−
80− function init() {
81− page.closePopup(true);
82− menuBackend.modelData = desktopMenuData.generateTestData(3, 3, 0);
83− activatedSpy.clear();
84− }
85−
86− // visit and verify that all the backend menus have been created
87− function recurseMenuConstruction(rows, menuPageName) {
88− for (var i = 0; i < rows.length; ++i) {
89− var rowData = rows[i]["rowData"];
90−
91− var menuPage = findChild(page, menuPageName);
92− verify(menuPage);
93− var menuItem = findChild(menuPage, menuPageName+"-menu"+i);
94− verify(menuItem);
95−
96− // recurse into submenu
97− var submenu = rows[i]["submenu"];
98− if (submenu) {
99− if (clickNavigate) {
100− mouseClick(menuItem, menuItem.width/2, menuItem.height/2);
101− } else {
102− mouseMove(menuItem, menuItem.width/2, menuItem.height/2);
103− }
104− tryCompare(menuPage, "openItem", menuItem);
105− recurseMenuConstruction(submenu, menuPageName+"-subMenu"+i);
106− }
107− }
108− }
109−
110− function test_hoverNavigation_data() {
111− return [
112− { tag: "long", testData: desktopMenuData.generateTestData(4, 2, 0) },
113− { tag: "deep", testData: desktopMenuData.generateTestData(2, 4, 0) }
114− ]
115− }
116−
117− function test_hoverNavigation(data) {
118− clickNavigate = false;
119− menuBackend.modelData = data.testData;
120−
121− recurseMenuConstruction(data.testData, "menuPage");
122− }
123−
124− function test_clickNavigation_data() {
125− return [
126− { tag: "long", testData: desktopMenuData.generateTestData(4, 2, 0) },
127− { tag: "deep", testData: desktopMenuData.generateTestData(2, 4, 0) }
128− ]
129− }
130−
131− function test_clickNavigation(data) {
132− clickNavigate = true;
133− menuBackend.modelData = data.testData;
134−
135− recurseMenuConstruction(data.testData, "menuPage");
136− }
137−
138− function test_checkableMenuTogglesOnClick() {
139− menuBackend.modelData = desktopMenuData.singleCheckable;
140−
141− var menuItem = findChild(page, "menuPage-menu0");
142− verify(menuItem);
143− verify(menuItem.delegate.isCheck);
144− verify(menuItem.delegate.isToggled === false);
145−
146− mouseClick(menuItem, menuItem.width/2, menuItem.height/2);
147−
148− compare(menuItem.delegate.isToggled, true, "Checkable menu should have toggled");
149− }
150−
151− function test_keyboardNavigation_DownKeySelectsAndOpensNextMenuItemAndRotates() {
152− menuBackend.modelData = desktopMenuData.generateTestData(4, 2, 3);
153− var listView = findChild(page, "menuPage-ListView");
154− verify(listView);
155−
156− var menuItem0 = findChild(page, "menuPage-menu0"); verify(menuItem0);
157− var menuItem1 = findChild(page, "menuPage-menu1"); verify(menuItem1);
158− var menuItem2 = findChild(page, "menuPage-menu2"); verify(menuItem2);
159− verify(menuItem2.delegate.isSeparator);
160− var menuItem3 = findChild(page, "menuPage-menu3"); verify(menuItem3);
161−
162− keyClick(Qt.Key_Down, Qt.NoModifier, 100);
163− compare(listView.selectedItem, menuItem0);
164− tryCompare(page, "openItem", menuItem0);
165−
166− keyClick(Qt.Key_Down, Qt.NoModifier, 100);
167− compare(listView.selectedItem, menuItem1);
168− tryCompare(page, "openItem", menuItem1);
169−
170− // Skip separator
171−
172− keyClick(Qt.Key_Down, Qt.NoModifier, 100);
173− compare(listView.selectedItem, menuItem3);
174− tryCompare(page, "openItem", menuItem3);
175−
176− keyClick(Qt.Key_Down, Qt.NoModifier, 100);
177− compare(listView.selectedItem, menuItem0);
178− tryCompare(page, "openItem", menuItem0);
179− }
180−
181− function test_keyboardNavigation_UpKeySelectsAndOpensPreviousMenuItemAndRotates() {
182− menuBackend.modelData = desktopMenuData.generateTestData(4, 2, 3);
183− var listView = findChild(page, "menuPage-ListView");
184− verify(listView);
185−
186− var menuItem0 = findChild(page, "menuPage-menu0"); verify(menuItem0);
187− var menuItem1 = findChild(page, "menuPage-menu1"); verify(menuItem1);
188− var menuItem2 = findChild(page, "menuPage-menu2"); verify(menuItem2);
189− verify(menuItem2.delegate.isSeparator);
190− var menuItem3 = findChild(page, "menuPage-menu3"); verify(menuItem3);
191−
192− keyClick(Qt.Key_Up, Qt.NoModifier, 100);
193− compare(listView.selectedItem, menuItem3);
194− tryCompare(page, "openItem", menuItem3);
195−
196− // Skip separator
197−
198− keyClick(Qt.Key_Up, Qt.NoModifier, 100);
199− compare(listView.selectedItem, menuItem1);
200− tryCompare(page, "openItem", menuItem1);
201−
202− keyClick(Qt.Key_Up, Qt.NoModifier, 100);
203− compare(listView.selectedItem, menuItem0);
204− tryCompare(page, "openItem", menuItem0);
205−
206− keyClick(Qt.Key_Up, Qt.NoModifier, 100);
207− compare(listView.selectedItem, menuItem3);
208− tryCompare(page, "openItem", menuItem3);
209− }
210−
211− function test_keyboardNavigation_RightKeyEntersSubMenu() {
212− menuBackend.modelData = desktopMenuData.generateTestData(2, 2, 0);
213−
214− var menuItem = findChild(page, "menuPage-menu0");
215− verify(menuItem);
216− page.open(menuItem, true);
217− compare(page.openItem, menuItem);
218−
219− var submenu = findChild(page, "menuPage-subMenu0");
220− verify(submenu);
221− var listView = findChild(page, "menuPage-subMenu0-ListView");
222− verify(listView);
223− menuItem = findChild(page, "menuPage-subMenu0-menu0");
224− verify(menuItem);
225−
226− keyClick(Qt.Key_Right, Qt.NoModifier);
227− compare(listView.selectedItem, menuItem);
228− }
229−
230− function test_keyboardNavigation_LeftKeyClosesSubMenu() {
231− menuBackend.modelData = desktopMenuData.generateTestData(2, 2, 0);
232−
233− var menuItem = findChild(page, "menuPage-menu0");
234− verify(menuItem);
235− page.open(menuItem, true, 0); // quick open & select item 0
236−
237− compare(page.openItem, menuItem);
238− keyClick(Qt.Key_Left, Qt.NoModifier);
239− compare(page.openItem, undefined);
240− }
241−
242− function test_mnemonics() {
243− var menuItem0 = findChild(page, "menuPage-menu0"); verify(menuItem0);
244−
245− keyClick(Qt.Key_A, Qt.NoModifier);
246− tryCompare(page, "openItem", menuItem0);
247−
248− var submenu0 = findChild(menuItem0, "menuPage-subMenu0"); verify(submenu0);
249− var submenu0_menuItem1 = findChild(submenu0, "menuPage-subMenu0-menu1"); verify(submenu0_menuItem1);
250−
251− keyClick(Qt.Key_B, Qt.NoModifier);
252− tryCompare(submenu0, "openItem", submenu0_menuItem1);
253−
254− keyClick(Qt.Key_B, Qt.NoModifier);
255− compare(activatedSpy.signalArguments, [{ "0": "menuA.B.B" }], "Activate should have been emmited once");
256− }
257− }
258−}
tests/qmltests/ApplicationMenus/tst_MenuPopup.qmlnew file+204
@@ -0,0 +1,204 @@
1+/*
2+ * Copyright (C) 2016 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.4
18+import QtTest 1.0
19+import Ubuntu.Components 1.3
20+import Ubuntu.Components.ListItems 1.3
21+import Unity.Application 0.1
22+import QMenuModel 0.1
23+import Unity.Test 0.1
24+import Utils 0.1
25+
26+import "../../../qml/ApplicationMenus"
27+import ".."
28+
29+Item {
30+ id: root
31+ width: Math.max(units.gu(100), page.width + units.gu(6))
32+ height: Math.max(units.gu(50), page.height + units.gu(6))
33+
34+ Binding {
35+ target: MouseTouchAdaptor
36+ property: "enabled"
37+ value: false
38+ }
39+
40+ ApplicationMenuDataLoader { id: appMenuData }
41+
42+ MenuPopup {
43+ id: page
44+ focus: true
45+
46+ anchors {
47+ left: parent.left
48+ top: parent.top
49+ leftMargin: units.gu(3)
50+ topMargin: units.gu(3)
51+ }
52+
53+ unityMenuModel: UnityMenuModel {
54+ id: menuBackend
55+ modelData: appMenuData.generateTestData(7,5,2,3,"menu")
56+ }
57+ }
58+
59+ SignalSpy {
60+ id: activatedSpy
61+ target: menuBackend
62+ signalName: "activated"
63+ }
64+
65+ UnityTestCase {
66+ id: testCase
67+ name: "MenuPage"
68+ when: windowShown
69+
70+ function init() {
71+ page.dismiss();
72+ wait(100); // let the page dismiss
73+ activatedSpy.clear();
74+ }
75+
76+ // visit and verify that all the backend menus have been created
77+ function recurseMenuConstruction(rows, menuPage) {
78+ for (var i = 0; i < rows.length; ++i) {
79+ var rowData = rows[i]["rowData"];
80+
81+ var menuItemName = menuPage.objectName +"-item"+i
82+
83+ var menuItem = findChild(menuPage, menuItemName); verify(menuItem);
84+
85+ var menuPriv = findInvisibleChild(menuPage, "d");
86+
87+ // recurse into submenu
88+ var submenu = rows[i]["submenu"];
89+ if (submenu) {
90+ mouseClick(menuItem, menuItem.width/2, menuItem.height/2);
91+ tryCompare(menuPriv, "currentItem", menuItem);
92+
93+ tryCompareFunction(function() { return menuItem.popup !== null && menuItem.visible }, true);
94+
95+ var submenuPage = findChild(menuPage, menuItemName + "-menu"); verify(submenuPage);
96+
97+ recurseMenuConstruction(submenu, submenuPage);
98+ } else {
99+ mouseMove(menuItem, menuItem.width/2, menuItem.height/2);
100+ tryCompare(menuPriv, "currentItem", menuItem);
101+ }
102+ }
103+ }
104+
105+ function test_clickNavigation_data() {
106+ return [
107+ { tag: "long", testData: appMenuData.generateTestData(4, 2, 1, 0, "menu", false) },
108+ { tag: "deep", testData: appMenuData.generateTestData(2, 4, 1, 0, "menu", false) }
109+ ]
110+ }
111+
112+ function test_clickNavigation(data) {
113+ menuBackend.modelData = data.testData;
114+
115+ recurseMenuConstruction(data.testData, page);
116+ }
117+
118+ function test_checkableMenuTogglesOnClick() {
119+ menuBackend.modelData = appMenuData.singleCheckable;
120+
121+ var menuItem = findChild(page, "menu-item0-actionItem");
122+ verify(menuItem);
123+ compare(menuItem.action.checkable, true, "Menu item should be checkable");
124+ compare(menuItem.action.checked, false, "Menu item should not be checked");
125+
126+ mouseClick(menuItem, menuItem.width/2, menuItem.height/2);
127+
128+ compare(menuItem.action.checked, true, "Checkable menu item should have toggled");
129+ }
130+
131+ function test_keyboardNavigation_DownKeySelectsAndOpensNextMenuItemAndRotates() {
132+ menuBackend.modelData = appMenuData.generateTestData(3,3,0,0,"menu",false);
133+
134+ var item0 = findChild(page, "menu-item0"); verify(item0);
135+ var item1 = findChild(page, "menu-item1"); verify(item1);
136+ var item2 = findChild(page, "menu-item2"); verify(item2);
137+
138+ var priv = findInvisibleChild(page, "d");
139+
140+ keyClick(Qt.Key_Down, Qt.NoModifier);
141+ compare(priv.currentItem, item0, "CurrentItem should have moved to item 0");
142+
143+ keyClick(Qt.Key_Down, Qt.NoModifier);
144+ compare(priv.currentItem, item1, "CurrentItem should have moved to item 1");
145+
146+ keyClick(Qt.Key_Down, Qt.NoModifier);
147+ compare(priv.currentItem, item2, "CurrentItem should have moved to item 2");
148+
149+ keyClick(Qt.Key_Down, Qt.NoModifier);
150+ compare(priv.currentItem, item0, "CurrentItem should have moved to item 0");
151+ }
152+
153+ function test_keyboardNavigation_UpKeySelectsAndOpensPreviousMenuItemAndRotates() {
154+ menuBackend.modelData = appMenuData.generateTestData(3,3,0,0,"menu",false);
155+
156+ var item0 = findChild(page, "menu-item0"); verify(item0);
157+ var item1 = findChild(page, "menu-item1"); verify(item1);
158+ var item2 = findChild(page, "menu-item2"); verify(item2);
159+
160+ var priv = findInvisibleChild(page, "d");
161+
162+ keyClick(Qt.Key_Down, Qt.NoModifier);
163+ compare(priv.currentItem, item0, "CurrentItem should have moved to item 2");
164+
165+ keyClick(Qt.Key_Down, Qt.NoModifier);
166+ compare(priv.currentItem, item1, "CurrentItem should have moved to item 1");
167+
168+ keyClick(Qt.Key_Down, Qt.NoModifier);
169+ compare(priv.currentItem, item2, "CurrentItem should have moved to item 0");
170+
171+ keyClick(Qt.Key_Down, Qt.NoModifier);
172+ compare(priv.currentItem, item0, "CurrentItem should have moved to item 2");
173+ }
174+
175+ function test_keyboardNavigation_RightKeyEntersSubMenu() {
176+ menuBackend.modelData = appMenuData.generateTestData(3,3,1,0,"menu",false);
177+
178+ var menuItem = findChild(page, "menu-item0");
179+
180+ var priv = findInvisibleChild(page, "d");
181+ priv.currentItem = menuItem;
182+
183+ keyClick(Qt.Key_Right, Qt.NoModifier);
184+ tryCompareFunction(function() { return menuItem.popup !== null && menuItem.popup.visible }, true);
185+
186+ var submenu0 = findChild(page, "menu-item0-menu"); verify(submenu0);
187+ var submenu0item0 = findChild(submenu0, "menu-item0-menu-item0"); verify(submenu0item0);
188+
189+ var submenu0Priv = findInvisibleChild(submenu0, "d"); verify(submenu0Priv);
190+ compare(submenu0Priv.currentItem, submenu0item0, "First item of submenu should be selected");
191+ }
192+
193+ function test_keyboardNavigation_LeftKeyClosesSubMenu() {
194+ menuBackend.modelData = appMenuData.generateTestData(3,3,1,0,"menu",false);
195+
196+ var menuItem = findChild(page, "menu-item0"); verify(menuItem);
197+ mouseClick(menuItem, menuItem.width/2, menuItem.height/2);
198+ tryCompareFunction(function() { return menuItem.popup !== null && menuItem.popup.visible }, true);
199+
200+ keyClick(Qt.Key_Left, Qt.NoModifier);
201+ tryCompareFunction(function() { return menuItem.popup !== null && menuItem.popup.visible }, false);
202+ }
203+ }
204+}
tests/qmltests/CMakeLists.txt+1−1
@@ -7,7 +7,7 @@ add_unity8_qmltest(. Shell)
77add_unity8_qmltest(. ShellWithPin)
88add_unity8_qmltest(. DeviceConfiguration)
99add_unity8_qmltest(ApplicationMenus MenuBar)
10−add_unity8_qmltest(ApplicationMenus MenuPage)
10+add_unity8_qmltest(ApplicationMenus MenuPopup)
1111add_unity8_qmltest(Components Background)
1212add_unity8_qmltest(Components Carousel)
1313add_unity8_qmltest(Components Dialogs)
tests/qmltests/Stage/tst_WindowDecoration.qml+3−3
@@ -120,7 +120,7 @@ Item {
120120 function test_titleRemainsWhenHoveringOnTitleBarWithNoMenu() {
121121 decoration.menu = undefined;
122122
123− var menuLoader = findChild(decoration, "windowDecorationMenuBarLoader");
123+ var menuLoader = findChild(decoration, "menuBarLoader");
124124 verify(menuLoader);
125125 mouseMove(menuLoader, menuLoader.width/2, menuLoader.height/2);
126126 wait(200);
@@ -133,7 +133,7 @@ Item {
133133 }
134134
135135 function test_menuShowsWhenHoveringOnTitleBar() {
136− var menuLoader = findChild(decoration, "windowDecorationMenuBarLoader");
136+ var menuLoader = findChild(decoration, "menuBarLoader");
137137 verify(menuLoader);
138138 mouseMove(menuLoader, menuLoader.width/2, menuLoader.height/2)
139139
@@ -150,7 +150,7 @@ Item {
150150 }
151151
152152 function test_showMenuBarWithShortcutsOnLongAltPress() {
153− var menuLoader = findChild(decoration, "windowDecorationMenuBarLoader");
153+ var menuLoader = findChild(decoration, "menuBarLoader");
154154 verify(menuLoader);
155155
156156 var titleLabel = findChild(decoration, "windowDecorationTitle");