forked from qt-creator/qt-creator
Squish: Add test for clean whitespaces
Task-number: QTCREATORBUG-24565 Change-Id: Idd763004f6ce9f1d34b902ea2fcf5c166ce8d4cf Reviewed-by: Robert Loehning <robert.loehning@qt.io>
This commit is contained in:
@@ -7,6 +7,6 @@ HOOK_SUB_PROCESSES=false
|
|||||||
IMPLICITAUTSTART=0
|
IMPLICITAUTSTART=0
|
||||||
LANGUAGE=Python
|
LANGUAGE=Python
|
||||||
OBJECTMAP=../objects.map
|
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
|
VERSION=2
|
||||||
WRAPPERS=Qt
|
WRAPPERS=Qt
|
||||||
|
144
tests/system/suite_editors/tst_clean_whitespaces/test.py
Normal file
144
tests/system/suite_editors/tst_clean_whitespaces/test.py
Normal file
@@ -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
|
Reference in New Issue
Block a user