diff options
Diffstat (limited to 'tests/auto/quickcontrols/font')
18 files changed, 809 insertions, 0 deletions
diff --git a/tests/auto/quickcontrols/font/CMakeLists.txt b/tests/auto/quickcontrols/font/CMakeLists.txt new file mode 100644 index 0000000000..ab62726cd3 --- /dev/null +++ b/tests/auto/quickcontrols/font/CMakeLists.txt @@ -0,0 +1,56 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from font.pro. + +if (NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT) + cmake_minimum_required(VERSION 3.16) + project(tst_font LANGUAGES C CXX ASM) + find_package(Qt6BuildInternals COMPONENTS STANDALONE_TEST) +endif() + +##################################################################### +## tst_font Test: +##################################################################### + +# Collect test data +file(GLOB_RECURSE test_data_glob + RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} + data/*) +list(APPEND test_data ${test_data_glob}) + +qt_internal_add_test(tst_font + SOURCES + tst_font.cpp + DEFINES + QQC2_IMPORT_PATH=\\\"${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/quickcontrols\\\" + LIBRARIES + Qt::CorePrivate + Qt::Gui + Qt::GuiPrivate + Qt::QmlPrivate + Qt::QuickControls2 + Qt::QuickControls2Private + Qt::QuickPrivate + Qt::QuickTemplates2Private + Qt::QuickTest + Qt::QuickTestUtilsPrivate + Qt::TestPrivate + TESTDATA ${test_data} +) + +#### Keys ignored in scope 1:.:.:font.pro:<TRUE>: +# OTHER_FILES = "data/*.qml" + +## Scopes: +##################################################################### + +qt_internal_extend_target(tst_font CONDITION ANDROID OR IOS + DEFINES + QT_QMLTEST_DATADIR=\\\":/data\\\" +) + +qt_internal_extend_target(tst_font CONDITION NOT ANDROID AND NOT IOS + DEFINES + QT_QMLTEST_DATADIR=\\\"${CMAKE_CURRENT_SOURCE_DIR}/data\\\" +) diff --git a/tests/auto/quickcontrols/font/data/font-appwindow-custom.qml b/tests/auto/quickcontrols/font/data/font-appwindow-custom.qml new file mode 100644 index 0000000000..fa621ae6a0 --- /dev/null +++ b/tests/auto/quickcontrols/font/data/font-appwindow-custom.qml @@ -0,0 +1,15 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick +import QtQuick.Controls + +ApplicationWindow { + font.capitalization: Font.AllUppercase + font.family: "Courier" + font.italic: true + font.pixelSize: 60 + font.strikeout: true + font.underline: true + font.weight: Font.DemiBold +} diff --git a/tests/auto/quickcontrols/font/data/font-appwindow-default.qml b/tests/auto/quickcontrols/font/data/font-appwindow-default.qml new file mode 100644 index 0000000000..f9c767b876 --- /dev/null +++ b/tests/auto/quickcontrols/font/data/font-appwindow-default.qml @@ -0,0 +1,8 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick +import QtQuick.Controls + +ApplicationWindow { +} diff --git a/tests/auto/quickcontrols/font/data/font-control-custom.qml b/tests/auto/quickcontrols/font/data/font-control-custom.qml new file mode 100644 index 0000000000..c7ee583d04 --- /dev/null +++ b/tests/auto/quickcontrols/font/data/font-control-custom.qml @@ -0,0 +1,15 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick +import QtQuick.Controls + +Control { + font.capitalization: Font.AllUppercase + font.family: "Courier" + font.italic: true + font.pixelSize: 60 + font.strikeout: true + font.underline: true + font.weight: Font.DemiBold +} diff --git a/tests/auto/quickcontrols/font/data/font-control-default.qml b/tests/auto/quickcontrols/font/data/font-control-default.qml new file mode 100644 index 0000000000..7cd58e12b3 --- /dev/null +++ b/tests/auto/quickcontrols/font/data/font-control-default.qml @@ -0,0 +1,8 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick +import QtQuick.Controls + +Control { +} diff --git a/tests/auto/quickcontrols/font/data/font-popup-custom.qml b/tests/auto/quickcontrols/font/data/font-popup-custom.qml new file mode 100644 index 0000000000..fcf942e3a5 --- /dev/null +++ b/tests/auto/quickcontrols/font/data/font-popup-custom.qml @@ -0,0 +1,15 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick +import QtQuick.Controls + +Popup { + font.capitalization: Font.AllUppercase + font.family: "Courier" + font.italic: true + font.pixelSize: 60 + font.strikeout: true + font.underline: true + font.weight: Font.DemiBold +} diff --git a/tests/auto/quickcontrols/font/data/font-popup-default.qml b/tests/auto/quickcontrols/font/data/font-popup-default.qml new file mode 100644 index 0000000000..b9db73c9fb --- /dev/null +++ b/tests/auto/quickcontrols/font/data/font-popup-default.qml @@ -0,0 +1,8 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick +import QtQuick.Controls + +Popup { +} diff --git a/tests/auto/quickcontrols/font/data/inheritance-childcontrol.qml b/tests/auto/quickcontrols/font/data/inheritance-childcontrol.qml new file mode 100644 index 0000000000..f476020517 --- /dev/null +++ b/tests/auto/quickcontrols/font/data/inheritance-childcontrol.qml @@ -0,0 +1,29 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick +import QtQuick.Controls + +ApplicationWindow { + id: window + + property alias control: control + property alias child: child + property alias grandChild: grandChild + + Item { + Control { + id: control + + Control { + id: child + + Item { + Control { + id: grandChild + } + } + } + } + } +} diff --git a/tests/auto/quickcontrols/font/data/inheritance-childpopup.qml b/tests/auto/quickcontrols/font/data/inheritance-childpopup.qml new file mode 100644 index 0000000000..8b7a033bd7 --- /dev/null +++ b/tests/auto/quickcontrols/font/data/inheritance-childpopup.qml @@ -0,0 +1,29 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick +import QtQuick.Controls + +ApplicationWindow { + id: window + + property alias control: control + property alias child: child + property alias grandChild: grandChild + + Item { + Popup { + id: control + + Control { + id: child + + Item { + Control { + id: grandChild + } + } + } + } + } +} diff --git a/tests/auto/quickcontrols/font/data/inheritance-control.qml b/tests/auto/quickcontrols/font/data/inheritance-control.qml new file mode 100644 index 0000000000..2cd5c125f4 --- /dev/null +++ b/tests/auto/quickcontrols/font/data/inheritance-control.qml @@ -0,0 +1,27 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick +import QtQuick.Controls + +ApplicationWindow { + id: window + + property alias control: control + property alias child: child + property alias grandChild: grandChild + + Control { + id: control + + Control { + id: child + + Item { + Control { + id: grandChild + } + } + } + } +} diff --git a/tests/auto/quickcontrols/font/data/inheritance-dynamicchildcontrol.qml b/tests/auto/quickcontrols/font/data/inheritance-dynamicchildcontrol.qml new file mode 100644 index 0000000000..18305058bc --- /dev/null +++ b/tests/auto/quickcontrols/font/data/inheritance-dynamicchildcontrol.qml @@ -0,0 +1,28 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick +import QtQuick.Controls + +ApplicationWindow { + id: window + + property Control control + property Control child + property Control grandChild + + Item { + id: childItem + } + + Component { + id: component + Control { } + } + + Component.onCompleted: { + control = component.createObject(childItem) + child = component.createObject(control) + grandChild = component.createObject(child) + } +} diff --git a/tests/auto/quickcontrols/font/data/inheritance-dynamicchildpopup.qml b/tests/auto/quickcontrols/font/data/inheritance-dynamicchildpopup.qml new file mode 100644 index 0000000000..6b16f1a46b --- /dev/null +++ b/tests/auto/quickcontrols/font/data/inheritance-dynamicchildpopup.qml @@ -0,0 +1,33 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick +import QtQuick.Controls + +ApplicationWindow { + id: window + + property Popup control + property Control child + property Control grandChild + + Item { + id: childItem + } + + Component { + id: popupComponent + Popup { } + } + + Component { + id: controlComponent + Control { } + } + + Component.onCompleted: { + control = popupComponent.createObject(childItem) + child = controlComponent.createObject(control.contentItem) + grandChild = controlComponent.createObject(child) + } +} diff --git a/tests/auto/quickcontrols/font/data/inheritance-dynamiccontrol.qml b/tests/auto/quickcontrols/font/data/inheritance-dynamiccontrol.qml new file mode 100644 index 0000000000..df0e13bf2c --- /dev/null +++ b/tests/auto/quickcontrols/font/data/inheritance-dynamiccontrol.qml @@ -0,0 +1,24 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick +import QtQuick.Controls + +ApplicationWindow { + id: window + + property Control control + property Control child + property Control grandChild + + Component { + id: component + Control { } + } + + Component.onCompleted: { + control = component.createObject(contentItem) + child = component.createObject(control) + grandChild = component.createObject(child) + } +} diff --git a/tests/auto/quickcontrols/font/data/inheritance-dynamicpopup.qml b/tests/auto/quickcontrols/font/data/inheritance-dynamicpopup.qml new file mode 100644 index 0000000000..76b7d7cbda --- /dev/null +++ b/tests/auto/quickcontrols/font/data/inheritance-dynamicpopup.qml @@ -0,0 +1,29 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick +import QtQuick.Controls + +ApplicationWindow { + id: window + + property Popup control + property Control child + property Control grandChild + + Component { + id: popupComponent + Popup { } + } + + Component { + id: controlComponent + Control { } + } + + Component.onCompleted: { + control = popupComponent.createObject(window) + child = controlComponent.createObject(control.contentItem) + grandChild = controlComponent.createObject(child) + } +} diff --git a/tests/auto/quickcontrols/font/data/inheritance-popup.qml b/tests/auto/quickcontrols/font/data/inheritance-popup.qml new file mode 100644 index 0000000000..a5010f0f11 --- /dev/null +++ b/tests/auto/quickcontrols/font/data/inheritance-popup.qml @@ -0,0 +1,27 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick +import QtQuick.Controls + +ApplicationWindow { + id: window + + property alias control: control + property alias child: child + property alias grandChild: grandChild + + Popup { + id: control + + Control { + id: child + + Item { + Control { + id: grandChild + } + } + } + } +} diff --git a/tests/auto/quickcontrols/font/data/listview.qml b/tests/auto/quickcontrols/font/data/listview.qml new file mode 100644 index 0000000000..aa07a337cf --- /dev/null +++ b/tests/auto/quickcontrols/font/data/listview.qml @@ -0,0 +1,32 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick +import QtQuick.Controls + +ApplicationWindow { + id: window + width: 200 + height: 200 + + property alias listView: listView + + font.pixelSize: 55 + + ListView { + id: listView + anchors.fill: parent + model: 1 + delegate: Column { + property alias control: control + property alias label: label + property alias textarea: textarea + property alias textfield: textfield + + Control { id: control } + Label { id: label } + TextArea { id: textarea } + TextField { id: textfield } + } + } +} diff --git a/tests/auto/quickcontrols/font/data/resolve.qml b/tests/auto/quickcontrols/font/data/resolve.qml new file mode 100644 index 0000000000..00e5c767bb --- /dev/null +++ b/tests/auto/quickcontrols/font/data/resolve.qml @@ -0,0 +1,50 @@ +// Copyright (C) 2022 yeshanshan <yeshanshan@uniontech.com>. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick +import QtQuick.Controls + +ApplicationWindow { + id: window + property alias control1: control1 + property alias control2: control2 + property alias control2ChildControl: control3 + property alias control4: control4 + + font {family: "Helvetica"; pointSize: 10; weight: 10} + + Control { + id: control1 + } + + function changeFont1(font) { + control1.font.pointSize = font.pointSize + window.font.weight = font.weight + } + + Control { + id: control2 + + Control { + id: control3 + // The font's resolve mask of control4 should be is 0, the + // controls3's font is same thing. because control3's font + // resolve mask is 0 also, so the font's all value equal to + // the parent font values. + font: control4.font + } + } + + Control { + font.pointSize: 10 + + Control { + id: control4 + } + } + + function changeFont2(font) { + control2.font.pointSize = font.pointSize + control2.font.weight = font.weight + } +} diff --git a/tests/auto/quickcontrols/font/tst_font.cpp b/tests/auto/quickcontrols/font/tst_font.cpp new file mode 100644 index 0000000000..26caf0c476 --- /dev/null +++ b/tests/auto/quickcontrols/font/tst_font.cpp @@ -0,0 +1,376 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#include <QtTest/qtest.h> + +#include <QtGui/qfont.h> +#include <QtGui/qpa/qplatformtheme.h> +#include <QtGui/private/qguiapplication_p.h> +#include <QtQml/qqmlengine.h> +#include <QtQml/qqmlcomponent.h> +#include <QtQuickTestUtils/private/qmlutils_p.h> +#include <QtQuickTemplates2/private/qquickapplicationwindow_p.h> +#include <QtQuickTemplates2/private/qquickcontrol_p.h> +#include <QtQuickTemplates2/private/qquickpopup_p.h> +#include <QtQuickTemplates2/private/qquicktheme_p_p.h> +#include <QtQuickControls2/qquickstyle.h> + +class tst_font : public QQmlDataTest +{ + Q_OBJECT + +public: + tst_font(); + +private slots: + void systemFont(); + + void font_data(); + void font(); + + void inheritance_data(); + void inheritance(); + + void defaultFont_data(); + void defaultFont(); + + void listView_data(); + void listView(); + + void resolve(); +}; + +static QFont testFont() +{ + QQmlEngine engine; + QQmlComponent component(&engine); + component.setData("import QtQuick; import QtQuick.Controls; Text { }", QUrl()); + + QScopedPointer<QObject> object(component.create()); + Q_ASSERT_X(!object.isNull(), "testFont", qPrintable(component.errorString())); + + QVariant var = object->property("font"); + Q_ASSERT_X(var.isValid(), "testFont", var.typeName()); + return var.value<QFont>(); +} + +tst_font::tst_font() + : QQmlDataTest(QT_QMLTEST_DATADIR) +{ + QQuickStyle::setStyle("Basic"); +} + +void tst_font::systemFont() +{ + QSKIP("QTBUG-70063: qmlClearTypeRegistrations() call causes crash"); + + const QFont *originalSystemFont = QGuiApplicationPrivate::platformTheme()->font(QPlatformTheme::SystemFont); + if (!originalSystemFont) + QSKIP("Cannot test the system font on a minimal platform"); + + const QFont fontBefore = testFont(); + QCOMPARE(fontBefore, *originalSystemFont); + + qmlClearTypeRegistrations(); + delete QGuiApplicationPrivate::app_font; + QGuiApplicationPrivate::app_font = nullptr; + + const QFont appFont = QGuiApplication::font(); + QCOMPARE(appFont, *originalSystemFont); + + const QFont fontAfter = testFont(); + QCOMPARE(fontAfter, *originalSystemFont); +} + +void tst_font::font_data() +{ + QTest::addColumn<QString>("testFile"); + QTest::addColumn<QFont>("expectedFont"); + + QTest::newRow("Control") << "font-control-default.qml" << QFont(); + QTest::newRow("AppWindow") << "font-appwindow-default.qml" << QFont(); + QTest::newRow("Popup") << "font-popup-default.qml" << QFont(); + + QFont customFont; + customFont.setCapitalization(QFont::AllUppercase); + customFont.setFamilies(QStringList{QLatin1String("Courier")}); + customFont.setItalic(true); + customFont.setPixelSize(60); + customFont.setStrikeOut(true); + customFont.setUnderline(true); + customFont.setWeight(QFont::DemiBold); + + QTest::newRow("Control:custom") << "font-control-custom.qml" << customFont; + QTest::newRow("AppWindow:custom") << "font-appwindow-custom.qml" << customFont; + QTest::newRow("Popup:custom") << "font-popup-custom.qml" << customFont; +} + +void tst_font::font() +{ + QFETCH(QString, testFile); + QFETCH(QFont, expectedFont); + + if (QSysInfo::productType().compare(QLatin1String("osx"), Qt::CaseInsensitive) == 0 + && qgetenv("QTEST_ENVIRONMENT").split(' ').contains("CI")) { + QSKIP("This test crashes on macOS: QTBUG-70063"); + } + + QQmlEngine engine; + QQmlComponent component(&engine); + component.loadUrl(testFileUrl(testFile)); + + QScopedPointer<QObject> object(component.create()); + QVERIFY2(!object.isNull(), qPrintable(component.errorString())); + + QVariant var = object->property("font"); + QVERIFY(var.isValid()); + + QFont actualFont = var.value<QFont>(); + QCOMPARE(actualFont, expectedFont); +} + +void tst_font::inheritance_data() +{ + QTest::addColumn<QString>("testFile"); + + QTest::newRow("Control") << "inheritance-control.qml"; + QTest::newRow("Child Control") << "inheritance-childcontrol.qml"; + QTest::newRow("Dynamic Control") << "inheritance-dynamiccontrol.qml"; + QTest::newRow("Dynamic Child Control") << "inheritance-dynamicchildcontrol.qml"; + + QTest::newRow("Popup") << "inheritance-popup.qml"; + QTest::newRow("Child Popup") << "inheritance-childpopup.qml"; + QTest::newRow("Dynamic Popup") << "inheritance-dynamicpopup.qml"; + QTest::newRow("Dynamic Child Popup") << "inheritance-dynamicchildpopup.qml"; +} + +void tst_font::inheritance() +{ + QFETCH(QString, testFile); + + QQmlEngine engine; + QQmlComponent component(&engine); + component.loadUrl(testFileUrl(testFile)); + + QScopedPointer<QQuickApplicationWindow> window(qobject_cast<QQuickApplicationWindow *>(component.create())); + QVERIFY2(!window.isNull(), qPrintable(component.errorString())); + + QObject *control = window->property("control").value<QObject *>(); + QObject *child = window->property("child").value<QObject *>(); + QObject *grandChild = window->property("grandChild").value<QObject *>(); + QVERIFY(control && child && grandChild); + + QCOMPARE(window->font(), QFont()); + + QCOMPARE(control->property("font").value<QFont>(), QFont()); + QCOMPARE(child->property("font").value<QFont>(), QFont()); + QCOMPARE(grandChild->property("font").value<QFont>(), QFont()); + + QFont childFont; + childFont.setFamilies(QStringList{QLatin1String("Arial")}); + childFont.setPixelSize(80); + childFont.setItalic(true); + child->setProperty("font", childFont); + QCOMPARE(child->property("font").value<QFont>(), childFont); + QCOMPARE(grandChild->property("font").value<QFont>(), childFont); + + QFont grandChildFont(childFont); + grandChildFont.setFamilies(QStringList{QLatin1String("Times New Roman")}); + grandChildFont.setUnderline(true); + grandChild->setProperty("font", grandChildFont); + QCOMPARE(child->property("font").value<QFont>(), childFont); + QCOMPARE(grandChild->property("font").value<QFont>(), grandChildFont); + + QFont windowFont; + windowFont.setWeight(QFont::Thin); + window->setFont(windowFont); + QCOMPARE(window->font(), windowFont); + QCOMPARE(control->property("font").value<QFont>(), windowFont); + + childFont.setWeight(QFont::Thin); + QCOMPARE(child->property("font").value<QFont>(), childFont); + + grandChildFont.setWeight(QFont::Thin); + QCOMPARE(grandChild->property("font").value<QFont>(), grandChildFont); + + child->setProperty("font", QVariant()); + QCOMPARE(child->property("font").value<QFont>(), windowFont); + QCOMPARE(grandChild->property("font").value<QFont>(), grandChildFont); + + grandChild->setProperty("font", QVariant()); + QCOMPARE(grandChild->property("font").value<QFont>(), windowFont); +} + +class TestFontTheme : public QQuickTheme +{ +public: + static const int NFonts = QQuickTheme::Tumbler + 1; + + TestFontTheme() + { + for (int i = 0; i < NFonts; ++i) { + QFont font = QFont(); + font.setPixelSize(i + 10); + setFont(static_cast<Scope>(i), font); + } + } +}; + +Q_DECLARE_METATYPE(QQuickTheme::Scope) + +void tst_font::defaultFont_data() +{ + QTest::addColumn<QString>("control"); + QTest::addColumn<QQuickTheme::Scope>("scope"); + + QTest::newRow("AbstractButton") << "AbstractButton" << QQuickTheme::System; + QTest::newRow("ApplicationWindow") << "ApplicationWindow" << QQuickTheme::System; + QTest::newRow("Button") << "Button" << QQuickTheme::Button; + QTest::newRow("CheckBox") << "CheckBox" << QQuickTheme::CheckBox; + QTest::newRow("CheckDelegate") << "CheckDelegate" << QQuickTheme::ListView; + QTest::newRow("ComboBox") << "ComboBox" << QQuickTheme::ComboBox; + QTest::newRow("Container") << "Container" << QQuickTheme::System; + QTest::newRow("Control") << "Control" << QQuickTheme::System; + QTest::newRow("Dial") << "Dial" << QQuickTheme::System; + QTest::newRow("Dialog") << "Dialog" << QQuickTheme::System; + QTest::newRow("DialogButtonBox") << "DialogButtonBox" << QQuickTheme::System; + QTest::newRow("Drawer") << "Drawer" << QQuickTheme::System; + QTest::newRow("Frame") << "Frame" << QQuickTheme::System; + QTest::newRow("GroupBox") << "GroupBox" << QQuickTheme::GroupBox; + QTest::newRow("ItemDelegate") << "ItemDelegate" << QQuickTheme::ItemView; + QTest::newRow("Label") << "Label" << QQuickTheme::Label; + QTest::newRow("Menu") << "Menu" << QQuickTheme::Menu; + QTest::newRow("MenuItem") << "MenuItem" << QQuickTheme::Menu; + QTest::newRow("MenuSeparator") << "MenuSeparator" << QQuickTheme::Menu; + QTest::newRow("Page") << "Page" << QQuickTheme::System; + QTest::newRow("Pane") << "Pane" << QQuickTheme::System; + QTest::newRow("Popup") << "Popup" << QQuickTheme::System; + QTest::newRow("ProgressBar") << "ProgressBar" << QQuickTheme::System; + QTest::newRow("RadioButton") << "RadioButton" << QQuickTheme::RadioButton; + QTest::newRow("RadioDelegate") << "RadioDelegate" << QQuickTheme::ListView; + QTest::newRow("RangeSlider") << "RangeSlider" << QQuickTheme::System; + QTest::newRow("RoundButton") << "RoundButton" << QQuickTheme::Button; + QTest::newRow("ScrollBar") << "ScrollBar" << QQuickTheme::System; + QTest::newRow("ScrollIndicator") << "ScrollIndicator" << QQuickTheme::System; + QTest::newRow("Slider") << "Slider" << QQuickTheme::System; + QTest::newRow("SpinBox") << "SpinBox" << QQuickTheme::SpinBox; + QTest::newRow("SwipeDelegate") << "SwipeDelegate" << QQuickTheme::ListView; + QTest::newRow("Switch") << "Switch" << QQuickTheme::Switch; + QTest::newRow("SwitchDelegate") << "SwitchDelegate" << QQuickTheme::ListView; + QTest::newRow("TabBar") << "TabBar" << QQuickTheme::TabBar; + QTest::newRow("TabButton") << "TabButton" << QQuickTheme::TabBar; + QTest::newRow("TextArea") << "TextArea" << QQuickTheme::TextArea; + QTest::newRow("TextField") << "TextField" << QQuickTheme::TextField; + QTest::newRow("ToolBar") << "ToolBar" << QQuickTheme::ToolBar; + QTest::newRow("ToolButton") << "ToolButton" << QQuickTheme::ToolBar; + QTest::newRow("ToolSeparator") << "ToolSeparator" << QQuickTheme::ToolBar; + QTest::newRow("ToolTip") << "ToolTip" << QQuickTheme::ToolTip; + QTest::newRow("Tumbler") << "Tumbler" << QQuickTheme::Tumbler; +} + +void tst_font::defaultFont() +{ + QFETCH(QString, control); + QFETCH(QQuickTheme::Scope, scope); + + QQmlEngine engine; + QQmlComponent component(&engine); + component.setData(QString("import QtQuick.Controls; %1 { }").arg(control).toUtf8(), QUrl()); + + // The call to setData() above causes QQuickBasicTheme to be set as the current theme, + // so we must make sure we only set our theme afterwards. + QQuickThemePrivate::instance.reset(new TestFontTheme); + + QScopedPointer<QObject> object(component.create()); + QVERIFY2(!object.isNull(), qPrintable(component.errorString())); + + QVariant var = object->property("font"); + QVERIFY(var.isValid()); + + QFont expectedFont = QQuickTheme::font(scope); + QFont actualFont = var.value<QFont>(); + QCOMPARE(actualFont, expectedFont); +} + +void tst_font::listView_data() +{ + QTest::addColumn<QString>("objectName"); + + QTest::newRow("Control") << "control"; + QTest::newRow("Label") << "label"; + QTest::newRow("TextArea") << "textarea"; + QTest::newRow("TextField") << "textfield"; +} + +void tst_font::listView() +{ + QFETCH(QString, objectName); + + QQmlEngine engine; + QQmlComponent component(&engine); + component.loadUrl(testFileUrl("listview.qml")); + + QScopedPointer<QQuickApplicationWindow> window(qobject_cast<QQuickApplicationWindow *>(component.create())); + QVERIFY2(!window.isNull(), qPrintable(component.errorString())); + + window->show(); + QVERIFY(QTest::qWaitForWindowActive(window.data())); + + QQuickItem *listView = window->property("listView").value<QQuickItem *>(); + QVERIFY(listView); + + QQuickItem *contentItem = listView->property("contentItem").value<QQuickItem *>(); + QVERIFY(contentItem); + + QVERIFY(QMetaObject::invokeMethod(listView, "forceLayout")); + + QQuickItem *column = contentItem->childItems().value(0); + QVERIFY(column); + + QQuickItem *control = column->property(objectName.toUtf8()).value<QQuickItem *>(); + QVERIFY(control); + + QCOMPARE(control->property("font").value<QFont>().pixelSize(), 55); +} + +void tst_font::resolve() +{ + QQmlEngine engine; + QQmlComponent component(&engine); + component.loadUrl(testFileUrl("resolve.qml")); + + QScopedPointer<QObject> window(component.create()); + QVERIFY2(!window.isNull(), qPrintable(component.errorString())); + + auto control1 = window->property("control1").value<QQuickControl*>(); + QVERIFY(control1); + + QCOMPARE(window->property("font").value<QFont>().pointSize(), + control1->property("font").value<QFont>().pointSize()); + QCOMPARE(window->property("font").value<QFont>().weight(), + control1->property("font").value<QFont>().weight()); + QMetaObject::invokeMethod(window.get(), "changeFont1", Q_ARG(QVariant, QFont("Helvetica", 12, 12))); + QVERIFY(window->property("font").value<QFont>().pointSize() + != control1->property("font").value<QFont>().pointSize()); + QCOMPARE(window->property("font").value<QFont>().weight(), + control1->property("font").value<QFont>().weight()); + + QMetaObject::invokeMethod(window.get(), "changeFont2", Q_ARG(QVariant, QFont("Helvetica", 20, 20))); + auto control2 = window->property("control2").value<QQuickControl*>(); + auto control2ChildControl = window->property("control2ChildControl").value<QQuickControl*>(); + auto control4 = window->property("control4").value<QQuickControl*>(); + QVERIFY(control2); + QVERIFY(control2ChildControl); + QVERIFY(control4); + auto control2Font = control2->property("font").value<QFont>(); + auto control2ChildControlFont = control2ChildControl->property("font").value<QFont>(); + auto control4Font = control4->property("font").value<QFont>(); + QCOMPARE((int)control4Font.resolveMask(), 0); + QCOMPARE(control4Font.resolveMask(), control2ChildControlFont.resolveMask()); + QCOMPARE(control2ChildControlFont, control2Font); + QVERIFY(control2ChildControlFont != control4Font); +} + +QTEST_MAIN(tst_font) + +#include "tst_font.moc" |