diff options
author | Christian Stenger <christian.stenger@qt.io> | 2020-09-07 14:23:35 +0200 |
---|---|---|
committer | Christian Stenger <christian.stenger@qt.io> | 2020-10-02 14:59:00 +0000 |
commit | a37a02a6b36232a46ec0e446239c09598c0b3aad (patch) | |
tree | 9640fbfbf0bfd12c0aedfe15a4907482682d8200 | |
parent | 46a9e35c28db013e4e4c7a0f352e870d1a344546 (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.conf | 2 | ||||
-rw-r--r-- | tests/system/suite_editors/tst_clean_whitespaces/test.py | 144 |
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 |