diff options
Diffstat (limited to 'tests/auto/corelib/kernel')
37 files changed, 475 insertions, 171 deletions
diff --git a/tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.cpp b/tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.cpp index 5e9dbdd226..a53501b9dd 100644 --- a/tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.cpp +++ b/tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.cpp @@ -415,7 +415,7 @@ void tst_QCoreApplication::removePostedEvents() expected.clear(); } -#ifndef QT_NO_THREAD +#if QT_CONFIG(thread) class DeliverInDefinedOrderThread : public QThread { Q_OBJECT @@ -532,7 +532,7 @@ void tst_QCoreApplication::deliverInDefinedOrder() QObject::connect(&obj, SIGNAL(done()), &app, SLOT(quit())); app.exec(); } -#endif // QT_NO_QTHREAD +#endif // QT_CONFIG(thread) void tst_QCoreApplication::applicationPid() { diff --git a/tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.h b/tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.h index b6c20a915f..105cca5174 100644 --- a/tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.h +++ b/tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.h @@ -43,7 +43,7 @@ private slots: void argc(); void postEvent(); void removePostedEvents(); -#ifndef QT_NO_THREAD +#if QT_CONFIG(thread) void deliverInDefinedOrder(); #endif void applicationPid(); diff --git a/tests/auto/corelib/kernel/qelapsedtimer/BLACKLIST b/tests/auto/corelib/kernel/qelapsedtimer/BLACKLIST index 4cd3c2f0c8..4dd71ca9f4 100644 --- a/tests/auto/corelib/kernel/qelapsedtimer/BLACKLIST +++ b/tests/auto/corelib/kernel/qelapsedtimer/BLACKLIST @@ -1,3 +1,4 @@ [elapsed] windows osx-10.12 +osx-10.13 diff --git a/tests/auto/corelib/kernel/qeventdispatcher/BLACKLIST b/tests/auto/corelib/kernel/qeventdispatcher/BLACKLIST index 402d87b82f..fb7e025b7c 100644 --- a/tests/auto/corelib/kernel/qeventdispatcher/BLACKLIST +++ b/tests/auto/corelib/kernel/qeventdispatcher/BLACKLIST @@ -4,3 +4,4 @@ osx [registerTimer] windows osx +winrt diff --git a/tests/auto/corelib/kernel/qmetaenum/tst_qmetaenum.cpp b/tests/auto/corelib/kernel/qmetaenum/tst_qmetaenum.cpp index e4aa8b80c0..bb111a9137 100644 --- a/tests/auto/corelib/kernel/qmetaenum/tst_qmetaenum.cpp +++ b/tests/auto/corelib/kernel/qmetaenum/tst_qmetaenum.cpp @@ -37,7 +37,10 @@ class tst_QMetaEnum : public QObject Q_OBJECT public: enum SuperEnum { SuperValue1 = 1 , SuperValue2 = 2 }; + enum Flag { Flag1 = 1 , Flag2 = 2 }; + Q_DECLARE_FLAGS(Flags, Flag) Q_ENUM(SuperEnum) + Q_FLAG(Flags) private slots: void fromType(); @@ -49,7 +52,17 @@ void tst_QMetaEnum::fromType() { QMetaEnum meta = QMetaEnum::fromType<SuperEnum>(); QVERIFY(meta.isValid()); + QVERIFY(!meta.isFlag()); QCOMPARE(meta.name(), "SuperEnum"); + QCOMPARE(meta.enumName(), "SuperEnum"); + QCOMPARE(meta.enclosingMetaObject(), &staticMetaObject); + QCOMPARE(meta.keyCount(), 2); + + meta = QMetaEnum::fromType<Flags>(); + QVERIFY(meta.isValid()); + QVERIFY(meta.isFlag()); + QCOMPARE(meta.name(), "Flags"); + QCOMPARE(meta.enumName(), "Flag"); QCOMPARE(meta.enclosingMetaObject(), &staticMetaObject); QCOMPARE(meta.keyCount(), 2); } diff --git a/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp b/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp index 431a9ebdea..9855bec520 100644 --- a/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp +++ b/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp @@ -54,6 +54,11 @@ namespace MyNamespace { MyEnum2, MyEnum3 }; + enum class MyScopedEnum { + Enum1, + Enum2, + Enum3 + }; enum MyAnotherEnum { MyAnotherEnum1 = 1, MyAnotherEnum2 = 2, @@ -64,7 +69,13 @@ namespace MyNamespace { MyFlag2 = 0x02, MyFlag3 = 0x04 }; + enum class MyScopedFlag { + MyFlag1 = 0x10, + MyFlag2 = 0x20, + MyFlag3 = 0x40 + }; Q_DECLARE_FLAGS(MyFlags, MyFlag) + Q_DECLARE_FLAGS(MyScopedFlags, MyScopedFlag) MyEnum myEnum() const { return m_enum; } void setMyEnum(MyEnum val) { m_enum = val; } @@ -79,8 +90,10 @@ namespace MyNamespace { { } private: Q_ENUM(MyEnum) + Q_ENUM(MyScopedEnum) Q_ENUM(MyAnotherEnum) Q_FLAG(MyFlags) + Q_FLAG(MyScopedFlags) MyEnum m_enum; MyFlags m_flags; @@ -1730,20 +1743,35 @@ void tst_QMetaObject::signalIndex() void tst_QMetaObject::enumDebugStream() { - QTest::ignoreMessage(QtDebugMsg, "hello MyNamespace::MyClass::MyEnum(MyEnum2) world "); - MyNamespace::MyClass::MyEnum e = MyNamespace::MyClass::MyEnum2; - qDebug() << "hello" << e << "world"; + QTest::ignoreMessage(QtDebugMsg, "hello MyNamespace::MyClass::MyEnum2 world "); + qDebug() << "hello" << MyNamespace::MyClass::MyEnum2 << "world"; + + QTest::ignoreMessage(QtDebugMsg, "hello MyNamespace::MyClass::MyScopedEnum::Enum3 scoped world "); + qDebug() << "hello" << MyNamespace::MyClass::MyScopedEnum::Enum3 << "scoped world"; - QTest::ignoreMessage(QtDebugMsg, "Qt::WindowType(WindowTitleHint) Qt::WindowType(Window) Qt::WindowType(Desktop) Qt::WindowType(WindowSystemMenuHint)"); - qDebug() << Qt::WindowTitleHint << Qt::Window <<Qt::Desktop << Qt::WindowSystemMenuHint; + QTest::ignoreMessage(QtDebugMsg, "Qt::WindowTitleHint Qt::Window Qt::Desktop Qt::WindowSystemMenuHint"); + qDebug() << Qt::WindowTitleHint << Qt::Window << Qt::Desktop << Qt::WindowSystemMenuHint; - QTest::ignoreMessage(QtDebugMsg, "hello QFlags<MyNamespace::MyClass::MyFlags>(MyFlag1) world"); + QTest::ignoreMessage(QtDebugMsg, "hello QFlags<MyNamespace::MyClass::MyFlag>(MyFlag1) world"); MyNamespace::MyClass::MyFlags f1 = MyNamespace::MyClass::MyFlag1; qDebug() << "hello" << f1 << "world"; MyNamespace::MyClass::MyFlags f2 = MyNamespace::MyClass::MyFlag2 | MyNamespace::MyClass::MyFlag3; - QTest::ignoreMessage(QtDebugMsg, "QFlags<MyNamespace::MyClass::MyFlags>(MyFlag1) QFlags<MyNamespace::MyClass::MyFlags>(MyFlag2|MyFlag3)"); + QTest::ignoreMessage(QtDebugMsg, "QFlags<MyNamespace::MyClass::MyFlag>(MyFlag1) QFlags<MyNamespace::MyClass::MyFlag>(MyFlag2|MyFlag3)"); qDebug() << f1 << f2; + + QTest::ignoreMessage(QtDebugMsg, "QFlags<MyNamespace::MyClass::MyScopedFlag>(MyFlag2)"); + MyNamespace::MyClass::MyScopedFlags f3 = MyNamespace::MyClass::MyScopedFlag::MyFlag2; + qDebug() << f3; + + QTest::ignoreMessage(QtDebugMsg, "QFlags<MyNamespace::MyClass::MyScopedFlag>(MyFlag2|MyFlag3)"); + f3 |= MyNamespace::MyClass::MyScopedFlag::MyFlag3; + qDebug() << f3; + + // Single flag recognized as enum: + QTest::ignoreMessage(QtDebugMsg, "MyNamespace::MyClass::MyFlag1"); + MyNamespace::MyClass::MyFlag f4 = MyNamespace::MyClass::MyFlag1; + qDebug() << f4; } void tst_QMetaObject::inherits_data() diff --git a/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp b/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp index 6bb031e357..56623773a2 100644 --- a/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp +++ b/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp @@ -830,6 +830,7 @@ void tst_QMetaObjectBuilder::enumerator() // Modify the attributes on enum1. enum1.setIsFlag(true); enum1.setIsScoped(true); + enum1.setEnumName(QByteArrayLiteral("fooFlag")); QCOMPARE(enum1.addKey("ABC", 0), 0); QCOMPARE(enum1.addKey("DEF", 1), 1); QCOMPARE(enum1.addKey("GHI", -1), 2); @@ -838,6 +839,7 @@ void tst_QMetaObjectBuilder::enumerator() QCOMPARE(enum1.name(), QByteArray("foo")); QVERIFY(enum1.isFlag()); QVERIFY(enum1.isScoped()); + QCOMPARE(enum1.enumName(), QByteArray("fooFlag")); QCOMPARE(enum1.keyCount(), 3); QCOMPARE(enum1.index(), 0); QCOMPARE(enum1.key(0), QByteArray("ABC")); diff --git a/tests/auto/corelib/kernel/qmetatype/qmetatype.pro b/tests/auto/corelib/kernel/qmetatype/qmetatype.pro index ad148ccc7f..d70befecfd 100644 --- a/tests/auto/corelib/kernel/qmetatype/qmetatype.pro +++ b/tests/auto/corelib/kernel/qmetatype/qmetatype.pro @@ -1,6 +1,6 @@ CONFIG += testcase TARGET = tst_qmetatype -QT = core testlib +QT = core-private testlib INCLUDEPATH += $$PWD/../../../other/qvariant_common SOURCES = tst_qmetatype.cpp TESTDATA=./typeFlags.bin diff --git a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp index e312199980..5d9b5ca95c 100644 --- a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp +++ b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp @@ -29,6 +29,7 @@ #include <QtCore> #include <QtTest/QtTest> +#include <QtCore/private/qmetaobjectbuilder_p.h> #include "tst_qmetatype.h" #include "tst_qvariant_common.h" @@ -38,6 +39,7 @@ #endif #include <algorithm> +#include <memory> // mingw gcc 4.8 also takes way too long, letting the CI system abort the test #if defined(__MINGW32__) @@ -52,12 +54,19 @@ class tst_QMetaType: public QObject Q_PROPERTY(QList<QVariant> prop READ prop WRITE setProp) public: + struct GadgetPropertyType { + QByteArray type; + QByteArray name; + QVariant testData; + }; + tst_QMetaType() { propList << 42 << "Hello"; } QList<QVariant> prop() const { return propList; } void setProp(const QList<QVariant> &list) { propList = list; } private: + void registerGadget(const char * name, const QVector<GadgetPropertyType> &gadgetProperties); QList<QVariant> propList; private slots: @@ -89,6 +98,7 @@ private slots: void flagsBinaryCompatibility5_0(); void construct_data(); void construct(); + void typedConstruct(); void constructCopy_data(); void constructCopy(); void typedefs(); @@ -115,6 +125,128 @@ private slots: void customDebugStream(); }; +struct BaseGenericType +{ + int m_typeId = -1; + virtual void *constructor(int typeId, void *where, const void *copy) = 0; + virtual void staticMetacallFunction(QMetaObject::Call _c, int _id, void **_a) = 0; + virtual void saveOperator(QDataStream & out) const = 0; + virtual void loadOperator(QDataStream &in) = 0; + virtual ~BaseGenericType() {} +}; + +struct GenericGadgetType : BaseGenericType +{ + void *constructor(int typeId, void *where, const void *copy) override + { + GenericGadgetType *ret = where ? new(where) GenericGadgetType : new GenericGadgetType; + ret->m_typeId = typeId; + if (copy) { + Q_ASSERT(ret->m_typeId == reinterpret_cast<const GenericGadgetType*>(copy)->m_typeId); + *ret = *reinterpret_cast<const GenericGadgetType*>(copy); + } else { + ret->properties = properties; + } + return ret; + } + + void staticMetacallFunction(QMetaObject::Call _c, int _id, void **_a) override + { + if (_c == QMetaObject::ReadProperty) { + if (_id < properties.size()) { + const auto &prop = properties.at(_id); + QMetaType::destruct(int(prop.userType()), _a[0]); + QMetaType::construct(int(prop.userType()), _a[0], prop.constData()); + } + } else if (_c == QMetaObject::WriteProperty) { + if (_id < properties.size()) { + auto & prop = properties[_id]; + prop = QVariant(prop.userType(), _a[0]); + } + } + } + + void saveOperator(QDataStream & out) const override + { + for (const auto &prop : properties) + out << prop; + } + + void loadOperator(QDataStream &in) override + { + for (auto &prop : properties) + in >> prop; + } + QVector<QVariant> properties; +}; + +struct GenericPODType : BaseGenericType +{ + // BaseGenericType interface + void *constructor(int typeId, void *where, const void *copy) override + { + GenericPODType *ret = where ? new(where) GenericPODType : new GenericPODType; + ret->m_typeId = typeId; + if (copy) { + Q_ASSERT(ret->m_typeId == reinterpret_cast<const GenericPODType*>(copy)->m_typeId); + *ret = *reinterpret_cast<const GenericPODType*>(copy); + } else { + ret->podData = podData; + } + return ret; + } + + void staticMetacallFunction(QMetaObject::Call _c, int _id, void **_a) override + { + Q_UNUSED(_c); + Q_UNUSED(_id); + Q_UNUSED(_a); + Q_ASSERT(false); + } + + void saveOperator(QDataStream &out) const override + { + out << podData; + } + void loadOperator(QDataStream &in) override + { + in >> podData; + } + QByteArray podData; +}; + +using RegisteredType = QPair<std::shared_ptr<BaseGenericType>, std::shared_ptr<QMetaObject>>; +static QHash<int, RegisteredType> s_managedTypes; + +static void GadgetsStaticMetacallFunction(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + reinterpret_cast<BaseGenericType*>(_o)->staticMetacallFunction(_c, _id, _a); +} + +static void GadgetTypedDestructor(int typeId, void *ptr) +{ + QCOMPARE(typeId, reinterpret_cast<BaseGenericType*>(ptr)->m_typeId); + reinterpret_cast<BaseGenericType*>(ptr)->~BaseGenericType(); +} + +static void *GadgetTypedConstructor(int type, void *where, const void *copy) +{ + auto it = s_managedTypes.find(type); + if (it == s_managedTypes.end()) + return nullptr; // crash the test + return it->first->constructor(type, where, copy); +} + +static void GadgetSaveOperator(QDataStream & out, const void *data) +{ + reinterpret_cast<const BaseGenericType *>(data)->saveOperator(out); +} + +static void GadgetLoadOperator(QDataStream &in, void *data) +{ + reinterpret_cast<BaseGenericType *>(data)->loadOperator(in); +} + struct Foo { int i; }; @@ -149,6 +281,34 @@ class GadgetDerivedAndTyped : public CustomGadget {}; Q_DECLARE_METATYPE(GadgetDerivedAndTyped<int>) Q_DECLARE_METATYPE(GadgetDerivedAndTyped<int>*) +void tst_QMetaType::registerGadget(const char *name, const QVector<GadgetPropertyType> &gadgetProperties) +{ + QMetaObjectBuilder gadgetBuilder; + gadgetBuilder.setClassName(name); + QMetaObjectBuilder::MetaObjectFlags metaObjectflags = QMetaObjectBuilder::DynamicMetaObject | QMetaObjectBuilder::PropertyAccessInStaticMetaCall; + gadgetBuilder.setFlags(metaObjectflags); + auto dynamicGadgetProperties = std::make_shared<GenericGadgetType>(); + for (const auto &prop : gadgetProperties) { + int propertyType = QMetaType::type(prop.type); + dynamicGadgetProperties->properties.push_back(QVariant(QVariant::Type(propertyType))); + auto dynamicPropery = gadgetBuilder.addProperty(prop.name, prop.type); + dynamicPropery.setWritable(true); + dynamicPropery.setReadable(true); + } + auto meta = gadgetBuilder.toMetaObject(); + meta->d.static_metacall = &GadgetsStaticMetacallFunction; + meta->d.superdata = nullptr; + const auto flags = QMetaType::WasDeclaredAsMetaType | QMetaType::IsGadget | QMetaType::NeedsConstruction | QMetaType::NeedsDestruction; + int gadgetTypeId = QMetaType::registerType(name, + &GadgetTypedDestructor, + &GadgetTypedConstructor, + sizeof(GenericGadgetType), + flags, meta); + QVERIFY(gadgetTypeId > 0); + QMetaType::registerStreamOperators(gadgetTypeId, &GadgetSaveOperator, &GadgetLoadOperator); + s_managedTypes[gadgetTypeId] = qMakePair(dynamicGadgetProperties, std::shared_ptr<QMetaObject>{meta, [](QMetaObject *ptr){ ::free(ptr); }}); +} + void tst_QMetaType::defined() { QCOMPARE(int(QMetaTypeId2<QString>::Defined), 1); @@ -906,6 +1066,90 @@ FOR_EACH_CORE_METATYPE(RETURN_CONSTRUCT_FUNCTION) TypeTestFunctionGetter::get(type)(); } +void tst_QMetaType::typedConstruct() +{ + auto testMetaObjectWriteOnGadget = [](QVariant &gadget, const QVector<GadgetPropertyType> &properties) + { + auto metaObject = QMetaType::metaObjectForType(gadget.userType()); + QVERIFY(metaObject != nullptr); + QCOMPARE(metaObject->methodCount(), 0); + QCOMPARE(metaObject->propertyCount(), properties.size()); + for (int i = 0; i < metaObject->propertyCount(); ++i) { + auto prop = metaObject->property(i); + QCOMPARE(properties[i].name, prop.name()); + QCOMPARE(properties[i].type, prop.typeName()); + prop.writeOnGadget(gadget.data(), properties[i].testData); + } + }; + + auto testMetaObjectReadOnGadget = [](QVariant gadget, const QVector<GadgetPropertyType> &properties) + { + auto metaObject = QMetaType::metaObjectForType(gadget.userType()); + QVERIFY(metaObject != nullptr); + QCOMPARE(metaObject->methodCount(), 0); + QCOMPARE(metaObject->propertyCount(), properties.size()); + for (int i = 0; i < metaObject->propertyCount(); ++i) { + auto prop = metaObject->property(i); + QCOMPARE(properties[i].name, prop.name()); + QCOMPARE(properties[i].type, prop.typeName()); + if (!QMetaType::typeFlags(prop.userType()).testFlag(QMetaType::IsGadget)) + QCOMPARE(properties[i].testData, prop.readOnGadget(gadget.constData())); + } + }; + + QVector<GadgetPropertyType> dynamicGadget1 = { + {"int", "int_prop", 34526}, + {"float", "float_prop", 1.23f}, + {"QString", "string_prop", QString{"Test QString"}} + }; + registerGadget("DynamicGadget1", dynamicGadget1); + + QVariant testGadget1(QVariant::Type(QMetaType::type("DynamicGadget1"))); + testMetaObjectWriteOnGadget(testGadget1, dynamicGadget1); + testMetaObjectReadOnGadget(testGadget1, dynamicGadget1); + + + QVector<GadgetPropertyType> dynamicGadget2 = { + {"int", "int_prop", 512}, + {"double", "double_prop", 4.56}, + {"QString", "string_prop", QString{"Another String"}}, + {"DynamicGadget1", "dynamicGadget1_prop", testGadget1} + }; + registerGadget("DynamicGadget2", dynamicGadget2); + QVariant testGadget2(QVariant::Type(QMetaType::type("DynamicGadget2"))); + testMetaObjectWriteOnGadget(testGadget2, dynamicGadget2); + testMetaObjectReadOnGadget(testGadget2, dynamicGadget2); + auto g2mo = QMetaType::metaObjectForType(testGadget2.userType()); + auto dynamicGadget1_prop = g2mo->property(g2mo->indexOfProperty("dynamicGadget1_prop")); + testMetaObjectReadOnGadget(dynamicGadget1_prop.readOnGadget(testGadget2.constData()), dynamicGadget1); + + + // Register POD + const QByteArray myPodTesData = "My POD test data"; + const char podTypeName[] = "DynamicPOD"; + auto dynamicGadgetProperties = std::make_shared<GenericPODType>(); + dynamicGadgetProperties->podData = myPodTesData; + const auto flags = QMetaType::NeedsConstruction | QMetaType::NeedsDestruction; + int podTypeId = QMetaType::registerType(podTypeName, + &GadgetTypedDestructor, + &GadgetTypedConstructor, + sizeof(GenericGadgetType), + flags, nullptr); + QVERIFY(podTypeId > 0); + QMetaType::registerStreamOperators(podTypeId, &GadgetSaveOperator, &GadgetLoadOperator); + s_managedTypes[podTypeId] = qMakePair(dynamicGadgetProperties, std::shared_ptr<QMetaObject>{}); + + // Test POD + QCOMPARE(podTypeId, QMetaType::type(podTypeName)); + QVariant podVariant{QVariant::Type(podTypeId)}; + QCOMPARE(myPodTesData, static_cast<const GenericPODType *>(reinterpret_cast<const BaseGenericType *>(podVariant.constData()))->podData); + + QVariant podVariant1{podVariant}; + podVariant1.detach(); // Test stream operators + static_cast<GenericPODType *>(reinterpret_cast<BaseGenericType *>(podVariant.data()))->podData.clear(); + QCOMPARE(myPodTesData, static_cast<const GenericPODType *>(reinterpret_cast<const BaseGenericType *>(podVariant1.constData()))->podData); +} + template<int ID> static void testConstructCopyHelper() { @@ -1574,6 +1818,9 @@ DECLARE_NONSTREAMABLE(QJsonValue) DECLARE_NONSTREAMABLE(QJsonObject) DECLARE_NONSTREAMABLE(QJsonArray) DECLARE_NONSTREAMABLE(QJsonDocument) +DECLARE_NONSTREAMABLE(QCborValue) +DECLARE_NONSTREAMABLE(QCborArray) +DECLARE_NONSTREAMABLE(QCborMap) DECLARE_NONSTREAMABLE(QObject*) DECLARE_NONSTREAMABLE(QWidget*) diff --git a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.h b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.h index 93ff33bb67..6bda9638f7 100644 --- a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.h +++ b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.h @@ -273,6 +273,24 @@ template<> struct TestValueFactory<QMetaType::QJsonDocument> { ); } }; + +template<> struct TestValueFactory<QMetaType::QCborSimpleType> { + static QCborSimpleType *create() { return new QCborSimpleType(QCborSimpleType::True); } +}; +template<> struct TestValueFactory<QMetaType::QCborValue> { + static QCborValue *create() { return new QCborValue(123.); } +}; +template<> struct TestValueFactory<QMetaType::QCborMap> { + static QCborMap *create() { + return new QCborMap{{0, 0}, {"Hello", 1}, {1, nullptr}}; + } +}; +template<> struct TestValueFactory<QMetaType::QCborArray> { + static QCborArray *create() { + return new QCborArray{0, 1, -2, 2.5, false, nullptr, "Hello", QByteArray("World") }; + } +}; + template<> struct TestValueFactory<QMetaType::QVariant> { static QVariant *create() { return new QVariant(QStringList(QStringList() << "Q" << "t")); } }; diff --git a/tests/auto/corelib/kernel/qobject/.gitignore b/tests/auto/corelib/kernel/qobject/.gitignore index 7970e32c8f..d609065333 100644 --- a/tests/auto/corelib/kernel/qobject/.gitignore +++ b/tests/auto/corelib/kernel/qobject/.gitignore @@ -1,3 +1,7 @@ tst_qobject -signalbug/signalbug -signalbug/signalbug.exe +signalbug_helper +signalbug_helper.exe +debug/signalbug_helper +release/signalbug_helper +debug/signalbug_helper.exe +release/signalbug_helper.exe diff --git a/tests/auto/corelib/kernel/qobject/qobject.pro b/tests/auto/corelib/kernel/qobject/qobject.pro index 978aab86c1..75ad7b5f14 100644 --- a/tests/auto/corelib/kernel/qobject/qobject.pro +++ b/tests/auto/corelib/kernel/qobject/qobject.pro @@ -1,8 +1,4 @@ TEMPLATE = subdirs -!winrt { - test.depends = signalbug - SUBDIRS += signalbug -} - -SUBDIRS += test +SUBDIRS += test.pro +!winrt: SUBDIRS += signalbug diff --git a/tests/auto/corelib/kernel/qobject/signalbug/signalbug.pro b/tests/auto/corelib/kernel/qobject/signalbug/signalbug.pro index cc51b4c661..d21b3a62a9 100644 --- a/tests/auto/corelib/kernel/qobject/signalbug/signalbug.pro +++ b/tests/auto/corelib/kernel/qobject/signalbug/signalbug.pro @@ -1,11 +1,6 @@ -CONFIG -= app_bundle debug_and_release -CONFIG += console -DESTDIR = ./ QT = core HEADERS += signalbug.h SOURCES += signalbug.cpp -# This app is testdata for tst_qobject -target.path = $$[QT_INSTALL_TESTS]/tst_qobject/$$TARGET -INSTALLS += target +load(qt_test_helper) diff --git a/tests/auto/corelib/kernel/qobject/test/test.pro b/tests/auto/corelib/kernel/qobject/test.pro index 4e77cb48c5..af5203e152 100644 --- a/tests/auto/corelib/kernel/qobject/test/test.pro +++ b/tests/auto/corelib/kernel/qobject/test.pro @@ -1,10 +1,10 @@ CONFIG += testcase console -TARGET = ../tst_qobject + QT = core-private network testlib -SOURCES = ../tst_qobject.cpp +TARGET = tst_qobject +SOURCES = tst_qobject.cpp # Force C++17 if available (needed due to P0012R1) contains(QT_CONFIG, c++1z): CONFIG += c++1z -!winrt: TEST_HELPER_INSTALLS = ../signalbug/signalbug DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 diff --git a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp index ec57522f48..68c6ece583 100644 --- a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp +++ b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp @@ -55,7 +55,6 @@ class tst_QObject : public QObject { Q_OBJECT private slots: - void initTestCase(); void disconnect(); void connectSlotsByName(); void connectSignalsToSignalsWithDefaultArguments(); @@ -145,6 +144,7 @@ private slots: void disconnectDoesNotLeakFunctor(); void contextDoesNotLeakFunctor(); void connectBase(); + void connectWarnings(); void qmlConnect(); void exceptions(); void noDeclarativeParentChangedOnDestruction(); @@ -282,14 +282,6 @@ static void playWithObjects() } } -void tst_QObject::initTestCase() -{ -#if QT_CONFIG(process) - const QString testDataDir = QFileInfo(QFINDTESTDATA("signalbug")).absolutePath(); - QVERIFY2(QDir::setCurrent(testDataDir), qPrintable("Could not chdir to " + testDataDir)); -#endif -} - void tst_QObject::disconnect() { SenderObject *s = new SenderObject; @@ -3026,7 +3018,7 @@ void tst_QObject::recursiveSignalEmission() #else QProcess proc; // signalbug helper app should always be next to this test binary - const QString path = QStringLiteral("signalbug/signalbug"); + const QString path = QStringLiteral("signalbug_helper"); proc.start(path); QVERIFY2(proc.waitForStarted(), qPrintable(QString::fromLatin1("Cannot start '%1': %2").arg(path, proc.errorString()))); QVERIFY(proc.waitForFinished()); @@ -6697,6 +6689,26 @@ void tst_QObject::connectBase() QCOMPARE( r1.count_slot3, 1 ); } +void tst_QObject::connectWarnings() +{ + SubSender sub; + SenderObject obj; + ReceiverObject r1; + r1.reset(); + + QTest::ignoreMessage(QtWarningMsg, "QObject::connect(SenderObject, ReceiverObject): invalid null parameter"); + connect(nullptr, &SubSender::signal1, &r1, &ReceiverObject::slot1); + + QTest::ignoreMessage(QtWarningMsg, "QObject::connect(SubSender, Unknown): invalid null parameter"); + connect(&sub, &SubSender::signal1, nullptr, &ReceiverObject::slot1); + + QTest::ignoreMessage(QtWarningMsg, "QObject::connect(SenderObject, ReceiverObject): invalid null parameter"); + connect(nullptr, &SenderObject::signal1, &r1, &ReceiverObject::slot1); + + QTest::ignoreMessage(QtWarningMsg, "QObject::connect(SenderObject, Unknown): invalid null parameter"); + connect(&obj, &SenderObject::signal1, nullptr, &ReceiverObject::slot1); +} + struct QmlReceiver : public QtPrivate::QSlotObjectBase { int callCount; diff --git a/tests/auto/corelib/kernel/qsharedmemory/sharedmemoryhelper/main.cpp b/tests/auto/corelib/kernel/qsharedmemory/producerconsumer/main.cpp index ffbad37d82..ffbad37d82 100644 --- a/tests/auto/corelib/kernel/qsharedmemory/sharedmemoryhelper/main.cpp +++ b/tests/auto/corelib/kernel/qsharedmemory/producerconsumer/main.cpp diff --git a/tests/auto/corelib/kernel/qsharedmemory/producerconsumer/producerconsumer.pro b/tests/auto/corelib/kernel/qsharedmemory/producerconsumer/producerconsumer.pro new file mode 100644 index 0000000000..a6156ed5b6 --- /dev/null +++ b/tests/auto/corelib/kernel/qsharedmemory/producerconsumer/producerconsumer.pro @@ -0,0 +1,5 @@ +QT = core testlib + +SOURCES += main.cpp + +load(qt_test_helper) diff --git a/tests/auto/corelib/kernel/qsharedmemory/qsharedmemory.pro b/tests/auto/corelib/kernel/qsharedmemory/qsharedmemory.pro index 3a4697750e..323d5bbd37 100644 --- a/tests/auto/corelib/kernel/qsharedmemory/qsharedmemory.pro +++ b/tests/auto/corelib/kernel/qsharedmemory/qsharedmemory.pro @@ -1,6 +1,6 @@ TEMPLATE = subdirs qtConfig(sharedmemory) { - !winrt: SUBDIRS = sharedmemoryhelper - SUBDIRS += test + !winrt: SUBDIRS = producerconsumer + SUBDIRS += test.pro } diff --git a/tests/auto/corelib/kernel/qsharedmemory/sharedmemoryhelper/sharedmemoryhelper.pro b/tests/auto/corelib/kernel/qsharedmemory/sharedmemoryhelper/sharedmemoryhelper.pro deleted file mode 100644 index 389015d504..0000000000 --- a/tests/auto/corelib/kernel/qsharedmemory/sharedmemoryhelper/sharedmemoryhelper.pro +++ /dev/null @@ -1,17 +0,0 @@ -QT = core testlib - -win32: CONFIG += console -mac:CONFIG -= app_bundle - -SOURCES += main.cpp -TARGET = helperbinary - -CONFIG(debug_and_release) { - CONFIG(debug, debug|release) { - DESTDIR = ../debug - } else { - DESTDIR = ../release - } -} else { - DESTDIR = .. -} diff --git a/tests/auto/corelib/kernel/qsharedmemory/test.pro b/tests/auto/corelib/kernel/qsharedmemory/test.pro new file mode 100644 index 0000000000..8b3badadb0 --- /dev/null +++ b/tests/auto/corelib/kernel/qsharedmemory/test.pro @@ -0,0 +1,8 @@ +CONFIG += testcase + +QT = core-private testlib + +TARGET = tst_qsharedmemory +SOURCES += tst_qsharedmemory.cpp + +linux: LIBS += -lrt diff --git a/tests/auto/corelib/kernel/qsharedmemory/test/test.pro b/tests/auto/corelib/kernel/qsharedmemory/test/test.pro deleted file mode 100644 index 61124c27ee..0000000000 --- a/tests/auto/corelib/kernel/qsharedmemory/test/test.pro +++ /dev/null @@ -1,18 +0,0 @@ -CONFIG += testcase - -QT = core-private testlib - -linux:LIBS += -lrt - -SOURCES += tst_qsharedmemory.cpp -TARGET = tst_qsharedmemory - -CONFIG(debug_and_release) { - CONFIG(debug, debug|release) { - DESTDIR = ../debug - } else { - DESTDIR = ../release - } -} else { - DESTDIR = .. -} diff --git a/tests/auto/corelib/kernel/qsharedmemory/test/tst_qsharedmemory.cpp b/tests/auto/corelib/kernel/qsharedmemory/tst_qsharedmemory.cpp index f81324b894..55deb8eb1a 100644 --- a/tests/auto/corelib/kernel/qsharedmemory/test/tst_qsharedmemory.cpp +++ b/tests/auto/corelib/kernel/qsharedmemory/tst_qsharedmemory.cpp @@ -51,7 +51,6 @@ public: public Q_SLOTS: void init(); - void initTestCase(); void cleanup(); @@ -101,7 +100,6 @@ private slots: void uniqueKey(); protected: - static QString helperBinary(); int remove(const QString &key); QString rememberKey(const QString &key) @@ -125,7 +123,7 @@ private: tst_QSharedMemory::tst_QSharedMemory() : existingSharedMemory(0) - , m_helperBinary(tst_QSharedMemory::helperBinary()) + , m_helperBinary("producerconsumer_helper") { } @@ -133,13 +131,6 @@ tst_QSharedMemory::~tst_QSharedMemory() { } -void tst_QSharedMemory::initTestCase() -{ -#if QT_CONFIG(process) - QVERIFY2(!m_helperBinary.isEmpty(), "Could not find helper binary"); -#endif -} - void tst_QSharedMemory::init() { existingSharedMemory = new QSharedMemory(EXISTING_SHARE); @@ -179,15 +170,6 @@ void tst_QSharedMemory::cleanup() #include <errno.h> #endif -QString tst_QSharedMemory::helperBinary() -{ - QString binary = QStringLiteral("helperbinary"); -#ifdef Q_OS_WIN - binary += QStringLiteral(".exe"); -#endif - return QFINDTESTDATA(binary); -} - int tst_QSharedMemory::remove(const QString &key) { #ifdef Q_OS_WIN diff --git a/tests/auto/corelib/kernel/qsystemsemaphore/acquirerelease/acquirerelease.pro b/tests/auto/corelib/kernel/qsystemsemaphore/acquirerelease/acquirerelease.pro new file mode 100644 index 0000000000..a6156ed5b6 --- /dev/null +++ b/tests/auto/corelib/kernel/qsystemsemaphore/acquirerelease/acquirerelease.pro @@ -0,0 +1,5 @@ +QT = core testlib + +SOURCES += main.cpp + +load(qt_test_helper) diff --git a/tests/auto/corelib/kernel/qsystemsemaphore/systemsemaphorehelper/main.cpp b/tests/auto/corelib/kernel/qsystemsemaphore/acquirerelease/main.cpp index 7bfb6b16cc..7bfb6b16cc 100644 --- a/tests/auto/corelib/kernel/qsystemsemaphore/systemsemaphorehelper/main.cpp +++ b/tests/auto/corelib/kernel/qsystemsemaphore/acquirerelease/main.cpp diff --git a/tests/auto/corelib/kernel/qsystemsemaphore/qsystemsemaphore.pro b/tests/auto/corelib/kernel/qsystemsemaphore/qsystemsemaphore.pro index f8a49254d2..70526426aa 100644 --- a/tests/auto/corelib/kernel/qsystemsemaphore/qsystemsemaphore.pro +++ b/tests/auto/corelib/kernel/qsystemsemaphore/qsystemsemaphore.pro @@ -1,3 +1,3 @@ TEMPLATE = subdirs -SUBDIRS = systemsemaphorehelper test +SUBDIRS = acquirerelease test.pro diff --git a/tests/auto/corelib/kernel/qsystemsemaphore/systemsemaphorehelper/systemsemaphorehelper.pro b/tests/auto/corelib/kernel/qsystemsemaphore/systemsemaphorehelper/systemsemaphorehelper.pro deleted file mode 100644 index 389015d504..0000000000 --- a/tests/auto/corelib/kernel/qsystemsemaphore/systemsemaphorehelper/systemsemaphorehelper.pro +++ /dev/null @@ -1,17 +0,0 @@ -QT = core testlib - -win32: CONFIG += console -mac:CONFIG -= app_bundle - -SOURCES += main.cpp -TARGET = helperbinary - -CONFIG(debug_and_release) { - CONFIG(debug, debug|release) { - DESTDIR = ../debug - } else { - DESTDIR = ../release - } -} else { - DESTDIR = .. -} diff --git a/tests/auto/corelib/kernel/qsystemsemaphore/test.pro b/tests/auto/corelib/kernel/qsystemsemaphore/test.pro new file mode 100644 index 0000000000..13bd1fa270 --- /dev/null +++ b/tests/auto/corelib/kernel/qsystemsemaphore/test.pro @@ -0,0 +1,7 @@ +CONFIG += testcase +QT = core testlib + +SOURCES += tst_qsystemsemaphore.cpp +TARGET = tst_qsystemsemaphore + +win32: CONFIG += console diff --git a/tests/auto/corelib/kernel/qsystemsemaphore/test/test.pro b/tests/auto/corelib/kernel/qsystemsemaphore/test/test.pro deleted file mode 100644 index f60207eb01..0000000000 --- a/tests/auto/corelib/kernel/qsystemsemaphore/test/test.pro +++ /dev/null @@ -1,17 +0,0 @@ -CONFIG += testcase -QT = core testlib - -win32: CONFIG += console - -SOURCES += tst_qsystemsemaphore.cpp -TARGET = tst_qsystemsemaphore - -CONFIG(debug_and_release) { - CONFIG(debug, debug|release) { - DESTDIR = ../debug - } else { - DESTDIR = ../release - } -} else { - DESTDIR = .. -} diff --git a/tests/auto/corelib/kernel/qsystemsemaphore/test/tst_qsystemsemaphore.cpp b/tests/auto/corelib/kernel/qsystemsemaphore/tst_qsystemsemaphore.cpp index 6ff1e14976..5f010ae3d1 100644 --- a/tests/auto/corelib/kernel/qsystemsemaphore/test/tst_qsystemsemaphore.cpp +++ b/tests/auto/corelib/kernel/qsystemsemaphore/tst_qsystemsemaphore.cpp @@ -42,7 +42,6 @@ public: tst_QSystemSemaphore(); public Q_SLOTS: - void initTestCase(); void init(); void cleanup(); @@ -65,22 +64,16 @@ private slots: void initialValue(); private: - static QString helperBinary(); QSystemSemaphore *existingLock; const QString m_helperBinary; }; tst_QSystemSemaphore::tst_QSystemSemaphore() - : m_helperBinary(helperBinary()) + : m_helperBinary("acquirerelease_helper") { } -void tst_QSystemSemaphore::initTestCase() -{ - QVERIFY2(!m_helperBinary.isEmpty(), "Could not find helper binary"); -} - void tst_QSystemSemaphore::init() { existingLock = new QSystemSemaphore(EXISTING_SHARE, 1, QSystemSemaphore::Create); @@ -294,14 +287,6 @@ void tst_QSystemSemaphore::initialValue() #endif } -QString tst_QSystemSemaphore::helperBinary() -{ - QString binary = QStringLiteral("helperbinary"); -#ifdef Q_OS_WIN - binary += QStringLiteral(".exe"); -#endif - return QFINDTESTDATA(binary); -} QTEST_MAIN(tst_QSystemSemaphore) #include "tst_qsystemsemaphore.moc" diff --git a/tests/auto/corelib/kernel/qtimer/tst_qtimer.cpp b/tests/auto/corelib/kernel/qtimer/tst_qtimer.cpp index 5b2d77a02c..8d194dafc1 100644 --- a/tests/auto/corelib/kernel/qtimer/tst_qtimer.cpp +++ b/tests/auto/corelib/kernel/qtimer/tst_qtimer.cpp @@ -75,6 +75,7 @@ private slots: void dontBlockEvents(); void postedEventsShouldNotStarveTimers(); + void callOnTimeout(); }; void tst_QTimer::zeroTimer() @@ -455,8 +456,7 @@ void tst_QTimer::moveToThread() #if defined(Q_OS_WIN32) QSKIP("Does not work reliably on Windows :("); #elif defined(Q_OS_MACOS) - if (__builtin_available(macOS 10.12, *)) - QSKIP("Does not work reliably on macOS 10.12 (QTBUG-59679)"); + QSKIP("Does not work reliably on macOS 10.12+ (QTBUG-59679)"); #endif QTimer ti1; QTimer ti2; @@ -979,5 +979,30 @@ void tst_QTimer::crossThreadSingleShotToFunctor() delete o; } +void tst_QTimer::callOnTimeout() +{ + QTimer timer; + QSignalSpy timeoutSpy(&timer, &QTimer::timeout); + timer.setInterval(0); + timer.start(); + + auto context = new QObject(); + + int count = 0; + timer.callOnTimeout([&count] { count++; }); + QMetaObject::Connection connection = timer.callOnTimeout(context, [&count] { count++; }); + timer.callOnTimeout(&timer, &QTimer::stop); + + + QTest::qWait(100); + QCOMPARE(count, 2); + QCOMPARE(timeoutSpy.count(), 1); + + // Test that connection is bound to context lifetime + QVERIFY(connection); + delete context; + QVERIFY(!connection); +} + QTEST_MAIN(tst_QTimer) #include "tst_qtimer.moc" diff --git a/tests/auto/corelib/kernel/qtranslator/android_testdata.qrc b/tests/auto/corelib/kernel/qtranslator/android_testdata.qrc index b33995ef21..39b85db664 100644 --- a/tests/auto/corelib/kernel/qtranslator/android_testdata.qrc +++ b/tests/auto/corelib/kernel/qtranslator/android_testdata.qrc @@ -1,6 +1,7 @@ <RCC> <qresource prefix="/android_testdata"> <file>hellotr_la.qm</file> + <file>hellotr_empty.qm</file> <file>msgfmt_from_po.qm</file> <file>dependencies_la.qm</file> </qresource> diff --git a/tests/auto/corelib/kernel/qtranslator/hellotr_empty.qm b/tests/auto/corelib/kernel/qtranslator/hellotr_empty.qm new file mode 100644 index 0000000000..be651eede2 --- /dev/null +++ b/tests/auto/corelib/kernel/qtranslator/hellotr_empty.qm @@ -0,0 +1 @@ +<¸dÊÍ!¿`¡½Ý
\ No newline at end of file diff --git a/tests/auto/corelib/kernel/qtranslator/hellotr_empty.ts b/tests/auto/corelib/kernel/qtranslator/hellotr_empty.ts new file mode 100644 index 0000000000..85e0d3992b --- /dev/null +++ b/tests/auto/corelib/kernel/qtranslator/hellotr_empty.ts @@ -0,0 +1,3 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1"/> diff --git a/tests/auto/corelib/kernel/qtranslator/qtranslator.pro b/tests/auto/corelib/kernel/qtranslator/qtranslator.pro index d8924c2d5f..a985f35a14 100644 --- a/tests/auto/corelib/kernel/qtranslator/qtranslator.pro +++ b/tests/auto/corelib/kernel/qtranslator/qtranslator.pro @@ -5,5 +5,5 @@ SOURCES = tst_qtranslator.cpp RESOURCES += qtranslator.qrc android:!android-embedded: RESOURCES += android_testdata.qrc -else: TESTDATA += dependencies_la.qm hellotr_la.qm msgfmt_from_po.qm +else: TESTDATA += dependencies_la.qm hellotr_empty.qm hellotr_la.qm msgfmt_from_po.qm diff --git a/tests/auto/corelib/kernel/qtranslator/qtranslator.qrc b/tests/auto/corelib/kernel/qtranslator/qtranslator.qrc index 333dcfaa21..cb82c6cc95 100644 --- a/tests/auto/corelib/kernel/qtranslator/qtranslator.qrc +++ b/tests/auto/corelib/kernel/qtranslator/qtranslator.qrc @@ -1,5 +1,6 @@ <RCC> <qresource prefix="/tst_qtranslator"> <file>hellotr_la.qm</file> + <file>hellotr_empty.qm</file> </qresource> </RCC> diff --git a/tests/auto/corelib/kernel/qtranslator/tst_qtranslator.cpp b/tests/auto/corelib/kernel/qtranslator/tst_qtranslator.cpp index 451f96339e..40a29c723c 100644 --- a/tests/auto/corelib/kernel/qtranslator/tst_qtranslator.cpp +++ b/tests/auto/corelib/kernel/qtranslator/tst_qtranslator.cpp @@ -41,13 +41,12 @@ protected: private slots: void initTestCase(); + void load_data(); void load(); - void load2(); void threadLoad(); void testLanguageChange(); void plural(); void translate_qm_file_generated_with_msgfmt(); - void loadFromResource(); void loadDirectory(); void dependencies(); void translationInThreadWhileInstallingTranslator(); @@ -106,24 +105,45 @@ bool tst_QTranslator::eventFilter(QObject *, QEvent *event) return false; } -void tst_QTranslator::load() +void tst_QTranslator::load_data() { + QTest::addColumn<QString>("filepath"); + QTest::addColumn<bool>("isEmpty"); + QTest::addColumn<QString>("translation"); - QTranslator tor( 0 ); - tor.load("hellotr_la"); - QVERIFY(!tor.isEmpty()); - QCOMPARE(tor.translate("QPushButton", "Hello world!"), QLatin1String("Hallo Welt!")); + QTest::newRow("hellotr_la") << "hellotr_la.qm" << false << "Hallo Welt!"; + QTest::newRow("hellotr_empty") << "hellotr_empty.qm" << true << ""; } -void tst_QTranslator::load2() +void tst_QTranslator::load() { - QTranslator tor( 0 ); - QFile file("hellotr_la.qm"); - file.open(QFile::ReadOnly); - QByteArray data = file.readAll(); - tor.load((const uchar *)data.constData(), data.length()); - QVERIFY(!tor.isEmpty()); - QCOMPARE(tor.translate("QPushButton", "Hello world!"), QLatin1String("Hallo Welt!")); + QFETCH(QString, filepath); + QFETCH(bool, isEmpty); + QFETCH(QString, translation); + + { + QTranslator tor; + QVERIFY(tor.load(QFileInfo(filepath).baseName())); + QCOMPARE(tor.isEmpty(), isEmpty); + QCOMPARE(tor.translate("QPushButton", "Hello world!"), translation); + } + + { + QFile file(filepath); + file.open(QFile::ReadOnly); + QByteArray data = file.readAll(); + QTranslator tor; + QVERIFY(tor.load((const uchar *)data.constData(), data.length())); + QCOMPARE(tor.isEmpty(), isEmpty); + QCOMPARE(tor.translate("QPushButton", "Hello world!"), translation); + } + + { + QTranslator tor; + QVERIFY(tor.load(QString(":/tst_qtranslator/%1").arg(filepath))); + QCOMPARE(tor.isEmpty(), isEmpty); + QCOMPARE(tor.translate("QPushButton", "Hello world!"), translation); + } } class TranslatorThread : public QThread @@ -240,14 +260,6 @@ void tst_QTranslator::translate_qm_file_generated_with_msgfmt() qApp->removeTranslator(&translator); } -void tst_QTranslator::loadFromResource() -{ - QTranslator tor; - tor.load(":/tst_qtranslator/hellotr_la.qm"); - QVERIFY(!tor.isEmpty()); - QCOMPARE(tor.translate("QPushButton", "Hello world!"), QLatin1String("Hallo Welt!")); -} - void tst_QTranslator::loadDirectory() { QString current_base = QDir::current().dirName(); diff --git a/tests/auto/corelib/kernel/qwineventnotifier/tst_qwineventnotifier.cpp b/tests/auto/corelib/kernel/qwineventnotifier/tst_qwineventnotifier.cpp index e2a0c2dad3..ac8aaa1327 100644 --- a/tests/auto/corelib/kernel/qwineventnotifier/tst_qwineventnotifier.cpp +++ b/tests/auto/corelib/kernel/qwineventnotifier/tst_qwineventnotifier.cpp @@ -46,6 +46,7 @@ protected slots: private slots: void simple_data(); void simple(); + void blockedWaiting(); void manyNotifiers(); void disableNotifiersInActivatedSlot_data(); void disableNotifiersInActivatedSlot(); @@ -104,6 +105,26 @@ void tst_QWinEventNotifier::simple() QVERIFY(simpleActivated); } +void tst_QWinEventNotifier::blockedWaiting() +{ + simpleHEvent = CreateEvent(0, true, false, 0); + QWinEventNotifier n(simpleHEvent); + QObject::connect(&n, &QWinEventNotifier::activated, + this, &tst_QWinEventNotifier::simple_activated); + simpleActivated = false; + + SetEvent(simpleHEvent); + QCOMPARE(WaitForSingleObject(simpleHEvent, 1000), WAIT_OBJECT_0); + + n.setEnabled(false); + ResetEvent(simpleHEvent); + n.setEnabled(true); + + QTestEventLoop::instance().enterLoop(1); + QVERIFY(QTestEventLoop::instance().timeout()); + QVERIFY(!simpleActivated); +} + class EventWithNotifier : public QObject { Q_OBJECT |