diff options
Diffstat (limited to 'tests/auto/widgets/widgets')
32 files changed, 2212 insertions, 172 deletions
diff --git a/tests/auto/widgets/widgets/qabstractscrollarea/tst_qabstractscrollarea.cpp b/tests/auto/widgets/widgets/qabstractscrollarea/tst_qabstractscrollarea.cpp index 372a467ada..007825d39c 100644 --- a/tests/auto/widgets/widgets/qabstractscrollarea/tst_qabstractscrollarea.cpp +++ b/tests/auto/widgets/widgets/qabstractscrollarea/tst_qabstractscrollarea.cpp @@ -334,6 +334,10 @@ void tst_QAbstractScrollArea::task214488_layoutDirection() int refValue = hbar->value(); qApp->sendEvent(&scrollArea, new QKeyEvent(QEvent::KeyPress, key, Qt::NoModifier)); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "WinRT: Scrollbar is not guaranteed to be visible, as QWidget::resize does not" + "work", Abort); +#endif QVERIFY(lessThan ? (hbar->value() < refValue) : (hbar->value() > refValue)); } diff --git a/tests/auto/widgets/widgets/qcalendarwidget/tst_qcalendarwidget.cpp b/tests/auto/widgets/widgets/qcalendarwidget/tst_qcalendarwidget.cpp index 5c0f4b1536..312ec0b1ec 100644 --- a/tests/auto/widgets/widgets/qcalendarwidget/tst_qcalendarwidget.cpp +++ b/tests/auto/widgets/widgets/qcalendarwidget/tst_qcalendarwidget.cpp @@ -153,6 +153,9 @@ void tst_QCalendarWidget::getSetCheck() void tst_QCalendarWidget::buttonClickCheck() { +#ifdef Q_OS_WINRT + QSKIP("Fails on WinRT - QTBUG-68297"); +#endif QCalendarWidget object; QSize size = object.sizeHint(); object.setGeometry(0,0,size.width(), size.height()); @@ -283,6 +286,10 @@ void tst_QCalendarWidget::showPrevNext() QFETCH(QDate, dateOrigin); QFETCH(QDate, expectedDate); +#ifdef Q_OS_WINRT + QSKIP("Fails on WinRT - QTBUG-68297"); +#endif + QCalendarWidget calWidget; calWidget.show(); QVERIFY(QTest::qWaitForWindowExposed(&calWidget)); diff --git a/tests/auto/widgets/widgets/qcombobox/qcombobox.pro b/tests/auto/widgets/widgets/qcombobox/qcombobox.pro index 939153dc88..ba25a85634 100644 --- a/tests/auto/widgets/widgets/qcombobox/qcombobox.pro +++ b/tests/auto/widgets/widgets/qcombobox/qcombobox.pro @@ -1,4 +1,7 @@ CONFIG += testcase TARGET = tst_qcombobox QT += widgets widgets-private gui-private core-private testlib testlib-private +DEFINES += QTEST_QPA_MOUSE_HANDLING SOURCES += tst_qcombobox.cpp + +TESTDATA += qtlogo.png qtlogoinverted.png diff --git a/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp b/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp index 7c1deb8fff..943fb997cd 100644 --- a/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp +++ b/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp @@ -1672,6 +1672,9 @@ void tst_QComboBox::setCustomModelAndView() const QRect subItemRect = view->visualRect(model->indexFromItem(subItem)); QWidget *window = view->window(); QTest::mouseClick(window->windowHandle(), Qt::LeftButton, 0, view->mapTo(window, subItemRect.center())); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "Fails on WinRT - QTBUG-68297", Abort); +#endif QTRY_COMPARE(combo.currentText(), subItem21Text); } @@ -2188,8 +2191,8 @@ void tst_QComboBox::itemListPosition() if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme()) useFullScreenForPopupMenu = theme->themeHint(QPlatformTheme::UseFullScreenForPopupMenu).toBool(); const QRect screen = useFullScreenForPopupMenu ? - QApplication::desktop()->screenGeometry(scrNumber) : - QApplication::desktop()->availableGeometry(scrNumber); + QApplication::screens().at(scrNumber)->geometry() : + QApplication::screens().at(scrNumber)->availableGeometry(); topLevel.move(screen.width() - topLevel.sizeHint().width() - 10, 0); //puts the combo to the top-right corner @@ -2311,7 +2314,7 @@ void tst_QComboBox::task191329_size() setFrameless(&tableCombo); tableCombo.move(200, 200); int rows; - if (QApplication::desktop()->screenGeometry().height() < 480) + if (QApplication::primaryScreen()->geometry().height() < 480) rows = 8; else rows = 15; @@ -2376,6 +2379,9 @@ void tst_QComboBox::task190205_setModelAdjustToContents() correctBox.addItems(finalContent); correctBox.showNormal(); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "WinRT does not support more than 1 native top level widget", Abort); +#endif QVERIFY(QTest::qWaitForWindowExposed(&box)); QVERIFY(QTest::qWaitForWindowExposed(&correctBox)); @@ -2390,8 +2396,7 @@ void tst_QComboBox::task248169_popupWithMinimalSize() QComboBox comboBox; comboBox.addItems(initialContent); - QDesktopWidget desktop; - QRect desktopSize = desktop.availableGeometry(); + QRect desktopSize = QGuiApplication::primaryScreen()->availableGeometry(); comboBox.view()->setMinimumWidth(desktopSize.width() / 2); comboBox.setGeometry(desktopSize.width() - (desktopSize.width() / 4), (desktopSize.width() / 4), (desktopSize.width() / 2), (desktopSize.width() / 4)); @@ -2407,6 +2412,7 @@ void tst_QComboBox::task248169_popupWithMinimalSize() #if defined QT_BUILD_INTERNAL QFrame *container = comboBox.findChild<QComboBoxPrivateContainer *>(); QVERIFY(container); + QDesktopWidget desktop; QTRY_VERIFY(desktop.screenGeometry(container).contains(container->geometry())); #endif } @@ -2719,32 +2725,18 @@ void tst_QComboBox::resetModel() } -static inline void centerCursor(const QWidget *w) -{ -#ifndef QT_NO_CURSOR - // Force cursor movement to prevent QCursor::setPos() from returning prematurely on QPA: - const QPoint target(w->mapToGlobal(w->rect().center())); - QCursor::setPos(QPoint(target.x() + 1, target.y())); - QCursor::setPos(target); -#else // !QT_NO_CURSOR - Q_UNUSED(w) -#endif -} - void tst_QComboBox::keyBoardNavigationWithMouse() { QComboBox combo; combo.setEditable(false); setFrameless(&combo); - combo.move(200, 200); - for (int i = 0; i < 80; i++) - combo.addItem( QString::number(i)); + for (int i = 0; i < 200; i++) + combo.addItem(QString::number(i)); + combo.move(200, 200); combo.showNormal(); - centerCursor(&combo); // QTBUG-33973, cursor needs to be within view from start on Mac. QApplication::setActiveWindow(&combo); QVERIFY(QTest::qWaitForWindowActive(&combo)); - QCOMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&combo)); QCOMPARE(combo.currentText(), QLatin1String("0")); @@ -2752,18 +2744,12 @@ void tst_QComboBox::keyBoardNavigationWithMouse() QTRY_VERIFY(combo.hasFocus()); QTest::keyClick(combo.lineEdit(), Qt::Key_Space); - QTest::qWait(30); QTRY_VERIFY(combo.view()); QTRY_VERIFY(combo.view()->isVisible()); - QTest::qWait(130); QCOMPARE(combo.currentText(), QLatin1String("0")); - // When calling cursor function, Windows CE responds with: This function is not supported on this system. -#if !defined Q_OS_QNX - // Force cursor movement to prevent QCursor::setPos() from returning prematurely on QPA: - centerCursor(combo.view()); - QTest::qWait(200); + QTest::mouseMove(&combo, combo.rect().center()); #define GET_SELECTION(SEL) \ QCOMPARE(combo.view()->selectionModel()->selection().count(), 1); \ @@ -2771,23 +2757,19 @@ void tst_QComboBox::keyBoardNavigationWithMouse() SEL = combo.view()->selectionModel()->selection().indexes().first().row() int selection; - GET_SELECTION(selection); + GET_SELECTION(selection); // get initial selection - //since we moved the mouse is in the middle it should even be around 5; - QVERIFY2(selection > 3, (QByteArrayLiteral("selection=") + QByteArray::number(selection)).constData()); - - static const int final = 40; + const int final = 40; for (int i = selection + 1; i <= final; i++) { QTest::keyClick(combo.view(), Qt::Key_Down); - QTest::qWait(20); GET_SELECTION(selection); QCOMPARE(selection, i); } QTest::keyClick(combo.view(), Qt::Key_Enter); QTRY_COMPARE(combo.currentText(), QString::number(final)); -#endif +#undef GET_SELECTION } void tst_QComboBox::task_QTBUG_1071_changingFocusEmitsActivated() @@ -3334,6 +3316,9 @@ void tst_QComboBox::task_QTBUG_56693_itemFontFromModel() QVERIFY(container); QVERIFY(QTest::qWaitForWindowExposed(container)); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "Fails on WinRT - QTBUG-68297", Abort); +#endif QCOMPARE(proxyStyle->italicItemsNo, 5); box.hidePopup(); diff --git a/tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp b/tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp index fa28ec2575..e2f1307eb1 100644 --- a/tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp +++ b/tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp @@ -70,6 +70,7 @@ #include <QSignalSpy> #include <QTestEventList> #include <QDateEdit> +#include <QProxyStyle> #include <private/qdatetimeedit_p.h> @@ -93,6 +94,46 @@ public: friend class tst_QDateTimeEdit; }; +class PressAndHoldStyle : public QProxyStyle +{ + Q_OBJECT +public: + using QProxyStyle::QProxyStyle; + + int styleHint(QStyle::StyleHint hint, const QStyleOption *option = nullptr, + const QWidget *widget = nullptr, QStyleHintReturn *returnData = nullptr) const override + { + switch (hint) { + case QStyle::SH_SpinBox_ClickAutoRepeatRate: + return 5; + case QStyle::SH_SpinBox_ClickAutoRepeatThreshold: + return 10; + default: + return QProxyStyle::styleHint(hint, option, widget, returnData); + } + } +}; + +class StepModifierStyle : public QProxyStyle +{ + Q_OBJECT +public: + using QProxyStyle::QProxyStyle; + + int styleHint(QStyle::StyleHint hint, const QStyleOption *option = nullptr, + const QWidget *widget = nullptr, QStyleHintReturn *returnData = nullptr) const override + { + switch (hint) { + case QStyle::SH_SpinBox_StepModifier: + return stepModifier; + default: + return QProxyStyle::styleHint(hint, option, widget, returnData); + } + } + + Qt::KeyboardModifier stepModifier = Qt::ControlModifier; +}; + class tst_QDateTimeEdit : public QObject { Q_OBJECT @@ -205,9 +246,8 @@ private slots: void reverseTest(); void ddMMMMyyyy(); -#if QT_CONFIG(wheelevent) + void wheelEvent_data(); void wheelEvent(); -#endif void specialValueCornerCase(); void cursorPositionOnInit(); @@ -245,14 +285,105 @@ private slots: void dateEditCorrectSectionSize_data(); void dateEditCorrectSectionSize(); #endif + + void stepModifierKeys_data(); + void stepModifierKeys(); + + void stepModifierButtons_data(); + void stepModifierButtons(); + + void stepModifierPressAndHold_data(); + void stepModifierPressAndHold(); private: EditorDateEdit* testWidget; QWidget *testFocusWidget; }; +typedef QList<QDate> DateList; typedef QList<QTime> TimeList; typedef QList<Qt::Key> KeyList; +static QLatin1String modifierToName(Qt::KeyboardModifier modifier) +{ + switch (modifier) { + case Qt::NoModifier: + return QLatin1Literal("No"); + break; + case Qt::ControlModifier: + return QLatin1Literal("Ctrl"); + break; + case Qt::ShiftModifier: + return QLatin1Literal("Shift"); + break; + case Qt::AltModifier: + return QLatin1Literal("Alt"); + break; + case Qt::MetaModifier: + return QLatin1Literal("Meta"); + break; + default: + qFatal("Unexpected keyboard modifier"); + return QLatin1String(); + } +} + +static QLatin1String sectionToName(const QDateTimeEdit::Section section) +{ + switch (section) { + case QDateTimeEdit::SecondSection: + return QLatin1Literal("Second"); + case QDateTimeEdit::MinuteSection: + return QLatin1Literal("Minute"); + case QDateTimeEdit::HourSection: + return QLatin1Literal("Hours"); + case QDateTimeEdit::DaySection: + return QLatin1Literal("Day"); + case QDateTimeEdit::MonthSection: + return QLatin1Literal("Month"); + case QDateTimeEdit::YearSection: + return QLatin1Literal("Year"); + default: + qFatal("Unexpected section"); + return QLatin1String(); + } +} + +static QDate stepDate(const QDate& startDate, const QDateTimeEdit::Section section, + const int steps) +{ + switch (section) { + case QDateTimeEdit::DaySection: + return startDate.addDays(steps); + case QDateTimeEdit::MonthSection: + return startDate.addMonths(steps); + case QDateTimeEdit::YearSection: + return startDate.addYears(steps); + default: + qFatal("Unexpected section"); + return QDate(); + } +} + +static QTime stepTime(const QTime& startTime, const QDateTimeEdit::Section section, + const int steps) +{ + switch (section) { + case QDateTimeEdit::SecondSection: + return startTime.addSecs(steps); + case QDateTimeEdit::MinuteSection: + return QTime(startTime.hour(), + startTime.minute() + steps, + startTime.second()); + case QDateTimeEdit::HourSection: + return QTime(startTime.hour() + steps, + startTime.minute(), + startTime.second()); + default: + qFatal("Unexpected section"); + return QTime(); + } +} + // Testing get/set functions void tst_QDateTimeEdit::getSetCheck() { @@ -326,6 +457,8 @@ void tst_QDateTimeEdit::cleanup() testWidget->setTimeSpec(Qt::LocalTime); testWidget->setSpecialValueText(QString()); testWidget->setWrapping(false); + // Restore the default. + testWidget->setCalendarPopup(false); } void tst_QDateTimeEdit::constructor_qwidget() @@ -3000,20 +3133,176 @@ void tst_QDateTimeEdit::ddMMMMyyyy() QCOMPARE(testWidget->lineEdit()->text(), "01." + QDate::longMonthName(1) + ".200"); } +void tst_QDateTimeEdit::wheelEvent_data() +{ #if QT_CONFIG(wheelevent) + QTest::addColumn<QPoint>("angleDelta"); + QTest::addColumn<int>("qt4Delta"); + QTest::addColumn<int>("stepModifier"); + QTest::addColumn<Qt::KeyboardModifiers>("modifiers"); + QTest::addColumn<Qt::MouseEventSource>("source"); + QTest::addColumn<QDateTimeEdit::Section>("section"); + QTest::addColumn<QDate>("startDate"); + QTest::addColumn<DateList>("expectedDates"); + + const auto fractions = {false, true}; + + const auto directions = {true, false}; + + const auto modifierList = {Qt::NoModifier, + Qt::ShiftModifier, + Qt::ControlModifier, + Qt::AltModifier, + Qt::MetaModifier}; + + const auto validStepModifierList = {Qt::NoModifier, + Qt::ControlModifier, + Qt::ShiftModifier}; + + const auto sources = {Qt::MouseEventNotSynthesized, + Qt::MouseEventSynthesizedBySystem, + Qt::MouseEventSynthesizedByQt, + Qt::MouseEventSynthesizedByApplication}; + + const auto sections = {QDateTimeEdit::DaySection, + QDateTimeEdit::MonthSection, + QDateTimeEdit::YearSection}; + + for (auto fraction : fractions) { + for (auto up : directions) { + + const QDate startDate(2000, up ? 2 : 12, 17); + + const int units = (fraction ? 60 : 120) * (up ? 1 : -1); + + for (auto modifier : modifierList) { + + const Qt::KeyboardModifiers modifiers(modifier); + + const auto modifierName = modifierToName(modifier); + if (modifierName.isEmpty()) + continue; + + for (auto stepModifier : validStepModifierList) { + + const auto stepModifierName = modifierToName(stepModifier); + if (stepModifierName.isEmpty()) + continue; + + const int steps = (modifier & stepModifier ? 10 : 1) + * (up ? 1 : -1); + + for (auto source : sources) { + +#ifdef Q_OS_MACOS + QPoint angleDelta; + if ((modifier & Qt::ShiftModifier) && + source == Qt::MouseEventNotSynthesized) { + // On macOS the Shift modifier converts vertical + // mouse wheel events to horizontal. + angleDelta = { units, 0 }; + } else { + // However, this is not the case for trackpad scroll + // events. + angleDelta = { 0, units }; + } +#else + const QPoint angleDelta(0, units); +#endif + + QLatin1String sourceName; + switch (source) { + case Qt::MouseEventNotSynthesized: + sourceName = QLatin1Literal("NotSynthesized"); + break; + case Qt::MouseEventSynthesizedBySystem: + sourceName = QLatin1Literal("SynthesizedBySystem"); + break; + case Qt::MouseEventSynthesizedByQt: + sourceName = QLatin1Literal("SynthesizedByQt"); + break; + case Qt::MouseEventSynthesizedByApplication: + sourceName = QLatin1Literal("SynthesizedByApplication"); + break; + default: + qFatal("Unexpected wheel event source"); + continue; + } + + for (const auto section : sections) { + + DateList expectedDates; + if (fraction) + expectedDates << startDate; + + const auto expectedDate = stepDate(startDate, section, steps); + if (!expectedDate.isValid()) + continue; + + expectedDates << expectedDate; + + const QLatin1String sectionName = sectionToName(section); + + QTest::addRow("%s%s%s%sWith%sKeyboardModifier%s", + fraction ? "half" : "full", + up ? "Up" : "Down", + stepModifierName.latin1(), + sectionName.latin1(), + modifierName.latin1(), + sourceName.latin1()) + << angleDelta + << units + << static_cast<int>(stepModifier) + << modifiers + << source + << section + << startDate + << expectedDates; + } + } + } + } + } + } +#else + QSKIP("Built with --no-feature-wheelevent"); +#endif +} + void tst_QDateTimeEdit::wheelEvent() { - testWidget->setDisplayFormat("dddd/MM"); - testWidget->setDate(QDate(2000, 2, 21)); - testWidget->setCurrentSection(QDateTimeEdit::DaySection); - QWheelEvent w(testWidget->lineEdit()->geometry().center(), 120, 0, 0); - qApp->sendEvent(testWidget, &w); - QCOMPARE(testWidget->date(), QDate(2000, 2, 22)); - testWidget->setCurrentSection(QDateTimeEdit::MonthSection); - qApp->sendEvent(testWidget, &w); - QCOMPARE(testWidget->date(), QDate(2000, 3, 22)); -} +#if QT_CONFIG(wheelevent) + QFETCH(QPoint, angleDelta); + QFETCH(int, qt4Delta); + QFETCH(int, stepModifier); + QFETCH(Qt::KeyboardModifiers, modifiers); + QFETCH(Qt::MouseEventSource, source); + QFETCH(QDateTimeEdit::Section, section); + QFETCH(QDate, startDate); + QFETCH(DateList, expectedDates); + + EditorDateEdit edit(0); + edit.setDate(startDate); + edit.setCurrentSection(section); + + QScopedPointer<StepModifierStyle, QScopedPointerDeleteLater> style( + new StepModifierStyle); + style->stepModifier = static_cast<Qt::KeyboardModifier>(stepModifier); + edit.setStyle(style.data()); + + QWheelEvent event(QPointF(), QPointF(), QPoint(), angleDelta, qt4Delta, + Qt::Vertical, Qt::NoButton, modifiers, Qt::NoScrollPhase, + source); + + QCOMPARE(edit.date(), startDate); + for (QDate expected : expectedDates) { + qApp->sendEvent(&edit, &event); + QCOMPARE(edit.date(), expected); + } +#else + QSKIP("Built with --no-feature-wheelevent"); #endif // QT_CONFIG(wheelevent) +} void tst_QDateTimeEdit::specialValueCornerCase() { @@ -3735,5 +4024,308 @@ void tst_QDateTimeEdit::dateEditCorrectSectionSize() } #endif +void tst_QDateTimeEdit::stepModifierKeys_data() +{ + QTest::addColumn<QDate>("startDate"); + QTest::addColumn<int>("stepModifier"); + QTest::addColumn<QDateTimeEdit::Section>("section"); + QTest::addColumn<QTestEventList>("keys"); + QTest::addColumn<QDate>("expectedDate"); + + const auto keyList = {Qt::Key_Up, Qt::Key_Down}; + + const auto modifierList = {Qt::NoModifier, + Qt::ShiftModifier, + Qt::ControlModifier, + Qt::AltModifier, + Qt::MetaModifier}; + + const auto validStepModifierList = {Qt::NoModifier, + Qt::ControlModifier, + Qt::ShiftModifier}; + + const auto sections = {QDateTimeEdit::DaySection, + QDateTimeEdit::MonthSection, + QDateTimeEdit::YearSection}; + + for (auto key : keyList) { + + const bool up = key == Qt::Key_Up; + Q_ASSERT(up || key == Qt::Key_Down); + + const QDate startDate(2000, up ? 2 : 12, 17); + + for (auto modifier : modifierList) { + + QTestEventList keys; + keys.addKeyClick(key, modifier); + + const auto modifierName = modifierToName(modifier); + if (modifierName.isEmpty()) + continue; + + for (auto stepModifier : validStepModifierList) { + + const auto stepModifierName = modifierToName(stepModifier); + if (stepModifierName.isEmpty()) + continue; + + const int steps = (modifier & stepModifier ? 10 : 1) + * (up ? 1 : -1); + + for (const auto section : sections) { + + const auto expectedDate = stepDate(startDate, section, steps); + if (!expectedDate.isValid()) + continue; + + const auto sectionName = sectionToName(section); + + QTest::addRow("%s%s%sWith%sKeyboardModifier", + up ? "up" : "down", + stepModifierName.latin1(), + sectionName.latin1(), + modifierName.latin1()) + << startDate + << static_cast<int>(stepModifier) + << section + << keys + << expectedDate; + } + } + } + } +} + +void tst_QDateTimeEdit::stepModifierKeys() +{ + QFETCH(QDate, startDate); + QFETCH(int, stepModifier); + QFETCH(QDateTimeEdit::Section, section); + QFETCH(QTestEventList, keys); + QFETCH(QDate, expectedDate); + + // This can interfere with our stuff. + testWidget->hide(); + + QDateTimeEdit edit(0); + edit.setDate(startDate); + edit.show(); + QVERIFY(QTest::qWaitForWindowActive(&edit)); + edit.setCurrentSection(section); + + QScopedPointer<StepModifierStyle, QScopedPointerDeleteLater> style( + new StepModifierStyle); + style->stepModifier = static_cast<Qt::KeyboardModifier>(stepModifier); + edit.setStyle(style.data()); + + QCOMPARE(edit.date(), startDate); + keys.simulate(&edit); + QCOMPARE(edit.date(), expectedDate); +} + +void tst_QDateTimeEdit::stepModifierButtons_data() +{ + QTest::addColumn<QStyle::SubControl>("subControl"); + QTest::addColumn<int>("stepModifier"); + QTest::addColumn<Qt::KeyboardModifiers>("modifiers"); + QTest::addColumn<QDateTimeEdit::Section>("section"); + QTest::addColumn<QTime>("startTime"); + QTest::addColumn<QTime>("expectedTime"); + + const auto subControls = {QStyle::SC_SpinBoxUp, QStyle::SC_SpinBoxDown}; + + const auto modifierList = {Qt::NoModifier, + Qt::ShiftModifier, + Qt::ControlModifier, + Qt::AltModifier, + Qt::MetaModifier}; + + const auto validStepModifierList = {Qt::NoModifier, + Qt::ControlModifier, + Qt::ShiftModifier}; + + const auto sections = {QDateTimeEdit::SecondSection, + QDateTimeEdit::MinuteSection, + QDateTimeEdit::HourSection}; + + const QTime startTime(12, 36, 24); + + for (auto subControl : subControls) { + + const bool up = subControl == QStyle::SC_SpinBoxUp; + Q_ASSERT(up || subControl == QStyle::SC_SpinBoxDown); + + for (auto modifier : modifierList) { + + const Qt::KeyboardModifiers modifiers(modifier); + + const auto modifierName = modifierToName(modifier); + if (modifierName.isEmpty()) + continue; + + for (auto stepModifier : validStepModifierList) { + + const auto stepModifierName = modifierToName(stepModifier); + if (stepModifierName.isEmpty()) + continue; + + const int steps = (modifier & stepModifier ? 10 : 1) + * (up ? 1 : -1); + + for (const auto section : sections) { + + const auto expectedTime = stepTime(startTime, section, steps); + if (!expectedTime.isValid()) + continue; + + const auto sectionName = sectionToName(section); + + QTest::addRow("%s%s%sWith%sKeyboardModifier", + up ? "up" : "down", + stepModifierName.latin1(), + sectionName.latin1(), + modifierName.latin1()) + << subControl + << static_cast<int>(stepModifier) + << modifiers + << section + << startTime + << expectedTime; + } + } + } + } +} + +void tst_QDateTimeEdit::stepModifierButtons() +{ + QFETCH(QStyle::SubControl, subControl); + QFETCH(int, stepModifier); + QFETCH(Qt::KeyboardModifiers, modifiers); + QFETCH(QDateTimeEdit::Section, section); + QFETCH(QTime, startTime); + QFETCH(QTime, expectedTime); + + testWidget->hide(); + + EditorDateEdit edit(0); + edit.setTime(startTime); + edit.show(); + QVERIFY(QTest::qWaitForWindowActive(&edit)); + edit.setCurrentSection(section); + + QScopedPointer<StepModifierStyle, QScopedPointerDeleteLater> style( + new StepModifierStyle); + style->stepModifier = static_cast<Qt::KeyboardModifier>(stepModifier); + edit.setStyle(style.data()); + + QStyleOptionSpinBox spinBoxStyleOption; + edit.initStyleOption(&spinBoxStyleOption); + + const QRect buttonRect = edit.style()->subControlRect( + QStyle::CC_SpinBox, &spinBoxStyleOption, subControl, &edit); + + QCOMPARE(edit.time(), startTime); + QTest::mouseClick(&edit, Qt::LeftButton, modifiers, buttonRect.center()); + QCOMPARE(edit.time(), expectedTime); +} + +void tst_QDateTimeEdit::stepModifierPressAndHold_data() +{ + QTest::addColumn<QStyle::SubControl>("subControl"); + QTest::addColumn<int>("stepModifier"); + QTest::addColumn<Qt::KeyboardModifiers>("modifiers"); + QTest::addColumn<int>("expectedStepModifier"); + + const auto subControls = {QStyle::SC_SpinBoxUp, QStyle::SC_SpinBoxDown}; + + const auto modifierList = {Qt::NoModifier, + Qt::ShiftModifier, + Qt::ControlModifier, + Qt::AltModifier, + Qt::MetaModifier}; + + const auto validStepModifierList = {Qt::NoModifier, + Qt::ControlModifier, + Qt::ShiftModifier}; + + for (auto subControl : subControls) { + + const bool up = subControl == QStyle::SC_SpinBoxUp; + Q_ASSERT(up || subControl == QStyle::SC_SpinBoxDown); + + for (auto modifier : modifierList) { + + const Qt::KeyboardModifiers modifiers(modifier); + + const auto modifierName = modifierToName(modifier); + if (modifierName.isEmpty()) + continue; + + for (auto stepModifier : validStepModifierList) { + + const auto stepModifierName = modifierToName(stepModifier); + if (stepModifierName.isEmpty()) + continue; + + const int steps = (modifier & stepModifier ? 10 : 1) + * (up ? 1 : -1); + + QTest::addRow("%s%sWith%sKeyboardModifier", + up ? "up" : "down", + stepModifierName.latin1(), + modifierName.latin1()) + << subControl + << static_cast<int>(stepModifier) + << modifiers + << steps; + } + } + } +} + +void tst_QDateTimeEdit::stepModifierPressAndHold() +{ + QFETCH(QStyle::SubControl, subControl); + QFETCH(int, stepModifier); + QFETCH(Qt::KeyboardModifiers, modifiers); + QFETCH(int, expectedStepModifier); + + const QDate startDate(2000, 1, 1); + + testWidget->hide(); + + EditorDateEdit edit(0); + edit.setDate(startDate); + + QScopedPointer<StepModifierStyle, QScopedPointerDeleteLater> stepModifierStyle( + new StepModifierStyle(new PressAndHoldStyle)); + stepModifierStyle->stepModifier = static_cast<Qt::KeyboardModifier>(stepModifier); + edit.setStyle(stepModifierStyle.data()); + + QSignalSpy spy(&edit, &EditorDateEdit::dateChanged); + + edit.show(); + QVERIFY(QTest::qWaitForWindowActive(&edit)); + edit.setCurrentSection(QDateTimeEdit::YearSection); + + QStyleOptionSpinBox spinBoxStyleOption; + edit.initStyleOption(&spinBoxStyleOption); + + const QRect buttonRect = edit.style()->subControlRect( + QStyle::CC_SpinBox, &spinBoxStyleOption, subControl, &edit); + + QTest::mousePress(&edit, Qt::LeftButton, modifiers, buttonRect.center()); + QTRY_VERIFY(spy.length() >= 3); + QTest::mouseRelease(&edit, Qt::LeftButton, modifiers, buttonRect.center()); + + const auto value = spy.last().at(0); + QVERIFY(value.type() == QVariant::Date); + const QDate expectedDate = startDate.addYears(spy.length() * + expectedStepModifier); + QCOMPARE(value.toDate(), expectedDate); +} + QTEST_MAIN(tst_QDateTimeEdit) #include "tst_qdatetimeedit.moc" diff --git a/tests/auto/widgets/widgets/qdockwidget/tst_qdockwidget.cpp b/tests/auto/widgets/widgets/qdockwidget/tst_qdockwidget.cpp index 7d1e736f42..078a3215fd 100644 --- a/tests/auto/widgets/widgets/qdockwidget/tst_qdockwidget.cpp +++ b/tests/auto/widgets/widgets/qdockwidget/tst_qdockwidget.cpp @@ -36,7 +36,7 @@ #include <qmainwindow.h> #include <qlineedit.h> #include <qtabbar.h> -#include <QDesktopWidget> +#include <QScreen> #include <QtGui/QPainter> #include "private/qdockwidget_p.h" @@ -338,7 +338,7 @@ void tst_QDockWidget::features() void tst_QDockWidget::setFloating() { - const QRect deskRect = QApplication::desktop()->availableGeometry(); + const QRect deskRect = QGuiApplication::primaryScreen()->availableGeometry(); QMainWindow mw; mw.move(deskRect.left() + deskRect.width() * 2 / 3, deskRect.top() + deskRect.height() / 3); QDockWidget dw; @@ -756,7 +756,7 @@ void tst_QDockWidget::restoreStateWhileStillFloating() // When the dock widget is already floating then it takes a different code path // so this test covers the case where the restoreState() is effectively just // moving it back and resizing it - const QRect availGeom = QApplication::desktop()->availableGeometry(); + const QRect availGeom = QGuiApplication::primaryScreen()->availableGeometry(); const QPoint startingDockPos = availGeom.center(); QMainWindow mw; QDockWidget *dock = createTestDock(mw); @@ -781,10 +781,8 @@ void tst_QDockWidget::restoreDockWidget() QByteArray geometry; QByteArray state; - const bool isXcb = !QGuiApplication::platformName().compare("xcb", Qt::CaseInsensitive); - const QString name = QStringLiteral("main"); - const QRect availableGeometry = QApplication::desktop()->availableGeometry(); + const QRect availableGeometry = QGuiApplication::primaryScreen()->availableGeometry(); const QSize size = availableGeometry.size() / 5; const QPoint mainWindowPos = availableGeometry.bottomRight() - QPoint(size.width(), size.height()) - QPoint(100, 100); const QPoint dockPos = availableGeometry.center(); @@ -815,8 +813,7 @@ void tst_QDockWidget::restoreDockWidget() dock->show(); QVERIFY(QTest::qWaitForWindowExposed(dock)); QTRY_VERIFY(dock->isFloating()); - if (!isXcb) // Avoid Window manager positioning issues - QTRY_COMPARE(dock->pos(), dockPos); + QTRY_COMPARE(dock->pos(), dockPos); } QVERIFY(!geometry.isEmpty()); @@ -837,8 +834,6 @@ void tst_QDockWidget::restoreDockWidget() restoreWindow.show(); QVERIFY(QTest::qWaitForWindowExposed(&restoreWindow)); QTRY_VERIFY(dock->isFloating()); - if (isXcb) - QSKIP("Skip due to Window manager positioning issues", Abort); QTRY_COMPARE(dock->pos(), dockPos); } } @@ -868,7 +863,7 @@ void tst_QDockWidget::task169808_setFloating() public: QSize sizeHint() const { - const QRect& deskRect = qApp->desktop()->availableGeometry(); + const QRect& deskRect = QGuiApplication::primaryScreen()->availableGeometry(); return QSize(qMin(300, deskRect.width() / 2), qMin(300, deskRect.height() / 2)); } @@ -892,6 +887,9 @@ void tst_QDockWidget::task169808_setFloating() mw.show(); QVERIFY(QTest::qWaitForWindowExposed(&mw)); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "Widgets are maximized on WinRT by default", Abort); +#endif QCOMPARE(dw->widget()->size(), dw->widget()->sizeHint()); //and now we try to test if the contents margin is taken into account @@ -934,6 +932,9 @@ void tst_QDockWidget::task248604_infiniteResize() d.setContentsMargins(2, 2, 2, 2); d.setMinimumSize(320, 240); d.showNormal(); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "Widgets are maximized on WinRT by default", Abort); +#endif QTRY_COMPARE(d.size(), QSize(320, 240)); } diff --git a/tests/auto/widgets/widgets/qdoublespinbox/tst_qdoublespinbox.cpp b/tests/auto/widgets/widgets/qdoublespinbox/tst_qdoublespinbox.cpp index d44cc40527..b1610c297d 100644 --- a/tests/auto/widgets/widgets/qdoublespinbox/tst_qdoublespinbox.cpp +++ b/tests/auto/widgets/widgets/qdoublespinbox/tst_qdoublespinbox.cpp @@ -31,6 +31,7 @@ #include <qapplication.h> #include <limits.h> +#include <cmath> #include <float.h> #include <qspinbox.h> @@ -40,6 +41,10 @@ #include <qlineedit.h> #include <qdebug.h> +#include <QStyleOptionSpinBox> +#include <QStyle> +#include <QProxyStyle> + class DoubleSpinBox : public QDoubleSpinBox { Q_OBJECT @@ -59,6 +64,16 @@ public: { return QDoubleSpinBox::valueFromText(text); } +#if QT_CONFIG(wheelevent) + void wheelEvent(QWheelEvent *event) + { + QDoubleSpinBox::wheelEvent(event); + } +#endif + void initStyleOption(QStyleOptionSpinBox *option) const + { + QDoubleSpinBox::initStyleOption(option); + } QLineEdit* lineEdit() const { return QDoubleSpinBox::lineEdit(); } public slots: @@ -68,6 +83,46 @@ public slots: } }; +class PressAndHoldStyle : public QProxyStyle +{ + Q_OBJECT +public: + using QProxyStyle::QProxyStyle; + + int styleHint(QStyle::StyleHint hint, const QStyleOption *option = nullptr, + const QWidget *widget = nullptr, QStyleHintReturn *returnData = nullptr) const override + { + switch (hint) { + case QStyle::SH_SpinBox_ClickAutoRepeatRate: + return 5; + case QStyle::SH_SpinBox_ClickAutoRepeatThreshold: + return 10; + default: + return QProxyStyle::styleHint(hint, option, widget, returnData); + } + } +}; + +class StepModifierStyle : public QProxyStyle +{ + Q_OBJECT +public: + using QProxyStyle::QProxyStyle; + + int styleHint(QStyle::StyleHint hint, const QStyleOption *option = nullptr, + const QWidget *widget = nullptr, QStyleHintReturn *returnData = nullptr) const override + { + switch (hint) { + case QStyle::SH_SpinBox_StepModifier: + return stepModifier; + default: + return QProxyStyle::styleHint(hint, option, widget, returnData); + } + } + + Qt::KeyboardModifier stepModifier = Qt::ControlModifier; +}; + class tst_QDoubleSpinBox : public QObject { @@ -135,6 +190,19 @@ private slots: void setGroupSeparatorShown_data(); void setGroupSeparatorShown(); + void adaptiveDecimalStep(); + + void wheelEvents_data(); + void wheelEvents(); + + void stepModifierKeys_data(); + void stepModifierKeys(); + + void stepModifierButtons_data(); + void stepModifierButtons(); + + void stepModifierPressAndHold_data(); + void stepModifierPressAndHold(); public slots: void valueChangedHelper(const QString &); void valueChangedHelper(double); @@ -149,6 +217,30 @@ typedef QList<double> DoubleList; Q_DECLARE_METATYPE(QLocale::Language) Q_DECLARE_METATYPE(QLocale::Country) +static QLatin1String modifierToName(Qt::KeyboardModifier modifier) +{ + switch (modifier) { + case Qt::NoModifier: + return QLatin1Literal("No"); + break; + case Qt::ControlModifier: + return QLatin1Literal("Ctrl"); + break; + case Qt::ShiftModifier: + return QLatin1Literal("Shift"); + break; + case Qt::AltModifier: + return QLatin1Literal("Alt"); + break; + case Qt::MetaModifier: + return QLatin1Literal("Meta"); + break; + default: + qFatal("Unexpected keyboard modifier"); + return QLatin1String(); + } +} + tst_QDoubleSpinBox::tst_QDoubleSpinBox() { @@ -1139,5 +1231,548 @@ void tst_QDoubleSpinBox::setGroupSeparatorShown() QCOMPARE(spinBox.value()+1000, 33000.44); } +void tst_QDoubleSpinBox::adaptiveDecimalStep() +{ + DoubleSpinBox spinBox; + spinBox.setRange(-100000, 100000); + spinBox.setDecimals(4); + spinBox.setStepType(DoubleSpinBox::StepType::AdaptiveDecimalStepType); + + // Positive values + + spinBox.setValue(0); + + // Go from 0 to 0.01 + for (double i = 0; i < 0.00999; i += 0.0001) { + QVERIFY(qFuzzyCompare(spinBox.value(), i)); + spinBox.stepBy(1); + } + + // Go from 0.01 to 0.1 + for (double i = 0.01; i < 0.0999; i += 0.001) { + QVERIFY(qFuzzyCompare(spinBox.value(), i)); + spinBox.stepBy(1); + } + + // Go from 0.1 to 1 + for (double i = 0.1; i < 0.999; i += 0.01) { + QVERIFY(qFuzzyCompare(spinBox.value(), i)); + spinBox.stepBy(1); + } + + // Go from 1 to 10 + for (double i = 1; i < 9.99; i += 0.1) { + QVERIFY(qFuzzyCompare(spinBox.value(), i)); + spinBox.stepBy(1); + } + + // Go from 10 to 100 + for (int i = 10; i < 100; i++) { + QVERIFY(qFuzzyCompare(spinBox.value(), i)); + spinBox.stepBy(1); + } + + // Go from 100 to 1000 + for (int i = 100; i < 1000; i += 10) { + QVERIFY(qFuzzyCompare(spinBox.value(), i)); + spinBox.stepBy(1); + } + + // Go from 1000 to 10000 + for (int i = 1000; i < 10000; i += 100) { + QVERIFY(qFuzzyCompare(spinBox.value(), i)); + spinBox.stepBy(1); + } + + // Test decreasing the values now + + // Go from 10000 down to 1000 + for (int i = 10000; i > 1000; i -= 100) { + QVERIFY(qFuzzyCompare(spinBox.value(), i)); + spinBox.stepBy(-1); + } + + // Go from 1000 down to 100 + for (int i = 1000; i > 100; i -= 10) { + QVERIFY(qFuzzyCompare(spinBox.value(), i)); + spinBox.stepBy(-1); + } + + // Negative values + + spinBox.setValue(0); + + // Go from 0 to -0.01 + for (double i = 0; i > -0.00999; i -= 0.0001) { + QVERIFY(qFuzzyCompare(spinBox.value(), i)); + spinBox.stepBy(-1); + } + + // Go from -0.01 to -0.1 + for (double i = -0.01; i > -0.0999; i -= 0.001) { + QVERIFY(qFuzzyCompare(spinBox.value(), i)); + spinBox.stepBy(-1); + } + + // Go from -0.1 to -1 + for (double i = -0.1; i > -0.999; i -= 0.01) { + QVERIFY(qFuzzyCompare(spinBox.value(), i)); + spinBox.stepBy(-1); + } + + // Go from -1 to -10 + for (double i = -1; i > -9.99; i -= 0.1) { + QVERIFY(qFuzzyCompare(spinBox.value(), i)); + spinBox.stepBy(-1); + } + + // Go from -10 to -100 + for (int i = -10; i > -100; i--) { + QVERIFY(qFuzzyCompare(spinBox.value(), i)); + spinBox.stepBy(-1); + } + + // Go from -100 to -1000 + for (int i = -100; i > -1000; i -= 10) { + QVERIFY(qFuzzyCompare(spinBox.value(), i)); + spinBox.stepBy(-1); + } + + // Go from 1000 to 10000 + for (int i = -1000; i > -10000; i -= 100) { + QVERIFY(qFuzzyCompare(spinBox.value(), i)); + spinBox.stepBy(-1); + } + + // Test increasing the values now + + // Go from -10000 up to -1000 + for (int i = -10000; i < -1000; i += 100) { + QVERIFY(qFuzzyCompare(spinBox.value(), i)); + spinBox.stepBy(1); + } + + // Go from -1000 up to -100 + for (int i = -1000; i < -100; i += 10) { + QVERIFY(qFuzzyCompare(spinBox.value(), i)); + spinBox.stepBy(1); + } +} + +void tst_QDoubleSpinBox::wheelEvents_data() +{ +#if QT_CONFIG(wheelevent) + QTest::addColumn<QPoint>("angleDelta"); + QTest::addColumn<int>("qt4Delta"); + QTest::addColumn<int>("stepModifier"); + QTest::addColumn<Qt::KeyboardModifiers>("modifier"); + QTest::addColumn<Qt::MouseEventSource>("source"); + QTest::addColumn<double>("start"); + QTest::addColumn<DoubleList>("expectedValues"); + + const auto fractions = {false, true}; + + const auto directions = {true, false}; + + const auto modifierList = {Qt::NoModifier, + Qt::ShiftModifier, + Qt::ControlModifier, + Qt::AltModifier, + Qt::MetaModifier}; + + const auto validStepModifierList = {Qt::NoModifier, + Qt::ControlModifier, + Qt::ShiftModifier}; + + const auto sources = {Qt::MouseEventNotSynthesized, + Qt::MouseEventSynthesizedBySystem, + Qt::MouseEventSynthesizedByQt, + Qt::MouseEventSynthesizedByApplication}; + + const double startValue = 0.0; + + for (auto fraction : fractions) { + for (auto up : directions) { + + const int units = (fraction ? 60 : 120) * (up ? 1 : -1); + + for (auto modifier : modifierList) { + + const Qt::KeyboardModifiers modifiers(modifier); + + const auto modifierName = modifierToName(modifier); + if (modifierName.isEmpty()) + continue; + + for (auto stepModifier : validStepModifierList) { + + const auto stepModifierName = modifierToName(stepModifier); + if (stepModifierName.isEmpty()) + continue; + + const int steps = (modifier & stepModifier ? 10 : 1) + * (up ? 1 : -1); + + for (auto source : sources) { + +#ifdef Q_OS_MACOS + QPoint angleDelta; + if ((modifier & Qt::ShiftModifier) && + source == Qt::MouseEventNotSynthesized) { + // On macOS the Shift modifier converts vertical + // mouse wheel events to horizontal. + angleDelta = { units, 0 }; + } else { + // However, this is not the case for trackpad scroll + // events. + angleDelta = { 0, units }; + } +#else + const QPoint angleDelta(0, units); +#endif + + QLatin1String sourceName; + switch (source) { + case Qt::MouseEventNotSynthesized: + sourceName = QLatin1Literal("NotSynthesized"); + break; + case Qt::MouseEventSynthesizedBySystem: + sourceName = QLatin1Literal("SynthesizedBySystem"); + break; + case Qt::MouseEventSynthesizedByQt: + sourceName = QLatin1Literal("SynthesizedByQt"); + break; + case Qt::MouseEventSynthesizedByApplication: + sourceName = QLatin1Literal("SynthesizedByApplication"); + break; + default: + qFatal("Unexpected wheel event source"); + continue; + } + + DoubleList expectedValues; + if (fraction) + expectedValues << startValue; + expectedValues << startValue + steps; + + QTest::addRow("%s%s%sWith%sKeyboardModifier%s", + fraction ? "half" : "full", + up ? "Up" : "Down", + stepModifierName.latin1(), + modifierName.latin1(), + sourceName.latin1()) + << angleDelta + << units + << static_cast<int>(stepModifier) + << modifiers + << source + << startValue + << expectedValues; + } + } + } + } + } +#else + QSKIP("Built with --no-feature-wheelevent"); +#endif +} + +void tst_QDoubleSpinBox::wheelEvents() +{ +#if QT_CONFIG(wheelevent) + QFETCH(QPoint, angleDelta); + QFETCH(int, qt4Delta); + QFETCH(int, stepModifier); + QFETCH(Qt::KeyboardModifiers, modifier); + QFETCH(Qt::MouseEventSource, source); + QFETCH(double, start); + QFETCH(DoubleList, expectedValues); + + DoubleSpinBox spinBox; + spinBox.setRange(-20, 20); + spinBox.setValue(start); + + QScopedPointer<StepModifierStyle, QScopedPointerDeleteLater> style( + new StepModifierStyle); + style->stepModifier = static_cast<Qt::KeyboardModifier>(stepModifier); + spinBox.setStyle(style.data()); + + QWheelEvent event(QPointF(), QPointF(), QPoint(), angleDelta, qt4Delta, + Qt::Vertical, Qt::NoButton, modifier, Qt::NoScrollPhase, + source); + for (int expected : expectedValues) { + qApp->sendEvent(&spinBox, &event); + QCOMPARE(spinBox.value(), expected); + } +#else + QSKIP("Built with --no-feature-wheelevent"); +#endif +} + +void tst_QDoubleSpinBox::stepModifierKeys_data() +{ + QTest::addColumn<double>("startValue"); + QTest::addColumn<int>("stepModifier"); + QTest::addColumn<QTestEventList>("keys"); + QTest::addColumn<double>("expectedValue"); + + const auto keyList = {Qt::Key_Up, Qt::Key_Down}; + + const auto modifierList = {Qt::NoModifier, + Qt::ShiftModifier, + Qt::ControlModifier, + Qt::AltModifier, + Qt::MetaModifier}; + + const auto validStepModifierList = {Qt::NoModifier, + Qt::ControlModifier, + Qt::ShiftModifier}; + + + for (auto key : keyList) { + + const bool up = key == Qt::Key_Up; + Q_ASSERT(up || key == Qt::Key_Down); + + const double startValue = up ? 0.0 : 10.0; + + for (auto modifier : modifierList) { + + QTestEventList keys; + keys.addKeyClick(key, modifier); + + const auto modifierName = modifierToName(modifier); + if (modifierName.isEmpty()) + continue; + + for (auto stepModifier : validStepModifierList) { + + const auto stepModifierName = modifierToName(stepModifier); + if (stepModifierName.isEmpty()) + continue; + + const int steps = (modifier & stepModifier ? 10 : 1) + * (up ? 1 : -1); + + const double expectedValue = startValue + steps; + + QTest::addRow("%s%sWith%sKeyboardModifier", + up ? "up" : "down", + stepModifierName.latin1(), + modifierName.latin1()) + << startValue + << static_cast<int>(stepModifier) + << keys + << expectedValue; + } + } + } +} + +void tst_QDoubleSpinBox::stepModifierKeys() +{ + QFETCH(double, startValue); + QFETCH(int, stepModifier); + QFETCH(QTestEventList, keys); + QFETCH(double, expectedValue); + + QDoubleSpinBox spin(0); + spin.setValue(startValue); + + QScopedPointer<StepModifierStyle, QScopedPointerDeleteLater> style( + new StepModifierStyle); + style->stepModifier = static_cast<Qt::KeyboardModifier>(stepModifier); + spin.setStyle(style.data()); + + spin.show(); + QVERIFY(QTest::qWaitForWindowActive(&spin)); + + QCOMPARE(spin.value(), startValue); + keys.simulate(&spin); + QCOMPARE(spin.value(), expectedValue); +} + +void tst_QDoubleSpinBox::stepModifierButtons_data() +{ + QTest::addColumn<QStyle::SubControl>("subControl"); + QTest::addColumn<int>("stepModifier"); + QTest::addColumn<Qt::KeyboardModifiers>("modifiers"); + QTest::addColumn<double>("startValue"); + QTest::addColumn<double>("expectedValue"); + + const auto subControls = {QStyle::SC_SpinBoxUp, QStyle::SC_SpinBoxDown}; + + const auto modifierList = {Qt::NoModifier, + Qt::ShiftModifier, + Qt::ControlModifier, + Qt::AltModifier, + Qt::MetaModifier}; + + const auto validStepModifierList = {Qt::NoModifier, + Qt::ControlModifier, + Qt::ShiftModifier}; + + for (auto subControl : subControls) { + + const bool up = subControl == QStyle::SC_SpinBoxUp; + Q_ASSERT(up || subControl == QStyle::SC_SpinBoxDown); + + const double startValue = up ? 0 : 10; + + for (auto modifier : modifierList) { + + const Qt::KeyboardModifiers modifiers(modifier); + + const auto modifierName = modifierToName(modifier); + if (modifierName.isEmpty()) + continue; + + for (auto stepModifier : validStepModifierList) { + + const auto stepModifierName = modifierToName(stepModifier); + if (stepModifierName.isEmpty()) + continue; + + const int steps = (modifier & stepModifier ? 10 : 1) + * (up ? 1 : -1); + + const double expectedValue = startValue + steps; + + QTest::addRow("%s%sWith%sKeyboardModifier", + up ? "up" : "down", + stepModifierName.latin1(), + modifierName.latin1()) + << subControl + << static_cast<int>(stepModifier) + << modifiers + << startValue + << expectedValue; + } + } + } +} + +void tst_QDoubleSpinBox::stepModifierButtons() +{ + QFETCH(QStyle::SubControl, subControl); + QFETCH(int, stepModifier); + QFETCH(Qt::KeyboardModifiers, modifiers); + QFETCH(double, startValue); + QFETCH(double, expectedValue); + + DoubleSpinBox spin(0); + spin.setRange(-20, 20); + spin.setValue(startValue); + + QScopedPointer<StepModifierStyle, QScopedPointerDeleteLater> style( + new StepModifierStyle); + style->stepModifier = static_cast<Qt::KeyboardModifier>(stepModifier); + spin.setStyle(style.data()); + + spin.show(); + QVERIFY(QTest::qWaitForWindowActive(&spin)); + + QStyleOptionSpinBox spinBoxStyleOption; + spin.initStyleOption(&spinBoxStyleOption); + + const QRect buttonRect = spin.style()->subControlRect( + QStyle::CC_SpinBox, &spinBoxStyleOption, subControl, &spin); + + QCOMPARE(spin.value(), startValue); + QTest::mouseClick(&spin, Qt::LeftButton, modifiers, buttonRect.center()); + QCOMPARE(spin.value(), expectedValue); +} + +void tst_QDoubleSpinBox::stepModifierPressAndHold_data() +{ + QTest::addColumn<QStyle::SubControl>("subControl"); + QTest::addColumn<int>("stepModifier"); + QTest::addColumn<Qt::KeyboardModifiers>("modifiers"); + QTest::addColumn<int>("expectedStepModifier"); + + const auto subControls = {QStyle::SC_SpinBoxUp, QStyle::SC_SpinBoxDown}; + + const auto modifierList = {Qt::NoModifier, + Qt::ShiftModifier, + Qt::ControlModifier, + Qt::AltModifier, + Qt::MetaModifier}; + + const auto validStepModifierList = {Qt::NoModifier, + Qt::ControlModifier, + Qt::ShiftModifier}; + + for (auto subControl : subControls) { + + const bool up = subControl == QStyle::SC_SpinBoxUp; + Q_ASSERT(up || subControl == QStyle::SC_SpinBoxDown); + + for (auto modifier : modifierList) { + + const Qt::KeyboardModifiers modifiers(modifier); + + const auto modifierName = modifierToName(modifier); + if (modifierName.isEmpty()) + continue; + + for (auto stepModifier : validStepModifierList) { + + const auto stepModifierName = modifierToName(stepModifier); + if (stepModifierName.isEmpty()) + continue; + + const int steps = (modifier & stepModifier ? 10 : 1) + * (up ? 1 : -1); + + QTest::addRow("%s%sWith%sKeyboardModifier", + up ? "up" : "down", + stepModifierName.latin1(), + modifierName.latin1()) + << subControl + << static_cast<int>(stepModifier) + << modifiers + << steps; + } + } + } +} + +void tst_QDoubleSpinBox::stepModifierPressAndHold() +{ + QFETCH(QStyle::SubControl, subControl); + QFETCH(int, stepModifier); + QFETCH(Qt::KeyboardModifiers, modifiers); + QFETCH(int, expectedStepModifier); + + DoubleSpinBox spin(0); + spin.setRange(-100.0, 100.0); + spin.setValue(0.0); + + QScopedPointer<StepModifierStyle, QScopedPointerDeleteLater> stepModifierStyle( + new StepModifierStyle(new PressAndHoldStyle)); + stepModifierStyle->stepModifier = static_cast<Qt::KeyboardModifier>(stepModifier); + spin.setStyle(stepModifierStyle.data()); + + QSignalSpy spy(&spin, QOverload<double>::of(&DoubleSpinBox::valueChanged)); + + spin.show(); + QVERIFY(QTest::qWaitForWindowExposed(&spin)); + + QStyleOptionSpinBox spinBoxStyleOption; + spin.initStyleOption(&spinBoxStyleOption); + + const QRect buttonRect = spin.style()->subControlRect( + QStyle::CC_SpinBox, &spinBoxStyleOption, subControl, &spin); + + QTest::mousePress(&spin, Qt::LeftButton, modifiers, buttonRect.center()); + QTRY_VERIFY(spy.length() >= 3); + QTest::mouseRelease(&spin, Qt::LeftButton, modifiers, buttonRect.center()); + + const auto value = spy.last().at(0); + QVERIFY(value.type() == QVariant::Double); + QCOMPARE(value.toDouble(), spy.length() * expectedStepModifier); +} + QTEST_MAIN(tst_QDoubleSpinBox) #include "tst_qdoublespinbox.moc" diff --git a/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp b/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp index 17462a5f86..448e2030bc 100644 --- a/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp +++ b/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp @@ -304,7 +304,7 @@ private slots: void QTBUG59957_clearButtonLeftmostAction(); void QTBUG_60319_setInputMaskCheckImSurroundingText(); void testQuickSelectionWithMouse(); - + void inputRejected(); protected slots: void editingFinished(); @@ -2279,6 +2279,16 @@ void tst_QLineEdit::deleteSelectedText() } +class ToUpperValidator : public QValidator +{ +public: + ToUpperValidator() {} + State validate(QString &input, int &) const override + { + input = input.toUpper(); + return QValidator::Acceptable; + } +}; void tst_QLineEdit::textChangedAndTextEdited() { @@ -2320,6 +2330,23 @@ void tst_QLineEdit::textChangedAndTextEdited() QCOMPARE(edited_count, 0); QVERIFY(changed_string.isEmpty()); QVERIFY(!changed_string.isNull()); + + changed_count = 0; + edited_count = 0; + changed_string.clear(); + + QScopedPointer<ToUpperValidator> validator(new ToUpperValidator()); + testWidget->setValidator(validator.data()); + testWidget->setText("foo"); + QCOMPARE(changed_count, 1); + QCOMPARE(edited_count, 0); + QCOMPARE(changed_string, QLatin1String("FOO")); + testWidget->setCursorPosition(sizeof("foo")); + QTest::keyClick(testWidget, 'b'); + QCOMPARE(changed_count, 2); + QCOMPARE(edited_count, 1); + QCOMPARE(changed_string, QLatin1String("FOOB")); + testWidget->setValidator(nullptr); } void tst_QLineEdit::onTextChanged(const QString &text) @@ -2637,9 +2664,9 @@ void tst_QLineEdit::setValidator_QIntValidator_data() << 0 << 100 << QString("153") - << QString(useKeys ? "15" : "") + << QString("153") << bool(useKeys) - << bool(useKeys ? true : false) + << bool(false) << uint(QLineEdit::Normal); QTest::newRow(QString(inputMode + "range [-100,100] int '-153'").toLatin1()) << -100 @@ -2660,7 +2687,7 @@ void tst_QLineEdit::setValidator_QIntValidator_data() QTest::newRow(QString(inputMode + "range [3,7] int '8'").toLatin1()) << 3 << 7 - << QString("8") + << QString("") << QString("") << bool(useKeys) << bool(false) @@ -3265,7 +3292,7 @@ void tst_QLineEdit::editInvalidText() { QLineEdit *testWidget = ensureTestWidget(); testWidget->clear(); - testWidget->setValidator(new QIntValidator(0, 120, 0)); + testWidget->setValidator(new QIntValidator(0, 12, 0)); testWidget->setText("1234"); QVERIFY(!testWidget->hasAcceptableInput()); @@ -4726,6 +4753,9 @@ void tst_QLineEdit::testQuickSelectionWithMouse() QTest::mousePress(lineEdit.windowHandle(), Qt::LeftButton, Qt::NoModifier, center); QTest::mouseMove(lineEdit.windowHandle(), center + QPoint(20, 0)); qCDebug(lcTests) << "Selected text:" << lineEdit.selectedText(); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "WinRT does not support QTest::mousePress/-Move", Abort); +#endif QVERIFY(!lineEdit.selectedText().isEmpty()); QVERIFY(!lineEdit.selectedText().endsWith(suffix)); @@ -4793,5 +4823,56 @@ void tst_QLineEdit::testQuickSelectionWithMouse() QVERIFY(lineEdit.selectedText().endsWith(suffix)); } +void tst_QLineEdit::inputRejected() +{ + QLineEdit *testWidget = ensureTestWidget(); + QSignalSpy spyInputRejected(testWidget, SIGNAL(inputRejected())); + + QTest::keyClicks(testWidget, "abcde"); + QCOMPARE(spyInputRejected.count(), 0); + testWidget->setText("fghij"); + QCOMPARE(spyInputRejected.count(), 0); + testWidget->insert("k"); + QCOMPARE(spyInputRejected.count(), 0); + + testWidget->clear(); + testWidget->setMaxLength(5); + QTest::keyClicks(testWidget, "abcde"); + QCOMPARE(spyInputRejected.count(), 0); + QTest::keyClicks(testWidget, "fgh"); + QCOMPARE(spyInputRejected.count(), 3); + testWidget->clear(); + spyInputRejected.clear(); + QApplication::clipboard()->setText("ijklmno"); + testWidget->paste(); + // The first 5 characters are accepted, but + // the last 2 are not. + QCOMPARE(spyInputRejected.count(), 1); + + testWidget->setMaxLength(INT_MAX); + testWidget->clear(); + spyInputRejected.clear(); + QIntValidator intValidator(1, 100); + testWidget->setValidator(&intValidator); + QTest::keyClicks(testWidget, "11"); + QCOMPARE(spyInputRejected.count(), 0); + QTest::keyClicks(testWidget, "a#"); + QCOMPARE(spyInputRejected.count(), 2); + testWidget->clear(); + spyInputRejected.clear(); + QApplication::clipboard()->setText("a#"); + testWidget->paste(); + QCOMPARE(spyInputRejected.count(), 1); + + testWidget->clear(); + testWidget->setValidator(0); + spyInputRejected.clear(); + testWidget->setInputMask("999.999.999.999;_"); + QTest::keyClicks(testWidget, "11"); + QCOMPARE(spyInputRejected.count(), 0); + QTest::keyClicks(testWidget, "a#"); + QCOMPARE(spyInputRejected.count(), 2); +} + QTEST_MAIN(tst_QLineEdit) #include "tst_qlineedit.moc" diff --git a/tests/auto/widgets/widgets/qmainwindow/BLACKLIST b/tests/auto/widgets/widgets/qmainwindow/BLACKLIST new file mode 100644 index 0000000000..a03ea11f40 --- /dev/null +++ b/tests/auto/widgets/widgets/qmainwindow/BLACKLIST @@ -0,0 +1,2 @@ +[resizeDocks] +winrt diff --git a/tests/auto/widgets/widgets/qmainwindow/tst_qmainwindow.cpp b/tests/auto/widgets/widgets/qmainwindow/tst_qmainwindow.cpp index ae71663036..1acf07301c 100644 --- a/tests/auto/widgets/widgets/qmainwindow/tst_qmainwindow.cpp +++ b/tests/auto/widgets/widgets/qmainwindow/tst_qmainwindow.cpp @@ -43,7 +43,7 @@ #include <qlabel.h> #include <qtextedit.h> #include <qstylehints.h> -#include <qdesktopwidget.h> +#include <qscreen.h> #include <private/qmainwindowlayout_p.h> #include <private/qdockarealayout_p.h> @@ -768,7 +768,7 @@ void tst_QMainWindow::contentsMargins() QFETCH(int, contentsMargin); QMainWindow mw; - const QRect availGeometry = QApplication::desktop()->availableGeometry(); + const QRect availGeometry = QGuiApplication::primaryScreen()->availableGeometry(); mw.menuBar()->addMenu("File"); mw.setWindowTitle(QLatin1String(QTest::currentTestFunction()) + QLatin1Char(' ') + QLatin1String(QTest::currentDataTag())); @@ -1782,6 +1782,9 @@ void tst_QMainWindow::centralWidgetSize() mainWindow.setCentralWidget(&widget); mainWindow.show(); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "Widgets are maximized by default on WinRT - QTBUG-68297", Abort); +#endif QTRY_COMPARE(widget.size(), widget.sizeHint()); } @@ -1826,6 +1829,9 @@ void tst_QMainWindow::fixedSizeCentralWidget() // finally verify that we get the space back when we resize to the old size mainWindow.resize(mwSize); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "QMainWindow::resize does not work on WinRT", Continue); +#endif QTRY_COMPARE(child->height(), childHeight); } diff --git a/tests/auto/widgets/widgets/qmdiarea/tst_qmdiarea.cpp b/tests/auto/widgets/widgets/qmdiarea/tst_qmdiarea.cpp index ecad7267dd..6cc19051d2 100644 --- a/tests/auto/widgets/widgets/qmdiarea/tst_qmdiarea.cpp +++ b/tests/auto/widgets/widgets/qmdiarea/tst_qmdiarea.cpp @@ -357,6 +357,9 @@ void tst_QMdiArea::subWindowActivated() QMdiSubWindow *window = windows.at(i); window->showNormal(); qApp->processEvents(); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("data2", "Broken on WinRT - QTBUG-68297", Abort); +#endif QVERIFY( window == activeWindow ); QVERIFY( activeWindow == workspace->activeSubWindow() ); } @@ -517,6 +520,9 @@ void tst_QMdiArea::subWindowActivated2() mdiArea.showNormal(); mdiArea.activateWindow(); QVERIFY(QTest::qWaitForWindowActive(&mdiArea)); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "Broken on WinRT - QTBUG-68297", Abort); +#endif QTRY_COMPARE(spy.count(), 1); QCOMPARE(mdiArea.activeSubWindow(), activeSubWindow); spy.clear(); @@ -1191,6 +1197,9 @@ void tst_QMdiArea::addAndRemoveWindows() // Don't occupy space. QMdiSubWindow *window3 = workspace.addSubWindow(new QWidget); window3->show(); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "Windows are maximized by default on WinRT", Abort); +#endif QCOMPARE(window3->geometry().topLeft(), QPoint(window2RestoreGeometry.right() + 1, 0)); } @@ -1451,6 +1460,9 @@ void tst_QMdiArea::subWindowList() QList<QMdiSubWindow *> widgets = workspace.subWindowList(windowOrder); QCOMPARE(widgets.count(), windowCount); if (windowOrder == QMdiArea::StackingOrder) { +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "Broken on WinRT - QTBUG-68297", Abort); +#endif QCOMPARE(widgets.at(widgets.count() - 1), windows[staysOnTop2]); QCOMPARE(widgets.at(widgets.count() - 2), windows[staysOnTop1]); QCOMPARE(widgets.at(widgets.count() - 3), windows[activeSubWindow]); @@ -1666,6 +1678,9 @@ void tst_QMdiArea::tileSubWindows() // Re-tile. workspace.tileSubWindows(); workspace.setActiveSubWindow(0); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "Broken on WinRT - QTBUG-68297", Abort); +#endif QCOMPARE(workspace.viewport()->childrenRect(), workspace.viewport()->rect()); // Cascade and verify that the views are not tiled anymore. @@ -1965,6 +1980,9 @@ void tst_QMdiArea::dontMaximizeSubWindowOnActivation() // Verify that new windows are not maximized. mdiArea.addSubWindow(new QWidget)->show(); QVERIFY(mdiArea.activeSubWindow()); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "Broken on WinRT - QTBUG-68297", Abort); +#endif QVERIFY(!mdiArea.activeSubWindow()->isMaximized()); } @@ -1986,6 +2004,9 @@ void tst_QMdiArea::delayedPlacement() QVERIFY(QTest::qWaitForWindowExposed(&mdiArea)); QCOMPARE(window1->geometry().topLeft(), QPoint(0, 0)); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "Broken on WinRT - QTBUG-68297", Abort); +#endif QCOMPARE(window2->geometry().topLeft(), window1->geometry().topRight() + QPoint(1, 0)); QCOMPARE(window3->geometry().topLeft(), window2->geometry().topRight() + QPoint(1, 0)); } @@ -2117,6 +2138,10 @@ void tst_QMdiArea::updateScrollBars() subWindow1->showNormal(); qApp->processEvents(); QVERIFY(!subWindow1->isMaximized()); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "Widgets are maximized by default on WinRT, so scroll bars might not be" + "visible", Abort); +#endif QVERIFY(hbar->style()->styleHint(QStyle::SH_ScrollBar_Transient) || hbar->isVisible()); QVERIFY(vbar->style()->styleHint(QStyle::SH_ScrollBar_Transient) || vbar->isVisible()); if (i == 0) { @@ -2318,6 +2343,10 @@ void tst_QMdiArea::setViewMode() QList<QMdiSubWindow *> subWindows = mdiArea.subWindowList(); // Default. +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "Widgets are maximized by default on WinRT, so scroll bars might not be" + "visible", Abort); +#endif QVERIFY(!activeSubWindow->isMaximized()); QTabBar *tabBar = mdiArea.findChild<QTabBar *>(); QVERIFY(!tabBar); diff --git a/tests/auto/widgets/widgets/qmdisubwindow/tst_qmdisubwindow.cpp b/tests/auto/widgets/widgets/qmdisubwindow/tst_qmdisubwindow.cpp index 360e0c93c4..4908f1b9f7 100644 --- a/tests/auto/widgets/widgets/qmdisubwindow/tst_qmdisubwindow.cpp +++ b/tests/auto/widgets/widgets/qmdisubwindow/tst_qmdisubwindow.cpp @@ -517,6 +517,9 @@ void tst_QMdiSubWindow::emittingOfSignals() } } } +#ifdef Q_OS_WINRT + QEXPECT_FAIL("windowMaximized", "Broken on WinRT - QTBUG-68297", Abort); +#endif QCOMPARE(count, 1); window->setParent(0); @@ -542,6 +545,9 @@ void tst_QMdiSubWindow::showShaded() QVERIFY(QTest::qWaitForWindowExposed(&workspace)); QVERIFY(!window->isShaded()); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "Windows are maximized per default on WinRt ", Abort); +#endif QVERIFY(!window->isMaximized()); QCOMPARE(window->size(), QSize(300, 300)); @@ -634,6 +640,10 @@ void tst_QMdiSubWindow::showNormal() qApp->processEvents(); window->showNormal(); qApp->processEvents(); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("showMinimized", "Windows are maximized per default on WinRt ", Abort); + QEXPECT_FAIL("showMaximized", "Windows are maximized per default on WinRt ", Abort); +#endif QCOMPARE(window->geometry(), originalGeometry); } @@ -740,6 +750,9 @@ void tst_QMdiSubWindow::setOpaqueResizeAndMove() // Leave resize mode sendMouseRelease(mouseReceiver, mousePosition); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "Fails on WinRT - QTBUG-68297", Abort); +#endif QCOMPARE(resizeSpy.count(), expectedGeometryCount); QCOMPARE(window->size(), windowSize + QSize(geometryCount, geometryCount)); } @@ -903,6 +916,9 @@ void tst_QMdiSubWindow::mouseDoubleClick() workspace.show(); window->show(); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "Windows are maximized per default on WinRt ", Abort); +#endif QVERIFY(!window->isMaximized()); QVERIFY(!window->isShaded()); @@ -971,6 +987,9 @@ void tst_QMdiSubWindow::setSystemMenu() QVERIFY(!qApp->activePopupWidget()); subWindow->showSystemMenu(); QTRY_COMPARE(qApp->activePopupWidget(), qobject_cast<QWidget *>(systemMenu)); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "Broken on WinRT - QTBUG-68297", Abort); +#endif QTRY_COMPARE(systemMenu->mapToGlobal(QPoint(0, 0)), (globalPopupPos = subWindow->mapToGlobal(subWindow->contentsRect().topLeft())) ); @@ -1196,6 +1215,9 @@ void tst_QMdiSubWindow::restoreFocusOverCreation() QTRY_COMPARE(QApplication::focusWidget(), subWidget2->m_lineEdit1); mdiArea.setActiveSubWindow(subWindow1); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "Broken on WinRt - QTBUG-68297", Abort); +#endif QTRY_COMPARE(QApplication::focusWidget(), subWidget1->m_lineEdit2); } @@ -1404,6 +1426,9 @@ void tst_QMdiSubWindow::resizeEvents() QCOMPARE(window->widget()->windowState(), windowState); // Make sure we got as many resize events as expected. +#ifdef Q_OS_WINRT + QEXPECT_FAIL("maximized", "Broken on WinRT - QTBUG-68297", Abort); +#endif QCOMPARE(windowResizeEventSpy.count(), expectedWindowResizeEvents); QCOMPARE(widgetResizeEventSpy.count(), expectedWidgetResizeEvents); windowResizeEventSpy.clear(); @@ -1413,6 +1438,10 @@ void tst_QMdiSubWindow::resizeEvents() window->showNormal(); // Check that the window state is correct. +#ifdef Q_OS_WINRT + QEXPECT_FAIL("minimized", "Broken on WinRT - QTBUG-68297", Abort); + QEXPECT_FAIL("shaded", "Broken on WinRT - QTBUG-68297", Abort); +#endif QCOMPARE(window->windowState(), Qt::WindowNoState | Qt::WindowActive); QCOMPARE(window->widget()->windowState(), Qt::WindowNoState); @@ -1673,6 +1702,9 @@ void tst_QMdiSubWindow::fixedMinMaxSize() QCOMPARE(subWindow->maximumSize(), maximumSize); mdiArea.addSubWindow(subWindow); subWindow->show(); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "Windows are maximized per default on WinRt ", Abort); +#endif QCOMPARE(subWindow->size(), minimumSize); // Calculate the size of a minimized sub window. @@ -2057,6 +2089,9 @@ void tst_QMdiSubWindow::testFullScreenState() subWindow->showFullScreen(); // QMdiSubWindow does not support the fullscreen state. This call // should be equivalent to setVisible(true) (and not showNormal()) QVERIFY(QTest::qWaitForWindowExposed(&mdiArea)); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "Windows are maximized per default on WinRt ", Abort); +#endif QCOMPARE(subWindow->size(), QSize(300, 300)); } diff --git a/tests/auto/widgets/widgets/qmenu/BLACKLIST b/tests/auto/widgets/widgets/qmenu/BLACKLIST index 1c970c43b3..89d12a259f 100644 --- a/tests/auto/widgets/widgets/qmenu/BLACKLIST +++ b/tests/auto/widgets/widgets/qmenu/BLACKLIST @@ -10,3 +10,5 @@ osx ci osx [tearOff] osx +[activeSubMenuPosition] +winrt diff --git a/tests/auto/widgets/widgets/qmenu/qmenu.pro b/tests/auto/widgets/widgets/qmenu/qmenu.pro index 84b6530184..4a492ee941 100644 --- a/tests/auto/widgets/widgets/qmenu/qmenu.pro +++ b/tests/auto/widgets/widgets/qmenu/qmenu.pro @@ -5,4 +5,6 @@ SOURCES += tst_qmenu.cpp macx:{ OBJECTIVE_SOURCES += tst_qmenu_mac.mm LIBS += -lobjc +} else { + DEFINES += QTEST_QPA_MOUSE_HANDLING } diff --git a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp index 0dde385bdb..a88fd8d19c 100644 --- a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp +++ b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp @@ -29,6 +29,7 @@ #include <QtTest/QtTest> #include <QtTest/private/qtesthelpers_p.h> #include <qapplication.h> +#include <private/qguiapplication_p.h> #include <QPushButton> #include <QMainWindow> #include <QMenuBar> @@ -48,6 +49,7 @@ #include <qdebug.h> #include <qpa/qplatformtheme.h> +#include <qpa/qplatformintegration.h> using namespace QTestPrivate; @@ -459,6 +461,9 @@ void tst_QMenu::focus() void tst_QMenu::overrideMenuAction() { + if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::WindowActivation)) + QSKIP("Window activation is not supported"); + //test the override menu action by first creating an action to which we set its menu QMainWindow w; w.resize(300, 200); @@ -614,6 +619,9 @@ static QMenu *getTornOffMenu() void tst_QMenu::tearOff() { + if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::WindowActivation)) + QSKIP("Window activation is not supported"); + QWidget widget; QScopedPointer<QMenu> menu(new QMenu(&widget)); QVERIFY(!menu->isTearOffEnabled()); //default value @@ -686,6 +694,9 @@ void tst_QMenu::tearOff() void tst_QMenu::submenuTearOffDontClose() { + if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::WindowActivation)) + QSKIP("Window activation is not supported"); + QWidget widget; QMenu *menu = new QMenu(&widget); QVERIFY(!menu->isTearOffEnabled()); //default value @@ -713,7 +724,8 @@ void tst_QMenu::submenuTearOffDontClose() // Move then click to avoid the submenu moves from causing it to close QTest::mouseMove(menu, submenuPos, 100); QTest::mouseClick(menu, Qt::LeftButton, 0, submenuPos, 100); - QTRY_VERIFY(QTest::qWaitForWindowActive(submenu)); + QVERIFY(QTest::qWaitFor([&]() { return submenu->window()->windowHandle(); })); + QVERIFY(QTest::qWaitForWindowActive(submenu)); // Make sure we enter the submenu frame directly on the tear-off area QTest::mouseMove(submenu, QPoint(10, 3), 100); if (submenu->style()->styleHint(QStyle::SH_Menu_SubMenuDontStartSloppyOnLeave)) { @@ -843,6 +855,10 @@ private: void tst_QMenu::activeSubMenuPositionExec() { + +#ifdef Q_OS_WINRT + QSKIP("Broken on WinRT - QTBUG-68297"); +#endif SubMenuPositionExecMenu menu; menu.exec(QGuiApplication::primaryScreen()->availableGeometry().center()); } @@ -986,9 +1002,6 @@ void tst_QMenu::task258920_mouseBorder() QAction *action = menu.addAction("test"); const QPoint center = QApplication::desktop()->availableGeometry().center(); -#ifndef QT_NO_CURSOR - QCursor::setPos(center - QPoint(100, 100)); // Mac: Ensure cursor is outside -#endif menu.popup(center); QVERIFY(QTest::qWaitForWindowExposed(&menu)); QRect actionRect = menu.actionGeometry(action); @@ -1082,6 +1095,9 @@ void tst_QMenu::pushButtonPopulateOnAboutToShow() QTimer::singleShot(300, buttonMenu, SLOT(hide())); QTest::mouseClick(&b, Qt::LeftButton, Qt::NoModifier, b.rect().center()); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "WinRT does not support QTest::mouseClick", Abort); +#endif QVERIFY2(!buttonMenu->geometry().intersects(b.geometry()), msgGeometryIntersects(buttonMenu->geometry(), b.geometry())); // note: we're assuming that, if we previously got the desired geometry, we'll get it here too @@ -1180,6 +1196,9 @@ void tst_QMenu::click_while_dismissing_submenu() //this opens the submenu, move two times to emulate user interaction (d->motions > 0 in QMenu) QTest::mouseMove(menuWindow, menu.rect().center() + QPoint(0,2)); QTest::mouseMove(menuWindow, menu.rect().center() + QPoint(1,3), 60); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "WinRT does not support QTest::mouseMove", Abort); +#endif QVERIFY(menuShownSpy.wait()); QVERIFY(sub.isVisible()); QVERIFY(QTest::qWaitForWindowExposed(&sub)); @@ -1229,96 +1248,95 @@ public: void tst_QMenu::QTBUG47515_widgetActionEnterLeave() { -#if !QT_CONFIG(cursor) - QSKIP("This test requires QCursor API"); -#else + if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::WindowActivation)) + QSKIP("Window activation is not supported"); if (QGuiApplication::platformName() == QLatin1String("cocoa")) QSKIP("See QTBUG-63031"); - QPoint screenCenter = QGuiApplication::primaryScreen()->availableGeometry().center(); - QPoint pointOutsideMenu = screenCenter - QPoint(100, 100); + const QRect availableGeometry = QGuiApplication::primaryScreen()->availableGeometry(); + QRect geometry(QPoint(), availableGeometry.size() / 3); + geometry.moveCenter(availableGeometry.center()); + QPoint pointOutsideMenu = geometry.bottomRight() - QPoint(5, 5); - QMenu menu("Menu1"); - QMenu submenu("Menu2"); + QMainWindow topLevel; + topLevel.setGeometry(geometry); - QWidgetAction menuAction(&menu); - MyWidget w1(&menu); - menuAction.setDefaultWidget(&w1); + QMenuBar *menuBar = topLevel.menuBar(); + menuBar->setNativeMenuBar(false); + QMenu *menu = menuBar->addMenu("Menu1"); + QMenu *submenu = menu->addMenu("Menu2"); - QWidgetAction submenuAction(&submenu); - MyWidget w2(&submenu); - submenuAction.setDefaultWidget(&w2); + QWidgetAction *menuAction = new QWidgetAction(menu); + MyWidget *w1 = new MyWidget(menu); + menuAction->setDefaultWidget(w1); - QAction *nextMenuAct = menu.addMenu(&submenu); + QWidgetAction *submenuAction = new QWidgetAction(submenu); + MyWidget *w2 = new MyWidget(submenu); + submenuAction->setDefaultWidget(w2); - menu.addAction(&menuAction); - submenu.addAction(&submenuAction); + QAction *nextMenuAct = menu->addMenu(submenu); - // Root menu - { - QCursor::setPos(pointOutsideMenu); - QTRY_COMPARE(QCursor::pos(), pointOutsideMenu); - menu.popup(screenCenter); - QVERIFY(QTest::qWaitForWindowExposed(&menu)); + menu->addAction(menuAction); + submenu->addAction(submenuAction); + + topLevel.show(); + topLevel.setWindowTitle(QTest::currentTestFunction()); + QVERIFY(QTest::qWaitForWindowActive(&topLevel)); + QWindow *topLevelWindow = topLevel.windowHandle(); + QVERIFY(topLevelWindow); - w1.enter = 0; - w1.leave = 0; - QPoint w1Center = w1.rect().center(); - const QPoint w1CenterGlobal = w1.mapToGlobal(w1Center); - QCursor::setPos(w1CenterGlobal); - QTRY_COMPARE(QCursor::pos(), w1CenterGlobal); - QVERIFY(w1.isVisible()); - QTRY_COMPARE(w1.leave, 0); - QTRY_COMPARE(w1.enter, 1); + // Root menu: Click on menu bar to open menu1 + { + const QPoint menuActionPos = menuBar->mapTo(&topLevel, menuBar->actionGeometry(menu->menuAction()).center()); + QTest::mouseClick(topLevelWindow, Qt::LeftButton, Qt::KeyboardModifiers(), menuActionPos); + QVERIFY(QTest::qWaitForWindowExposed(menu)); + + w1->enter = 0; + w1->leave = 0; + QPoint w1Center = topLevel.mapFromGlobal(w1->mapToGlobal(w1->rect().center())); + QTest::mouseMove(topLevelWindow, w1Center); + QVERIFY(w1->isVisible()); + QTRY_COMPARE(w1->leave, 0); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "WinRT does not support QTest::mouseMove", Abort); +#endif + QTRY_COMPARE(w1->enter, 1); // Check whether leave event is not delivered on mouse move - w1.move = 0; - QWidget *nativeParent = w1.nativeParentWidget(); - QVERIFY(nativeParent); - QWindow *window = nativeParent->windowHandle(); - QVERIFY(window); - QTest::mouseMove(window, w1.mapTo(nativeParent, w1Center + QPoint(1, 1))); - QTRY_COMPARE(w1.move, 1); - QTRY_COMPARE(w1.leave, 0); - QTRY_COMPARE(w1.enter, 1); - - QCursor::setPos(pointOutsideMenu); - QTRY_COMPARE(QCursor::pos(), pointOutsideMenu); - QTRY_COMPARE(w1.leave, 1); - QTRY_COMPARE(w1.enter, 1); + w1->move = 0; + QTest::mouseMove(topLevelWindow, w1Center + QPoint(1, 1)); + QTRY_COMPARE(w1->move, 1); + QTRY_COMPARE(w1->leave, 0); + QTRY_COMPARE(w1->enter, 1); + + QTest::mouseMove(topLevelWindow, topLevel.mapFromGlobal(pointOutsideMenu)); + QTRY_COMPARE(w1->leave, 1); + QTRY_COMPARE(w1->enter, 1); } // Submenu { - menu.setActiveAction(nextMenuAct); - QVERIFY(QTest::qWaitForWindowExposed(&submenu)); + menu->setActiveAction(nextMenuAct); + QVERIFY(QTest::qWaitForWindowExposed(submenu)); - QPoint w2Center = w2.rect().center(); - const QPoint w2CenterGlobal = w2.mapToGlobal(w2Center); - QCursor::setPos(w2CenterGlobal); - QTRY_COMPARE(QCursor::pos(), w2CenterGlobal); + QPoint w2Center = topLevel.mapFromGlobal(w2->mapToGlobal(w2->rect().center())); + QTest::mouseMove(topLevelWindow, w2Center); - QVERIFY(w2.isVisible()); - QTRY_COMPARE(w2.leave, 0); - QTRY_COMPARE(w2.enter, 1); + QVERIFY(w2->isVisible()); + QTRY_COMPARE(w2->leave, 0); + QTRY_COMPARE(w2->enter, 1); // Check whether leave event is not delivered on mouse move - w2.move = 0; - QWidget *nativeParent = w2.nativeParentWidget(); - QVERIFY(nativeParent); - QWindow *window = nativeParent->windowHandle(); - QVERIFY(window); - QTest::mouseMove(window, w2.mapTo(nativeParent, w2Center + QPoint(1, 1))); - QTRY_COMPARE(w2.move, 1); - QTRY_COMPARE(w2.leave, 0); - QTRY_COMPARE(w2.enter, 1); - - QCursor::setPos(pointOutsideMenu); - QTRY_COMPARE(QCursor::pos(), pointOutsideMenu); - QTRY_COMPARE(w2.leave, 1); - QTRY_COMPARE(w2.enter, 1); + w2->move = 0; + QTest::mouseMove(topLevelWindow, w2Center + QPoint(1, 1)); + QTRY_COMPARE(w2->move, 1); + QTRY_COMPARE(w2->leave, 0); + QTRY_COMPARE(w2->enter, 1); + + QTest::mouseMove(topLevelWindow, topLevel.mapFromGlobal(pointOutsideMenu)); + QTRY_COMPARE(w2->leave, 1); + QTRY_COMPARE(w2->enter, 1); } -#endif // QT_NO_CURSOR } class MyMenu : public QMenu @@ -1407,6 +1425,9 @@ void tst_QMenu::QTBUG_56917_wideMenuSize() menu.popup(QPoint()); QVERIFY(QTest::qWaitForWindowExposed(&menu)); QVERIFY(menu.isVisible()); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "Broken on WinRT - QTBUG-68297", Abort); +#endif QVERIFY(menu.height() <= menuSizeHint.height()); } @@ -1542,6 +1563,9 @@ void tst_QMenu::menuSize_Scrolling() getContentsMargins(&leftMargin, &topMargin, &rightMargin, &bottomMargin); QRect lastItem = actionGeometry(actions().at(actions().length() - 1)); QSize s = size(); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "Broken on WinRT - QTBUG-68297", Abort); +#endif QCOMPARE( s.width(), lastItem.right() + fw + hmargin + rightMargin + 1); QMenu::showEvent(e); } @@ -1610,6 +1634,12 @@ void tst_QMenu::menuSize_Scrolling() return; QTest::keyClick(&menu, Qt::Key_End); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("data8", "Broken on WinRT - QTBUG-68297", Abort); + QEXPECT_FAIL("data9", "Broken on WinRT - QTBUG-68297", Abort); + QEXPECT_FAIL("data10", "Broken on WinRT - QTBUG-68297", Abort); + QEXPECT_FAIL("data11", "Broken on WinRT - QTBUG-68297", Abort); +#endif QTRY_COMPARE(menu.actionGeometry(actions.last()).right(), menu.width() - mm.fw - mm.hmargin - leftMargin - 1); QCOMPARE(menu.actionGeometry(actions.last()).bottom(), @@ -1618,6 +1648,8 @@ void tst_QMenu::menuSize_Scrolling() void tst_QMenu::tearOffMenuNotDisplayed() { + if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::WindowActivation)) + QSKIP("Window activation is not supported"); QWidget widget; QScopedPointer<QMenu> menu(new QMenu(&widget)); menu->setTearOffEnabled(true); @@ -1653,6 +1685,9 @@ void tst_QMenu::tearOffMenuNotDisplayed() void tst_QMenu::QTBUG_61039_menu_shortcuts() { + if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::WindowActivation)) + QSKIP("Window activation is not supported"); + QAction *actionKamen = new QAction("Action Kamen"); actionKamen->setShortcut(QKeySequence(QLatin1String("K"))); diff --git a/tests/auto/widgets/widgets/qmenubar/BLACKLIST b/tests/auto/widgets/widgets/qmenubar/BLACKLIST index 9b8e07312d..f897797f00 100644 --- a/tests/auto/widgets/widgets/qmenubar/BLACKLIST +++ b/tests/auto/widgets/widgets/qmenubar/BLACKLIST @@ -1,5 +1,8 @@ [check_menuPosition] ubuntu-16.04 #QTBUG-66255 +ubuntu-18.04 [activatedCount] * +[QTBUG_65488_hiddenActionTriggered] +winrt diff --git a/tests/auto/widgets/widgets/qmenubar/tst_qmenubar.cpp b/tests/auto/widgets/widgets/qmenubar/tst_qmenubar.cpp index ab82268578..3063d43aa6 100644 --- a/tests/auto/widgets/widgets/qmenubar/tst_qmenubar.cpp +++ b/tests/auto/widgets/widgets/qmenubar/tst_qmenubar.cpp @@ -1184,6 +1184,9 @@ void tst_QMenuBar::check_menuPosition() mbItemRect.moveTo(w.menuBar()->mapToGlobal(mbItemRect.topLeft())); QTest::keyClick(&w, Qt::Key_M, Qt::AltModifier ); QVERIFY(menu.isActiveWindow()); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "QTest::keyClick does not work on WinRT.", Abort); +#endif QCOMPARE(menu.pos(), QPoint(mbItemRect.x(), mbItemRect.top() - menu.height())); menu.close(); } @@ -1512,6 +1515,9 @@ void tst_QMenuBar::cornerWidgets() case Qt::TopLeftCorner: QVERIFY2(fileMenuGeometry.left() >= cornerWidgetWidth, msgComparison(fileMenuGeometry.left(), ">=", cornerWidgetWidth)); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "Broken on WinRT - QTBUG-68297", Abort); +#endif QVERIFY2(menuBarWidth - editMenuGeometry.right() < cornerWidgetWidth, msgComparison(menuBarWidth - editMenuGeometry.right(), "<", cornerWidgetWidth)); break; @@ -1754,7 +1760,6 @@ void tst_QMenuBar::QTBUG_57404_existingMenuItemException() mb->addMenu(editMenu); QAction *copyAction = editMenu->addAction("&Copy"); copyAction->setShortcut(QKeySequence("Ctrl+C")); - QTest::ignoreMessage(QtWarningMsg, "Menu item \"&Copy\" has unsupported role QPlatformMenuItem::MenuRole(NoRole)"); copyAction->setMenuRole(QAction::NoRole); QVERIFY(QTest::qWaitForWindowExposed(&mw2)); diff --git a/tests/auto/widgets/widgets/qplaintextedit/tst_qplaintextedit.cpp b/tests/auto/widgets/widgets/qplaintextedit/tst_qplaintextedit.cpp index a08a8862b8..cfa2ddc4cc 100644 --- a/tests/auto/widgets/widgets/qplaintextedit/tst_qplaintextedit.cpp +++ b/tests/auto/widgets/widgets/qplaintextedit/tst_qplaintextedit.cpp @@ -1352,6 +1352,9 @@ void tst_QPlainTextEdit::adjustScrollbars() QLatin1String txt("\nabc def ghi jkl mno pqr stu vwx"); ed->setPlainText(txt + txt + txt + txt); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "WinRT does not support setMinimum/MaximumSize", Abort); +#endif QVERIFY(ed->verticalScrollBar()->maximum() > 0); ed->moveCursor(QTextCursor::End); diff --git a/tests/auto/widgets/widgets/qprogressbar/tst_qprogressbar.cpp b/tests/auto/widgets/widgets/qprogressbar/tst_qprogressbar.cpp index 39989c6dbb..df5ff9d448 100644 --- a/tests/auto/widgets/widgets/qprogressbar/tst_qprogressbar.cpp +++ b/tests/auto/widgets/widgets/qprogressbar/tst_qprogressbar.cpp @@ -255,6 +255,9 @@ void tst_QProgressBar::setMinMaxRepaint() pbar.repainted = false; pbar.setMinimum(0); QTest::qWait(50); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "Broken on WinRT - QTBUG-68297", Abort); +#endif QTRY_VERIFY(!pbar.repainted); // No repaint when setting maximum to the current maximum diff --git a/tests/auto/widgets/widgets/qpushbutton/tst_qpushbutton.cpp b/tests/auto/widgets/widgets/qpushbutton/tst_qpushbutton.cpp index 625f38d8ae..66f4df4498 100644 --- a/tests/auto/widgets/widgets/qpushbutton/tst_qpushbutton.cpp +++ b/tests/auto/widgets/widgets/qpushbutton/tst_qpushbutton.cpp @@ -507,7 +507,7 @@ void tst_QPushButton::sizeHint_data() #if !defined(QT_NO_STYLE_FUSION) QTest::newRow("fusion") << QString::fromLatin1("fusion"); #endif -#if defined(Q_OS_WIN) && !defined(QT_NO_STYLE_WINDOWSVISTA) +#if defined(Q_OS_WIN) && !defined(QT_NO_STYLE_WINDOWSVISTA) && !defined(Q_OS_WINRT) QTest::newRow("windowsvista") << QString::fromLatin1("windowsvista"); #endif } diff --git a/tests/auto/widgets/widgets/qsizegrip/BLACKLIST b/tests/auto/widgets/widgets/qsizegrip/BLACKLIST deleted file mode 100644 index 2c874bcb57..0000000000 --- a/tests/auto/widgets/widgets/qsizegrip/BLACKLIST +++ /dev/null @@ -1,2 +0,0 @@ -[hideAndShowOnWindowStateChange:Qt::Window] -xcb diff --git a/tests/auto/widgets/widgets/qsizegrip/tst_qsizegrip.cpp b/tests/auto/widgets/widgets/qsizegrip/tst_qsizegrip.cpp index 7610adc155..4cc1810cd4 100644 --- a/tests/auto/widgets/widgets/qsizegrip/tst_qsizegrip.cpp +++ b/tests/auto/widgets/widgets/qsizegrip/tst_qsizegrip.cpp @@ -107,6 +107,9 @@ void tst_QSizeGrip::hideAndShowOnWindowStateChange_data() void tst_QSizeGrip::hideAndShowOnWindowStateChange() { QFETCH(Qt::WindowType, windowType); +#ifdef Q_OS_WINRT + QSKIP("Broken on WinRT - QTBUG-68297"); +#endif QWidget *parentWidget = windowType == Qt::Window ? 0 : new QWidget; TestWidget *widget = new TestWidget(parentWidget, Qt::WindowFlags(windowType)); @@ -152,6 +155,10 @@ void tst_QSizeGrip::hideAndShowOnWindowStateChange() void tst_QSizeGrip::orientation() { +#ifdef Q_OS_WINRT + QSKIP("Broken on WinRT - QTBUG-68297"); +#endif + TestWidget widget; widget.setLayout(new QVBoxLayout); QSizeGrip *sizeGrip = new QSizeGrip(&widget); @@ -198,7 +205,9 @@ void tst_QSizeGrip::dontCrashOnTLWChange() // the above setup causes a change of TLW for the size grip, // and it must not crash. - +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "Broken on WinRT - QTBUG-68297", Abort); +#endif QVERIFY(QTest::qWaitForWindowExposed(&mdiArea)); QVERIFY(QTest::qWaitForWindowExposed(mw)); } diff --git a/tests/auto/widgets/widgets/qspinbox/BLACKLIST b/tests/auto/widgets/widgets/qspinbox/BLACKLIST new file mode 100644 index 0000000000..a38511bfb4 --- /dev/null +++ b/tests/auto/widgets/widgets/qspinbox/BLACKLIST @@ -0,0 +1,3 @@ +[stepModifierPressAndHold] +opensuse ci # QTBUG-69492 +opensuse-leap ci diff --git a/tests/auto/widgets/widgets/qspinbox/tst_qspinbox.cpp b/tests/auto/widgets/widgets/qspinbox/tst_qspinbox.cpp index 57816f9f70..37bb28dec9 100644 --- a/tests/auto/widgets/widgets/qspinbox/tst_qspinbox.cpp +++ b/tests/auto/widgets/widgets/qspinbox/tst_qspinbox.cpp @@ -50,6 +50,9 @@ #include <QKeySequence> #include <QStackedWidget> #include <QDebug> +#include <QStyleOptionSpinBox> +#include <QStyle> +#include <QProxyStyle> class SpinBox : public QSpinBox { @@ -75,10 +78,54 @@ public: QSpinBox::wheelEvent(event); } #endif + void initStyleOption(QStyleOptionSpinBox *option) const + { + QSpinBox::initStyleOption(option); + } QLineEdit *lineEdit() const { return QSpinBox::lineEdit(); } }; +class PressAndHoldStyle : public QProxyStyle +{ + Q_OBJECT +public: + using QProxyStyle::QProxyStyle; + + int styleHint(QStyle::StyleHint hint, const QStyleOption *option = nullptr, + const QWidget *widget = nullptr, QStyleHintReturn *returnData = nullptr) const override + { + switch (hint) { + case QStyle::SH_SpinBox_ClickAutoRepeatRate: + return 5; + case QStyle::SH_SpinBox_ClickAutoRepeatThreshold: + return 10; + default: + return QProxyStyle::styleHint(hint, option, widget, returnData); + } + } +}; + +class StepModifierStyle : public QProxyStyle +{ + Q_OBJECT +public: + using QProxyStyle::QProxyStyle; + + int styleHint(QStyle::StyleHint hint, const QStyleOption *option = nullptr, + const QWidget *widget = nullptr, QStyleHintReturn *returnData = nullptr) const override + { + switch (hint) { + case QStyle::SH_SpinBox_StepModifier: + return stepModifier; + default: + return QProxyStyle::styleHint(hint, option, widget, returnData); + } + } + + Qt::KeyboardModifier stepModifier = Qt::ControlModifier; +}; + class tst_QSpinBox : public QObject { Q_OBJECT @@ -143,8 +190,19 @@ private slots: void setGroupSeparatorShown_data(); void setGroupSeparatorShown(); + void wheelEvents_data(); void wheelEvents(); + void adaptiveDecimalStep(); + + void stepModifierKeys_data(); + void stepModifierKeys(); + + void stepModifierButtons_data(); + void stepModifierButtons(); + + void stepModifierPressAndHold_data(); + void stepModifierPressAndHold(); public slots: void valueChangedHelper(const QString &); void valueChangedHelper(int); @@ -158,6 +216,30 @@ typedef QList<int> IntList; Q_DECLARE_METATYPE(QLocale::Language) Q_DECLARE_METATYPE(QLocale::Country) +static QLatin1String modifierToName(Qt::KeyboardModifier modifier) +{ + switch (modifier) { + case Qt::NoModifier: + return QLatin1Literal("No"); + break; + case Qt::ControlModifier: + return QLatin1Literal("Ctrl"); + break; + case Qt::ShiftModifier: + return QLatin1Literal("Shift"); + break; + case Qt::AltModifier: + return QLatin1Literal("Alt"); + break; + case Qt::MetaModifier: + return QLatin1Literal("Meta"); + break; + default: + qFatal("Unexpected keyboard modifier"); + return QLatin1String(); + } +} + // Testing get/set functions void tst_QSpinBox::getSetCheck() { @@ -410,13 +492,17 @@ void tst_QSpinBox::setReadOnly() QTest::keyClick(&spin, Qt::Key_Up); QCOMPARE(spin.value(), 1); spin.setReadOnly(true); +#ifndef Q_OS_WINRT // QTBUG-68297 QCOMPARE(spin.eventsReceived, QList<QEvent::Type>() << QEvent::ReadOnlyChange); +#endif QTest::keyClick(&spin, Qt::Key_Up); QCOMPARE(spin.value(), 1); spin.stepBy(1); QCOMPARE(spin.value(), 2); spin.setReadOnly(false); +#ifndef Q_OS_WINRT // QTBUG-68297 QCOMPARE(spin.eventsReceived, QList<QEvent::Type>() << QEvent::ReadOnlyChange << QEvent::ReadOnlyChange); +#endif QTest::keyClick(&spin, Qt::Key_Up); QCOMPARE(spin.value(), 3); } @@ -1215,28 +1301,505 @@ void tst_QSpinBox::setGroupSeparatorShown() QCOMPARE(spinBox.value()+1000, 33000); } +void tst_QSpinBox::wheelEvents_data() +{ +#if QT_CONFIG(wheelevent) + QTest::addColumn<QPoint>("angleDelta"); + QTest::addColumn<int>("qt4Delta"); + QTest::addColumn<int>("stepModifier"); + QTest::addColumn<Qt::KeyboardModifiers>("modifier"); + QTest::addColumn<Qt::MouseEventSource>("source"); + QTest::addColumn<int>("start"); + QTest::addColumn<IntList>("expectedValues"); + + const auto fractions = {false, true}; + + const auto directions = {true, false}; + + const auto modifierList = {Qt::NoModifier, + Qt::ShiftModifier, + Qt::ControlModifier, + Qt::AltModifier, + Qt::MetaModifier}; + + const auto validStepModifierList = {Qt::NoModifier, + Qt::ControlModifier, + Qt::ShiftModifier}; + + const auto sources = {Qt::MouseEventNotSynthesized, + Qt::MouseEventSynthesizedBySystem, + Qt::MouseEventSynthesizedByQt, + Qt::MouseEventSynthesizedByApplication}; + + const int startValue = 0; + + for (auto fraction : fractions) { + for (auto up : directions) { + + const int units = (fraction ? 60 : 120) * (up ? 1 : -1); + + for (auto modifier : modifierList) { + + const Qt::KeyboardModifiers modifiers(modifier); + + const auto modifierName = modifierToName(modifier); + if (modifierName.isEmpty()) + continue; + + for (auto stepModifier : validStepModifierList) { + + const auto stepModifierName = modifierToName(stepModifier); + if (stepModifierName.isEmpty()) + continue; + + const int steps = (modifier & stepModifier ? 10 : 1) + * (up ? 1 : -1); + + for (auto source : sources) { + +#ifdef Q_OS_MACOS + QPoint angleDelta; + if ((modifier & Qt::ShiftModifier) && + source == Qt::MouseEventNotSynthesized) { + // On macOS the Shift modifier converts vertical + // mouse wheel events to horizontal. + angleDelta = { units, 0 }; + } else { + // However, this is not the case for trackpad scroll + // events. + angleDelta = { 0, units }; + } +#else + const QPoint angleDelta(0, units); +#endif + + QLatin1String sourceName; + switch (source) { + case Qt::MouseEventNotSynthesized: + sourceName = QLatin1Literal("NotSynthesized"); + break; + case Qt::MouseEventSynthesizedBySystem: + sourceName = QLatin1Literal("SynthesizedBySystem"); + break; + case Qt::MouseEventSynthesizedByQt: + sourceName = QLatin1Literal("SynthesizedByQt"); + break; + case Qt::MouseEventSynthesizedByApplication: + sourceName = QLatin1Literal("SynthesizedByApplication"); + break; + default: + qFatal("Unexpected wheel event source"); + continue; + } + + IntList expectedValues; + if (fraction) + expectedValues << startValue; + expectedValues << startValue + steps; + + QTest::addRow("%s%s%sWith%sKeyboardModifier%s", + fraction ? "half" : "full", + up ? "Up" : "Down", + stepModifierName.latin1(), + modifierName.latin1(), + sourceName.latin1()) + << angleDelta + << units + << static_cast<int>(stepModifier) + << modifiers + << source + << startValue + << expectedValues; + } + } + } + } + } +#else + QSKIP("Built with --no-feature-wheelevent"); +#endif +} + void tst_QSpinBox::wheelEvents() { #if QT_CONFIG(wheelevent) + QFETCH(QPoint, angleDelta); + QFETCH(int, qt4Delta); + QFETCH(int, stepModifier); + QFETCH(Qt::KeyboardModifiers, modifier); + QFETCH(Qt::MouseEventSource, source); + QFETCH(int, start); + QFETCH(IntList, expectedValues); + SpinBox spinBox; spinBox.setRange(-20, 20); + spinBox.setValue(start); + + QScopedPointer<StepModifierStyle, QScopedPointerDeleteLater> style( + new StepModifierStyle); + style->stepModifier = static_cast<Qt::KeyboardModifier>(stepModifier); + spinBox.setStyle(style.data()); + + QWheelEvent event(QPointF(), QPointF(), QPoint(), angleDelta, qt4Delta, + Qt::Vertical, Qt::NoButton, modifier, Qt::NoScrollPhase, + source); + for (int expected : expectedValues) { + qApp->sendEvent(&spinBox, &event); + QCOMPARE(spinBox.value(), expected); + } +#else + QSKIP("Built with --no-feature-wheelevent"); +#endif +} + +void tst_QSpinBox::adaptiveDecimalStep() +{ + SpinBox spinBox; + spinBox.setRange(-100000, 100000); + spinBox.setStepType(SpinBox::StepType::AdaptiveDecimalStepType); + + // Positive values + spinBox.setValue(0); - QWheelEvent wheelUp(QPointF(), QPointF(), QPoint(), QPoint(0, 120), 120, Qt::Vertical, Qt::NoButton, Qt::NoModifier); - spinBox.wheelEvent(&wheelUp); - QCOMPARE(spinBox.value(), 1); + // Go from 0 to 100 + for (int i = 0; i < 100; i++) { + QCOMPARE(spinBox.value(), i); + spinBox.stepBy(1); + } - QWheelEvent wheelDown(QPointF(), QPointF(), QPoint(), QPoint(0, -120), -120, Qt::Vertical, Qt::NoButton, Qt::NoModifier); - spinBox.wheelEvent(&wheelDown); - spinBox.wheelEvent(&wheelDown); - QCOMPARE(spinBox.value(), -1); + // Go from 100 to 1000 + for (int i = 100; i < 1000; i += 10) { + QCOMPARE(spinBox.value(), i); + spinBox.stepBy(1); + } - QWheelEvent wheelHalfUp(QPointF(), QPointF(), QPoint(), QPoint(0, 60), 60, Qt::Vertical, Qt::NoButton, Qt::NoModifier); - spinBox.wheelEvent(&wheelHalfUp); - QCOMPARE(spinBox.value(), -1); - spinBox.wheelEvent(&wheelHalfUp); - QCOMPARE(spinBox.value(), 0); -#endif + // Go from 1000 to 10000 + for (int i = 1000; i < 10000; i += 100) { + QCOMPARE(spinBox.value(), i); + spinBox.stepBy(1); + } + + // Test decreasing the values now + + // Go from 10000 down to 1000 + for (int i = 10000; i > 1000; i -= 100) { + QCOMPARE(spinBox.value(), i); + spinBox.stepBy(-1); + } + + // Go from 1000 down to 100 + for (int i = 1000; i > 100; i -= 10) { + QCOMPARE(spinBox.value(), i); + spinBox.stepBy(-1); + } + + // Negative values + + spinBox.setValue(0); + + // Go from 0 to -100 + for (int i = 0; i > -100; i--) { + QCOMPARE(spinBox.value(), i); + spinBox.stepBy(-1); + } + + // Go from -100 to -1000 + for (int i = -100; i > -1000; i -= 10) { + QCOMPARE(spinBox.value(), i); + spinBox.stepBy(-1); + } + + // Go from 1000 to 10000 + for (int i = -1000; i > -10000; i -= 100) { + QCOMPARE(spinBox.value(), i); + spinBox.stepBy(-1); + } + + // Test increasing the values now + + // Go from -10000 up to -1000 + for (int i = -10000; i < -1000; i += 100) { + QCOMPARE(spinBox.value(), i); + spinBox.stepBy(1); + } + + // Go from -1000 up to -100 + for (int i = -1000; i < -100; i += 10) { + QCOMPARE(spinBox.value(), i); + spinBox.stepBy(1); + } +} + +void tst_QSpinBox::stepModifierKeys_data() +{ + QTest::addColumn<int>("startValue"); + QTest::addColumn<int>("stepModifier"); + QTest::addColumn<QTestEventList>("keys"); + QTest::addColumn<int>("expectedValue"); + + const auto keyList = {Qt::Key_Up, Qt::Key_Down}; + + const auto modifierList = {Qt::NoModifier, + Qt::ShiftModifier, + Qt::ControlModifier, + Qt::AltModifier, + Qt::MetaModifier}; + + const auto validStepModifierList = {Qt::NoModifier, + Qt::ControlModifier, + Qt::ShiftModifier}; + + for (auto key : keyList) { + + const bool up = key == Qt::Key_Up; + Q_ASSERT(up || key == Qt::Key_Down); + + const int startValue = up ? 0.0 : 10.0; + + for (auto modifier : modifierList) { + + QTestEventList keys; + keys.addKeyClick(key, modifier); + + const auto modifierName = modifierToName(modifier); + if (modifierName.isEmpty()) + continue; + + for (auto stepModifier : validStepModifierList) { + + const auto stepModifierName = modifierToName(stepModifier); + if (stepModifierName.isEmpty()) + continue; + + const int steps = (modifier & stepModifier ? 10 : 1) + * (up ? 1 : -1); + + const int expectedValue = startValue + steps; + + QTest::addRow("%s%sWith%sKeyboardModifier", + up ? "up" : "down", + stepModifierName.latin1(), + modifierName.latin1()) + << startValue + << static_cast<int>(stepModifier) + << keys + << expectedValue; + } + } + } +} + +void tst_QSpinBox::stepModifierKeys() +{ + QFETCH(int, startValue); + QFETCH(int, stepModifier); + QFETCH(QTestEventList, keys); + QFETCH(int, expectedValue); + + QSpinBox spin(0); + spin.setValue(startValue); + + QScopedPointer<StepModifierStyle, QScopedPointerDeleteLater> style( + new StepModifierStyle); + style->stepModifier = static_cast<Qt::KeyboardModifier>(stepModifier); + spin.setStyle(style.data()); + + spin.show(); + QVERIFY(QTest::qWaitForWindowActive(&spin)); + + QCOMPARE(spin.value(), startValue); + keys.simulate(&spin); + QCOMPARE(spin.value(), expectedValue); +} + +void tst_QSpinBox::stepModifierButtons_data() +{ + QTest::addColumn<QStyle::SubControl>("subControl"); + QTest::addColumn<int>("stepModifier"); + QTest::addColumn<Qt::KeyboardModifiers>("modifiers"); + QTest::addColumn<int>("startValue"); + QTest::addColumn<int>("expectedValue"); + + const auto subControls = {QStyle::SC_SpinBoxUp, QStyle::SC_SpinBoxDown}; + + const auto modifierList = {Qt::NoModifier, + Qt::ShiftModifier, + Qt::ControlModifier, + Qt::AltModifier, + Qt::MetaModifier}; + + const auto validStepModifierList = {Qt::NoModifier, + Qt::ControlModifier, + Qt::ShiftModifier}; + + for (auto subControl : subControls) { + + const bool up = subControl == QStyle::SC_SpinBoxUp; + Q_ASSERT(up || subControl == QStyle::SC_SpinBoxDown); + + const int startValue = up ? 0 : 10; + + for (auto modifier : modifierList) { + + const Qt::KeyboardModifiers modifiers(modifier); + + const auto modifierName = modifierToName(modifier); + if (modifierName.isEmpty()) + continue; + + for (auto stepModifier : validStepModifierList) { + + const auto stepModifierName = modifierToName(stepModifier); + if (stepModifierName.isEmpty()) + continue; + + const int steps = (modifier & stepModifier ? 10 : 1) + * (up ? 1 : -1); + + const int expectedValue = startValue + steps; + + QTest::addRow("%s%sWith%sKeyboardModifier", + up ? "up" : "down", + stepModifierName.latin1(), + modifierName.latin1()) + << subControl + << static_cast<int>(stepModifier) + << modifiers + << startValue + << expectedValue; + } + } + } +} + +void tst_QSpinBox::stepModifierButtons() +{ + QFETCH(QStyle::SubControl, subControl); + QFETCH(int, stepModifier); + QFETCH(Qt::KeyboardModifiers, modifiers); + QFETCH(int, startValue); + QFETCH(int, expectedValue); + + SpinBox spin(0); + spin.setRange(-20, 20); + spin.setValue(startValue); + + QScopedPointer<StepModifierStyle, QScopedPointerDeleteLater> style( + new StepModifierStyle); + style->stepModifier = static_cast<Qt::KeyboardModifier>(stepModifier); + spin.setStyle(style.data()); + + spin.show(); + QVERIFY(QTest::qWaitForWindowActive(&spin)); + + QStyleOptionSpinBox spinBoxStyleOption; + spin.initStyleOption(&spinBoxStyleOption); + + const QRect buttonRect = spin.style()->subControlRect( + QStyle::CC_SpinBox, &spinBoxStyleOption, subControl, &spin); + + QCOMPARE(spin.value(), startValue); + QTest::mouseClick(&spin, Qt::LeftButton, modifiers, buttonRect.center()); + QCOMPARE(spin.value(), expectedValue); +} + +void tst_QSpinBox::stepModifierPressAndHold_data() +{ + QTest::addColumn<QStyle::SubControl>("subControl"); + QTest::addColumn<int>("stepModifier"); + QTest::addColumn<Qt::KeyboardModifiers>("modifiers"); + QTest::addColumn<int>("expectedStepModifier"); + + const auto subControls = {QStyle::SC_SpinBoxUp, QStyle::SC_SpinBoxDown}; + + const auto modifierList = {Qt::NoModifier, + Qt::ShiftModifier, + Qt::ControlModifier, + Qt::AltModifier, + Qt::MetaModifier}; + + const auto validStepModifierList = {Qt::NoModifier, + Qt::ControlModifier, + Qt::ShiftModifier}; + + for (auto subControl : subControls) { + + const bool up = subControl == QStyle::SC_SpinBoxUp; + Q_ASSERT(up || subControl == QStyle::SC_SpinBoxDown); + + for (auto modifier : modifierList) { + + const Qt::KeyboardModifiers modifiers(modifier); + + const auto modifierName = modifierToName(modifier); + if (modifierName.isEmpty()) + continue; + + for (auto stepModifier : validStepModifierList) { + + const auto stepModifierName = modifierToName(stepModifier); + if (stepModifierName.isEmpty()) + continue; + + const int steps = (modifier & stepModifier ? 10 : 1) + * (up ? 1 : -1); + + QTest::addRow("%s%sWith%sKeyboardModifier", + up ? "up" : "down", + stepModifierName.latin1(), + modifierName.latin1()) + << subControl + << static_cast<int>(stepModifier) + << modifiers + << steps; + } + } + } +} + +void tst_QSpinBox::stepModifierPressAndHold() +{ + QFETCH(QStyle::SubControl, subControl); + QFETCH(int, stepModifier); + QFETCH(Qt::KeyboardModifiers, modifiers); + QFETCH(int, expectedStepModifier); + + SpinBox spin(0); + spin.setRange(-100, 100); + spin.setValue(0); + + QScopedPointer<StepModifierStyle, QScopedPointerDeleteLater> stepModifierStyle( + new StepModifierStyle(new PressAndHoldStyle)); + stepModifierStyle->stepModifier = static_cast<Qt::KeyboardModifier>(stepModifier); + spin.setStyle(stepModifierStyle.data()); + + QSignalSpy spy(&spin, QOverload<int>::of(&SpinBox::valueChanged)); + // TODO: remove debug output when QTBUG-69492 is fixed + connect(&spin, QOverload<int>::of(&SpinBox::valueChanged), [=]() { + qDebug() << QTime::currentTime() << "valueChanged emitted"; + }); + + spin.show(); + QVERIFY(QTest::qWaitForWindowActive(&spin)); + + QStyleOptionSpinBox spinBoxStyleOption; + spin.initStyleOption(&spinBoxStyleOption); + + const QRect buttonRect = spin.style()->subControlRect( + QStyle::CC_SpinBox, &spinBoxStyleOption, subControl, &spin); + + // TODO: remove debug output when QTBUG-69492 is fixed + qDebug() << "QGuiApplication::focusWindow():" << QGuiApplication::focusWindow(); + qDebug() << "QGuiApplication::topLevelWindows():" << QGuiApplication::topLevelWindows(); + QTest::mousePress(&spin, Qt::LeftButton, modifiers, buttonRect.center()); + QTRY_VERIFY2(spy.length() >= 3, qPrintable(QString::fromLatin1( + "Expected valueChanged() to be emitted 3 or more times, but it was only emitted %1 times").arg(spy.length()))); + QTest::mouseRelease(&spin, Qt::LeftButton, modifiers, buttonRect.center()); + + const auto value = spy.last().at(0); + QVERIFY(value.type() == QVariant::Int); + QCOMPARE(value.toInt(), spy.length() * expectedStepModifier); } QTEST_MAIN(tst_QSpinBox) diff --git a/tests/auto/widgets/widgets/qsplitter/tst_qsplitter.cpp b/tests/auto/widgets/widgets/qsplitter/tst_qsplitter.cpp index 77abf5e5a7..d744cece9c 100644 --- a/tests/auto/widgets/widgets/qsplitter/tst_qsplitter.cpp +++ b/tests/auto/widgets/widgets/qsplitter/tst_qsplitter.cpp @@ -773,12 +773,16 @@ void tst_QSplitter::replaceWidget() const int expectedResizeCount = visible ? 1 : 0; // new widget only const int expectedPaintCount = visible && !collapsed ? 2 : 0; // splitter and new widget QTRY_COMPARE(ef.resizeCount, expectedResizeCount); +#ifndef Q_OS_WINRT // QTBUG-68297 QTRY_COMPARE(ef.paintCount, expectedPaintCount); +#endif QCOMPARE(newWidget->parentWidget(), &sp); QCOMPARE(newWidget->isVisible(), visible); if (visible && !collapsed) QCOMPARE(newWidget->geometry(), oldGeom); +#ifndef Q_OS_WINRT // QTBUG-68297 QCOMPARE(newWidget->size().isEmpty(), !visible || collapsed); +#endif delete res; } QCOMPARE(sp.count(), count); @@ -830,7 +834,9 @@ void tst_QSplitter::replaceWidgetWithSplitterChild() QTRY_VERIFY(ef.resizeCount > 0); QTRY_VERIFY(ef.paintCount > 0); QCOMPARE(sp.count(), count + 1); +#ifndef Q_OS_WINRT // QTBUG-68297 QCOMPARE(sp.sizes().mid(0, count), sizes); +#endif QCOMPARE(sp.sizes().last(), sibling->width()); } else { // No-op for the rest diff --git a/tests/auto/widgets/widgets/qstatusbar/tst_qstatusbar.cpp b/tests/auto/widgets/widgets/qstatusbar/tst_qstatusbar.cpp index 14ee6cb9bd..928910344c 100644 --- a/tests/auto/widgets/widgets/qstatusbar/tst_qstatusbar.cpp +++ b/tests/auto/widgets/widgets/qstatusbar/tst_qstatusbar.cpp @@ -141,6 +141,9 @@ void tst_QStatusBar::setSizeGripEnabled() QTRY_VERIFY(statusBar->isVisible()); QPointer<QSizeGrip> sizeGrip = statusBar->findChild<QSizeGrip *>(); QVERIFY(sizeGrip); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "Fails on WinRT - QTBUG-68297", Abort); +#endif QVERIFY(sizeGrip->isVisible()); statusBar->setSizeGripEnabled(true); diff --git a/tests/auto/widgets/widgets/qtextbrowser/qtextbrowser.pro b/tests/auto/widgets/widgets/qtextbrowser/qtextbrowser.pro index 5416c1c71f..9680ffd871 100644 --- a/tests/auto/widgets/widgets/qtextbrowser/qtextbrowser.pro +++ b/tests/auto/widgets/widgets/qtextbrowser/qtextbrowser.pro @@ -5,3 +5,5 @@ SOURCES += tst_qtextbrowser.cpp QT += widgets testlib TESTDATA += *.html subdir/* + +builtin_testdata: DEFINES += BUILTIN_TESTDATA diff --git a/tests/auto/widgets/widgets/qtextbrowser/tst_qtextbrowser.cpp b/tests/auto/widgets/widgets/qtextbrowser/tst_qtextbrowser.cpp index 700fa505c1..8a1b228c71 100644 --- a/tests/auto/widgets/widgets/qtextbrowser/tst_qtextbrowser.cpp +++ b/tests/auto/widgets/widgets/qtextbrowser/tst_qtextbrowser.cpp @@ -29,7 +29,6 @@ #include <QtTest/QtTest> #include <qtextbrowser.h> -#include <qdatetime.h> #include <qapplication.h> #include <qscrollbar.h> @@ -114,7 +113,7 @@ void tst_QTextBrowser::cleanup() void tst_QTextBrowser::noReloadOnAnchorJump() { - QUrl url = QUrl::fromLocalFile("anchor.html"); + QUrl url = QUrl::fromLocalFile(QFINDTESTDATA("anchor.html")); browser->htmlLoadAttempts = 0; browser->setSource(url); @@ -130,11 +129,11 @@ void tst_QTextBrowser::noReloadOnAnchorJump() void tst_QTextBrowser::bgColorOnSourceChange() { - browser->setSource(QUrl::fromLocalFile("pagewithbg.html")); + browser->setSource(QUrl::fromLocalFile(QFINDTESTDATA("pagewithbg.html"))); QVERIFY(browser->document()->rootFrame()->frameFormat().hasProperty(QTextFormat::BackgroundBrush)); QCOMPARE(browser->document()->rootFrame()->frameFormat().background().color(), QColor(Qt::blue)); - browser->setSource(QUrl::fromLocalFile("pagewithoutbg.html")); + browser->setSource(QUrl::fromLocalFile(QFINDTESTDATA("pagewithoutbg.html"))); QVERIFY(!browser->document()->rootFrame()->frameFormat().hasProperty(QTextFormat::BackgroundBrush)); } @@ -147,7 +146,7 @@ void tst_QTextBrowser::forwardButton() QVERIFY(browser->historyTitle(0).isEmpty()); QVERIFY(browser->historyTitle(1).isEmpty()); - browser->setSource(QUrl::fromLocalFile("pagewithbg.html")); + browser->setSource(QUrl::fromLocalFile(QFINDTESTDATA("pagewithbg.html"))); QVERIFY(!forwardEmissions.isEmpty()); QVariant val = forwardEmissions.takeLast()[0]; @@ -160,12 +159,12 @@ void tst_QTextBrowser::forwardButton() QVERIFY(!val.toBool()); QVERIFY(browser->historyTitle(-1).isEmpty()); - QCOMPARE(browser->historyUrl(0), QUrl::fromLocalFile("pagewithbg.html")); + QCOMPARE(browser->historyUrl(0), QUrl::fromLocalFile(QFINDTESTDATA("pagewithbg.html"))); QCOMPARE(browser->documentTitle(), QString("Page With BG")); QCOMPARE(browser->historyTitle(0), QString("Page With BG")); QVERIFY(browser->historyTitle(1).isEmpty()); - browser->setSource(QUrl::fromLocalFile("anchor.html")); + browser->setSource(QUrl::fromLocalFile(QFINDTESTDATA("anchor.html"))); QVERIFY(!forwardEmissions.isEmpty()); val = forwardEmissions.takeLast()[0]; @@ -197,8 +196,11 @@ void tst_QTextBrowser::forwardButton() QCOMPARE(browser->historyTitle(0), QString("Page With BG")); QCOMPARE(browser->historyTitle(1), QString("Sample Anchor")); - browser->setSource(QUrl("pagewithoutbg.html")); + browser->setSource(QUrl(QFINDTESTDATA("pagewithoutbg.html"))); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "Fails on WinRT - QTBUG-68297", Abort); +#endif QVERIFY(!forwardEmissions.isEmpty()); val = forwardEmissions.takeLast()[0]; QCOMPARE(val.type(), QVariant::Bool); @@ -212,11 +214,11 @@ void tst_QTextBrowser::forwardButton() void tst_QTextBrowser::viewportPositionInHistory() { - browser->setSource(QUrl::fromLocalFile("bigpage.html")); + browser->setSource(QUrl::fromLocalFile(QFINDTESTDATA("bigpage.html"))); browser->scrollToAnchor("bottom"); QVERIFY(browser->verticalScrollBar()->value() > 0); - browser->setSource(QUrl::fromLocalFile("pagewithbg.html")); + browser->setSource(QUrl::fromLocalFile(QFINDTESTDATA("pagewithbg.html"))); QCOMPARE(browser->verticalScrollBar()->value(), 0); browser->backward(); @@ -225,6 +227,9 @@ void tst_QTextBrowser::viewportPositionInHistory() void tst_QTextBrowser::relativeLinks() { +#ifdef BUILTIN_TESTDATA + QSKIP("Relative links cannot be checked when resources are used to package tests."); +#endif QSignalSpy sourceChangedSpy(browser, SIGNAL(sourceChanged(QUrl))); browser->setSource(QUrl("subdir/../qtextbrowser.html")); QVERIFY(!browser->document()->isEmpty()); @@ -256,11 +261,11 @@ void tst_QTextBrowser::relativeLinks() void tst_QTextBrowser::anchors() { - browser->setSource(QUrl::fromLocalFile("bigpage.html")); + browser->setSource(QUrl::fromLocalFile(QFINDTESTDATA("bigpage.html"))); browser->setSource(QUrl("#bottom")); QVERIFY(browser->verticalScrollBar()->value() > 0); - browser->setSource(QUrl::fromLocalFile("bigpage.html")); + browser->setSource(QUrl::fromLocalFile(QFINDTESTDATA("bigpage.html"))); browser->setSource(QUrl("#id-anchor")); QVERIFY(browser->verticalScrollBar()->value() > 0); } @@ -420,6 +425,9 @@ void tst_QTextBrowser::clearHistory() void tst_QTextBrowser::sourceInsideLoadResource() { +#ifdef Q_OS_WINRT + QSKIP("Paths cannot be compared if applications are sandboxed."); +#endif QUrl url = QUrl::fromLocalFile("pagewithimage.html"); browser->setSource(url); QCOMPARE(browser->lastResource, QUrl::fromLocalFile(QDir::current().filePath("foobar.png"))); @@ -515,7 +523,11 @@ void tst_QTextBrowser::adjacentAnchors() void tst_QTextBrowser::loadResourceOnRelativeLocalFiles() { +#ifndef BUILTIN_TESTDATA browser->setSource(QUrl::fromLocalFile("subdir/index.html")); +#else + browser->setSource(QUrl::fromLocalFile(QFINDTESTDATA("subdir/index.html"))); +#endif QVERIFY(!browser->toPlainText().isEmpty()); QVariant v = browser->loadResource(QTextDocument::HtmlResource, QUrl("../anchor.html")); QVERIFY(v.isValid()); @@ -526,7 +538,7 @@ void tst_QTextBrowser::loadResourceOnRelativeLocalFiles() void tst_QTextBrowser::focusIndicator() { HackBrowser *browser = new HackBrowser; - browser->setSource(QUrl::fromLocalFile("firstpage.html")); + browser->setSource(QUrl::fromLocalFile(QFINDTESTDATA("firstpage.html"))); QVERIFY(!browser->textCursor().hasSelection()); browser->focusTheNextChild(); @@ -578,7 +590,7 @@ void tst_QTextBrowser::focusIndicator() void tst_QTextBrowser::focusHistory() { HackBrowser *browser = new HackBrowser; - browser->setSource(QUrl::fromLocalFile("firstpage.html")); + browser->setSource(QUrl::fromLocalFile(QFINDTESTDATA("firstpage.html"))); QVERIFY(!browser->textCursor().hasSelection()); browser->focusTheNextChild(); diff --git a/tests/auto/widgets/widgets/qtextedit/qtextedit.pro b/tests/auto/widgets/widgets/qtextedit/qtextedit.pro index 8b39ab59b7..de8531daec 100644 --- a/tests/auto/widgets/widgets/qtextedit/qtextedit.pro +++ b/tests/auto/widgets/widgets/qtextedit/qtextedit.pro @@ -6,3 +6,5 @@ QT += widgets widgets-private gui-private core-private testlib SOURCES += tst_qtextedit.cpp osx: LIBS += -framework AppKit + +TESTDATA += fullWidthSelection diff --git a/tests/auto/widgets/widgets/qtextedit/tst_qtextedit.cpp b/tests/auto/widgets/widgets/qtextedit/tst_qtextedit.cpp index f383d430d6..6a2ae4951b 100644 --- a/tests/auto/widgets/widgets/qtextedit/tst_qtextedit.cpp +++ b/tests/auto/widgets/widgets/qtextedit/tst_qtextedit.cpp @@ -1702,6 +1702,9 @@ void tst_QTextEdit::adjustScrollbars() QLatin1String txt("\nabc def ghi jkl mno pqr stu vwx"); ed->setText(txt + txt + txt + txt); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "setMinimum/MaximumSize does not work on WinRT", Abort); +#endif QVERIFY(ed->verticalScrollBar()->maximum() > 0); ed->moveCursor(QTextCursor::End); @@ -1882,6 +1885,9 @@ void tst_QTextEdit::copyPasteBackgroundImage() QBrush ba = a->cellAt(0, 0).format().background(); QBrush bb = b->cellAt(0, 0).format().background(); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "Fails on WinRT - QTBUG-68297", Abort); +#endif QCOMPARE(ba.style(), Qt::TexturePattern); QCOMPARE(ba.style(), bb.style()); diff --git a/tests/auto/widgets/widgets/qtoolbutton/tst_qtoolbutton.cpp b/tests/auto/widgets/widgets/qtoolbutton/tst_qtoolbutton.cpp index a7a62496e6..44b30fa794 100644 --- a/tests/auto/widgets/widgets/qtoolbutton/tst_qtoolbutton.cpp +++ b/tests/auto/widgets/widgets/qtoolbutton/tst_qtoolbutton.cpp @@ -272,6 +272,9 @@ void tst_QToolButton::qtbug_34759_sizeHintResetWhenSettingMenu() button1.show(); button2.show(); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "Winrt does not support more than 1 native top level widget.", Abort); +#endif QVERIFY(QTest::qWaitForWindowExposed(&button1)); QVERIFY(QTest::qWaitForWindowExposed(&button2)); diff --git a/tests/auto/widgets/widgets/widgets.pro b/tests/auto/widgets/widgets/widgets.pro index c098108edc..c6325aac15 100644 --- a/tests/auto/widgets/widgets/widgets.pro +++ b/tests/auto/widgets/widgets/widgets.pro @@ -55,4 +55,4 @@ SUBDIRS=\ qtextedit \ qtoolbar \ -qtConfig(opengl): SUBDIRS += qopenglwidget +!winrt:qtConfig(opengl): SUBDIRS += qopenglwidget |