File indexing completed on 2024-04-28 03:56:10
0001 /* 0002 * SPDX-FileCopyrightText: 2023 ivan tkachenko <me@ratijas.tk> 0003 * 0004 * SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include <QAbstractItemModel> 0008 #include <QJsonObject> 0009 #include <QObject> 0010 #include <QQmlApplicationEngine> 0011 #include <QQmlContext> 0012 #include <QSignalSpy> 0013 #include <QStandardItemModel> 0014 #include <QTest> 0015 0016 #include <memory> 0017 0018 #ifdef IMPORT_ITEMMODELSPLUGIN 0019 #include <QPluginLoader> 0020 Q_IMPORT_PLUGIN(Plugin) 0021 #endif 0022 0023 class tst_KRoleNamesQml : public QObject 0024 { 0025 Q_OBJECT 0026 private Q_SLOTS: 0027 void testAttachedNonModel(); 0028 void testAttachedInvalidRole(); 0029 void testAttachedInvalidRoleName(); 0030 void testAttachedRoleToRoleName(); 0031 void testAttachedRoleNameToRole(); 0032 0033 private: 0034 QAbstractItemModel *createMonthTestModel(QObject *parent = nullptr); 0035 }; 0036 0037 QAbstractItemModel *tst_KRoleNamesQml::createMonthTestModel(QObject *parent) 0038 { 0039 auto testModel = new QStandardItemModel(parent); 0040 for (int i = 1; i <= 12; i++) { 0041 auto entry = new QStandardItem(); 0042 entry->setData(QLocale::c().monthName(i), Qt::DisplayRole); 0043 entry->setData(i, Qt::UserRole); 0044 testModel->appendRow(entry); 0045 } 0046 testModel->setItemRoleNames({{Qt::UserRole, "user"}, {Qt::DisplayRole, "display"}}); 0047 return testModel; 0048 } 0049 0050 void tst_KRoleNamesQml::testAttachedNonModel() 0051 { 0052 QTest::ignoreMessage(QtWarningMsg, QRegularExpression(".* KRoleNames must be attached to a QAbstractItemModel")); 0053 QQmlApplicationEngine app; 0054 app.loadData(R"( 0055 import QtQml 0056 import org.kde.kitemmodels as KItemModels 0057 0058 QtObject { 0059 property int role 0060 0061 Component.onCompleted: { 0062 role = KItemModels.KRoleNames.role("display"); 0063 } 0064 } 0065 )"); 0066 QCOMPARE(app.rootObjects().count(), 1); 0067 } 0068 0069 void tst_KRoleNamesQml::testAttachedInvalidRole() 0070 { 0071 QQmlApplicationEngine app; 0072 std::unique_ptr<QStandardItemModel> model = std::make_unique<QStandardItemModel>(); 0073 model->setItemRoleNames({}); 0074 app.setInitialProperties({{"model", QVariant::fromValue(&*model)}}); 0075 app.loadData(R"( 0076 import QtQml 0077 import org.kde.kitemmodels as KItemModels 0078 0079 QtObject { 0080 required property var model 0081 property int role 0082 0083 Component.onCompleted: { 0084 role = model.KItemModels.KRoleNames.role(Qt.UserRole); 0085 } 0086 } 0087 )"); 0088 QCOMPARE(app.rootObjects().count(), 1); 0089 const auto object = app.rootObjects().first(); 0090 const auto role = object->property("role").toInt(); 0091 QCOMPARE(role, -1); 0092 } 0093 0094 void tst_KRoleNamesQml::testAttachedInvalidRoleName() 0095 { 0096 QQmlApplicationEngine app; 0097 std::unique_ptr<QStandardItemModel> model = std::make_unique<QStandardItemModel>(); 0098 model->setItemRoleNames({}); 0099 app.setInitialProperties({{"model", QVariant::fromValue(&*model)}}); 0100 app.loadData(R"( 0101 import QtQml 0102 import org.kde.kitemmodels as KItemModels 0103 0104 QtObject { 0105 required property var model 0106 property string roleName 0107 0108 Component.onCompleted: { 0109 roleName = model.KItemModels.KRoleNames.roleName(Qt.UserRole); 0110 } 0111 } 0112 )"); 0113 QCOMPARE(app.rootObjects().count(), 1); 0114 const auto object = app.rootObjects().first(); 0115 const auto roleName = object->property("roleName").toString(); 0116 QCOMPARE(roleName, ""); 0117 } 0118 0119 void tst_KRoleNamesQml::testAttachedRoleNameToRole() 0120 { 0121 QQmlApplicationEngine app; 0122 std::unique_ptr<QAbstractItemModel> model{createMonthTestModel(nullptr)}; 0123 app.setInitialProperties({{"model", QVariant::fromValue(&*model)}}); 0124 app.loadData(R"( 0125 import QtQml 0126 import org.kde.kitemmodels as KItemModels 0127 0128 QtObject { 0129 required property var model 0130 property int role 0131 0132 Component.onCompleted: { 0133 role = model.KItemModels.KRoleNames.role("user"); 0134 } 0135 } 0136 )"); 0137 QCOMPARE(app.rootObjects().count(), 1); 0138 const auto object = app.rootObjects().first(); 0139 const auto role = object->property("role").toInt(); 0140 QCOMPARE(role, Qt::UserRole); 0141 } 0142 0143 void tst_KRoleNamesQml::testAttachedRoleToRoleName() 0144 { 0145 QQmlApplicationEngine app; 0146 std::unique_ptr<QAbstractItemModel> model{createMonthTestModel(nullptr)}; 0147 app.setInitialProperties({{"model", QVariant::fromValue(&*model)}}); 0148 app.loadData(R"( 0149 import QtQml 0150 import org.kde.kitemmodels as KItemModels 0151 0152 QtObject { 0153 required property var model 0154 property string roleName 0155 0156 Component.onCompleted: { 0157 roleName = model.KItemModels.KRoleNames.roleName(Qt.UserRole); 0158 } 0159 } 0160 )"); 0161 QCOMPARE(app.rootObjects().count(), 1); 0162 const auto object = app.rootObjects().first(); 0163 const auto roleName = object->property("roleName").toString(); 0164 QCOMPARE(roleName, "user"); 0165 } 0166 0167 QTEST_GUILESS_MAIN(tst_KRoleNamesQml) 0168 0169 #include "krolenames_qml.moc"