From 6ddef0007ae557d9be3e577fb8397654482ac7f3 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Mon, 10 Sep 2012 21:15:25 +0200 Subject: [PATCH] Test case for moc handling defines Added some test cases that check that moc correctly expands #defines Change-Id: I7fe6eed129d46ca9281d73064571cae43b32410d Reviewed-by: Lars Knoll Reviewed-by: Olivier Goffart --- tests/auto/tools/moc/moc.pro | 1 + tests/auto/tools/moc/parse-defines.h | 105 +++++++++++++++++++++++++++++++++++ tests/auto/tools/moc/tst_moc.cpp | 55 ++++++++++++++++++ 3 files changed, 161 insertions(+) create mode 100644 tests/auto/tools/moc/parse-defines.h diff --git a/tests/auto/tools/moc/moc.pro b/tests/auto/tools/moc/moc.pro index 0932f5a..fd6af68 100644 --- a/tests/auto/tools/moc/moc.pro +++ b/tests/auto/tools/moc/moc.pro @@ -22,6 +22,7 @@ HEADERS += using-namespaces.h no-keywords.h task87883.h c-comments.h backslash-n cxx11-final-classes.h \ cxx11-explicit-override-control.h \ forward-declared-param.h \ + parse-defines.h if(*-g++*|*-icc*|*-clang*|*-llvm):!irix-*:!win32-*: HEADERS += os9-newlines.h win-newlines.h diff --git a/tests/auto/tools/moc/parse-defines.h b/tests/auto/tools/moc/parse-defines.h new file mode 100644 index 0000000..bc22444 --- /dev/null +++ b/tests/auto/tools/moc/parse-defines.h @@ -0,0 +1,105 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the tools applications of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef PARSE_DEFINES_H +#define PARSE_DEFINES_H + +#include + +// this is intentionally ugly to test moc's preprocessing capabilities +#define PD_NAMESPACE PD +#define PD_BEGIN_NAMESPACE namespace PD_NAMESPACE { +#define PD_END_NAMESPACE } +#define PD_VOIDFUNCTION() voidFunction() +#define PD_CLASSNAME ParseDefine + +#define PD_STRINGIFY(a) #a +#define PD_SCOPED_STRING(a, b) PD_STRINGIFY(a) "::" PD_STRINGIFY(b) +#define PD_DEFINE1(a,b) a##b +#define PD_DEFINE2(a,b) a comb##b +#define PD_DEFINE3(a,b) a b##ined3() +#define PD_COMBINE(a,b) a b +#define PD_TEST_IDENTIFIER_ARG(if, while) if while + +#define QString() error_type + +#define PD_CLASSINFO Q_CLASSINFO + +#if defined(Q_COMPILER_VARIADIC_MACROS) +#define PD_VARARG(x, ...) x(__VA_ARGS__) +#endif + +PD_BEGIN_NAMESPACE + +class PD_CLASSNAME : public QObject +{ + Q_OBJECT + Q_CLASSINFO("TestString", PD_STRINGIFY(PD_CLASSNAME)) + PD_CLASSINFO("TestString2", "TestValue") +public: + PD_CLASSNAME() {} + +public slots: + void PD_VOIDFUNCTION() {} + + QString stringMethod() { return QString::fromLatin1(""); } + + void PD_DEFINE1(comb, ined1()) {} + PD_DEFINE2(void, ined2()) {} + PD_DEFINE3(void, comb) {} + PD_COMBINE(void combined4(int, int), {}) + + PD_COMBINE(void combined5() {, }) + + PD_TEST_IDENTIFIER_ARG(void, combined6()) {} + +#if defined(Q_COMPILER_VARIADIC_MACROS) + PD_VARARG(void vararg1) {} + PD_VARARG(void vararg2, int) {} + PD_VARARG(void vararg3, int, int) {} +#endif +}; + +#undef QString + +PD_END_NAMESPACE + +#endif diff --git a/tests/auto/tools/moc/tst_moc.cpp b/tests/auto/tools/moc/tst_moc.cpp index 7b49ba8..ede486e 100644 --- a/tests/auto/tools/moc/tst_moc.cpp +++ b/tests/auto/tools/moc/tst_moc.cpp @@ -74,6 +74,8 @@ #include "cxx11-final-classes.h" #include "cxx11-explicit-override-control.h" +#include "parse-defines.h" + QT_USE_NAMESPACE struct MyStruct {}; @@ -551,6 +553,7 @@ private slots: void explicitOverrideControl(); void autoPropertyMetaTypeRegistration(); void autoMethodArgumentMetaTypeRegistration(); + void parseDefines(); signals: void sigWithUnsignedArg(unsigned foo); @@ -2705,6 +2708,58 @@ void tst_Moc::autoMethodArgumentMetaTypeRegistration() } +void tst_Moc::parseDefines() +{ + const QMetaObject *mo = &PD_NAMESPACE::PD_CLASSNAME::staticMetaObject; + QCOMPARE(mo->className(), PD_SCOPED_STRING(PD_NAMESPACE, PD_CLASSNAME)); + QVERIFY(mo->indexOfSlot("voidFunction()") != -1); + + int index = mo->indexOfSlot("stringMethod()"); + QVERIFY(index != -1); + QVERIFY(mo->method(index).returnType() == QMetaType::QString); + + index = mo->indexOfSlot("combined1()"); + QVERIFY(index != -1); + + index = mo->indexOfSlot("combined2()"); + QVERIFY(index != -1); + + index = mo->indexOfSlot("combined3()"); + QVERIFY(index != -1); + + index = mo->indexOfSlot("combined4(int,int)"); + QVERIFY(index != -1); + + index = mo->indexOfSlot("combined5()"); + QVERIFY(index != -1); + + index = mo->indexOfSlot("combined6()"); + QVERIFY(index != -1); + +#if defined(Q_COMPILER_VARIADIC_MACROS) + index = mo->indexOfSlot("vararg1()"); + QVERIFY(index != -1); + index = mo->indexOfSlot("vararg2(int)"); + QVERIFY(index != -1); + index = mo->indexOfSlot("vararg3(int,int)"); + QVERIFY(index != -1); +#endif + + int count = 0; + for (int i = 0; i < mo->classInfoCount(); ++i) { + QMetaClassInfo mci = mo->classInfo(i); + if (!qstrcmp(mci.name(), "TestString")) { + ++count; + QVERIFY(!qstrcmp(mci.value(), "ParseDefine")); + } + if (!qstrcmp(mci.name(), "TestString2")) { + ++count; + QVERIFY(!qstrcmp(mci.value(), "TestValue")); + } + } + QVERIFY(count == 2); +} + QTEST_MAIN(tst_Moc) #include "tst_moc.moc" -- 2.7.4