summaryrefslogtreecommitdiffstats
path: root/tests/auto/tools/moc/tst_moc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/tools/moc/tst_moc.cpp')
-rw-r--r--tests/auto/tools/moc/tst_moc.cpp252
1 files changed, 205 insertions, 47 deletions
diff --git a/tests/auto/tools/moc/tst_moc.cpp b/tests/auto/tools/moc/tst_moc.cpp
index 0f801fe902..08dae7f6ca 100644
--- a/tests/auto/tools/moc/tst_moc.cpp
+++ b/tests/auto/tools/moc/tst_moc.cpp
@@ -1,7 +1,7 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2013 Olivier Goffart <ogoffart@woboq.com>
+** Copyright (C) 2020 The Qt Company Ltd.
+** Copyright (C) 2020 Olivier Goffart <ogoffart@woboq.com>
** Contact: https://www.qt.io/licensing/
**
** This file is part of the test suite of the Qt Toolkit.
@@ -27,13 +27,13 @@
**
****************************************************************************/
-
-
#include <QtTest/QtTest>
#include <stdio.h>
#include <qobject.h>
#include <qmetaobject.h>
#include <qjsondocument.h>
+#include <qversionnumber.h>
+#include <qregularexpression.h>
#include "using-namespaces.h"
#include "assign-namespace.h"
@@ -74,6 +74,11 @@
#include "cxx17-namespaces.h"
#include "cxx-attributes.h"
+#include "moc_include.h"
+#include "fwdclass1.h"
+#include "fwdclass2.h"
+#include "fwdclass3.h"
+
#ifdef Q_MOC_RUN
// check that moc can parse these constructs, they are being used in Windows winsock2.h header
#define STRING_HASH_HASH(x) ("foo" ## x ## "bar")
@@ -630,7 +635,6 @@ public:
private slots:
void initTestCase();
- void slotWithException() throw(MyStruct);
void dontStripNamespaces();
void oldStyleCasts();
void warnOnExtraSignalSlotQualifiaction();
@@ -672,7 +676,6 @@ private slots:
void templateGtGt();
void qprivateslots();
void qprivateproperties();
- void inlineSlotsWithThrowDeclaration();
void warnOnPropertyWithoutREAD();
void constructors();
void typenameWithUnsigned();
@@ -719,7 +722,11 @@ private slots:
void cxx17Namespaces();
void cxxAttributes();
void mocJsonOutput();
+ void mocInclude();
void requiredProperties();
+ void qpropertyMembers();
+ void observerMetaCall();
+ void setQPRopertyBinding();
signals:
void sigWithUnsignedArg(unsigned foo);
@@ -782,12 +789,6 @@ void tst_Moc::initTestCase()
#endif
}
-void tst_Moc::slotWithException() throw(MyStruct)
-{
- // be happy
- QVERIFY(true);
-}
-
void tst_Moc::dontStripNamespaces()
{
Sender sender;
@@ -822,7 +823,7 @@ void tst_Moc::oldStyleCasts()
QStringList args;
args << "-c" << "-x" << "c++" << "-Wold-style-cast" << "-I" << "."
- << "-I" << qtIncludePath << "-o" << "/dev/null" << "-fPIC" << "-std=c++11" << "-";
+ << "-I" << qtIncludePath << "-o" << "/dev/null" << "-fPIC" << "-std=c++1z" << "-";
proc.start("gcc", args);
QVERIFY(proc.waitForStarted());
proc.write(mocOut);
@@ -892,7 +893,7 @@ void tst_Moc::inputFileNameWithDotsButNoExtension()
QStringList args;
args << "-c" << "-x" << "c++" << "-I" << ".."
- << "-I" << qtIncludePath << "-o" << "/dev/null" << "-fPIC" << "-std=c++11" << "-";
+ << "-I" << qtIncludePath << "-o" << "/dev/null" << "-fPIC" << "-std=c++1z" << "-";
proc.start("gcc", args);
QVERIFY(proc.waitForStarted());
proc.write(mocOut);
@@ -1172,7 +1173,7 @@ void tst_Moc::ignoreOptionClashes()
QStringList gccArgs;
gccArgs << "-c" << "-x" << "c++" << "-I" << ".."
<< "-I" << qtIncludePath << "-I" << includeDir << "-o" << "/dev/null"
- << "-fPIC" << "-std=c++11" << "-";
+ << "-fPIC" << "-std=c++1z" << "-";
proc.start("gcc", gccArgs);
QVERIFY(proc.waitForStarted());
proc.write(mocOut);
@@ -1591,21 +1592,6 @@ void tst_Moc::qprivateproperties()
}
-#include "task189996.h"
-
-void InlineSlotsWithThrowDeclaration::c() throw() {}
-
-void tst_Moc::inlineSlotsWithThrowDeclaration()
-{
- InlineSlotsWithThrowDeclaration tst;
- const QMetaObject *mobj = tst.metaObject();
- QVERIFY(mobj->indexOfSlot("a()") != -1);
- QVERIFY(mobj->indexOfSlot("b()") != -1);
- QVERIFY(mobj->indexOfSlot("c()") != -1);
- QVERIFY(mobj->indexOfSlot("d()") != -1);
- QVERIFY(mobj->indexOfSlot("e()") != -1);
-}
-
void tst_Moc::warnOnPropertyWithoutREAD()
{
#ifdef MOC_CROSS_COMPILED
@@ -1621,7 +1607,7 @@ void tst_Moc::warnOnPropertyWithoutREAD()
QVERIFY(!mocOut.isEmpty());
QString mocWarning = QString::fromLocal8Bit(proc.readAllStandardError());
QCOMPARE(mocWarning, header +
- QString(":36: Warning: Property declaration foo has no READ accessor function or associated MEMBER variable. The property will be invalid.\n"));
+ QString(":36: Warning: Property declaration foo has neither an associated QProperty<> member, nor a READ accessor function nor an associated MEMBER variable. The property will be invalid.\n"));
#else
QSKIP("Only tested on linux/gcc");
#endif
@@ -1845,8 +1831,8 @@ void tst_Moc::QTBUG12260_defaultTemplate()
{
QVERIFY(QTBUG12260_defaultTemplate_Object::staticMetaObject.indexOfSlot("doSomething(QHash<QString,QVariant>)") != -1);
QVERIFY(QTBUG12260_defaultTemplate_Object::staticMetaObject.indexOfSlot("doAnotherThing(bool,bool)") != -1);
- QVERIFY(QTBUG12260_defaultTemplate_Object::staticMetaObject.indexOfSlot("doSomethingElse(QSharedPointer<QVarLengthArray<QString,(16>>2)> >)") != -1);
- QVERIFY(QTBUG12260_defaultTemplate_Object::staticMetaObject.indexOfSlot("performSomething(QVector<QList<QString> >,QHash<int,QVector<QString> >)") != -1);
+ QVERIFY(QTBUG12260_defaultTemplate_Object::staticMetaObject.indexOfSlot("doSomethingElse(QSharedPointer<QVarLengthArray<QString,(16>>2)>>)") != -1);
+ QVERIFY(QTBUG12260_defaultTemplate_Object::staticMetaObject.indexOfSlot("performSomething(QVector<QList<QString>>,QHash<int,QVector<QString>>)") != -1);
}
void tst_Moc::notifyError()
@@ -1867,7 +1853,7 @@ void tst_Moc::notifyError()
QStringList args;
args << "-c" << "-x" << "c++" << "-I" << "."
- << "-I" << qtIncludePath << "-o" << "/dev/null" << "-fPIC" << "-std=c++11" << "-";
+ << "-I" << qtIncludePath << "-o" << "/dev/null" << "-fPIC" << "-std=c++1z" << "-";
proc.start("gcc", args);
QVERIFY(proc.waitForStarted());
proc.write(mocOut);
@@ -1914,12 +1900,14 @@ class VersionTest : public QObject
Q_OBJECT
Q_PROPERTY(int prop1 READ foo)
Q_PROPERTY(int prop2 READ foo REVISION 2)
+ Q_PROPERTY(int prop514 READ foo REVISION(5, 14))
public:
int foo() const { return 0; }
Q_INVOKABLE void method1() {}
Q_INVOKABLE Q_REVISION(4) void method2() {}
+ Q_INVOKABLE Q_REVISION(6, 0) void method60() {}
enum TestEnum { One, Two };
Q_ENUM(TestEnum);
@@ -1928,18 +1916,26 @@ public:
public slots:
void slot1() {}
Q_REVISION(3) void slot2() {}
+ Q_REVISION(6, 1) void slot61() {}
signals:
void signal1();
Q_REVISION(5) void signal2();
+ Q_REVISION(6, 2) void signal62();
public slots Q_REVISION(6):
void slot3() {}
void slot4() {}
+public slots Q_REVISION(5, 12):
+ void slot512() {}
+
signals Q_REVISION(7):
void signal3();
void signal4();
+
+signals Q_REVISION(5, 15):
+ void signal515();
};
// If changed, update VersionTest above
@@ -1948,12 +1944,14 @@ class VersionTestNotify : public QObject
Q_OBJECT
Q_PROPERTY(int prop1 READ foo NOTIFY fooChanged)
Q_PROPERTY(int prop2 READ foo REVISION 2)
+ Q_PROPERTY(int prop514 READ foo REVISION(5, 14))
public:
int foo() const { return 0; }
Q_INVOKABLE void method1() {}
Q_INVOKABLE Q_REVISION(4) void method2() {}
+ Q_INVOKABLE Q_REVISION(6, 0) void method60() {}
enum TestEnum { One, Two };
Q_ENUM(TestEnum);
@@ -1961,19 +1959,27 @@ public:
public slots:
void slot1() {}
Q_REVISION(3) void slot2() {}
+ Q_REVISION(6, 1) void slot61() {}
signals:
void fooChanged();
void signal1();
Q_REVISION(5) void signal2();
+ Q_REVISION(6, 2) void signal62();
public slots Q_REVISION(6):
void slot3() {}
void slot4() {}
+public slots Q_REVISION(5, 12):
+ void slot512() {}
+
signals Q_REVISION(7):
void signal3();
void signal4();
+
+signals Q_REVISION(5, 15):
+ void signal515();
};
template <class T>
@@ -1982,32 +1988,58 @@ void tst_Moc::revisions_T()
int idx = T::staticMetaObject.indexOfProperty("prop1");
QCOMPARE(T::staticMetaObject.property(idx).revision(), 0);
idx = T::staticMetaObject.indexOfProperty("prop2");
- QCOMPARE(T::staticMetaObject.property(idx).revision(), 2);
+ QCOMPARE(T::staticMetaObject.property(idx).revision(),
+ QTypeRevision::fromMinorVersion(2).toEncodedVersion<int>());
+ idx = T::staticMetaObject.indexOfProperty("prop514");
+ QCOMPARE(T::staticMetaObject.property(idx).revision(),
+ QTypeRevision::fromVersion(5, 14).toEncodedVersion<int>());
idx = T::staticMetaObject.indexOfMethod("method1()");
QCOMPARE(T::staticMetaObject.method(idx).revision(), 0);
idx = T::staticMetaObject.indexOfMethod("method2()");
- QCOMPARE(T::staticMetaObject.method(idx).revision(), 4);
+ QCOMPARE(T::staticMetaObject.method(idx).revision(),
+ QTypeRevision::fromMinorVersion(4).toEncodedVersion<int>());
+ idx = T::staticMetaObject.indexOfMethod("method60()");
+ QCOMPARE(T::staticMetaObject.method(idx).revision(),
+ QTypeRevision::fromVersion(6, 0).toEncodedVersion<int>());
idx = T::staticMetaObject.indexOfSlot("slot1()");
QCOMPARE(T::staticMetaObject.method(idx).revision(), 0);
idx = T::staticMetaObject.indexOfSlot("slot2()");
- QCOMPARE(T::staticMetaObject.method(idx).revision(), 3);
+ QCOMPARE(T::staticMetaObject.method(idx).revision(),
+ QTypeRevision::fromMinorVersion(3).toEncodedVersion<int>());
+ idx = T::staticMetaObject.indexOfSlot("slot61()");
+ QCOMPARE(T::staticMetaObject.method(idx).revision(),
+ QTypeRevision::fromVersion(6, 1).toEncodedVersion<int>());
idx = T::staticMetaObject.indexOfSlot("slot3()");
- QCOMPARE(T::staticMetaObject.method(idx).revision(), 6);
+ QCOMPARE(T::staticMetaObject.method(idx).revision(),
+ QTypeRevision::fromMinorVersion(6).toEncodedVersion<int>());
idx = T::staticMetaObject.indexOfSlot("slot4()");
- QCOMPARE(T::staticMetaObject.method(idx).revision(), 6);
+ QCOMPARE(T::staticMetaObject.method(idx).revision(),
+ QTypeRevision::fromMinorVersion(6).toEncodedVersion<int>());
+ idx = T::staticMetaObject.indexOfSlot("slot512()");
+ QCOMPARE(T::staticMetaObject.method(idx).revision(),
+ QTypeRevision::fromVersion(5, 12).toEncodedVersion<int>());
idx = T::staticMetaObject.indexOfSignal("signal1()");
QCOMPARE(T::staticMetaObject.method(idx).revision(), 0);
idx = T::staticMetaObject.indexOfSignal("signal2()");
- QCOMPARE(T::staticMetaObject.method(idx).revision(), 5);
+ QCOMPARE(T::staticMetaObject.method(idx).revision(),
+ QTypeRevision::fromMinorVersion(5).toEncodedVersion<int>());
+ idx = T::staticMetaObject.indexOfSignal("signal62()");
+ QCOMPARE(T::staticMetaObject.method(idx).revision(),
+ QTypeRevision::fromVersion(6, 2).toEncodedVersion<int>());
idx = T::staticMetaObject.indexOfSignal("signal3()");
- QCOMPARE(T::staticMetaObject.method(idx).revision(), 7);
+ QCOMPARE(T::staticMetaObject.method(idx).revision(),
+ QTypeRevision::fromMinorVersion(7).toEncodedVersion<int>());
idx = T::staticMetaObject.indexOfSignal("signal4()");
- QCOMPARE(T::staticMetaObject.method(idx).revision(), 7);
+ QCOMPARE(T::staticMetaObject.method(idx).revision(),
+ QTypeRevision::fromMinorVersion(7).toEncodedVersion<int>());
+ idx = T::staticMetaObject.indexOfSignal("signal515()");
+ QCOMPARE(T::staticMetaObject.method(idx).revision(),
+ QTypeRevision::fromVersion(5, 15).toEncodedVersion<int>());
idx = T::staticMetaObject.indexOfEnumerator("TestEnum");
QCOMPARE(T::staticMetaObject.enumerator(idx).keyCount(), 2);
@@ -2059,7 +2091,7 @@ void tst_Moc::warnings_data()
<< QStringList()
<< 0
<< QString("IGNORE_ALL_STDOUT")
- << QString("standard input:1: Warning: Property declaration x has no READ accessor function or associated MEMBER variable. The property will be invalid.");
+ << QString("standard input:1: Warning: Property declaration x has neither an associated QProperty<> member, nor a READ accessor function nor an associated MEMBER variable. The property will be invalid.");
// This should output a warning
QTest::newRow("Duplicate property warning")
@@ -2075,7 +2107,7 @@ void tst_Moc::warnings_data()
<< (QStringList() << "-nn")
<< 0
<< QString("IGNORE_ALL_STDOUT")
- << QString("standard input:1: Warning: Property declaration x has no READ accessor function or associated MEMBER variable. The property will be invalid.");
+ << QString("standard input:1: Warning: Property declaration x has neither an associated QProperty<> member, nor a READ accessor function nor an associated MEMBER variable. The property will be invalid.");
// Passing "-nw" should suppress the warning
QTest::newRow("Invalid property warning with -nw")
@@ -2223,8 +2255,7 @@ void tst_Moc::warnings()
#ifdef Q_CC_MSVC
// for some reasons, moc compiled with MSVC uses a different output format
- QRegExp lineNumberRe(":(-?\\d+):");
- lineNumberRe.setMinimal(true);
+ QRegularExpression lineNumberRe(":(-?\\d+):", QRegularExpression::InvertedGreedinessOption);
expectedStdErr.replace(lineNumberRe, "(\\1):");
#endif
@@ -3917,7 +3948,7 @@ void tst_Moc::testQNamespace()
EnumFromNamespaceClass obj;
const QVariant prop = obj.property("prop");
- QCOMPARE(prop.type(), QMetaType::Int);
+ QCOMPARE(prop.userType(), QMetaType::fromType<FooNamespace::Enum1>().id());
QCOMPARE(prop.toInt(), int(FooNamespace::Enum1::Key2));
}
@@ -4026,6 +4057,29 @@ void tst_Moc::mocJsonOutput()
QVERIFY2(actualOutput == expectedOutput, showPotentialDiff(actualOutput, expectedOutput).constData());
}
+void TestFwdProperties::setProp1(const FwdClass1 &v)
+{
+ prop1.reset(new FwdClass1(v));
+}
+void TestFwdProperties::setProp2(const FwdClass2 &v)
+{
+ prop2.reset(new FwdClass2(v));
+}
+void TestFwdProperties::setProp3(const FwdClass3 &v)
+{
+ prop3.reset(new FwdClass3(v));
+}
+TestFwdProperties::~TestFwdProperties() {}
+
+Q_DECLARE_METATYPE(FwdClass1);
+
+void tst_Moc::mocInclude()
+{
+ TestFwdProperties obj;
+ obj.setProperty("prop1", QVariant::fromValue(FwdClass1 { 45 }));
+ QCOMPARE(obj.prop1->x, 45);
+}
+
class RequiredTest :public QObject
{
Q_OBJECT
@@ -4049,6 +4103,110 @@ void tst_Moc::requiredProperties()
QVERIFY(!notRequired.isRequired());
}
+class ClassWithQPropertyMembers : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(int publicProperty NOTIFY publicPropertyChanged)
+ Q_PROPERTY(int privateExposedProperty)
+public:
+
+ QProperty<int> publicProperty;
+ QProperty<int> notExposed;
+
+signals:
+ void publicPropertyChanged();
+
+protected:
+ QProperty<int> protectedProperty;
+
+private:
+ QProperty<int> privateProperty;
+ QProperty<int> privateExposedProperty;
+ QPropertyMemberChangeHandler<&ClassWithQPropertyMembers::publicProperty, &ClassWithQPropertyMembers::publicPropertyChanged> connector{this};
+};
+
+void tst_Moc::qpropertyMembers()
+{
+ const auto metaObject = &ClassWithQPropertyMembers::staticMetaObject;
+
+ QCOMPARE(metaObject->propertyCount() - metaObject->superClass()->propertyCount(), 2);
+
+ QCOMPARE(metaObject->indexOfProperty("notExposed"), -1);
+
+ QMetaProperty prop = metaObject->property(metaObject->indexOfProperty("publicProperty"));
+ QVERIFY(prop.isValid());
+
+ QVERIFY(metaObject->property(metaObject->indexOfProperty("privateExposedProperty")).isValid());
+
+ ClassWithQPropertyMembers instance;
+
+ prop.write(&instance, 42);
+ QCOMPARE(instance.publicProperty.value(), 42);
+
+ QSignalSpy publicPropertySpy(&instance, SIGNAL(publicPropertyChanged()));
+
+ instance.publicProperty.setValue(100);
+ QCOMPARE(prop.read(&instance).toInt(), 100);
+ QCOMPARE(publicPropertySpy.count(), 1);
+
+ QCOMPARE(prop.metaType(), QMetaType(QMetaType::Int));
+
+ QVERIFY(prop.notifySignal().isValid());
+}
+
+
+
+void tst_Moc::observerMetaCall()
+{
+ const auto metaObject = &ClassWithQPropertyMembers::staticMetaObject;
+ QMetaProperty prop = metaObject->property(metaObject->indexOfProperty("publicProperty"));
+ QVERIFY(prop.isValid());
+
+ ClassWithQPropertyMembers instance;
+
+ int observerCallCount = 0;
+
+ QProperty<int> dummy;
+ auto handler = dummy.onValueChanged([&observerCallCount]() {
+ ++observerCallCount;
+ });
+
+ {
+ void *argv[] = { &handler };
+ instance.qt_metacall(QMetaObject::RegisterQPropertyObserver, prop.propertyIndex(), argv);
+ }
+
+ instance.publicProperty.setValue(100);
+ QCOMPARE(observerCallCount, 1);
+ instance.publicProperty.setValue(101);
+ QCOMPARE(observerCallCount, 2);
+}
+
+
+
+void tst_Moc::setQPRopertyBinding()
+{
+ const auto metaObject = &ClassWithQPropertyMembers::staticMetaObject;
+ QMetaProperty prop = metaObject->property(metaObject->indexOfProperty("publicProperty"));
+ QVERIFY(prop.isValid());
+
+ ClassWithQPropertyMembers instance;
+
+ bool bindingCalled = false;
+ auto binding = Qt::makePropertyBinding([&bindingCalled]() {
+ bindingCalled = true;
+ return 42;
+ });
+
+ {
+ void *argv[] = { &binding };
+ instance.qt_metacall(QMetaObject::SetQPropertyBinding, prop.propertyIndex(), argv);
+ }
+
+ QCOMPARE(instance.publicProperty.value(), 42);
+ QVERIFY(bindingCalled); // but now it should've been called :)
+}
+
QTEST_MAIN(tst_Moc)
// the generated code must compile with QT_NO_KEYWORDS