diff options
Diffstat (limited to 'tests/auto/quickcontrols2/dialogs/qquickfontdialogimpl/tst_qquickfontdialogimpl.cpp')
-rw-r--r-- | tests/auto/quickcontrols2/dialogs/qquickfontdialogimpl/tst_qquickfontdialogimpl.cpp | 520 |
1 files changed, 0 insertions, 520 deletions
diff --git a/tests/auto/quickcontrols2/dialogs/qquickfontdialogimpl/tst_qquickfontdialogimpl.cpp b/tests/auto/quickcontrols2/dialogs/qquickfontdialogimpl/tst_qquickfontdialogimpl.cpp deleted file mode 100644 index 42f60f1b..00000000 --- a/tests/auto/quickcontrols2/dialogs/qquickfontdialogimpl/tst_qquickfontdialogimpl.cpp +++ /dev/null @@ -1,520 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2021 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL3$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPLv3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or later as published by the Free -** Software Foundation and appearing in the file LICENSE.GPL included in -** the packaging of this file. Please review the following information to -** ensure the GNU General Public License version 2.0 requirements will be -** met: http://www.gnu.org/licenses/gpl-2.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "../../shared/dialogtestutil.h" -#include "../../shared/util.h" -#include "../../shared/visualtestutil.h" - -#include <QtTest/qtest.h> -#include <QtTest/qsignalspy.h> -#include <QtQml/qqmlfile.h> -#include <QtQuick/private/qquicklistview_p.h> -#include <QtQuickTemplates2/private/qquickitemdelegate_p.h> -#include <QtQuickDialogs2/private/qquickfontdialog_p.h> -#include <QtQuickDialogs2QuickImpl/private/qquickfontdialogimpl_p.h> -#include <QtQuickTest/quicktest.h> -#include <QtQuickTemplates2/private/qquickapplicationwindow_p.h> -#include <QtQuickTemplates2/private/qquickcombobox_p.h> -#include <QtQuickTemplates2/private/qquicktextfield_p.h> -#include <QtQuickTemplates2/private/qquickdialogbuttonbox_p.h> -#include <QtQuickTemplates2/private/qquickdialogbuttonbox_p_p.h> -#include <QtQuickTemplates2/private/qquicklabel_p.h> -#include <QtQuickTemplates2/private/qquickoverlay_p.h> - -using namespace QQuickDialogTestUtil; -using namespace QQuickVisualTestUtil; - -class tst_QQuickFontDialogImpl : public QQmlDataTest -{ - Q_OBJECT - -private slots: - void writingSystem(); - void listViews(); - void effects(); - void changeFontSize(); - void changeDialogTitle(); - void searchFamily(); - -private: - QQuickAbstractButton *findDialogButton(QQuickDialogButtonBox *box, const QString &buttonText) - { - for (int i = 0; i < box->count(); ++i) { - auto button = qobject_cast<QQuickAbstractButton *>(box->itemAt(i)); - if (button && button->text().toUpper() == buttonText.toUpper()) - return button; - } - return nullptr; - } - - bool closePopup(DialogTestHelper<QQuickFontDialog, QQuickFontDialogImpl> *dialogHelper, - QString dialogButton, QString &failureMessage) - { - auto dialogButtonBox = - dialogHelper->quickDialog->footer()->findChild<QQuickDialogButtonBox *>(); - - if (!dialogButtonBox) { - failureMessage = QLatin1String("dialogButtonBox is null"); - return false; - } - - QQuickAbstractButton *openButton = findDialogButton(dialogButtonBox, dialogButton); - - if (!openButton) { - failureMessage = - QLatin1String("Couldn't find a button with text '%1'").arg(dialogButton); - return false; - } - - bool clicked = clickButton(openButton); - - if (!clicked) { - failureMessage = QLatin1String("'%1' button was never clicked").arg(dialogButton); - return false; - } - - bool visible = dialogHelper->dialog->isVisible(); - if (visible) { - failureMessage = QLatin1String("Dialog is still visible after clicking the '%1' button") - .arg(dialogButton); - return false; - } - return true; - } -}; - -#define CREATE_DIALOG_TEST_HELPER \ - DialogTestHelper<QQuickFontDialog, QQuickFontDialogImpl> dialogHelper(this, "fontDialog.qml"); \ - QVERIFY2(dialogHelper.isWindowInitialized(), dialogHelper.failureMessage()); \ - QVERIFY(dialogHelper.waitForWindowActive()); - -#define CLOSE_DIALOG(BUTTON) \ - QString errorMessage; \ - QVERIFY2(closePopup(&dialogHelper, BUTTON, errorMessage), qPrintable(errorMessage)); \ - QTRY_VERIFY(!dialogHelper.quickDialog->isVisible()); - -void tst_QQuickFontDialogImpl::writingSystem() -{ - CREATE_DIALOG_TEST_HELPER - - // Open the dialog. - QVERIFY(dialogHelper.openDialog()); - QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); - - const QQuickTextEdit *sampleEdit = - dialogHelper.quickDialog->findChild<QQuickTextEdit *>("sampleEdit"); - QVERIFY(sampleEdit); - - QCOMPARE(sampleEdit->text(), QFontDatabase::writingSystemSample(QFontDatabase::Any)); - - // Check that the font family list view exist and add signal spy. - const QQuickListView *fontFamilyListView = - dialogHelper.quickDialog->findChild<QQuickListView *>("familyListView"); - QVERIFY(fontFamilyListView); - QSignalSpy fontFamilyModelSpy(fontFamilyListView, SIGNAL(modelChanged())); - - // Open the ComboBox's popup. - const QQuickComboBox *writingSystemComboBox = dialogHelper.quickDialog->findChild<QQuickComboBox*>(); - QVERIFY(writingSystemComboBox); - const QPoint comboBoxCenterPos = writingSystemComboBox->mapToScene({ writingSystemComboBox->width() / 2, writingSystemComboBox->height() / 2 }).toPoint(); - QTest::mouseClick(dialogHelper.window(), Qt::LeftButton, Qt::NoModifier, comboBoxCenterPos); - QTRY_VERIFY(writingSystemComboBox->popup()->isOpened()); - - // "Any" should be selected by default. - QQuickListView *comboBoxPopupListView = qobject_cast<QQuickListView*>(writingSystemComboBox->popup()->contentItem()); - QVERIFY(comboBoxPopupListView); - const int anyIndex = QFontDatabase::Any; - QQuickAbstractButton *anyDelegate = qobject_cast<QQuickAbstractButton*>(findViewDelegateItem(comboBoxPopupListView, anyIndex)); - QVERIFY(anyDelegate); - QCOMPARE(anyDelegate->text(), QFontDatabase::writingSystemName(QFontDatabase::Any)); - - QCOMPARE(fontFamilyModelSpy.count(), 0); - - // Select "Japanese" from the ComboBox. - const int japaneseIndex = QFontDatabase::Japanese; - QQuickAbstractButton *japaneseDelegate = qobject_cast<QQuickAbstractButton*>(findViewDelegateItem(comboBoxPopupListView, japaneseIndex)); - QVERIFY(japaneseDelegate); - QCOMPARE(japaneseDelegate->text(), QFontDatabase::writingSystemName(QFontDatabase::Japanese)); - QVERIFY(clickButton(japaneseDelegate)); - QTRY_VERIFY(!writingSystemComboBox->popup()->isVisible()); - - // Check that the contents of the font family listview changed - QCOMPARE(fontFamilyModelSpy.count(), 1); - - // And that the sample text is correctly set - QCOMPARE(sampleEdit->text(), QFontDatabase::writingSystemSample(QFontDatabase::Japanese)); - - // Then accept it to close it. - auto dialogButtonBox = dialogHelper.quickDialog->footer()->findChild<QQuickDialogButtonBox*>(); - QVERIFY(dialogButtonBox); - QQuickAbstractButton* openButton = findDialogButton(dialogButtonBox, "Ok"); - QVERIFY(openButton); - QVERIFY(clickButton(openButton)); - QVERIFY(!dialogHelper.dialog->isVisible()); - QTRY_VERIFY(!dialogHelper.quickDialog->isVisible()); -} - -void tst_QQuickFontDialogImpl::listViews() -{ - CREATE_DIALOG_TEST_HELPER - - // Open the dialog. - QVERIFY(dialogHelper.openDialog()); - QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); - - QQuickListView *fontFamilyListView = - dialogHelper.quickDialog->findChild<QQuickListView *>("familyListView"); - QVERIFY(fontFamilyListView); - - const QQuickListView *fontStyleListView = - dialogHelper.quickDialog->findChild<QQuickListView *>("styleListView"); - QVERIFY(fontStyleListView); - - const QQuickListView *fontSizeListView = - dialogHelper.quickDialog->findChild<QQuickListView *>("sizeListView"); - QVERIFY(fontSizeListView); - - QSignalSpy currentFontSpy(dialogHelper.dialog, SIGNAL(currentFontChanged())); - QSignalSpy styleModelSpy(fontStyleListView, SIGNAL(modelChanged())); - QSignalSpy sizeModelSpy(fontSizeListView, SIGNAL(modelChanged())); - - QCOMPARE(fontFamilyListView->currentIndex(), 0); - QCOMPARE(fontStyleListView->currentIndex(), 0); - QCOMPARE(fontSizeListView->currentIndex(), 0); - - auto fontListModel = QFontDatabase::families(QFontDatabase::WritingSystem::Any); - fontListModel.removeIf(QFontDatabase::isPrivateFamily); - - // In case the font database contains a significant number of font families - const int maxNumberOfFamiliesToTest = 10; - - for (auto i = 1; i < qMin(fontListModel.size(), maxNumberOfFamiliesToTest); ++i) { - currentFontSpy.clear(); - styleModelSpy.clear(); - sizeModelSpy.clear(); - - const QString err = QString("LOOP INDEX %1, EXPECTED %2, ACTUAL %3").arg(i); - - const QFont currentFont = dialogHelper.dialog->currentFont(); - - const auto oldStyleModel = fontStyleListView->model(); - const auto oldSizeModel = fontSizeListView->model(); - - const QString expected1 = fontListModel[i - 1], actual1 = currentFont.family(); - QVERIFY2(expected1 == actual1, qPrintable(err.arg(expected1, actual1))); - - QQuickAbstractButton *fontDelegate = - qobject_cast<QQuickAbstractButton *>(findViewDelegateItem(fontFamilyListView, i)); - QVERIFY2(fontDelegate, qPrintable(QString("LOOP INDEX %1").arg(i))); - - QVERIFY2(clickButton(fontDelegate), qPrintable(QString("LOOP INDEX %1").arg(i))); - - const QString expected2 = fontListModel[i], - actual2 = dialogHelper.dialog->currentFont().family(); - QVERIFY2(expected2 == actual2, qPrintable(err.arg(expected2, actual2).append(" font: ").append(fontDelegate->text()))); - QVERIFY2(currentFontSpy.count() == 1, qPrintable(err.arg(1, currentFontSpy.count()))); - QVERIFY2((oldStyleModel == fontStyleListView->model()) != (styleModelSpy.count() == 1), - qPrintable(QString("LOOP INDEX %1").arg(i))); - QVERIFY2((oldSizeModel == fontSizeListView->model()) != (sizeModelSpy.count() == 1), - qPrintable(QString("LOOP INDEX %1").arg(i))); - } - - // Then accept it to close it. - QVERIFY(dialogHelper.dialog->currentFont() != dialogHelper.dialog->selectedFont()); - - CLOSE_DIALOG("Ok"); - - QVERIFY(dialogHelper.dialog->currentFont() == dialogHelper.dialog->selectedFont()); -} - -void tst_QQuickFontDialogImpl::effects() -{ - CREATE_DIALOG_TEST_HELPER - - // Open the dialog. - QVERIFY(dialogHelper.openDialog()); - QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); - - QSignalSpy currentFontSpy(dialogHelper.dialog, SIGNAL(currentFontChanged())); - - QQuickCheckBox *underlineCheckBox = - dialogHelper.quickDialog->findChild<QQuickCheckBox *>("underlineEffect"); - QVERIFY(underlineCheckBox); - - QQuickCheckBox *strikeoutCheckBox = - dialogHelper.quickDialog->findChild<QQuickCheckBox *>("strikeoutEffect"); - QVERIFY(strikeoutCheckBox); - - QVERIFY(!dialogHelper.dialog->currentFont().underline()); - QVERIFY(!dialogHelper.dialog->currentFont().strikeOut()); - - QVERIFY(clickButton(underlineCheckBox)); - - QCOMPARE(currentFontSpy.count(), 1); - QVERIFY(dialogHelper.dialog->currentFont().underline()); - QVERIFY(!dialogHelper.dialog->currentFont().strikeOut()); - - QVERIFY(clickButton(underlineCheckBox)); - - QCOMPARE(currentFontSpy.count(), 2); - QVERIFY(!dialogHelper.dialog->currentFont().underline()); - QVERIFY(!dialogHelper.dialog->currentFont().strikeOut()); - - QVERIFY(clickButton(strikeoutCheckBox)); - - QCOMPARE(currentFontSpy.count(), 3); - QVERIFY(!dialogHelper.dialog->currentFont().underline()); - QVERIFY(dialogHelper.dialog->currentFont().strikeOut()); - - QVERIFY(clickButton(strikeoutCheckBox)); - - QCOMPARE(currentFontSpy.count(), 4); - QVERIFY(!dialogHelper.dialog->currentFont().underline()); - QVERIFY(!dialogHelper.dialog->currentFont().strikeOut()); - - // Then accept it to close it. - CLOSE_DIALOG("Ok"); -} - -void tst_QQuickFontDialogImpl::changeFontSize() -{ - CREATE_DIALOG_TEST_HELPER - - // Open the dialog. - QVERIFY(dialogHelper.openDialog()); - QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); - - QQuickTextField *sizeEdit = dialogHelper.quickDialog->findChild<QQuickTextField *>("sizeEdit"); - QVERIFY(sizeEdit); - - QQuickListView *fontSizeListView = - dialogHelper.quickDialog->findChild<QQuickListView *>("sizeListView"); - QVERIFY(fontSizeListView); - - const QQuickItemDelegate *firstSizeDelegate = - qobject_cast<QQuickItemDelegate *>(findViewDelegateItem(fontSizeListView, 0)); - - QCOMPARE(dialogHelper.dialog->currentFont().pointSize(), firstSizeDelegate->text().toInt()); - - sizeEdit->setText("15"); - QCOMPARE(dialogHelper.dialog->currentFont().pointSize(), 15); - - sizeEdit->setText("22"); - QCOMPARE(dialogHelper.dialog->currentFont().pointSize(), 22); - - QVERIFY(dialogHelper.dialog->currentFont() != dialogHelper.dialog->selectedFont()); - - // Then accept it to close it. - CLOSE_DIALOG("Ok"); - - QVERIFY(dialogHelper.dialog->currentFont() == dialogHelper.dialog->selectedFont()); -} - -void tst_QQuickFontDialogImpl::changeDialogTitle() -{ - CREATE_DIALOG_TEST_HELPER - - // Open the dialog. - QVERIFY(dialogHelper.openDialog()); - QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); - - const auto dialogButtonBox = - dialogHelper.quickDialog->footer()->findChild<QQuickDialogButtonBox *>(); - QVERIFY(dialogButtonBox); - QQuickAbstractButton *cancelButton = findDialogButton(dialogButtonBox, "Cancel"); - QVERIFY(cancelButton); - - const QQuickLabel *titleLabel = dialogHelper.quickDialog->header()->findChild<QQuickLabel *>(); - QVERIFY(titleLabel); - - QCOMPARE(titleLabel->text(), QString()); - - const QString newTitle1 = QLatin1String("Some random title #1"); - - // Dialog must be closed for the title to update - QVERIFY(clickButton(cancelButton)); - QVERIFY(!dialogHelper.dialog->isVisible()); - QTRY_VERIFY(!dialogHelper.quickDialog->isVisible()); - - dialogHelper.dialog->setTitle(newTitle1); - - // Reopen the dialog - QVERIFY(dialogHelper.openDialog()); - QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); - QVERIFY(dialogHelper.dialog->isVisible()); - QTRY_VERIFY(dialogHelper.quickDialog->isVisible()); - - QCOMPARE(titleLabel->text(), newTitle1); - - const QString newTitle2 = QLatin1String("Some random other title #2"); - - dialogHelper.dialog->setTitle(newTitle2); - - // Shouldn't update unless you reopen the dialog - QCOMPARE(titleLabel->text(), newTitle1); - - QVERIFY(clickButton(cancelButton)); - QVERIFY(dialogHelper.openDialog()); - QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); - - // Should now be updated - QCOMPARE(titleLabel->text(), newTitle2); - - CLOSE_DIALOG("Ok"); -} - -/* - Represents the expected search logic we use when the user types text into - one of the read-only text edits. - - As we test against real fonts installed on the system and hence cannot use - a hard-coded list, we need this helper to ensure that the (non-trivial) - searching behavior matches what we expect. -*/ -class ListSearchHelper -{ -public: - ListSearchHelper(const QStringList &model) - : m_model(model) - { - } - - int expectedCurrentIndexForSearch(const QString &searchText) - { - bool redo = false; - - do { - m_searchText.append(searchText); - - for (int i = 0; i < m_model.count(); ++i) { - if (m_model.at(i).startsWith(m_searchText, Qt::CaseInsensitive)) - return i; - } - - m_searchText.clear(); - - redo = !redo; - } while (redo); - - return -1; - } - -private: - QStringList m_model; - QString m_searchText; -}; - -void tst_QQuickFontDialogImpl::searchFamily() -{ - CREATE_DIALOG_TEST_HELPER - - // Open the dialog. - QVERIFY(dialogHelper.openDialog()); - QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); - - const QQuickTextField *familyEdit = - dialogHelper.quickDialog->findChild<QQuickTextField *>("familyEdit"); - QVERIFY(familyEdit); - - QQuickListView *fontFamilyListView = - dialogHelper.quickDialog->findChild<QQuickListView *>("familyListView"); - QVERIFY(fontFamilyListView); - - const QPoint familyEditCenterPos = - familyEdit->mapToScene({ familyEdit->width() / 2, familyEdit->height() / 2 }).toPoint(); - QTest::mouseClick(dialogHelper.window(), Qt::LeftButton, Qt::NoModifier, familyEditCenterPos); - QVERIFY(familyEdit->hasActiveFocus()); - - QSignalSpy familyListViewCurrentIndexSpy(fontFamilyListView, SIGNAL(currentIndexChanged())); - QVERIFY(familyListViewCurrentIndexSpy.isValid()); - - const QString alphabet("abcdefghijklmnopqrstuvwxyz"); - QStringList model = QFontDatabase::families(QFontDatabase::WritingSystem::Any); - model.removeIf(QFontDatabase::isPrivateFamily); - - ListSearchHelper listSearchHelper(model); - - // For each letter in the alphabet, press the corresponding key - // and check that the relevant delegate item in familyListView is selected. - for (auto alphabet_it = alphabet.cbegin(); alphabet_it != alphabet.cend(); alphabet_it++) { - const int previousIndex = fontFamilyListView->currentIndex(); - - const char keyEntered = alphabet_it->toLatin1(); - QTest::keyClick(dialogHelper.window(), keyEntered); - - int expectedListViewIndex = listSearchHelper.expectedCurrentIndexForSearch(QString(keyEntered)); - if (expectedListViewIndex == -1) { - // There was no match, so the currentIndex should remain unchanged. - expectedListViewIndex = previousIndex; - } - if (fontFamilyListView->currentIndex() == expectedListViewIndex) { - // Working as expected; keep testing. - continue; - } - - // Get the actual text of the current delegate item and the expected text. - auto currentDelegateItem = findViewDelegateItem(fontFamilyListView, fontFamilyListView->currentIndex()); - QVERIFY(currentDelegateItem); - const auto actualDelegateText = currentDelegateItem->property("text").toString(); - const auto expectedDelegateText = expectedListViewIndex != -1 ? model.at(expectedListViewIndex) : "(none)"; - - QFAIL(qPrintable(QString::fromLatin1("Expected fontFamilyListView to" - " change its currentIndex to %1 (%2) after typing '%3', but it is %4 (%5)") - .arg(expectedListViewIndex) - .arg(expectedDelegateText) - .arg(keyEntered) - .arg(fontFamilyListView->currentIndex()) - .arg(actualDelegateText))); - } - - CLOSE_DIALOG("Ok"); -} - -int main(int argc, char *argv[]) -{ - // We need to set this attribute, and this (defining main() ourselves and - // calling QTEST_MAIN_IMPL) seems to be the nicest way to do it without - // duplicating too much code. - // We also don't want to run this for every style, as each one will have - // different ways of implementing the dialogs. - QCoreApplication::setAttribute(Qt::AA_DontUseNativeDialogs); - // For now we only test one style. - // TODO: use Basic - QQuickStyle::setStyle("Fusion"); - QTEST_MAIN_IMPL(tst_QQuickFontDialogImpl) -} - -#include "tst_qquickfontdialogimpl.moc" |