aboutsummaryrefslogtreecommitdiffstats
path: root/tests/auto/debugger/tst_dumpers.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/debugger/tst_dumpers.cpp')
-rw-r--r--tests/auto/debugger/tst_dumpers.cpp277
1 files changed, 211 insertions, 66 deletions
diff --git a/tests/auto/debugger/tst_dumpers.cpp b/tests/auto/debugger/tst_dumpers.cpp
index 381a39f339..3646f9eaac 100644
--- a/tests/auto/debugger/tst_dumpers.cpp
+++ b/tests/auto/debugger/tst_dumpers.cpp
@@ -28,11 +28,11 @@
#include "watchdata.h"
#include "watchutils.h"
+#include <utils/fileutils.h>
#ifdef Q_OS_WIN
#include <utils/environment.h>
#ifdef Q_CC_MSVC
#include <utils/qtcprocess.h>
-#include <utils/fileutils.h>
#include <utils/synchronousprocess.h>
#endif // Q_CC_MSVC
#endif // Q_OS_WIN
@@ -45,6 +45,22 @@
using namespace Debugger;
using namespace Internal;
+enum class BuildSystem
+{
+ Qmake,
+ CMake,
+ Nim
+};
+
+enum class Language
+{
+ Cxx,
+ C,
+ ObjectiveCxx,
+ Nim,
+ Fortran90
+};
+
#ifdef Q_CC_MSVC
// Copied from msvctoolchain.cpp to avoid plugin dependency.
@@ -220,6 +236,12 @@ struct BoostVersion : VersionBase
{}
};
+struct ConfigTest
+{
+ QString executable;
+ QStringList arguments;
+};
+
static QString noValue = "\001";
enum DebuggerEngine
@@ -697,6 +719,7 @@ struct NetworkProfile {};
struct QmlProfile {};
struct QmlPrivateProfile {};
struct SqlProfile {};
+struct XmlProfile {};
struct NimProfile {};
@@ -838,6 +861,10 @@ public:
{
profileExtra += "QT += core\n";
+ cmakelistsExtra +=
+ "find_package(Qt5 COMPONENTS Core REQUIRED)\n"
+ "target_link_libraries(doit PRIVATE Qt5::Core)\n";
+
useQt = true;
useQHash = true;
@@ -848,6 +875,10 @@ public:
{
profileExtra += "QT += core network\n";
+ cmakelistsExtra +=
+ "find_package(Qt5 COMPONENTS Core Network REQUIRED)\n"
+ "target_link_libraries(doit PRIVATE Qt5::Core Qt::Network)\n";
+
useQt = true;
useQHash = true;
@@ -876,6 +907,10 @@ public:
"QT += gui\n"
"greaterThan(QT_MAJOR_VERSION, 4):QT *= widgets\n";
+ cmakelistsExtra +=
+ "find_package(Qt5 COMPONENTS Core Gui Widgets REQUIRED)\n"
+ "target_link_libraries(doit PRIVATE Qt5::Core Qt5::Gui Qt::Widgets)\n";
+
return *this;
}
@@ -900,6 +935,10 @@ public:
" CONFIG += no_private_qt_headers_warning\n"
"}";
+ cmakelistsExtra +=
+ //"find_package(Qt5 COMPONENTS Core Gui GuiPrivate REQUIRED)\n"
+ "target_link_libraries(doit PRIVATE Qt5::Core Qt5::Gui Qt5::GuiPrivate)\n";
+
return *this;
}
@@ -923,6 +962,23 @@ public:
" CONFIG += no_private_qt_headers_warning\n"
"}";
+ cmakelistsExtra +=
+ "find_package(Qt5 COMPONENTS Core Gui Qml REQUIRED)\n"
+ "target_link_libraries(doit PRIVATE Qt5::Core Qt5::Qml Qt5::QmlPrivate)\n";
+
+ return *this;
+ }
+
+ const Data &operator+(const XmlProfile &) const
+ {
+ this->operator+(CoreProfile());
+ profileExtra +=
+ " QT += xml\n";
+
+ cmakelistsExtra +=
+ "find_package(Qt5 COMPONENTS Core Xml REQUIRED)\n"
+ "target_link_libraries(doit PRIVATE Qt5::Core Qt5::Xml)\n";
+
return *this;
}
@@ -935,13 +991,13 @@ public:
useQt = false;
useQHash = false;
- mainFile = "main.mm";
+ language = Language::ObjectiveCxx;
return *this;
}
const Data &operator+(const ForceC &) const
{
- mainFile = "main.c";
+ language = Language::C;
return *this;
}
@@ -962,16 +1018,15 @@ public:
mutable BoostVersion neededBoostVersion; // DEC. 105400 for 1.54.0
mutable DwarfVersion neededDwarfVersion; // DEC. 105400 for 1.54.0
- mutable QString configTest;
+ mutable ConfigTest configTest;
mutable QString allProfile; // Overrides anything below if not empty.
mutable QString allCode; // Overrides anything below if not empty.
- mutable QString mainFile = "main.cpp";
- mutable QString projectFile = "doit.pro";
-
+ mutable Language language = Language::Cxx;
mutable QString dumperOptions;
mutable QString profileExtra;
+ mutable QString cmakelistsExtra;
mutable QString includes;
mutable QString code;
mutable QString unused;
@@ -1015,9 +1070,11 @@ private slots:
private:
void disarm() { t->buildTemp.setAutoRemove(!keepTemp()); }
bool keepTemp() const { return m_keepTemp || m_forceKeepTemp; }
- TempStuff *t = 0;
+ TempStuff *t = nullptr;
+ BuildSystem m_buildSystem = BuildSystem::Qmake;
QString m_debuggerBinary;
QString m_qmakeBinary;
+ QString m_cmakeBinary{"cmake"};
QProcessEnvironment m_env;
DebuggerEngine m_debuggerEngine;
QString m_makeBinary;
@@ -1056,7 +1113,11 @@ void tst_Dumpers::initTestCase()
m_qmakeBinary = QDir::fromNativeSeparators(QString::fromLocal8Bit(qgetenv("QTC_QMAKE_PATH_FOR_TEST")));
if (m_qmakeBinary.isEmpty())
m_qmakeBinary = "qmake";
+ if (qEnvironmentVariableIntValue("QTC_USE_CMAKE_FOR_TEST"))
+ m_buildSystem = BuildSystem::CMake;
+
qDebug() << "QMake : " << m_qmakeBinary;
+ qDebug() << "Use CMake : " << (m_buildSystem == BuildSystem::CMake) << int(m_buildSystem);
m_useGLibCxxDebug = qgetenv("QTC_USE_GLIBCXXDEBUG_FOR_TEST").toInt();
qDebug() << "Use _GLIBCXX_DEBUG : " << m_useGLibCxxDebug;
@@ -1288,44 +1349,109 @@ void tst_Dumpers::dumper()
+ QByteArray::number(data.neededMsvcVersion.max));
}
- if (!data.configTest.isEmpty()) {
+ if (!data.configTest.executable.isEmpty()) {
QProcess configTest;
- configTest.start(data.configTest);
+ configTest.start(data.configTest.executable, data.configTest.arguments);
QVERIFY(configTest.waitForFinished());
output = configTest.readAllStandardOutput();
error = configTest.readAllStandardError();
if (configTest.exitCode()) {
- MSKIP_SINGLE("Configure test failed: '"
- + data.configTest.toUtf8() + "' " + output + ' ' + error);
+ QString msg = "Configure test failed: '"
+ + data.configTest.executable + ' '
+ + data.configTest.arguments.join(' ')
+ + "' " + output + ' ' + error;
+ MSKIP_SINGLE(msg.toUtf8());
}
}
- QFile proFile(t->buildPath + '/' + data.projectFile);
- QVERIFY(proFile.open(QIODevice::ReadWrite));
- if (data.allProfile.isEmpty()) {
- proFile.write("SOURCES = ");
- proFile.write(data.mainFile.toUtf8());
- proFile.write("\nTARGET = doit\n");
- proFile.write("\nCONFIG -= app_bundle\n");
- proFile.write("\nmacos: CONFIG += sdk_no_version_check\n");
- proFile.write("\nCONFIG -= release\n");
- proFile.write("\nCONFIG += debug\n");
- proFile.write("\nCONFIG += console\n");
- if (data.useQt)
- proFile.write("QT -= widgets gui\n");
- else
- proFile.write("CONFIG -= qt\n");
- if (m_useGLibCxxDebug)
- proFile.write("DEFINES += _GLIBCXX_DEBUG\n");
- if (m_debuggerEngine == GdbEngine && m_debuggerVersion < 70500)
- proFile.write("QMAKE_CXXFLAGS += -gdwarf-3\n");
- proFile.write(data.profileExtra.toUtf8());
+ QString mainFile;
+ QByteArray cmakeLanguage;
+ if (data.language == Language::C) {
+ mainFile = "main.c";
+ cmakeLanguage = "C";
+ } else if (data.language == Language::ObjectiveCxx) {
+ mainFile = "main.mm";
+ cmakeLanguage = "CXX";
+ } else if (data.language == Language::Nim) {
+ mainFile = "main.nim";
+ cmakeLanguage = "CXX";
+ } else if (data.language == Language::Fortran90) {
+ mainFile = "main.f90";
+ cmakeLanguage = "Fortran";
} else {
- proFile.write(data.allProfile.toUtf8());
+ mainFile = "main.cpp";
+ cmakeLanguage = "CXX";
}
- proFile.close();
- QFile source(t->buildPath + '/' + data.mainFile);
+ QFile projectFile;
+ if (m_buildSystem == BuildSystem::CMake) {
+ projectFile.setFileName(t->buildPath + "/CMakeLists.txt");
+ QVERIFY(projectFile.open(QIODevice::ReadWrite));
+ if (data.allProfile.isEmpty()) {
+ projectFile.write("cmake_minimum_required(VERSION 3.5)\n\n");
+ projectFile.write("project(doit LANGUAGES " + cmakeLanguage + ")\n\n");
+ projectFile.write("set(CMAKE_INCLUDE_CURRENT_DIR ON)\n\n");
+
+ if (data.useQt) {
+ projectFile.write("set(CMAKE_AUTOUIC ON)\n");
+ projectFile.write("set(CMAKE_AUTOMOC ON)\n");
+ projectFile.write("set(CMAKE_AUTORCC ON)\n");
+ }
+
+ projectFile.write("set(CMAKE_CXX_STANDARD 11)\n");
+ projectFile.write("set(CMAKE_CXX_STANDARD_REQUIRED ON)\n");
+
+ projectFile.write("add_executable(doit\n");
+ projectFile.write(" " + mainFile.toUtf8() + "\n");
+ projectFile.write(")\n\n");
+
+ //projectFile.write("target_link_libraries(doit PRIVATE Qt5::Widgets)\n");
+
+ //projectFile.write("\nmacos: CONFIG += sdk_no_version_check\n");
+ //projectFile.write("\nCONFIG -= release\n");
+ //projectFile.write("\nCONFIG += debug\n");
+ //projectFile.write("\nCONFIG += console\n");
+
+ //if (m_useGLibCxxDebug)
+ // projectFile.write("DEFINES += _GLIBCXX_DEBUG\n");
+ //if (m_debuggerEngine == GdbEngine && m_debuggerVersion < 70500)
+ // projectFile.write("QMAKE_CXXFLAGS += -gdwarf-3\n");
+ projectFile.write(data.cmakelistsExtra.toUtf8());
+ } else {
+ projectFile.write(data.allProfile.toUtf8());
+ }
+ projectFile.close();
+ } else {
+ projectFile.setFileName(t->buildPath + "/doit.pro");
+ QVERIFY(projectFile.open(QIODevice::ReadWrite));
+ if (data.allProfile.isEmpty()) {
+ projectFile.write("SOURCES = ");
+ projectFile.write(mainFile.toUtf8());
+ projectFile.write("\nTARGET = doit\n");
+ projectFile.write("\nCONFIG -= app_bundle\n");
+ projectFile.write("\nmacos: CONFIG += sdk_no_version_check\n");
+ projectFile.write("\nCONFIG -= release\n");
+ projectFile.write("\nCONFIG += debug\n");
+ projectFile.write("\nCONFIG += console\n");
+ if (data.useQt)
+ projectFile.write("QT -= widgets gui\n");
+ else
+ projectFile.write("CONFIG -= qt\n");
+ if (m_useGLibCxxDebug)
+ projectFile.write("DEFINES += _GLIBCXX_DEBUG\n");
+ if (m_debuggerEngine == GdbEngine && m_debuggerVersion < 70500)
+ projectFile.write("QMAKE_CXXFLAGS += -gdwarf-3\n");
+ projectFile.write(data.profileExtra.toUtf8());
+ } else {
+ projectFile.write(data.allProfile.toUtf8());
+ }
+#ifdef Q_OS_WIN
+ projectFile.write("TARGET = ../doit\n"); // avoid handling debug / release folder
+#endif
+ projectFile.close();
+ }
+
+ QFile source(t->buildPath + '/' + mainFile);
QVERIFY(source.open(QIODevice::ReadWrite));
QString unused;
@@ -1411,23 +1537,47 @@ void tst_Dumpers::dumper()
source.write(fullCode.toUtf8());
source.close();
- QProcess qmake;
- qmake.setWorkingDirectory(t->buildPath);
- //qDebug() << "Starting qmake: " << m_qmakeBinary;
- QStringList options;
-#ifdef Q_OS_MAC
- if (m_qtVersion && m_qtVersion < 0x050000)
- options << "-spec" << "unsupported/macx-clang";
-#endif
- qmake.start(m_qmakeBinary, options);
- QVERIFY(qmake.waitForFinished());
- output = qmake.readAllStandardOutput();
- error = qmake.readAllStandardError();
- //qDebug() << "stdout: " << output;
+ if (m_buildSystem == BuildSystem::CMake) {
+ QProcess cmake;
+ cmake.setWorkingDirectory(t->buildPath);
+ QDir dir = QFileInfo(m_qmakeBinary).dir(); // {Qt:QT_INSTALL_PREFIX}
+ dir.cdUp();
+ QStringList options = {
+ "-DCMAKE_BUILD_TYPE=Debug",
+ "-DCMAKE_PREFIX_PATH=" + dir.absolutePath(),
+ "."
+ };
+ //qDebug() << "Starting cmake: " << m_cmakeBinary << ' ' << qPrintable(options.join(' '));
+ cmake.start(m_cmakeBinary, options);
+ QVERIFY(cmake.waitForFinished());
+ output = cmake.readAllStandardOutput();
+ error = cmake.readAllStandardError();
+ //qDebug() << "stdout: " << output;
+
+ if (data.allProfile.isEmpty()) { // Nim...
+ if (!error.isEmpty()) {
+ qDebug() << error; QVERIFY(false);
+ }
+ }
+ } else {
+ QProcess qmake;
+ qmake.setWorkingDirectory(t->buildPath);
+ //qDebug() << "Starting qmake: " << m_qmakeBinary;
+ QStringList options;
+ #ifdef Q_OS_MACOS
+ if (m_qtVersion && m_qtVersion < 0x050000)
+ options << "-spec" << "unsupported/macx-clang";
+ #endif
+ qmake.start(m_qmakeBinary, options);
+ QVERIFY(qmake.waitForFinished());
+ output = qmake.readAllStandardOutput();
+ error = qmake.readAllStandardError();
+ //qDebug() << "stdout: " << output;
- if (data.allProfile.isEmpty()) { // Nim...
- if (!error.isEmpty()) {
- qDebug() << error; QVERIFY(false);
+ if (data.allProfile.isEmpty()) { // Nim...
+ if (!error.isEmpty()) {
+ qDebug() << error; QVERIFY(false);
+ }
}
}
@@ -1445,7 +1595,7 @@ void tst_Dumpers::dumper()
qDebug() << "\n------------------ CODE --------------------";
qDebug().noquote() << fullCode;
qDebug() << "\n------------------ CODE --------------------";
- qDebug().noquote() << "Project file: " << proFile.fileName();
+ qDebug().noquote() << "Project file: " << projectFile.fileName();
QCOMPARE(make.exitCode(), 0);
}
@@ -1487,7 +1637,7 @@ void tst_Dumpers::dumper()
}
};
collectExpandedINames(data.checks);
- for (const auto checkset : qAsConst(data.checksets))
+ for (const auto &checkset : qAsConst(data.checksets))
collectExpandedINames(checkset.checks);
QString expanded;
@@ -1518,12 +1668,7 @@ void tst_Dumpers::dumper()
QByteArray nograb = "-nograb";
cmds = "set confirm off\n"
-#ifdef Q_OS_WIN
- "file debug/doit\n"
-#else
"file doit\n"
-#endif
- "set print object on\n"
"set auto-load python-scripts off\n";
cmds += "python sys.path.insert(1, '" + dumperDir + "')\n"
@@ -1547,7 +1692,7 @@ void tst_Dumpers::dumper()
<< "0x4000001f"
<< "-c"
<< "bm doit!qtcDebugBreakFunction;g"
- << "debug\\doit.exe";
+ << "doit.exe";
cmds += ".symopt+0x8000\n"
"!qtcreatorcdbext.script sys.path.insert(1, '" + dumperDir + "')\n"
"!qtcreatorcdbext.script from cdbbridge import *\n"
@@ -2333,6 +2478,7 @@ void tst_Dumpers::dumper_data()
"&l1, &l2, &l3, &l4, &l5, &l6")
+ CoreProfile()
+ + QtVersion(0, 0x5ffff) // QLinkedList was dropped in Qt 6
+ Check("l0", "<0 items>", "@QLinkedList<float>")
@@ -4267,8 +4413,7 @@ void tst_Dumpers::dumper_data()
"atts.append(\"name3\", \"uri3\", \"localPart3\", \"value3\");",
"&atts")
- + CoreProfile()
- + Profile("QT += xml\n")
+ + XmlProfile()
+ Check("atts", "<3 items>", "@QXmlAttributes")
+ Check("atts.0", "[0]", "", "@QXmlAttributes::Attribute")
@@ -5857,7 +6002,7 @@ void tst_Dumpers::dumper_data()
// + Check("c.r", "1", "int");
// // Manual: Toogle "Sort Member Alphabetically" in context menu
-// // Manual: of "Locals and Expressions" view");
+// // Manual: of "Locals" and "Expressions" views");
// // Manual: Check that order of displayed members changes");
QTest::newRow("Typedef")
@@ -5972,7 +6117,7 @@ void tst_Dumpers::dumper_data()
// QTest::newRow("TypeFormats")
// << Data(
// "// These tests should result in properly displayed umlauts in the\n"
-// "// Locals and Expressions view. It is only support on gdb with Python");\n"
+// "// Locals and Expressions views. It is only support on gdb with Python");\n"
// "const char *s = "aöa";\n"
// "const wchar_t *w = L"aöa";\n"
// "QString u;\n"
@@ -7796,7 +7941,7 @@ void tst_Dumpers::dumper_data()
#ifdef Q_OS_LINUX
Data f90data;
- f90data.configTest = "which f95";
+ f90data.configTest = {"which", {"f95"}};
f90data.allProfile =
"CONFIG -= qt\n"
"SOURCES += main.f90\n"
@@ -7819,7 +7964,7 @@ void tst_Dumpers::dumper_data()
" i8 = i8 / 0\n"
"end program\n";
- f90data.mainFile = "main.f90";
+ f90data.language = Language::Fortran90;
QTest::newRow("F90")
<< f90data
@@ -7834,7 +7979,7 @@ void tst_Dumpers::dumper_data()
// touch qt_tst_dumpers_Nim_.../dummy.nimproject
// qtcreator qt_tst_dumpers_Nim_*/dummy.nimproject
Data nimData;
- nimData.configTest = "which nim";
+ nimData.configTest = {"which", {"nim"}};
nimData.allProfile =
"CONFIG -= qt\n"
"SOURCES += main.nim\n"