/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ ** 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 https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 as published by the Free Software ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #include #include #include #include "qfontdialog.h" #include QT_FORWARD_DECLARE_CLASS(QtTestEventThread) class tst_QFontDialog : public QObject { Q_OBJECT public: tst_QFontDialog(); virtual ~tst_QFontDialog(); public slots: void postKeyReturn(); void testGetFont(); void testSetFont(); void testNonStandardFontSize(); public slots: void initTestCase(); void cleanupTestCase(); void init(); void cleanup(); private slots: void defaultOkButton(); void setFont(); void task256466_wrongStyle(); void setNonStandardFontSize(); #ifndef QT_NO_STYLE_STYLESHEET void qtbug_41513_stylesheetStyle(); #endif private: void runSlotWithFailsafeTimer(const char *member); }; tst_QFontDialog::tst_QFontDialog() { } tst_QFontDialog::~tst_QFontDialog() { } void tst_QFontDialog::initTestCase() { } void tst_QFontDialog::cleanupTestCase() { } void tst_QFontDialog::init() { } void tst_QFontDialog::cleanup() { } void tst_QFontDialog::postKeyReturn() { QWidgetList list = QApplication::topLevelWidgets(); for (int i=0; i(list[i]); if (dialog) { QTest::keyClick( list[i], Qt::Key_Return, Qt::NoModifier ); return; } } } void tst_QFontDialog::testGetFont() { #ifdef Q_OS_MAC QEXPECT_FAIL("", "Sending QTest::keyClick to OSX font dialog helper fails, see QTBUG-24321", Continue); #endif bool ok = false; QTimer::singleShot(2000, this, SLOT(postKeyReturn())); QFontDialog::getFont(&ok); QVERIFY(ok); } void tst_QFontDialog::runSlotWithFailsafeTimer(const char *member) { // FailSafeTimer quits the nested event loop if the dialog closing doesn't do it. QTimer failSafeTimer; failSafeTimer.setInterval(4000); failSafeTimer.setSingleShot(true); connect(&failSafeTimer, SIGNAL(timeout()), qApp, SLOT(quit())); failSafeTimer.start(); QTimer::singleShot(0, this, member); qApp->exec(); // FailSafeTimer stops once it goes out of scope. } void tst_QFontDialog::defaultOkButton() { runSlotWithFailsafeTimer(SLOT(testGetFont())); } void tst_QFontDialog::testSetFont() { bool ok = false; #if defined Q_OS_HPUX QString fontName = "Courier"; int fontSize = 25; #elif defined Q_OS_AIX QString fontName = "Charter"; int fontSize = 13; #else QString fontName = "Arial"; int fontSize = 24; #endif QFont f1(fontName, fontSize); f1.setPixelSize(QFontInfo(f1).pixelSize()); QTimer::singleShot(2000, this, SLOT(postKeyReturn())); QFont f2 = QFontDialog::getFont(&ok, f1); QCOMPARE(QFontInfo(f2).pointSize(), QFontInfo(f1).pointSize()); } void tst_QFontDialog::setFont() { /* The font should be the same before as it is after if nothing changed while the font dialog was open. Task #27662 */ runSlotWithFailsafeTimer(SLOT(testSetFont())); } class FriendlyFontDialog : public QFontDialog { friend class tst_QFontDialog; Q_DECLARE_PRIVATE(QFontDialog) }; void tst_QFontDialog::task256466_wrongStyle() { QFontDatabase fdb; FriendlyFontDialog dialog; dialog.setOption(QFontDialog::DontUseNativeDialog); QListView *familyList = reinterpret_cast(dialog.d_func()->familyList); QListView *styleList = reinterpret_cast(dialog.d_func()->styleList); QListView *sizeList = reinterpret_cast(dialog.d_func()->sizeList); for (int i = 0; i < familyList->model()->rowCount(); ++i) { QModelIndex currentFamily = familyList->model()->index(i, 0); familyList->setCurrentIndex(currentFamily); int expectedSize = sizeList->currentIndex().data().toInt(); const QFont current = dialog.currentFont(), expected = fdb.font(currentFamily.data().toString(), styleList->currentIndex().data().toString(), expectedSize); QCOMPARE(current.family(), expected.family()); QCOMPARE(current.style(), expected.style()); if (expectedSize == 0 && !QFontDatabase().isScalable(current.family(), current.styleName())) QEXPECT_FAIL("", "QTBUG-53299: Smooth sizes for unscalable font contains unsupported size", Continue); QCOMPARE(current.pointSizeF(), expected.pointSizeF()); } } void tst_QFontDialog::setNonStandardFontSize() { runSlotWithFailsafeTimer(SLOT(testNonStandardFontSize())); } #ifndef QT_NO_STYLE_STYLESHEET static const QString offendingStyleSheet = QStringLiteral("* { font-family: \"QtBidiTestFont\"; }"); void tst_QFontDialog::qtbug_41513_stylesheetStyle() { if (QFontDatabase::addApplicationFont(QFINDTESTDATA("test.ttf")) < 0) QSKIP("Test fonts not found."); if (QFontDatabase::addApplicationFont(QFINDTESTDATA("testfont.ttf")) < 0) QSKIP("Test fonts not found."); QFont testFont = QFont(QStringLiteral("QtsSpecialTestFont")); qApp->setStyleSheet(offendingStyleSheet); bool accepted = false; QTimer::singleShot(2000, this, SLOT(postKeyReturn())); QFont resultFont = QFontDialog::getFont(&accepted, testFont, QApplication::activeWindow(), QLatin1String("QFontDialog - Stylesheet Test"), QFontDialog::DontUseNativeDialog); QVERIFY(accepted); // The fontdialog sets the styleName, when the fontdatabase knows the style name. resultFont.setStyleName(testFont.styleName()); testFont.setFamilies(QStringList(testFont.family())); QCOMPARE(resultFont, testFont); // reset stylesheet qApp->setStyleSheet(QString()); } #endif // QT_NO_STYLE_STYLESHEET void tst_QFontDialog::testNonStandardFontSize() { QList standardSizesList = QFontDatabase::standardSizes(); int nonStandardFontSize; if (!standardSizesList.isEmpty()) { nonStandardFontSize = standardSizesList.at(standardSizesList.count()-1); // get the maximum standard size. nonStandardFontSize += 1; // the increment of 1 to mock a non-standard font size. } else { QSKIP("QFontDatabase::standardSizes() is empty."); } QFont testFont; testFont.setPointSize(nonStandardFontSize); bool accepted = false; QTimer::singleShot(2000, this, SLOT(postKeyReturn())); QFont resultFont = QFontDialog::getFont(&accepted, testFont, QApplication::activeWindow(), QLatin1String("QFontDialog - NonStandardFontSize Test"), QFontDialog::DontUseNativeDialog); QVERIFY(accepted); if (accepted) QCOMPARE(testFont.pointSize(), resultFont.pointSize()); else QWARN("Fail using a non-standard font size."); } QTEST_MAIN(tst_QFontDialog) #include "tst_qfontdialog.moc"