From 7f0aaff9b5d5f1527587dfd68d3b42e020a21122 Mon Sep 17 00:00:00 2001 From: Frank Reininghaus Date: Mon, 13 Feb 2012 22:37:26 +0100 Subject: [PATCH] Test which items are activated when pressing Enter or Return The ViewState struct gets a new bool member to indicate if the selected items should have been activated after the last event or not. One could argue that adding a bool parameter to the constructor is not optimal, but I think adding an enum is not really worth the effort because the struct is not used outside this unit test. Moreover, I could not think of a good name for the enum type and its values. (cherry picked from commit 307cca7b31b998fb7e8af0478a8e97e53bdc059c) --- src/tests/kitemlistcontrollertest.cpp | 56 +++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 4 deletions(-) diff --git a/src/tests/kitemlistcontrollertest.cpp b/src/tests/kitemlistcontrollertest.cpp index f62ef0c3e..b446e8477 100644 --- a/src/tests/kitemlistcontrollertest.cpp +++ b/src/tests/kitemlistcontrollertest.cpp @@ -37,6 +37,7 @@ namespace { Q_DECLARE_METATYPE(KFileItemListView::Layout); Q_DECLARE_METATYPE(Qt::Orientation); Q_DECLARE_METATYPE(KItemListController::SelectionBehavior); +Q_DECLARE_METATYPE(QSet); class KItemListControllerTest : public QObject { @@ -76,6 +77,8 @@ private: */ void KItemListControllerTest::initTestCase() { + qRegisterMetaType >("QSet"); + m_testDir = new TestDir(); m_dirLister = new KDirLister(); m_model = new KFileItemModel(m_dirLister); @@ -158,17 +161,22 @@ struct KeyPress { /** * \class ViewState is a small helper struct that represents a certain state - * of the view, including the current item and the selected items. + * of the view, including the current item, the selected items in MultiSelection + * mode (in the other modes, the selection is either empty or equal to the + * current item), and the information whether items were activated by the last + * key press. */ struct ViewState { - ViewState(int current, QSet selection) : + ViewState(int current, const QSet selection, bool activated = false) : m_current(current), - m_selection(selection) + m_selection(selection), + m_activated(activated) {} int m_current; QSet m_selection; + bool m_activated; }; // We have to define a typedef for the pair in order to make the test compile. @@ -264,11 +272,15 @@ void KItemListControllerTest::testKeyboardNavigation_data() // for any layout and any number of columns. testList << qMakePair(KeyPress(nextItemKey), ViewState(1, QSet() << 1)) + << qMakePair(KeyPress(Qt::Key_Return), ViewState(1, QSet() << 1, true)) + << qMakePair(KeyPress(Qt::Key_Enter), ViewState(1, QSet() << 1, true)) << qMakePair(KeyPress(nextItemKey), ViewState(2, QSet() << 2)) << qMakePair(KeyPress(nextItemKey, Qt::ShiftModifier), ViewState(3, QSet() << 2 << 3)) + << qMakePair(KeyPress(Qt::Key_Return), ViewState(3, QSet() << 2 << 3, true)) << qMakePair(KeyPress(previousItemKey, Qt::ShiftModifier), ViewState(2, QSet() << 2)) << qMakePair(KeyPress(nextItemKey, Qt::ShiftModifier), ViewState(3, QSet() << 2 << 3)) << qMakePair(KeyPress(nextItemKey, Qt::ControlModifier), ViewState(4, QSet() << 2 << 3)) + << qMakePair(KeyPress(Qt::Key_Return), ViewState(4, QSet() << 2 << 3, true)) << qMakePair(KeyPress(previousItemKey), ViewState(3, QSet() << 3)) << qMakePair(KeyPress(Qt::Key_Home, Qt::ShiftModifier), ViewState(0, QSet() << 0 << 1 << 2 << 3)) << qMakePair(KeyPress(nextItemKey, Qt::ControlModifier), ViewState(1, QSet() << 0 << 1 << 2 << 3)) @@ -276,7 +288,10 @@ void KItemListControllerTest::testKeyboardNavigation_data() << qMakePair(KeyPress(Qt::Key_Space, Qt::ControlModifier), ViewState(1, QSet() << 0 << 1 << 2 << 3)) << qMakePair(KeyPress(Qt::Key_End), ViewState(19, QSet() << 19)) << qMakePair(KeyPress(previousItemKey, Qt::ShiftModifier), ViewState(18, QSet() << 18 << 19)) - << qMakePair(KeyPress(Qt::Key_Home), ViewState(0, QSet() << 0)); + << qMakePair(KeyPress(Qt::Key_Home), ViewState(0, QSet() << 0)) + << qMakePair(KeyPress(Qt::Key_Space, Qt::ControlModifier), ViewState(0, QSet())) + << qMakePair(KeyPress(Qt::Key_Enter), ViewState(0, QSet(), true)) + << qMakePair(KeyPress(Qt::Key_Space, Qt::ControlModifier), ViewState(0, QSet() << 0)); // Next, we test combinations of key presses which only work for a // particular number of columns and either enabled or disabled grouping. @@ -456,20 +471,53 @@ void KItemListControllerTest::testKeyboardNavigation() adjustGeometryForColumnCount(columnCount); QCOMPARE(m_view->m_layouter->m_columnCount, columnCount); + QSignalSpy spySingleItemActivated(m_controller, SIGNAL(itemActivated(int))); + QSignalSpy spyMultipleItemsActivated(m_controller, SIGNAL(itemsActivated(QSet))); + while (!testList.isEmpty()) { const QPair test = testList.takeFirst(); const Qt::Key key = test.first.m_key; const Qt::KeyboardModifiers modifier = test.first.m_modifier; const int current = test.second.m_current; const QSet selection = test.second.m_selection; + const bool activated = test.second.m_activated; QTest::keyClick(m_container, key, modifier); + QCOMPARE(m_selectionManager->currentItem(), current); switch (selectionBehavior) { case KItemListController::NoSelection: QVERIFY(m_selectionManager->selectedItems().isEmpty()); break; case KItemListController::SingleSelection: QCOMPARE(m_selectionManager->selectedItems(), QSet() << current); break; case KItemListController::MultiSelection: QCOMPARE(m_selectionManager->selectedItems(), selection); break; } + + if (activated) { + switch (selectionBehavior) { + case KItemListController::MultiSelection: + if (!selection.isEmpty()) { + // The selected items should be activated. + if (selection.count() == 1) { + QVERIFY(!spySingleItemActivated.isEmpty()); + QCOMPARE(qvariant_cast(spySingleItemActivated.takeFirst().at(0)), selection.toList().at(0)); + QVERIFY(spyMultipleItemsActivated.isEmpty()); + } else { + QVERIFY(spySingleItemActivated.isEmpty()); + QVERIFY(!spyMultipleItemsActivated.isEmpty()); + QCOMPARE(qvariant_cast >(spyMultipleItemsActivated.takeFirst().at(0)), selection); + } + break; + } + // No items are selected. Therefore, the current item should be activated. + // This is handled by falling through to the NoSelection/SingleSelection case. + case KItemListController::NoSelection: + case KItemListController::SingleSelection: + // In NoSelection and SingleSelection mode, the current item should be activated. + QVERIFY(!spySingleItemActivated.isEmpty()); + QCOMPARE(qvariant_cast(spySingleItemActivated.takeFirst().at(0)), current); + QVERIFY(spyMultipleItemsActivated.isEmpty()); + break; + } + } } } -- 2.47.3