aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Stenger <christian.stenger@qt.io>2020-09-07 14:23:35 +0200
committerChristian Stenger <christian.stenger@qt.io>2020-10-02 14:59:00 +0000
commita37a02a6b36232a46ec0e446239c09598c0b3aad (patch)
tree9640fbfbf0bfd12c0aedfe15a4907482682d8200
parent46a9e35c28db013e4e4c7a0f352e870d1a344546 (diff)
Squish: Add test for clean whitespaces
Task-number: QTCREATORBUG-24565 Change-Id: Idd763004f6ce9f1d34b902ea2fcf5c166ce8d4cf Reviewed-by: Robert Loehning <robert.loehning@qt.io>
-rw-r--r--tests/system/suite_editors/suite.conf2
-rw-r--r--tests/system/suite_editors/tst_clean_whitespaces/test.py144
2 files changed, 145 insertions, 1 deletions
diff --git a/tests/system/suite_editors/suite.conf b/tests/system/suite_editors/suite.conf
index b6c5a0fdb3..716e11fb83 100644
--- a/tests/system/suite_editors/suite.conf
+++ b/tests/system/suite_editors/suite.conf
@@ -7,6 +7,6 @@ HOOK_SUB_PROCESSES=false
IMPLICITAUTSTART=0
LANGUAGE=Python
OBJECTMAP=../objects.map
-TEST_CASES=tst_basic_cpp_support tst_delete_externally tst_edit_externally tst_generic_highlighter tst_memberoperator tst_modify_readonly tst_qml_editor tst_qml_indent tst_rename_macros tst_revert_changes tst_select_all
+TEST_CASES=tst_basic_cpp_support tst_clean_whitespaces tst_delete_externally tst_edit_externally tst_generic_highlighter tst_memberoperator tst_modify_readonly tst_qml_editor tst_qml_indent tst_rename_macros tst_revert_changes tst_select_all
VERSION=2
WRAPPERS=Qt
diff --git a/tests/system/suite_editors/tst_clean_whitespaces/test.py b/tests/system/suite_editors/tst_clean_whitespaces/test.py
new file mode 100644
index 0000000000..bf6e83a6e2
--- /dev/null
+++ b/tests/system/suite_editors/tst_clean_whitespaces/test.py
@@ -0,0 +1,144 @@
+############################################################################
+#
+# Copyright (C) 2020 The Qt Company Ltd.
+# Contact: https://www.qt.io/licensing/
+#
+# This file is part of Qt Creator.
+#
+# 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 The Qt Company. For licensing terms
+# and conditions see https://www.qt.io/terms-conditions. For further
+# information use the contact form at https://www.qt.io/contact-us.
+#
+# GNU General Public License Usage
+# Alternatively, this file may be used under the terms of the GNU
+# General Public License version 3 as published by the Free Software
+# Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+# included in the packaging of this file. Please review the following
+# information to ensure the GNU General Public License requirements will
+# be met: https://www.gnu.org/licenses/gpl-3.0.html.
+#
+############################################################################
+
+source("../../shared/qtcreator.py")
+
+# This tests for QTCREATORBUG-24565
+
+TabBlankTab = '\t \t'
+TripleTab = '\t\t\t'
+
+
+def main():
+ files = map(lambda record: os.path.join(srcPath, testData.field(record, "filename")),
+ testData.dataset("files.tsv"))
+ files = filter(lambda x: not x.endswith(".bin"), files)
+ for currentFile in files:
+ if not neededFilePresent(currentFile):
+ return
+
+ startQC()
+ if not startedWithoutPluginError():
+ return
+
+ ignoredFiles = ignoredFilesFromSettings()
+ directory = tempDir()
+
+ for currentFile in files:
+ baseName = os.path.basename(currentFile)
+ fileName = os.path.join(directory, baseName)
+ test.log("Testing file %s" % fileName)
+ content = readFile(currentFile)
+ preparedContent, emptyLine, trailingWS = prepareFileExternal(fileName, content)
+ isIgnored = isIgnoredFile(baseName, ignoredFiles)
+ test.verify(preparedContent.find('\t') != -1, "Added at least one tab.")
+ test.log("Expecting file to be cleaned (trailing whitespace): %s" % str(not isIgnored))
+
+ invokeMenuItem("File", "Open File or Project...")
+ selectFromFileDialog(fileName, True)
+ editor = getEditorForFileSuffix(fileName)
+ if editor == None:
+ test.fatal("Could not get the editor for '%s'" % fileName,
+ "Skipping this file for now.")
+ continue
+
+ fileCombo = waitForObject(":Qt Creator_FilenameQComboBox")
+ invokeMenuItem("Edit", "Advanced", "Clean Whitespace")
+ if emptyLine or (trailingWS and not isIgnored):
+ waitFor("str(fileCombo.currentText).endswith('*')", 2500)
+
+ currentContent = str(editor.toPlainText())
+ if trailingWS and not isIgnored:
+ test.verify(currentContent.find(TabBlankTab) == -1, "Trailing whitespace cleaned.")
+ expectedContent = preparedContent.replace(TabBlankTab, '')
+ if emptyLine:
+ expectedContent = expectedContent.replace(TripleTab, '')
+ test.compare(currentContent, expectedContent,
+ "'%s' vs '%s'" % (currentContent, expectedContent))
+ else:
+ test.verify(currentContent.find(TabBlankTab) != -1, "Trailing whitespace still present.")
+ if emptyLine:
+ test.compare(currentContent.find(TripleTab), -1, "Indentation cleaned.")
+
+ hasBeenCleaned = str(fileCombo.currentText).endswith('*')
+ test.compare(hasBeenCleaned, emptyLine or (trailingWS and not isIgnored),
+ "Cleaned as expected.")
+ if hasBeenCleaned:
+ invokeMenuItem('File', 'Save "%s"' % os.path.basename(fileName))
+
+ invokeMenuItem("File", "Exit")
+
+
+def prepareFileExternal(fileName, content):
+ if content.find('\t') != -1:
+ test.fatal("Tabs present before edit (%s)." % fileName)
+ modifiedContent = ''
+ emptyLine = trailingWS = False
+ lines = content.splitlines(True)
+
+ for currentLine in lines:
+ if not emptyLine:
+ if len(currentLine) == 1: # just the line break
+ currentLine = TripleTab + '\n'
+ emptyLine = True
+ test.log("Replaced empty line by 3 tabs.")
+ elif not trailingWS:
+ if re.match(r"^.*\S+.*$", currentLine) is not None:
+ currentLine = currentLine[:-1] + TabBlankTab + '\n'
+ trailingWS = True
+ test.log("Added trailing whitespace.")
+ modifiedContent += currentLine
+
+ with open(fileName, "w") as f:
+ f.write(modifiedContent)
+
+ if not emptyLine or not trailingWS:
+ test.warning("Could not completely prepare test file %s." % fileName)
+ return modifiedContent, emptyLine, trailingWS
+
+
+def isIgnoredFile(fileName, ignoredFiles):
+ for filePattern in ignoredFiles:
+ pattern = filePattern.replace('.', r'\.')
+ pattern = pattern.replace('*', '.*')
+ pattern = pattern.replace('?', '.')
+ pattern = '^' + pattern + '$'
+ if re.match(pattern, fileName) is not None:
+ return True
+ return False
+
+
+def ignoredFilesFromSettings():
+ invokeMenuItem("Tools", "Options...")
+ mouseClick(waitForObjectItem(":Options_QListView", "Text Editor"))
+ waitForObject("{container=':Options.qt_tabwidget_tabbar_QTabBar' type='TabItem' "
+ "text='Behavior'}")
+ clickOnTab(":Options.qt_tabwidget_tabbar_QTabBar", "Behavior")
+ ensureChecked("{type='QCheckBox' name='skipTrailingWhitespace'}")
+ ignoredLineEdit = waitForObject("{type='QLineEdit' name='ignoreFileTypes'}")
+ ignoredFiles = str(ignoredLineEdit.text).split(',')
+ test.log("Ignored files: %s" % str(ignoredFiles))
+ clickButton(":Options.Cancel_QPushButton")
+ return ignoredFiles