mirror of
https://bitbucket.org/smil3y/kde-extraapps.git
synced 2025-02-27 20:32:54 +00:00
325 lines
No EOL
11 KiB
C++
325 lines
No EOL
11 KiB
C++
/*
|
|
This library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Library General Public
|
|
License version 2 as published by the Free Software Foundation.
|
|
|
|
This library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Library General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Library General Public License
|
|
along with this library; see the file COPYING.LIB. If not, write to
|
|
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
Boston, MA 02110-1301, USA.
|
|
*/
|
|
|
|
#include "astyletest.h"
|
|
|
|
#include <QtTest/QTest>
|
|
#include <QDebug>
|
|
|
|
#include "../astyle_formatter.h"
|
|
#include <util/formattinghelpers.h>
|
|
|
|
QTEST_MAIN(AstyleTest)
|
|
|
|
void AstyleTest::initTestCase()
|
|
{
|
|
m_formatter = new AStyleFormatter;
|
|
///TODO: probably all settings should be covered by tests
|
|
/// or at least set so we can be sure about what we
|
|
/// actually test...
|
|
m_formatter->setSpaceIndentation(4);
|
|
}
|
|
|
|
void AstyleTest::renameVariable()
|
|
{
|
|
// think this:
|
|
// int asdf = 1;
|
|
// e.g. asdf was before something different and got renamed
|
|
QString formattedSource = m_formatter->formatSource(
|
|
"asdf", "int ", " = 1;"
|
|
);
|
|
qDebug() << "formatted source:" << formattedSource;
|
|
QCOMPARE(formattedSource, QString("asdf"));
|
|
|
|
// int main() {
|
|
// if(asdf){}}
|
|
formattedSource = m_formatter->formatSource(
|
|
"asdf", "int main(){\n if(", "){}}"
|
|
);
|
|
qDebug() << "formatted source:" << formattedSource;
|
|
QCOMPARE(formattedSource, QString("asdf"));
|
|
}
|
|
|
|
void AstyleTest::testFuzzyMatching()
|
|
{
|
|
// Some formatting styles inserts "{" and "}" parens behind "ifs", or change comment styles
|
|
// The actual text changes, thus it is difficult to match original and formatted text
|
|
|
|
QString leftContext = "void b() {/*some comment*/\nif( ";
|
|
QString center = "a[ 0]";
|
|
QString rightContext = " ) q;\n }\n";
|
|
QString text = leftContext + center + rightContext;
|
|
QString formatted = "void b() {// some comment\n if( a[0] ) {\n q;\n }\n }\n";
|
|
QString extracted = KDevelop::extractFormattedTextFromContext( formatted, text, QString(), QString() );
|
|
QCOMPARE( extracted, formatted );
|
|
|
|
extracted = KDevelop::extractFormattedTextFromContext( formatted, center, leftContext, rightContext );
|
|
qDebug() << "extracted" << extracted << "formatted" << formatted;
|
|
QCOMPARE( extracted, QString("a[0]") );
|
|
}
|
|
|
|
void AstyleTest::testTabMatching()
|
|
{
|
|
// Some formatting styles inserts "{" and "}" parens behind "ifs", or change comment styles
|
|
// The actual text changes, thus it is difficult to match original and formatted text
|
|
|
|
{
|
|
// Mismatch: There is a preceding tab, but the formatter replaces the tab with spaces
|
|
// The tab is matched with 2 spaces, since we set tab-width 2
|
|
QString extracted = KDevelop::extractFormattedTextFromContext(
|
|
"class C {\n class A;\n}\n",
|
|
"class A;", "class C {\n ", "\n}\n", 2 );
|
|
QCOMPARE( extracted, QString("class A;") );
|
|
|
|
// Two tabs are inserted insead of 1
|
|
extracted = KDevelop::extractFormattedTextFromContext(
|
|
"class C {\n class A;\n}\n",
|
|
"class A;", "class C {\n ", "\n}\n", 2 );
|
|
QCOMPARE( extracted, QString(" class A;") );
|
|
|
|
// One space is inserted behind the tab
|
|
extracted = KDevelop::extractFormattedTextFromContext(
|
|
"class C {\n class A;\n}\n",
|
|
"class A;", "class C {\n ", "\n}\n", 2 );
|
|
QCOMPARE( extracted, QString(" class A;") );
|
|
|
|
// Two tabs are inserted, with 2 preceding whitespaces
|
|
// Add only 1 tab
|
|
extracted = KDevelop::extractFormattedTextFromContext(
|
|
"class C {\n class A;\n}\n",
|
|
"class A;", "class C {\n ", "\n}\n", 2 );
|
|
QCOMPARE( extracted, QString(" class A;") );
|
|
|
|
extracted = KDevelop::extractFormattedTextFromContext(
|
|
"class C {\n class A;\n}\n",
|
|
"class A;", "class C {\n ", "\n}\n", 4 );
|
|
QCOMPARE( extracted, QString(" class A;") );
|
|
}
|
|
{
|
|
// Already correctly formatted
|
|
QString leftContext = "void b() {\n c = 4;\n ";
|
|
QString center = "a = 3;";
|
|
QString rightContext = "\n b = 5;\n }\n";
|
|
QString text = leftContext + center + rightContext;
|
|
QString formatted = "void b() {\n c = 4;\n a = 3;\n b = 5;\n }\n";
|
|
QString extracted = KDevelop::extractFormattedTextFromContext( formatted, text, QString(), QString() );
|
|
QCOMPARE( extracted, formatted );
|
|
|
|
extracted = KDevelop::extractFormattedTextFromContext( formatted, center, leftContext, rightContext );
|
|
QCOMPARE( extracted, QString("a = 3;") );
|
|
}
|
|
{
|
|
QString leftContext = "void b() {\n c = 4;\n";
|
|
QString center = "a = 3;\n";
|
|
QString rightContext = "b = 5;\n }\n";
|
|
QString text = leftContext + center + rightContext;
|
|
QString formatted = "void b() {\n c = 4;\n a = 3;\n b = 5;\n }\n";
|
|
QString extracted = KDevelop::extractFormattedTextFromContext( formatted, text, QString(), QString() );
|
|
QCOMPARE( extracted, formatted );
|
|
|
|
extracted = KDevelop::extractFormattedTextFromContext( formatted, center, leftContext, rightContext );
|
|
QCOMPARE( extracted, QString(" a = 3;\n ") );
|
|
}
|
|
}
|
|
|
|
void AstyleTest::overrideHelper()
|
|
{
|
|
// think this:
|
|
// virtual void asdf();
|
|
// gets included into a class
|
|
|
|
// test1: not indented
|
|
QString formattedSource = m_formatter->formatSource(
|
|
"virtual void asdf();", "class asdf {\n int bar();\n", "\n};"
|
|
);
|
|
qDebug() << "formatted source:" << formattedSource;
|
|
QCOMPARE(formattedSource, QString(" virtual void asdf();"));
|
|
|
|
// test2: already indented
|
|
formattedSource = m_formatter->formatSource(
|
|
"virtual void asdf();", "class asdf {\n int bar();\n ", "\n};"
|
|
);
|
|
qDebug() << "formatted source:" << formattedSource;
|
|
QCOMPARE(formattedSource, QString("virtual void asdf();"));
|
|
}
|
|
|
|
void AstyleTest::varTypeAssistant()
|
|
{
|
|
// think this:
|
|
// asdf = 1;
|
|
// and you execute the assitant to get:
|
|
// int asdf = 1;
|
|
|
|
// test1: already indented
|
|
QString formattedSource = m_formatter->formatSource(
|
|
"int ", "int main() {\n ", "asdf = 1;\n}\n"
|
|
);
|
|
qDebug() << "formatted source:" << formattedSource;
|
|
QCOMPARE(formattedSource, QString("int "));
|
|
|
|
// test2: not yet indented
|
|
formattedSource = m_formatter->formatSource(
|
|
"int ", "int main() {\n", "asdf = 1;\n}\n"
|
|
);
|
|
qDebug() << "formatted source:" << formattedSource;
|
|
QCOMPARE(formattedSource, QString(" int "));
|
|
|
|
}
|
|
|
|
void AstyleTest::testMultipleFormatters()
|
|
{
|
|
// just test that multiple formatters can exist at the same time
|
|
AStyleFormatter* formatter1 = new AStyleFormatter;
|
|
AStyleFormatter* formatter2 = new AStyleFormatter;
|
|
delete formatter1;
|
|
delete formatter2;
|
|
}
|
|
|
|
void AstyleTest::testMacroFormatting()
|
|
{
|
|
AStyleFormatter fmt;
|
|
fmt.setSpaceIndentation(2);
|
|
fmt.setPreprocessorIndent(true);
|
|
QString formatted = fmt.formatSource("#define asdf\\\nfoobar\n");
|
|
QCOMPARE(formatted, QString("#define asdf\\\n foobar\n"));
|
|
}
|
|
|
|
void AstyleTest::testContext()
|
|
{
|
|
AStyleFormatter* formatter = new AStyleFormatter;
|
|
formatter->setBracketFormatMode(astyle::LINUX_MODE);
|
|
formatter->setParensInsidePaddingMode(true);
|
|
formatter->setBlockIndent(true);
|
|
// We enable break-blocks mode, so that we can test the newline matching
|
|
formatter->setBreakBlocksMode(true);
|
|
formatter->setBreakClosingHeaderBlocksMode(true);
|
|
formatter->setParensUnPaddingMode(true);
|
|
|
|
QString leftContext = "int main() {\n";
|
|
QString rightContext = ";\n}\n";
|
|
|
|
/// Newline tests
|
|
|
|
QString formattedSource = formatter->formatSource(
|
|
" int a;\n", leftContext, "int b;" + rightContext );
|
|
|
|
// qDebug() << formattedSource;
|
|
// Adjust indentation
|
|
QCOMPARE(formattedSource, QString(" int a;\n "));
|
|
|
|
formattedSource = formatter->formatSource(
|
|
" int a;\n", leftContext + " ", " int b;" + rightContext );
|
|
|
|
// qDebug() << formattedSource;
|
|
QCOMPARE(formattedSource, QString(" int a;\n "));
|
|
|
|
/// "if(a);" is interpreted as own block, so due to the "break blocks" option,
|
|
/// astyle breaks these blocks with a newline in between.
|
|
formattedSource = formatter->formatSource(
|
|
" if(a); ", leftContext + " if(a); ", " if(a);" + rightContext );
|
|
|
|
// qDebug() << formattedSource;
|
|
QCOMPARE(formattedSource, QString("\n\n if( a );\n\n "));
|
|
|
|
formattedSource = formatter->formatSource(
|
|
" if(a); ", leftContext + " if(a);\n", " \n if(a);" + rightContext );
|
|
|
|
// qDebug() << formattedSource;
|
|
QCOMPARE(formattedSource, QString("\n if( a );\n"));
|
|
|
|
formattedSource = formatter->formatSource(
|
|
" if(a)\na; ", leftContext + " if(a);\n", " \n\n if(a);" + rightContext );
|
|
|
|
// qDebug() << formattedSource;
|
|
// Adjust indentation, successor already partially indentend
|
|
QCOMPARE(formattedSource, QString("\n if( a )\n a;"));
|
|
|
|
/// Whitespace tests
|
|
|
|
formattedSource = formatter->formatSource(
|
|
"int ", leftContext + " ", rightContext );
|
|
|
|
// 2 whitespaces are already in the context, so add only 2
|
|
// qDebug() << "formatted source:" << formattedSource;
|
|
QCOMPARE(formattedSource, QString(" int "));
|
|
|
|
formattedSource = formatter->formatSource(
|
|
"q", leftContext + " if(", ")" + rightContext );
|
|
|
|
// Padding was added around both parens
|
|
QCOMPARE(formattedSource, QString(" q "));
|
|
|
|
formattedSource = formatter->formatSource(
|
|
"q", leftContext + " if( ", " )" + rightContext );
|
|
|
|
// Padding already existed around both parens
|
|
QCOMPARE(formattedSource, QString("q"));
|
|
|
|
formattedSource = formatter->formatSource(
|
|
" q ", leftContext + " if(", " )" + rightContext );
|
|
|
|
// qDebug() << formattedSource;
|
|
// No padding on left, too much padding on right
|
|
QCOMPARE(formattedSource, QString(" q"));
|
|
|
|
formattedSource = formatter->formatSource(
|
|
" ", leftContext + " if(q", ")" + rightContext );
|
|
|
|
// qDebug() << formattedSource;
|
|
// Normalize padding: from 3 to 1
|
|
QCOMPARE(formattedSource, QString(" "));
|
|
|
|
formattedSource = formatter->formatSource(
|
|
"", leftContext + " if(", "q )" + rightContext );
|
|
|
|
// qDebug() << formattedSource;
|
|
// Normalize padding: from 0 to 1
|
|
QCOMPARE(formattedSource, QString(" "));
|
|
|
|
formattedSource = formatter->formatSource(
|
|
" ", leftContext + " if( ", "q )" + rightContext );
|
|
|
|
// qDebug() << formattedSource;
|
|
// Reduce padding as much as possible
|
|
QCOMPARE(formattedSource, QString(""));
|
|
|
|
delete formatter;
|
|
}
|
|
|
|
void AstyleTest::testTabIndentation()
|
|
{
|
|
AStyleFormatter formatter;
|
|
formatter.setTabSpaceConversionMode(false);
|
|
formatter.setTabIndentation(2, false);
|
|
|
|
const QString initial("int a() {\n return 0;\n}\n");
|
|
const QString expected("int a() {\n\treturn 0;\n}\n");
|
|
const QString formatted = formatter.formatSource(initial);
|
|
QCOMPARE(formatted, expected);
|
|
}
|
|
|
|
void AstyleTest::testForeach()
|
|
{
|
|
AStyleFormatter formatter;
|
|
QVERIFY(formatter.predefinedStyle("KDELibs"));
|
|
|
|
const QString initial("int a(){QList<int> v;foreach(int i,v){return i;}}\n");
|
|
const QString expected("int a()\n{\n QList<int> v;\n foreach (int i, v) {\n return i;\n }\n}\n");
|
|
const QString formatted = formatter.formatSource(initial);
|
|
QCOMPARE(formatted, expected);
|
|
}
|
|
|
|
#include "moc_astyletest.cpp" |