forked from qt-creator/qt-creator
CppEditor: Convert ConvertToMetaMethodCallTest to out-of-line approach
Change-Id: If540f851c424df57793551bcfef3f565c4b07682 Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
@@ -302,5 +302,24 @@
|
||||
<file>testcases/ConvertToCamelCaseTest/upper-case/original_file.cpp</file>
|
||||
<file>testcases/ConvertToCamelCaseTest/wild-mix/expected_file.cpp</file>
|
||||
<file>testcases/ConvertToCamelCaseTest/wild-mix/original_file.cpp</file>
|
||||
<file>testcases/ConvertToMetaMethodCallTest/emit/expected_file.cpp</file>
|
||||
<file>testcases/ConvertToMetaMethodCallTest/emit/original_file.cpp</file>
|
||||
<file>testcases/ConvertToMetaMethodCallTest/expression/expected_file.cpp</file>
|
||||
<file>testcases/ConvertToMetaMethodCallTest/expression/original_file.cpp</file>
|
||||
<file>testcases/ConvertToMetaMethodCallTest/not-invokable/original_file.cpp</file>
|
||||
<file>testcases/ConvertToMetaMethodCallTest/object-value/expected_file.cpp</file>
|
||||
<file>testcases/ConvertToMetaMethodCallTest/object-value/original_file.cpp</file>
|
||||
<file>testcases/ConvertToMetaMethodCallTest/pointer-to-object/expected_file.cpp</file>
|
||||
<file>testcases/ConvertToMetaMethodCallTest/pointer-to-object/original_file.cpp</file>
|
||||
<file>testcases/ConvertToMetaMethodCallTest/Q_EMIT/expected_file.cpp</file>
|
||||
<file>testcases/ConvertToMetaMethodCallTest/Q_EMIT/original_file.cpp</file>
|
||||
<file>testcases/ConvertToMetaMethodCallTest/Q_INVOKABLE/expected_file.cpp</file>
|
||||
<file>testcases/ConvertToMetaMethodCallTest/Q_INVOKABLE/original_file.cpp</file>
|
||||
<file>testcases/ConvertToMetaMethodCallTest/Q_SIGNAL/expected_file.cpp</file>
|
||||
<file>testcases/ConvertToMetaMethodCallTest/Q_SIGNAL/original_file.cpp</file>
|
||||
<file>testcases/ConvertToMetaMethodCallTest/Q_SLOT/expected_file.cpp</file>
|
||||
<file>testcases/ConvertToMetaMethodCallTest/Q_SLOT/original_file.cpp</file>
|
||||
<file>testcases/ConvertToMetaMethodCallTest/slot/expected_file.cpp</file>
|
||||
<file>testcases/ConvertToMetaMethodCallTest/slot/original_file.cpp</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
@@ -110,11 +110,6 @@ private:
|
||||
//! marked as invokable.
|
||||
class ConvertToMetaMethodCall : public CppQuickFixFactory
|
||||
{
|
||||
#ifdef WITH_TESTS
|
||||
public:
|
||||
static QObject *createTest();
|
||||
#endif
|
||||
private:
|
||||
void doMatch(const CppQuickFixInterface &interface, QuickFixOperations &result) override
|
||||
{
|
||||
const Document::Ptr &cppDoc = interface.currentFile()->cppDocument();
|
||||
@@ -161,113 +156,12 @@ private:
|
||||
}
|
||||
};
|
||||
|
||||
#ifdef WITH_TESTS
|
||||
using namespace Tests;
|
||||
|
||||
class ConvertToMetaMethodCallTest : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
private slots:
|
||||
void test_data()
|
||||
{
|
||||
QTest::addColumn<QByteArray>("input");
|
||||
QTest::addColumn<QByteArray>("expected");
|
||||
|
||||
// ^ marks the cursor locations.
|
||||
// $ marks the replacement regions.
|
||||
// The quoted string in the comment is the data tag.
|
||||
// The rest of the comment is the replacement string.
|
||||
const QByteArray allCases = R"(
|
||||
class C {
|
||||
public:
|
||||
C() {
|
||||
$this->^aSignal()$; // "signal from region on pointer to object" QMetaObject::invokeMethod(this, "aSignal")
|
||||
C c;
|
||||
$c.^aSignal()$; // "signal from region on object value" QMetaObject::invokeMethod(&c, "aSignal")
|
||||
$(new C)->^aSignal()$; // "signal from region on expression" QMetaObject::invokeMethod((new C), "aSignal")
|
||||
$emit this->^aSignal()$; // "signal from region, with emit" QMetaObject::invokeMethod(this, "aSignal")
|
||||
$Q_EMIT this->^aSignal()$; // "signal from region, with Q_EMIT" QMetaObject::invokeMethod(this, "aSignal")
|
||||
$this->^aSlot()$; // "slot from region" QMetaObject::invokeMethod(this, "aSlot")
|
||||
$this->^noArgs()$; // "Q_SIGNAL, no arguments" QMetaObject::invokeMethod(this, "noArgs")
|
||||
$this->^oneArg(0)$; // "Q_SLOT, one argument" QMetaObject::invokeMethod(this, "oneArg", Q_ARG(int, 0))
|
||||
$this->^twoArgs(0, c)$; // "Q_INVOKABLE, two arguments" QMetaObject::invokeMethod(this, "twoArgs", Q_ARG(int, 0), Q_ARG(C, c))
|
||||
this->^notInvokable(); // "not invokable"
|
||||
}
|
||||
|
||||
signals:
|
||||
void aSignal();
|
||||
|
||||
private slots:
|
||||
void aSlot();
|
||||
|
||||
private:
|
||||
Q_SIGNAL void noArgs();
|
||||
Q_SLOT void oneArg(int index);
|
||||
Q_INVOKABLE void twoArgs(int index, const C &value);
|
||||
void notInvokable();
|
||||
};
|
||||
)";
|
||||
|
||||
qsizetype nextCursor = allCases.indexOf('^');
|
||||
while (nextCursor != -1) {
|
||||
const int commentStart = allCases.indexOf("//", nextCursor);
|
||||
QVERIFY(commentStart != -1);
|
||||
const int tagStart = allCases.indexOf('"', commentStart + 2);
|
||||
QVERIFY(tagStart != -1);
|
||||
const int tagEnd = allCases.indexOf('"', tagStart + 1);
|
||||
QVERIFY(tagEnd != -1);
|
||||
QByteArray input = allCases;
|
||||
QByteArray output = allCases;
|
||||
input.replace(nextCursor, 1, "@");
|
||||
const QByteArray tag = allCases.mid(tagStart + 1, tagEnd - tagStart - 1);
|
||||
const int prevNewline = allCases.lastIndexOf('\n', nextCursor);
|
||||
const int regionStart = allCases.lastIndexOf('$', nextCursor);
|
||||
bool hasReplacement = false;
|
||||
if (regionStart != -1 && regionStart > prevNewline) {
|
||||
const int regionEnd = allCases.indexOf('$', regionStart + 1);
|
||||
QVERIFY(regionEnd != -1);
|
||||
const int nextNewline = allCases.indexOf('\n', tagEnd);
|
||||
QVERIFY(nextNewline != -1);
|
||||
const QByteArray replacement
|
||||
= allCases.mid(tagEnd + 1, nextNewline - tagEnd - 1).trimmed();
|
||||
output.replace(regionStart, regionEnd - regionStart, replacement);
|
||||
hasReplacement = true;
|
||||
}
|
||||
static const auto matcher = [](char c) { return c == '^' || c == '$'; };
|
||||
input.removeIf(matcher);
|
||||
if (hasReplacement) {
|
||||
output.removeIf(matcher);
|
||||
output.prepend("#include <QMetaObject>\n\n");
|
||||
} else {
|
||||
output.clear();
|
||||
}
|
||||
QTest::newRow(tag.data()) << input << output;
|
||||
nextCursor = allCases.indexOf('^', nextCursor + 1);
|
||||
}
|
||||
}
|
||||
|
||||
void test()
|
||||
{
|
||||
QFETCH(QByteArray, input);
|
||||
QFETCH(QByteArray, expected);
|
||||
ConvertToMetaMethodCall factory;
|
||||
QuickFixOperationTest({CppTestDocument::create("file.cpp", input, expected)}, &factory);
|
||||
}
|
||||
};
|
||||
|
||||
QObject *ConvertToMetaMethodCall::createTest() { return new ConvertToMetaMethodCallTest; }
|
||||
|
||||
#endif // WITH_TESTS
|
||||
} // namespace
|
||||
|
||||
void registerConvertToMetaMethodCallQuickfix()
|
||||
{
|
||||
CppQuickFixFactory::registerFactory<ConvertToMetaMethodCall>();
|
||||
CppQuickFixFactory::registerFactoryWithStandardTest<ConvertToMetaMethodCall>(
|
||||
"ConvertToMetaMethodCallTest");
|
||||
}
|
||||
|
||||
} // namespace CppEditor::Internal
|
||||
|
||||
#ifdef WITH_TESTS
|
||||
#include <converttometamethodcall.moc>
|
||||
#endif
|
||||
|
@@ -0,0 +1,11 @@
|
||||
#include <QMetaObject>
|
||||
|
||||
class C {
|
||||
public:
|
||||
C() {
|
||||
QMetaObject::invokeMethod(this, "aSignal");
|
||||
}
|
||||
|
||||
signals:
|
||||
void aSignal();
|
||||
};
|
@@ -0,0 +1,9 @@
|
||||
class C {
|
||||
public:
|
||||
C() {
|
||||
Q_EMIT this->@aSignal();
|
||||
}
|
||||
|
||||
signals:
|
||||
void aSignal();
|
||||
};
|
@@ -0,0 +1,12 @@
|
||||
#include <QMetaObject>
|
||||
|
||||
class C {
|
||||
public:
|
||||
C() {
|
||||
C c;
|
||||
QMetaObject::invokeMethod(this, "twoArgs", Q_ARG(int, 0), Q_ARG(C, c));
|
||||
}
|
||||
|
||||
private:
|
||||
Q_INVOKABLE void twoArgs(int index, const C &value);
|
||||
};
|
@@ -0,0 +1,10 @@
|
||||
class C {
|
||||
public:
|
||||
C() {
|
||||
C c;
|
||||
this->@twoArgs(0, c);
|
||||
}
|
||||
|
||||
private:
|
||||
Q_INVOKABLE void twoArgs(int index, const C &value);
|
||||
};
|
@@ -0,0 +1,12 @@
|
||||
#include <QMetaObject>
|
||||
|
||||
class C {
|
||||
public:
|
||||
C() {
|
||||
C c;
|
||||
QMetaObject::invokeMethod(this, "noArgs");
|
||||
}
|
||||
|
||||
private:
|
||||
Q_SIGNAL void noArgs();
|
||||
};
|
@@ -0,0 +1,10 @@
|
||||
class C {
|
||||
public:
|
||||
C() {
|
||||
C c;
|
||||
this->@noArgs();
|
||||
}
|
||||
|
||||
private:
|
||||
Q_SIGNAL void noArgs();
|
||||
};
|
@@ -0,0 +1,11 @@
|
||||
#include <QMetaObject>
|
||||
|
||||
class C {
|
||||
public:
|
||||
C() {
|
||||
QMetaObject::invokeMethod(this, "oneArg", Q_ARG(int, 0));
|
||||
}
|
||||
|
||||
private:
|
||||
Q_SLOT void oneArg(int index);
|
||||
};
|
@@ -0,0 +1,9 @@
|
||||
class C {
|
||||
public:
|
||||
C() {
|
||||
this->@oneArg(0);
|
||||
}
|
||||
|
||||
private:
|
||||
Q_SLOT void oneArg(int index);
|
||||
};
|
@@ -0,0 +1,11 @@
|
||||
#include <QMetaObject>
|
||||
|
||||
class C {
|
||||
public:
|
||||
C() {
|
||||
QMetaObject::invokeMethod(this, "aSignal");
|
||||
}
|
||||
|
||||
signals:
|
||||
void aSignal();
|
||||
};
|
@@ -0,0 +1,9 @@
|
||||
class C {
|
||||
public:
|
||||
C() {
|
||||
emit this->@aSignal();
|
||||
}
|
||||
|
||||
signals:
|
||||
void aSignal();
|
||||
};
|
@@ -0,0 +1,11 @@
|
||||
#include <QMetaObject>
|
||||
|
||||
class C {
|
||||
public:
|
||||
C() {
|
||||
QMetaObject::invokeMethod((new C), "aSignal");
|
||||
}
|
||||
|
||||
signals:
|
||||
void aSignal();
|
||||
};
|
@@ -0,0 +1,9 @@
|
||||
class C {
|
||||
public:
|
||||
C() {
|
||||
(new C)->@aSignal();
|
||||
}
|
||||
|
||||
signals:
|
||||
void aSignal();
|
||||
};
|
@@ -0,0 +1,9 @@
|
||||
class C {
|
||||
public:
|
||||
C() {
|
||||
this->@notInvokable();
|
||||
}
|
||||
|
||||
private:
|
||||
void notInvokable();
|
||||
};
|
@@ -0,0 +1,12 @@
|
||||
#include <QMetaObject>
|
||||
|
||||
class C {
|
||||
public:
|
||||
C() {
|
||||
C c;
|
||||
QMetaObject::invokeMethod(&c, "aSignal");
|
||||
}
|
||||
|
||||
signals:
|
||||
void aSignal();
|
||||
};
|
@@ -0,0 +1,10 @@
|
||||
class C {
|
||||
public:
|
||||
C() {
|
||||
C c;
|
||||
c.@aSignal();
|
||||
}
|
||||
|
||||
signals:
|
||||
void aSignal();
|
||||
};
|
@@ -0,0 +1,11 @@
|
||||
#include <QMetaObject>
|
||||
|
||||
class C {
|
||||
public:
|
||||
C() {
|
||||
QMetaObject::invokeMethod(this, "aSignal");
|
||||
}
|
||||
|
||||
signals:
|
||||
void aSignal();
|
||||
};
|
@@ -0,0 +1,9 @@
|
||||
class C {
|
||||
public:
|
||||
C() {
|
||||
this->@aSignal();
|
||||
}
|
||||
|
||||
signals:
|
||||
void aSignal();
|
||||
};
|
@@ -0,0 +1,11 @@
|
||||
#include <QMetaObject>
|
||||
|
||||
class C {
|
||||
public:
|
||||
C() {
|
||||
QMetaObject::invokeMethod(this, "aSlot");
|
||||
}
|
||||
|
||||
private slots:
|
||||
void aSlot();
|
||||
};
|
@@ -0,0 +1,9 @@
|
||||
class C {
|
||||
public:
|
||||
C() {
|
||||
this->@aSlot();
|
||||
}
|
||||
|
||||
private slots:
|
||||
void aSlot();
|
||||
};
|
Reference in New Issue
Block a user