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.cpp129
1 files changed, 114 insertions, 15 deletions
diff --git a/tests/auto/tools/moc/tst_moc.cpp b/tests/auto/tools/moc/tst_moc.cpp
index b49d7bc477..dc28422294 100644
--- a/tests/auto/tools/moc/tst_moc.cpp
+++ b/tests/auto/tools/moc/tst_moc.cpp
@@ -70,6 +70,12 @@
#include "non-gadget-parent-class.h"
#include "grand-parent-gadget-class.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")
+const char *string_hash_hash = STRING_HASH_HASH("baz");
+#endif
+
Q_DECLARE_METATYPE(const QMetaObject*);
@@ -489,13 +495,6 @@ public:
Q_ENUMS(EnumSourceClass::TestEnum)
};
-#if defined(Q_MOC_RUN)
-// Task #119503
-#define _TASK_119503
-#if !_TASK_119503
-#endif
-#endif
-
class CtorTestClass : public QObject
{
Q_OBJECT
@@ -576,6 +575,10 @@ private slots:
void frameworkSearchPath();
void cstyleEnums();
void defineMacroViaCmdline();
+ void defineMacroViaForcedInclude();
+ void defineMacroViaForcedIncludeRelative();
+ void environmentIncludePaths_data();
+ void environmentIncludePaths();
void specifyMetaTagsFromCmdline();
void invokable();
void singleFunctionKeywordSignalAndSlot();
@@ -1254,6 +1257,92 @@ void tst_Moc::defineMacroViaCmdline()
#endif
}
+void tst_Moc::defineMacroViaForcedInclude()
+{
+#if defined(Q_OS_LINUX) && defined(Q_CC_GNU) && !defined(QT_NO_PROCESS)
+ QProcess proc;
+
+ QStringList args;
+ args << "--include" << m_sourceDirectory + QLatin1String("/subdir/extradefines.h");
+ args << m_sourceDirectory + QStringLiteral("/macro-on-cmdline.h");
+
+ proc.start(m_moc, args);
+ QVERIFY(proc.waitForFinished());
+ QCOMPARE(proc.exitCode(), 0);
+ QCOMPARE(proc.readAllStandardError(), QByteArray());
+ QByteArray mocOut = proc.readAllStandardOutput();
+ QVERIFY(!mocOut.isEmpty());
+#else
+ QSKIP("Only tested on linux/gcc");
+#endif
+}
+
+void tst_Moc::defineMacroViaForcedIncludeRelative()
+{
+#if defined(Q_OS_LINUX) && defined(Q_CC_GNU) && !defined(QT_NO_PROCESS)
+ QProcess proc;
+
+ QStringList args;
+ args << "--include" << QStringLiteral("extradefines.h") << "-I" + m_sourceDirectory + "/subdir";
+ args << m_sourceDirectory + QStringLiteral("/macro-on-cmdline.h");
+
+ proc.start(m_moc, args);
+ QVERIFY(proc.waitForFinished());
+ QCOMPARE(proc.exitCode(), 0);
+ QCOMPARE(proc.readAllStandardError(), QByteArray());
+ QByteArray mocOut = proc.readAllStandardOutput();
+ QVERIFY(!mocOut.isEmpty());
+#else
+ QSKIP("Only tested on linux/gcc");
+#endif
+}
+
+
+void tst_Moc::environmentIncludePaths_data()
+{
+#if defined(Q_OS_LINUX) && defined(Q_CC_GNU) && !defined(QT_NO_PROCESS)
+ QTest::addColumn<QString>("cmdline");
+ QTest::addColumn<QString>("varname");
+
+ QTest::newRow("INCLUDE") << "--compiler-flavor=msvc" << "INCLUDE";
+ QTest::newRow("CPATH1") << QString() << "CPATH";
+ QTest::newRow("CPATH2") << "--compiler-flavor=unix" << "CPATH";
+ QTest::newRow("CPLUS_INCLUDE_PATH1") << QString() << "CPLUS_INCLUDE_PATH";
+ QTest::newRow("CPLUS_INCLUDE_PATH2") << "--compiler-flavor=unix" << "CPLUS_INCLUDE_PATH";
+#endif
+}
+
+void tst_Moc::environmentIncludePaths()
+{
+#if defined(Q_OS_LINUX) && defined(Q_CC_GNU) && !defined(QT_NO_PROCESS)
+ QFETCH(QString, cmdline);
+ QFETCH(QString, varname);
+
+ QStringList args;
+ if (!cmdline.isEmpty())
+ args << cmdline;
+ args << "--include" << QStringLiteral("extradefines.h")
+ << m_sourceDirectory + QStringLiteral("/macro-on-cmdline.h");
+
+ QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
+ env.remove("INCLUDE");
+ env.remove("CPATH");
+ env.remove("CPLUS_INCLUDE_PATH");
+ env.insert(varname, m_sourceDirectory + "/subdir");
+
+ QProcess proc;
+ proc.setProcessEnvironment(env);
+ proc.start(m_moc, args);
+ QVERIFY(proc.waitForFinished());
+ QCOMPARE(proc.exitCode(), 0);
+ QCOMPARE(proc.readAllStandardError(), QByteArray());
+ QByteArray mocOut = proc.readAllStandardOutput();
+ QVERIFY(!mocOut.isEmpty());
+#else
+ QSKIP("Only tested on linux/gcc");
+#endif
+}
+
// tst_Moc::specifyMetaTagsFromCmdline()
// plugin_metadata.h contains a plugin which we register here. Since we're not building this
// application as a plugin, we need top copy some of the initializer code found in qplugin.h:
@@ -1939,6 +2028,13 @@ void tst_Moc::warnings_data()
<< QString("IGNORE_ALL_STDOUT")
<< QString(":-1: Error: Unexpected character in macro argument list.");
+ QTest::newRow("Missing header warning")
+ << QByteArray("class X : public QObject { Q_OBJECT };")
+ << (QStringList() << QStringLiteral("--include") << QStringLiteral("doesnotexist.h"))
+ << 0
+ << QString("IGNORE_ALL_STDOUT")
+ << QStringLiteral("Warning: Failed to resolve include \"doesnotexist.h\" for moc file <standard input>");
+
QTest::newRow("QTBUG-54815: Crash on invalid input")
<< QByteArray("class M{(})F<{}d000000000000000#0")
<< QStringList()
@@ -2012,18 +2108,19 @@ void tst_Moc::cxx11Enums_data()
QTest::addColumn<const QMetaObject *>("meta");
QTest::addColumn<QByteArray>("enumName");
QTest::addColumn<char>("prefix");
+ QTest::addColumn<bool>("isScoped");
const QMetaObject *meta1 = &CXX11Enums::staticMetaObject;
const QMetaObject *meta2 = &CXX11Enums2::staticMetaObject;
- QTest::newRow("EnumClass") << meta1 << QByteArray("EnumClass") << 'A';
- QTest::newRow("EnumClass 2") << meta2 << QByteArray("EnumClass") << 'A';
- QTest::newRow("TypedEnum") << meta1 << QByteArray("TypedEnum") << 'B';
- QTest::newRow("TypedEnum 2") << meta2 << QByteArray("TypedEnum") << 'B';
- QTest::newRow("TypedEnumClass") << meta1 << QByteArray("TypedEnumClass") << 'C';
- QTest::newRow("TypedEnumClass 2") << meta2 << QByteArray("TypedEnumClass") << 'C';
- QTest::newRow("NormalEnum") << meta1 << QByteArray("NormalEnum") << 'D';
- QTest::newRow("NormalEnum 2") << meta2 << QByteArray("NormalEnum") << 'D';
+ QTest::newRow("EnumClass") << meta1 << QByteArray("EnumClass") << 'A' << true;
+ QTest::newRow("EnumClass 2") << meta2 << QByteArray("EnumClass") << 'A' << true;
+ QTest::newRow("TypedEnum") << meta1 << QByteArray("TypedEnum") << 'B' << false;
+ QTest::newRow("TypedEnum 2") << meta2 << QByteArray("TypedEnum") << 'B' << false;
+ QTest::newRow("TypedEnumClass") << meta1 << QByteArray("TypedEnumClass") << 'C' << true;
+ QTest::newRow("TypedEnumClass 2") << meta2 << QByteArray("TypedEnumClass") << 'C' << true;
+ QTest::newRow("NormalEnum") << meta1 << QByteArray("NormalEnum") << 'D' << false;
+ QTest::newRow("NormalEnum 2") << meta2 << QByteArray("NormalEnum") << 'D' << false;
}
void tst_Moc::cxx11Enums()
@@ -2033,6 +2130,7 @@ void tst_Moc::cxx11Enums()
QFETCH(QByteArray, enumName);
QFETCH(char, prefix);
+ QFETCH(bool, isScoped);
int idx;
idx = meta->indexOfEnumerator(enumName);
@@ -2046,6 +2144,7 @@ void tst_Moc::cxx11Enums()
QCOMPARE(meta->enumerator(idx).keyToValue(v), i);
QCOMPARE(meta->enumerator(idx).valueToKey(i), v.constData());
}
+ QCOMPARE(meta->enumerator(idx).isScoped(), isScoped);
}
void tst_Moc::returnRefs()