Editor: Fix whitespace cleaning.

Task-number: QTCREATORBUG-7994
Change-Id: I6c197ccc3a148555018e8f8184d116c88d7ea400
Reviewed-by: Christian Stenger <christian.stenger@theqtcompany.com>
Reviewed-by: Eike Ziller <eike.ziller@theqtcompany.com>
This commit is contained in:
David Schulz
2016-01-13 14:32:23 +01:00
parent bc921b46a2
commit 9aa51d4857
22 changed files with 346 additions and 200 deletions

View File

@@ -36,6 +36,7 @@
#include "texteditor.h"
#include "texteditorplugin.h"
#include "textdocument.h"
#include "tabsettings.h"
using namespace TextEditor;
@@ -497,4 +498,133 @@ void Internal::TextEditorPlugin::testBlockSelectionCopy()
Core::EditorManager::closeDocument(editor->document(), false);
}
QString tabPolicyToString(TabSettings::TabPolicy policy)
{
switch (policy) {
case TabSettings::SpacesOnlyTabPolicy:
return QLatin1String("spacesOnlyPolicy");
case TabSettings::TabsOnlyTabPolicy:
return QLatin1String("tabsOnlyPolicy");
case TabSettings::MixedTabPolicy:
return QLatin1String("mixedIndentPolicy");
}
return QString();
}
QString continuationAlignBehaviorToString(TabSettings::ContinuationAlignBehavior behavior)
{
switch (behavior) {
case TabSettings::NoContinuationAlign:
return QLatin1String("noContinuation");
case TabSettings::ContinuationAlignWithSpaces:
return QLatin1String("spacesContinuation");
case TabSettings::ContinuationAlignWithIndent:
return QLatin1String("indentContinuation");
}
return QString();
}
struct TabSettingsFlags{
TabSettings::TabPolicy policy;
TabSettings::ContinuationAlignBehavior behavior;
};
typedef std::function<bool(TabSettingsFlags)> IsClean;
void generateTestRows(QLatin1String name, QString text, IsClean isClean)
{
QList<TabSettings::TabPolicy> allPolicys;
allPolicys << TabSettings::SpacesOnlyTabPolicy
<< TabSettings::TabsOnlyTabPolicy
<< TabSettings::MixedTabPolicy;
QList<TabSettings::ContinuationAlignBehavior> allbehavior;
allbehavior << TabSettings::NoContinuationAlign
<< TabSettings::ContinuationAlignWithSpaces
<< TabSettings::ContinuationAlignWithIndent;
const QLatin1Char splitter('_');
const int indentSize = 3;
foreach (TabSettings::TabPolicy policy, allPolicys) {
foreach (TabSettings::ContinuationAlignBehavior behavior, allbehavior) {
const QString tag = tabPolicyToString(policy) + splitter
+ continuationAlignBehaviorToString(behavior) + splitter
+ name;
QTest::newRow(tag.toLatin1().data())
<< policy
<< behavior
<< text
<< indentSize
<< isClean({policy, behavior});
}
}
}
void Internal::TextEditorPlugin::testIndentationClean_data()
{
QTest::addColumn<TabSettings::TabPolicy>("policy");
QTest::addColumn<TabSettings::ContinuationAlignBehavior>("behavior");
QTest::addColumn<QString>("text");
QTest::addColumn<int>("indentSize");
QTest::addColumn<bool>("clean");
generateTestRows(QLatin1String("emptyString"), QString::fromLatin1(""),
[](TabSettingsFlags) -> bool {
return true;
});
generateTestRows(QLatin1String("spaceIndentation"), QString::fromLatin1(" f"),
[](TabSettingsFlags flags) -> bool {
return flags.policy != TabSettings::TabsOnlyTabPolicy;
});
generateTestRows(QLatin1String("spaceIndentationGuessTabs"), QString::fromLatin1(" f\n\tf"),
[](TabSettingsFlags flags) -> bool {
return flags.policy == TabSettings::SpacesOnlyTabPolicy;
});
generateTestRows(QLatin1String("tabIndentation"), QString::fromLatin1("\tf"),
[](TabSettingsFlags flags) -> bool {
return flags.policy == TabSettings::TabsOnlyTabPolicy;
});
generateTestRows(QLatin1String("tabIndentationGuessTabs"), QString::fromLatin1("\tf\n\tf"),
[](TabSettingsFlags flags) -> bool {
return flags.policy != TabSettings::SpacesOnlyTabPolicy;
});
generateTestRows(QLatin1String("doubleSpaceIndentation"), QString::fromLatin1(" f"),
[](TabSettingsFlags flags) -> bool {
return flags.policy != TabSettings::TabsOnlyTabPolicy
&& flags.behavior != TabSettings::NoContinuationAlign;
});
generateTestRows(QLatin1String("doubleTabIndentation"), QString::fromLatin1("\t\tf"),
[](TabSettingsFlags flags) -> bool {
return flags.policy == TabSettings::TabsOnlyTabPolicy
&& flags.behavior == TabSettings::ContinuationAlignWithIndent;
});
generateTestRows(QLatin1String("tabSpaceIndentation"), QString::fromLatin1("\t f"),
[](TabSettingsFlags flags) -> bool {
return flags.policy == TabSettings::TabsOnlyTabPolicy
&& flags.behavior == TabSettings::ContinuationAlignWithSpaces;
});
}
void Internal::TextEditorPlugin::testIndentationClean()
{
// fetch test data
QFETCH(TabSettings::TabPolicy, policy);
QFETCH(TabSettings::ContinuationAlignBehavior, behavior);
QFETCH(QString, text);
QFETCH(int, indentSize);
QFETCH(bool, clean);
const TabSettings settings(policy, indentSize, indentSize, behavior);
const QTextDocument doc(text);
const QTextBlock block = doc.firstBlock();
QCOMPARE(settings.isIndentationClean(block, indentSize), clean);
}
#endif // ifdef WITH_TESTS