Commit b58dadfe authored by Robert Loehning's avatar Robert Loehning

Squish: Enclose code model tests in sections

Change-Id: I4478acfc5ea7b3fa22d1cd17576e04fdda81dbb9
Reviewed-by: Christian Stenger's avatarChristian Stenger <christian.stenger@qt.io>
parent 2760b9fc
...@@ -2,7 +2,7 @@ Prerequisites - general information ...@@ -2,7 +2,7 @@ Prerequisites - general information
----------------------------------- -----------------------------------
Squish tests inside this folder have several prerequisites to get them running. Squish tests inside this folder have several prerequisites to get them running.
First - and most important - you have to own a valid Squish license. Currently it's recommended to use Squish 6.0. First - and most important - you have to own a valid Squish license. At least Squish 6.0 is required.
Second - some of the test suites/test cases expect a build of Qt 4.8.7 to be available: Second - some of the test suites/test cases expect a build of Qt 4.8.7 to be available:
1. Download the source code from: 1. Download the source code from:
......
...@@ -61,11 +61,13 @@ def __openCodeModelOptions__(): ...@@ -61,11 +61,13 @@ def __openCodeModelOptions__():
clickItem(":Options_QListView", "C++", 14, 15, 0, Qt.LeftButton) clickItem(":Options_QListView", "C++", 14, 15, 0, Qt.LeftButton)
clickOnTab(":Options.qt_tabwidget_tabbar_QTabBar", "Code Model") clickOnTab(":Options.qt_tabwidget_tabbar_QTabBar", "Code Model")
def checkCodeModelSettings(useClang): def getCodeModelString(useClang):
codeModelName = "built-in" codeModelName = "built-in"
if useClang: if useClang:
codeModelName = "Clang" codeModelName = "Clang"
test.log("Testing code model: %s" % codeModelName) return "Testing code model: %s" % codeModelName
def checkCodeModelSettings(useClang):
__openCodeModelOptions__() __openCodeModelOptions__()
test.verify(verifyChecked("{name='ignorePCHCheckBox' type='QCheckBox' visible='1'}"), test.verify(verifyChecked("{name='ignorePCHCheckBox' type='QCheckBox' visible='1'}"),
"Verifying whether 'Ignore pre-compiled headers' is checked by default.") "Verifying whether 'Ignore pre-compiled headers' is checked by default.")
......
...@@ -231,3 +231,13 @@ class Qt5Path: ...@@ -231,3 +231,13 @@ class Qt5Path:
path = "Docs/Qt-5.%d" % qtMinorVersion path = "Docs/Qt-5.%d" % qtMinorVersion
return os.path.join(Qt5Path.__createPlatformQtPath__(qtMinorVersion), path) return os.path.join(Qt5Path.__createPlatformQtPath__(qtMinorVersion), path)
class TestSection:
def __init__(self, description):
self.description = description
def __enter__(self):
test.startSection(self.description)
def __exit__(self, exc_type, exc_value, traceback):
test.endSection()
...@@ -44,89 +44,90 @@ def triggerCompletion(editorWidget): ...@@ -44,89 +44,90 @@ def triggerCompletion(editorWidget):
# entry of test # entry of test
def main(): def main():
for useClang in [False, True]: for useClang in [False, True]:
if not startCreator(useClang): with TestSection(getCodeModelString(useClang)):
continue if not startCreator(useClang):
# create qt quick application continue
# create qt quick application
# Step 1: Open test .pro project. # Step 1: Open test .pro project.
createNewQtQuickApplication(tempDir(), "SampleApp") createNewQtQuickApplication(tempDir(), "SampleApp")
checkCodeModelSettings(useClang) checkCodeModelSettings(useClang)
changeAutocompleteToManual(False) changeAutocompleteToManual(False)
# Step 2: Open .cpp file in Edit mode. # Step 2: Open .cpp file in Edit mode.
if not openDocument("SampleApp.Sources.main\\.cpp"): if not openDocument("SampleApp.Sources.main\\.cpp"):
test.fatal("Could not open main.cpp") test.fatal("Could not open main.cpp")
invokeMenuItem("File", "Exit") invokeMenuItem("File", "Exit")
return return
test.verify(checkIfObjectExists(":Qt Creator_CppEditor::Internal::CPPEditorWidget"), test.verify(checkIfObjectExists(":Qt Creator_CppEditor::Internal::CPPEditorWidget"),
"Step 2: Verifying if: .cpp file is opened in Edit mode.") "Step 2: Verifying if: .cpp file is opened in Edit mode.")
# Step 3: Insert text "re" to new line in Editor mode and press Ctrl+Space. # Step 3: Insert text "re" to new line in Editor mode and press Ctrl+Space.
editorWidget = findObject(":Qt Creator_CppEditor::Internal::CPPEditorWidget") editorWidget = findObject(":Qt Creator_CppEditor::Internal::CPPEditorWidget")
if not placeCursorToLine(editorWidget, "QGuiApplication app(argc, argv);"): if not placeCursorToLine(editorWidget, "QGuiApplication app(argc, argv);"):
earlyExit("Did not find first line in function block.") earlyExit("Did not find first line in function block.")
return return
type(editorWidget, "<Return>") type(editorWidget, "<Return>")
type(editorWidget, "re") type(editorWidget, "re")
triggerCompletion(editorWidget) triggerCompletion(editorWidget)
functionName = "realpath" functionName = "realpath"
if platform.system() in ('Windows', 'Microsoft'): if platform.system() in ('Windows', 'Microsoft'):
functionName = "realloc" functionName = "realloc"
waitForObjectItem(":popupFrame_Proposal_QListView", functionName) waitForObjectItem(":popupFrame_Proposal_QListView", functionName)
doubleClickItem(":popupFrame_Proposal_QListView", functionName, 5, 5, 0, Qt.LeftButton) doubleClickItem(":popupFrame_Proposal_QListView", functionName, 5, 5, 0, Qt.LeftButton)
test.compare(str(lineUnderCursor(editorWidget)).strip(), functionName + "()", test.compare(str(lineUnderCursor(editorWidget)).strip(), functionName + "()",
"Step 3: Verifying if: The list of suggestions is opened. It is " "Step 3: Verifying if: The list of suggestions is opened. It is "
"possible to select one of the suggestions.") "possible to select one of the suggestions.")
# Step 4: Insert text "voi" to new line and press Tab. # Step 4: Insert text "voi" to new line and press Tab.
resetLine(editorWidget) resetLine(editorWidget)
type(editorWidget, "voi") type(editorWidget, "voi")
try: try:
waitForObjectItem(":popupFrame_Proposal_QListView", "void") waitForObjectItem(":popupFrame_Proposal_QListView", "void")
type(waitForObject(":popupFrame_Proposal_QListView"), "<Tab>") type(waitForObject(":popupFrame_Proposal_QListView"), "<Tab>")
test.compare(str(lineUnderCursor(editorWidget)).strip(), "void", test.compare(str(lineUnderCursor(editorWidget)).strip(), "void",
"Step 4: Verifying if: Word 'void' is completed because only one option is available.") "Step 4: Verifying if: Word 'void' is completed because only one option is available.")
except: except:
test.fail("The expected completion popup was not shown.") test.fail("The expected completion popup was not shown.")
# Step 4.5: Insert text "2." to new line and verify that code completion is not triggered (QTCREATORBUG-16188) # Step 4.5: Insert text "2." to new line and verify that code completion is not triggered (QTCREATORBUG-16188)
resetLine(editorWidget) resetLine(editorWidget)
lineWithFloat = "float fl = 2." lineWithFloat = "float fl = 2."
type(editorWidget, lineWithFloat) type(editorWidget, lineWithFloat)
try: try:
waitForObject(":popupFrame_Proposal_QListView", 5000) waitForObject(":popupFrame_Proposal_QListView", 5000)
test.fail("Typing a float value triggered code completion") test.fail("Typing a float value triggered code completion")
except: except:
test.compare(str(lineUnderCursor(editorWidget)), " " + lineWithFloat, test.compare(str(lineUnderCursor(editorWidget)), " " + lineWithFloat,
"Typing a float value does not trigger code completion") "Typing a float value does not trigger code completion")
triggerCompletion(editorWidget) triggerCompletion(editorWidget)
try: try:
waitForObject(":popupFrame_Proposal_QListView", 5000) waitForObject(":popupFrame_Proposal_QListView", 5000)
if useClang and JIRA.isBugStillOpen(16607): if useClang and JIRA.isBugStillOpen(16607):
test.xfail("User can trigger code completion manually in a float value") test.xfail("User can trigger code completion manually in a float value")
else: else:
test.fail("User can trigger code completion manually in a float value") test.fail("User can trigger code completion manually in a float value")
except: except:
test.passes("User can't trigger code completion manually in a float value") test.passes("User can't trigger code completion manually in a float value")
# Step 5: From "Tools -> Options -> Text Editor -> Completion" select Activate completion Manually, # Step 5: From "Tools -> Options -> Text Editor -> Completion" select Activate completion Manually,
# uncheck Autocomplete common prefix and press Apply and then Ok . Return to Edit mode. # uncheck Autocomplete common prefix and press Apply and then Ok . Return to Edit mode.
test.log("Step 5: Change Code Completion settings") test.log("Step 5: Change Code Completion settings")
changeAutocompleteToManual() changeAutocompleteToManual()
# Step 6: Insert text "ret" and press Ctrl+Space. # Step 6: Insert text "ret" and press Ctrl+Space.
editorWidget = waitForObject(":Qt Creator_CppEditor::Internal::CPPEditorWidget") editorWidget = waitForObject(":Qt Creator_CppEditor::Internal::CPPEditorWidget")
resetLine(editorWidget) resetLine(editorWidget)
type(editorWidget, "retu") type(editorWidget, "retu")
triggerCompletion(editorWidget) triggerCompletion(editorWidget)
try: try:
proposal = "return" proposal = "return"
if useClang: if useClang:
# clang adds a whitespace because the function needs to return a value # clang adds a whitespace because the function needs to return a value
proposal += " " proposal += " "
waitForObjectItem(":popupFrame_Proposal_QListView", proposal) waitForObjectItem(":popupFrame_Proposal_QListView", proposal)
except: except:
test.fail("Could not find proposal popup.") test.fail("Could not find proposal popup.")
type(editorWidget, "<Right>") type(editorWidget, "<Right>")
type(editorWidget, "<Backspace>") type(editorWidget, "<Backspace>")
test.compare(str(lineUnderCursor(editorWidget)).strip(), "retu", test.compare(str(lineUnderCursor(editorWidget)).strip(), "retu",
"Step 6: Verifying if: Suggestion is displayed but text is not " "Step 6: Verifying if: Suggestion is displayed but text is not "
"completed automatically even there is only one suggestion.") "completed automatically even there is only one suggestion.")
invokeMenuItem('File', 'Revert "main.cpp" to Saved') invokeMenuItem('File', 'Revert "main.cpp" to Saved')
clickButton(waitForObject(":Revert to Saved.Proceed_QPushButton")) clickButton(waitForObject(":Revert to Saved.Proceed_QPushButton"))
# exit qt creator # exit qt creator
invokeMenuItem("File", "Save All") invokeMenuItem("File", "Save All")
invokeMenuItem("File", "Exit") invokeMenuItem("File", "Exit")
...@@ -28,61 +28,62 @@ source("../../shared/qtcreator.py") ...@@ -28,61 +28,62 @@ source("../../shared/qtcreator.py")
# entry of test # entry of test
def main(): def main():
for useClang in [False, True]: for useClang in [False, True]:
if not startCreator(useClang): with TestSection(getCodeModelString(useClang)):
continue if not startCreator(useClang):
# create qt quick application continue
# create qt quick application
# Step 1: Open test .pro project. # Step 1: Open test .pro project.
createNewQtQuickApplication(tempDir(), "SampleApp") createNewQtQuickApplication(tempDir(), "SampleApp")
checkCodeModelSettings(useClang) checkCodeModelSettings(useClang)
# Step 2: Open .cpp file in Edit mode. # Step 2: Open .cpp file in Edit mode.
if not openDocument("SampleApp.Sources.main\\.cpp"): if not openDocument("SampleApp.Sources.main\\.cpp"):
test.fatal("Could not open main.cpp") test.fatal("Could not open main.cpp")
invokeMenuItem("File", "Exit") invokeMenuItem("File", "Exit")
return return
test.verify(checkIfObjectExists(":Qt Creator_CppEditor::Internal::CPPEditorWidget"), test.verify(checkIfObjectExists(":Qt Creator_CppEditor::Internal::CPPEditorWidget"),
"Step 2: Verifying if: .cpp file is opened in Edit mode.") "Step 2: Verifying if: .cpp file is opened in Edit mode.")
# Steps 3&4: Insert text "class" to new line in Editor mode and press Ctrl+Space. # Steps 3&4: Insert text "class" to new line in Editor mode and press Ctrl+Space.
# Focus "class derived from QObject" in the list and press Tab or Enter to complete the code. # Focus "class derived from QObject" in the list and press Tab or Enter to complete the code.
editorWidget = findObject(":Qt Creator_CppEditor::Internal::CPPEditorWidget") editorWidget = findObject(":Qt Creator_CppEditor::Internal::CPPEditorWidget")
mouseClick(editorWidget, 5, 5, 0, Qt.LeftButton) mouseClick(editorWidget, 5, 5, 0, Qt.LeftButton)
type(editorWidget, "<Return>") type(editorWidget, "<Return>")
type(editorWidget, "<Up>") type(editorWidget, "<Up>")
type(editorWidget, "class") type(editorWidget, "class")
if useClang and JIRA.isBugStillOpen(18769): if useClang and JIRA.isBugStillOpen(18769):
snooze(4) snooze(4)
if platform.system() == "Darwin": if platform.system() == "Darwin":
type(editorWidget, "<Meta+Space>") type(editorWidget, "<Meta+Space>")
else: else:
type(editorWidget, "<Ctrl+Space>") type(editorWidget, "<Ctrl+Space>")
listView = waitForObject(":popupFrame_Proposal_QListView") listView = waitForObject(":popupFrame_Proposal_QListView")
shownProposals = dumpItems(listView.model()) shownProposals = dumpItems(listView.model())
usedProposal = "class derived from QObject" usedProposal = "class derived from QObject"
expectedProposals = ["class", "class ", "class template", expectedProposals = ["class", "class ", "class template",
usedProposal, "class derived from QWidget"] usedProposal, "class derived from QWidget"]
test.compare(len(shownProposals), len(expectedProposals), "Number of proposed templates") test.compare(len(shownProposals), len(expectedProposals), "Number of proposed templates")
test.compare(set(shownProposals), set(expectedProposals), test.compare(set(shownProposals), set(expectedProposals),
"Expected proposals shown, ignoring order?") "Expected proposals shown, ignoring order?")
doubleClickItem(listView, usedProposal, 5, 5, 0, Qt.LeftButton) doubleClickItem(listView, usedProposal, 5, 5, 0, Qt.LeftButton)
pattern = ("(?<=class)\s+name\s*:\s*public\s+QObject\s*\{\s*Q_OBJECT\s+" pattern = ("(?<=class)\s+name\s*:\s*public\s+QObject\s*\{\s*Q_OBJECT\s+"
"public:\s+name\(\)\s*\{\}\s+virtual\s+~name\(\)\s*\{\}\s+\};") "public:\s+name\(\)\s*\{\}\s+virtual\s+~name\(\)\s*\{\}\s+\};")
test.verify(re.search(pattern, str(editorWidget.plainText)), test.verify(re.search(pattern, str(editorWidget.plainText)),
"Code with several variables is inserted?") "Code with several variables is inserted?")
# Step 5: Press Tab to move between the variables and specify values for them. For example write "Myname" for variable "name". # Step 5: Press Tab to move between the variables and specify values for them. For example write "Myname" for variable "name".
type(editorWidget, "<Tab>") type(editorWidget, "<Tab>")
type(editorWidget, "<Tab>") type(editorWidget, "<Tab>")
type(editorWidget, "<Tab>") type(editorWidget, "<Tab>")
type(editorWidget, "Myname") type(editorWidget, "Myname")
result = re.search(pattern.replace("name", "Myname"), str(editorWidget.plainText)) result = re.search(pattern.replace("name", "Myname"), str(editorWidget.plainText))
if result: if result:
test.passes("Step 5: Verifying if: A value for a variable is inserted and all " test.passes("Step 5: Verifying if: A value for a variable is inserted and all "
"instances of the variable within the snippet are renamed.") "instances of the variable within the snippet are renamed.")
else: else:
test.fail("Step 5: Seems that not all instances of variable had been renamed " test.fail("Step 5: Seems that not all instances of variable had been renamed "
"- Content of editor:\n%s" % editorWidget.plainText) "- Content of editor:\n%s" % editorWidget.plainText)
invokeMenuItem('File', 'Revert "main.cpp" to Saved') invokeMenuItem('File', 'Revert "main.cpp" to Saved')
clickButton(waitForObject(":Revert to Saved.Proceed_QPushButton")) clickButton(waitForObject(":Revert to Saved.Proceed_QPushButton"))
snooze(1) # 'Close "main.cpp"' might still be disabled snooze(1) # 'Close "main.cpp"' might still be disabled
# editor must be closed to get the second code model applied on re-opening the file # editor must be closed to get the second code model applied on re-opening the file
invokeMenuItem('File', 'Close "main.cpp"') invokeMenuItem('File', 'Close "main.cpp"')
# exit qt creator # exit qt creator
invokeMenuItem("File", "Exit") invokeMenuItem("File", "Exit")
...@@ -76,44 +76,45 @@ def main(): ...@@ -76,44 +76,45 @@ def main():
"do while" : ["", "int dummy = 0;", "do", "++dummy;", "while (dummy < 10);"] "do while" : ["", "int dummy = 0;", "do", "++dummy;", "while (dummy < 10);"]
} }
for useClang in [False, True]: for useClang in [False, True]:
if not startCreator(useClang): with TestSection(getCodeModelString(useClang)):
continue if not startCreator(useClang):
projectName = createNewNonQtProject()
checkCodeModelSettings(useClang)
openDocument("%s.Sources.main\\.cpp" % projectName)
editor = getEditorForFileSuffix("main.cpp")
if not editor:
test.fatal("Failed to get an editor - leaving test.")
invokeMenuItem("File", "Exit")
return
originalContent = str(editor.plainText)
for case, codeLines in code.items():
funcSuffix = case.title().replace(" ", "")
test.log("Testing: Extract Function for '%s'" % case)
if not placeCursorToLine(editor, "{"):
continue continue
typeLines(editor, codeLines) projectName = createNewNonQtProject()
if not placeCursorToLine(editor, codeLines[2]): checkCodeModelSettings(useClang)
openDocument("%s.Sources.main\\.cpp" % projectName)
editor = getEditorForFileSuffix("main.cpp")
if not editor:
test.fatal("Failed to get an editor - leaving test.")
invokeMenuItem("File", "Exit")
return
originalContent = str(editor.plainText)
for case, codeLines in code.items():
funcSuffix = case.title().replace(" ", "")
test.log("Testing: Extract Function for '%s'" % case)
if not placeCursorToLine(editor, "{"):
continue
typeLines(editor, codeLines)
if not placeCursorToLine(editor, codeLines[2]):
revertMainCpp()
continue
type(editor, home)
markText(editor, "Right", 2)
snooze(1) # avoid timing issue with the parser
invokeContextMenuItem(editor, 'Refactor', 'Extract Function')
funcEdit = waitForObject("{buddy={text='Function name' type='QLabel' unnamed='1' "
"visible='1' window=%s} type='Utils::FancyLineEdit' "
"unnamed='1' visible='1'}" % inputDialog)
replaceEditorContent(funcEdit, "myFunc%s" % funcSuffix)
clickButton(waitForObject("{text='OK' type='QPushButton' unnamed='1' visible='1' window=%s}"
% inputDialog))
waitFor("'void myFunc%s' in str(editor.plainText)" % funcSuffix, 2500)
# verify the change
modifiedCode = str(editor.plainText)
expectedCode = constructExpectedCode(originalContent, codeLines, funcSuffix)
test.compare(modifiedCode, expectedCode, "Verifying whether code matches expected.")
# reverting to initial state of main.cpp
revertMainCpp() revertMainCpp()
continue snooze(1) # "Close All" might be disabled
type(editor, home) invokeMenuItem('File', 'Close All')
markText(editor, "Right", 2) invokeMenuItem('File', 'Exit')
snooze(1) # avoid timing issue with the parser
invokeContextMenuItem(editor, 'Refactor', 'Extract Function')
funcEdit = waitForObject("{buddy={text='Function name' type='QLabel' unnamed='1' "
"visible='1' window=%s} type='Utils::FancyLineEdit' "
"unnamed='1' visible='1'}" % inputDialog)
replaceEditorContent(funcEdit, "myFunc%s" % funcSuffix)
clickButton(waitForObject("{text='OK' type='QPushButton' unnamed='1' visible='1' window=%s}"
% inputDialog))
waitFor("'void myFunc%s' in str(editor.plainText)" % funcSuffix, 2500)
# verify the change
modifiedCode = str(editor.plainText)
expectedCode = constructExpectedCode(originalContent, codeLines, funcSuffix)
test.compare(modifiedCode, expectedCode, "Verifying whether code matches expected.")
# reverting to initial state of main.cpp
revertMainCpp()
snooze(1) # "Close All" might be disabled
invokeMenuItem('File', 'Close All')
invokeMenuItem('File', 'Exit')
...@@ -36,41 +36,42 @@ def main(): ...@@ -36,41 +36,42 @@ def main():
templateDir = prepareTemplate(sourceExample) templateDir = prepareTemplate(sourceExample)
examplePath = os.path.join(templateDir, proFile) examplePath = os.path.join(templateDir, proFile)
for useClang in [False, True]: for useClang in [False, True]:
if not startCreator(useClang): with TestSection(getCodeModelString(useClang)):
continue if not startCreator(useClang):
# open example project continue
openQmakeProject(examplePath) # open example project
# wait for parsing to complete openQmakeProject(examplePath)
progressBarWait(30000) # wait for parsing to complete
checkCodeModelSettings(useClang) progressBarWait(30000)
# open .cpp file in editor checkCodeModelSettings(useClang)
if not openDocument("property-animation.Sources.main\\.cpp"): # open .cpp file in editor
test.fatal("Could not open main.cpp") if not openDocument("property-animation.Sources.main\\.cpp"):
test.fatal("Could not open main.cpp")
invokeMenuItem("File", "Exit")
return
test.verify(checkIfObjectExists(":Qt Creator_CppEditor::Internal::CPPEditorWidget"),
"Verifying if: .cpp file is opened in Edit mode.")
# place cursor on line "QmlApplicationViewer viewer;"
editorWidget = findObject(":Qt Creator_CppEditor::Internal::CPPEditorWidget")
# invoke find usages from context menu on word "viewer"
if not invokeFindUsage(editorWidget, "QmlApplicationViewer viewer;", "<Left>", 10):
invokeMenuItem("File", "Exit")
return
# wait until search finished and verify search results
waitForSearchResults()
validateSearchResult(21)
result = re.search("QmlApplicationViewer", str(editorWidget.plainText))
test.verify(result, "Verifying if: The list of all usages of the selected text is displayed in Search Results. "
"File with used text is opened.")
# move cursor to the other word and test Find Usages function by pressing Ctrl+Shift+U.
openDocument("property-animation.Sources.main\\.cpp")
if not placeCursorToLine(editorWidget, "viewer.setOrientation(QmlApplicationViewer::ScreenOrientationAuto);"):
return
for i in range(4):
type(editorWidget, "<Left>")
type(editorWidget, "<Ctrl+Shift+u>")
# wait until search finished and verify search results
waitForSearchResults()
validateSearchResult(3)
invokeMenuItem("File", "Close All")
invokeMenuItem("File", "Exit") invokeMenuItem("File", "Exit")
return
test.verify(checkIfObjectExists(":Qt Creator_CppEditor::Internal::CPPEditorWidget"),
"Verifying if: .cpp file is opened in Edit mode.")
# place cursor on line "QmlApplicationViewer viewer;"
editorWidget = findObject(":Qt Creator_CppEditor::Internal::CPPEditorWidget")
# invoke find usages from context menu on word "viewer"
if not invokeFindUsage(editorWidget, "QmlApplicationViewer viewer;", "<Left>", 10):
invokeMenuItem("File", "Exit")
return
# wait until search finished and verify search results
waitForSearchResults()
validateSearchResult(21)
result = re.search("QmlApplicationViewer", str(editorWidget.plainText))
test.verify(result, "Verifying if: The list of all usages of the selected text is displayed in Search Results. "
"File with used text is opened.")
# move cursor to the other word and test Find Usages function by pressing Ctrl+Shift+U.
openDocument("property-animation.Sources.main\\.cpp")
if not placeCursorToLine(editorWidget, "viewer.setOrientation(QmlApplicationViewer::ScreenOrientationAuto);"):
return
for i in range(4):
type(editorWidget, "<Left>")
type(editorWidget, "<Ctrl+Shift+u>")
# wait until search finished and verify search results
waitForSearchResults()
validateSearchResult(3)
invokeMenuItem("File", "Close All")
invokeMenuItem("File", "Exit")
...@@ -36,59 +36,60 @@ def main(): ...@@ -36,59 +36,60 @@ def main():
templateDir = prepareTemplate(sourceExample) templateDir = prepareTemplate(sourceExample)
examplePath = os.path.join(templateDir, proFile) examplePath = os.path.join(templateDir, proFile)
for useClang in [False, True]: for useClang in [False, True]:
if not startCreator(useClang): with TestSection(getCodeModelString(useClang)):
continue if not startCreator(useClang):
# open example project continue
openQmakeProject(examplePath) # open example project
# wait for parsing to complete openQmakeProject(examplePath)
progressBarWait(30000) # wait for parsing to complete
checkCodeModelSettings(useClang) progressBarWait(30000)
# open .cpp file in editor checkCodeModelSettings(useClang)
if not openDocument("property-animation.Sources.main\\.cpp"): # open .cpp file in editor
test.fatal("Could not open main.cpp") if not openDocument("property-animation.Sources.main\\.cpp"):
invokeMenuItem("File", "Exit") test.fatal("Could not open main.cpp")
return invokeMenuItem("File", "Exit")
test.verify(checkIfObjectExists(":Qt Creator_CppEditor::Internal::CPPEditorWidget"), return
"Verifying if: .cpp file is opened in Edit mode.") test.verify(checkIfObjectExists(":Qt Creator_CppEditor::Internal::CPPEditorWidget"),
# select some word for example "viewer" and press Ctrl+F. "Verifying if: .cpp file is opened in Edit mode.")
editorWidget = findObject(":Qt Creator_CppEditor::Internal::CPPEditorWidget") # select some word for example "viewer" and press Ctrl+F.
if not placeCursorToLine(editorWidget, "QmlApplicationViewer viewer;"): editorWidget = findObject(":Qt Creator_CppEditor::Internal::CPPEditorWidget")
invokeMenuItem("File", "Exit") if not placeCursorToLine(editorWidget, "QmlApplicationViewer viewer;"):
return invokeMenuItem("File", "Exit")
type(editorWidget, "<Left>") return
markText(editorWidget, "Left", 6)
type(editorWidget, "<Ctrl+f>")
# verify if find toolbar exists and if search text contains selected word
test.verify(checkIfObjectExists(":*Qt Creator.Find_Find::Internal::FindToolBar"),
"Verifying if: Find/Replace pane is displayed at the bottom of the view.")
test.compare(waitForObject(":*Qt Creator.findEdit_Utils::FilterLineEdit").displayText, "viewer",
"Verifying if: Find line edit contains 'viewer' text.")
# insert some word to "Replace with:" field and select "Replace All".
replaceEditorContent(waitForObject(":Qt Creator.replaceEdit_Utils::FilterLineEdit"), "find")
oldCodeText = str(editorWidget.plainText)
clickButton(waitForObject(":Qt Creator.Replace All_QToolButton"))
mouseClick(waitForObject(":Qt Creator.replaceEdit_Utils::FilterLineEdit"), 5, 5, 0, Qt.LeftButton)
newCodeText = str(editorWidget.plainText)
test.compare(newCodeText, oldCodeText.replace("viewer", "find").replace("Viewer", "find"),
"Verifying if: Found text is replaced with new word properly.")
# select some other word in .cpp file and select "Edit" -> "Find/Replace".
clickButton(waitForObject(":Qt Creator.CloseFind_QToolButton"))
placeCursorToLine(editorWidget, "find.setOrientation(QmlApplicationfind::ScreenOrientationAuto);")
for i in range(25):
type(editorWidget, "<Left>") type(editorWidget, "<Left>")
markText(editorWidget, "Left", 18) markText(editorWidget, "Left", 6)
invokeMenuItem("Edit", "Find/Replace", "Find/Replace") type(editorWidget, "<Ctrl+f>")
replaceEditorContent(waitForObject(":Qt Creator.replaceEdit_Utils::FilterLineEdit"), "QmlApplicationViewer") # verify if find toolbar exists and if search text contains selected word
oldCodeText = str(editorWidget.plainText) test.verify(checkIfObjectExists(":*Qt Creator.Find_Find::Internal::FindToolBar"),
clickButton(waitForObject(":Qt Creator.Replace_QToolButton")) "Verifying if: Find/Replace pane is displayed at the bottom of the view.")
newCodeText = str(editorWidget.plainText) test.compare(waitForObject(":*Qt Creator.findEdit_Utils::FilterLineEdit").displayText, "viewer",
# "::" is used to replace only one occurrence by python "Verifying if: Find line edit contains 'viewer' text.")
test.compare(newCodeText, oldCodeText.replace("QmlApplicationfind::", "QmlApplicationViewer::"), # insert some word to "Replace with:" field and select "Replace All".
"Verifying if: Only selected word is replaced, the rest of found words are not replaced.") replaceEditorContent(waitForObject(":Qt Creator.replaceEdit_Utils::FilterLineEdit"), "find")
# close Find/Replace tab. oldCodeText = str(editorWidget.plainText)
clickButton(waitForObject(":Qt Creator.CloseFind_QToolButton")) clickButton(waitForObject(":Qt Creator.Replace All_QToolButton"))
test.verify(checkIfObjectExists(":*Qt Creator.Find_Find::Internal::FindToolBar", False), mouseClick(waitForObject(":Qt Creator.replaceEdit_Utils::FilterLineEdit"), 5, 5, 0, Qt.LeftButton)
"Verifying if: Find/Replace tab is closed.") newCodeText = str(editorWidget.plainText)
invokeMenuItem("File", "Close All") test.compare(newCodeText, oldCodeText.replace("viewer", "find").replace("Viewer", "find"),
clickButton(waitForObject(":Save Changes.Do not Save_QPushButton")) "Verifying if: Found text is replaced with new word properly.")
invokeMenuItem("File", "Exit") # select some other word in .cpp file and select "Edit" -> "Find/Replace".
clickButton(waitForObject(":Qt Creator.CloseFind_QToolButton"))
placeCursorToLine(editorWidget, "find.setOrientation(QmlApplicationfind::ScreenOrientationAuto);")
for i in range(25):
type(editorWidget, "<Left>")
markText(editorWidget, "Left", 18)
invokeMenuItem("Edit", "Find/Replace", "Find/Replace")
replaceEditorContent(waitForObject(":Qt Creator.replaceEdit_Utils::FilterLineEdit"), "QmlApplicationViewer")
oldCodeText = str(editorWidget.plainText)
clickButton(waitForObject(":Qt Creator.Replace_QToolButton"))
newCodeText = str(editorWidget.plainText)
# "::" is used to replace only one occurrence by python