forked from qt-creator/qt-creator
Squish: Enclose code model tests in sections
Change-Id: I4478acfc5ea7b3fa22d1cd17576e04fdda81dbb9 Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
@@ -2,7 +2,7 @@ Prerequisites - general information
|
||||
-----------------------------------
|
||||
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:
|
||||
1. Download the source code from:
|
||||
|
@@ -61,11 +61,13 @@ def __openCodeModelOptions__():
|
||||
clickItem(":Options_QListView", "C++", 14, 15, 0, Qt.LeftButton)
|
||||
clickOnTab(":Options.qt_tabwidget_tabbar_QTabBar", "Code Model")
|
||||
|
||||
def checkCodeModelSettings(useClang):
|
||||
def getCodeModelString(useClang):
|
||||
codeModelName = "built-in"
|
||||
if useClang:
|
||||
codeModelName = "Clang"
|
||||
test.log("Testing code model: %s" % codeModelName)
|
||||
return "Testing code model: %s" % codeModelName
|
||||
|
||||
def checkCodeModelSettings(useClang):
|
||||
__openCodeModelOptions__()
|
||||
test.verify(verifyChecked("{name='ignorePCHCheckBox' type='QCheckBox' visible='1'}"),
|
||||
"Verifying whether 'Ignore pre-compiled headers' is checked by default.")
|
||||
|
@@ -231,3 +231,13 @@ class Qt5Path:
|
||||
path = "Docs/Qt-5.%d" % qtMinorVersion
|
||||
|
||||
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):
|
||||
# entry of test
|
||||
def main():
|
||||
for useClang in [False, True]:
|
||||
if not startCreator(useClang):
|
||||
continue
|
||||
# create qt quick application
|
||||
with TestSection(getCodeModelString(useClang)):
|
||||
if not startCreator(useClang):
|
||||
continue
|
||||
# create qt quick application
|
||||
# Step 1: Open test .pro project.
|
||||
createNewQtQuickApplication(tempDir(), "SampleApp")
|
||||
checkCodeModelSettings(useClang)
|
||||
changeAutocompleteToManual(False)
|
||||
createNewQtQuickApplication(tempDir(), "SampleApp")
|
||||
checkCodeModelSettings(useClang)
|
||||
changeAutocompleteToManual(False)
|
||||
# Step 2: Open .cpp file in Edit mode.
|
||||
if not openDocument("SampleApp.Sources.main\\.cpp"):
|
||||
test.fatal("Could not open main.cpp")
|
||||
invokeMenuItem("File", "Exit")
|
||||
return
|
||||
test.verify(checkIfObjectExists(":Qt Creator_CppEditor::Internal::CPPEditorWidget"),
|
||||
"Step 2: Verifying if: .cpp file is opened in Edit mode.")
|
||||
if not openDocument("SampleApp.Sources.main\\.cpp"):
|
||||
test.fatal("Could not open main.cpp")
|
||||
invokeMenuItem("File", "Exit")
|
||||
return
|
||||
test.verify(checkIfObjectExists(":Qt Creator_CppEditor::Internal::CPPEditorWidget"),
|
||||
"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.
|
||||
editorWidget = findObject(":Qt Creator_CppEditor::Internal::CPPEditorWidget")
|
||||
if not placeCursorToLine(editorWidget, "QGuiApplication app(argc, argv);"):
|
||||
earlyExit("Did not find first line in function block.")
|
||||
return
|
||||
type(editorWidget, "<Return>")
|
||||
type(editorWidget, "re")
|
||||
triggerCompletion(editorWidget)
|
||||
functionName = "realpath"
|
||||
if platform.system() in ('Windows', 'Microsoft'):
|
||||
functionName = "realloc"
|
||||
waitForObjectItem(":popupFrame_Proposal_QListView", functionName)
|
||||
doubleClickItem(":popupFrame_Proposal_QListView", functionName, 5, 5, 0, Qt.LeftButton)
|
||||
test.compare(str(lineUnderCursor(editorWidget)).strip(), functionName + "()",
|
||||
"Step 3: Verifying if: The list of suggestions is opened. It is "
|
||||
"possible to select one of the suggestions.")
|
||||
editorWidget = findObject(":Qt Creator_CppEditor::Internal::CPPEditorWidget")
|
||||
if not placeCursorToLine(editorWidget, "QGuiApplication app(argc, argv);"):
|
||||
earlyExit("Did not find first line in function block.")
|
||||
return
|
||||
type(editorWidget, "<Return>")
|
||||
type(editorWidget, "re")
|
||||
triggerCompletion(editorWidget)
|
||||
functionName = "realpath"
|
||||
if platform.system() in ('Windows', 'Microsoft'):
|
||||
functionName = "realloc"
|
||||
waitForObjectItem(":popupFrame_Proposal_QListView", functionName)
|
||||
doubleClickItem(":popupFrame_Proposal_QListView", functionName, 5, 5, 0, Qt.LeftButton)
|
||||
test.compare(str(lineUnderCursor(editorWidget)).strip(), functionName + "()",
|
||||
"Step 3: Verifying if: The list of suggestions is opened. It is "
|
||||
"possible to select one of the suggestions.")
|
||||
# Step 4: Insert text "voi" to new line and press Tab.
|
||||
resetLine(editorWidget)
|
||||
type(editorWidget, "voi")
|
||||
try:
|
||||
waitForObjectItem(":popupFrame_Proposal_QListView", "void")
|
||||
type(waitForObject(":popupFrame_Proposal_QListView"), "<Tab>")
|
||||
test.compare(str(lineUnderCursor(editorWidget)).strip(), "void",
|
||||
"Step 4: Verifying if: Word 'void' is completed because only one option is available.")
|
||||
except:
|
||||
test.fail("The expected completion popup was not shown.")
|
||||
resetLine(editorWidget)
|
||||
type(editorWidget, "voi")
|
||||
try:
|
||||
waitForObjectItem(":popupFrame_Proposal_QListView", "void")
|
||||
type(waitForObject(":popupFrame_Proposal_QListView"), "<Tab>")
|
||||
test.compare(str(lineUnderCursor(editorWidget)).strip(), "void",
|
||||
"Step 4: Verifying if: Word 'void' is completed because only one option is available.")
|
||||
except:
|
||||
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)
|
||||
resetLine(editorWidget)
|
||||
lineWithFloat = "float fl = 2."
|
||||
type(editorWidget, lineWithFloat)
|
||||
try:
|
||||
waitForObject(":popupFrame_Proposal_QListView", 5000)
|
||||
test.fail("Typing a float value triggered code completion")
|
||||
except:
|
||||
test.compare(str(lineUnderCursor(editorWidget)), " " + lineWithFloat,
|
||||
"Typing a float value does not trigger code completion")
|
||||
triggerCompletion(editorWidget)
|
||||
try:
|
||||
waitForObject(":popupFrame_Proposal_QListView", 5000)
|
||||
if useClang and JIRA.isBugStillOpen(16607):
|
||||
test.xfail("User can trigger code completion manually in a float value")
|
||||
else:
|
||||
test.fail("User can trigger code completion manually in a float value")
|
||||
except:
|
||||
test.passes("User can't trigger code completion manually in a float value")
|
||||
resetLine(editorWidget)
|
||||
lineWithFloat = "float fl = 2."
|
||||
type(editorWidget, lineWithFloat)
|
||||
try:
|
||||
waitForObject(":popupFrame_Proposal_QListView", 5000)
|
||||
test.fail("Typing a float value triggered code completion")
|
||||
except:
|
||||
test.compare(str(lineUnderCursor(editorWidget)), " " + lineWithFloat,
|
||||
"Typing a float value does not trigger code completion")
|
||||
triggerCompletion(editorWidget)
|
||||
try:
|
||||
waitForObject(":popupFrame_Proposal_QListView", 5000)
|
||||
if useClang and JIRA.isBugStillOpen(16607):
|
||||
test.xfail("User can trigger code completion manually in a float value")
|
||||
else:
|
||||
test.fail("User can trigger code completion manually in a float value")
|
||||
except:
|
||||
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,
|
||||
# uncheck Autocomplete common prefix and press Apply and then Ok . Return to Edit mode.
|
||||
test.log("Step 5: Change Code Completion settings")
|
||||
changeAutocompleteToManual()
|
||||
test.log("Step 5: Change Code Completion settings")
|
||||
changeAutocompleteToManual()
|
||||
# Step 6: Insert text "ret" and press Ctrl+Space.
|
||||
editorWidget = waitForObject(":Qt Creator_CppEditor::Internal::CPPEditorWidget")
|
||||
resetLine(editorWidget)
|
||||
type(editorWidget, "retu")
|
||||
triggerCompletion(editorWidget)
|
||||
try:
|
||||
proposal = "return"
|
||||
if useClang:
|
||||
# clang adds a whitespace because the function needs to return a value
|
||||
proposal += " "
|
||||
waitForObjectItem(":popupFrame_Proposal_QListView", proposal)
|
||||
except:
|
||||
test.fail("Could not find proposal popup.")
|
||||
type(editorWidget, "<Right>")
|
||||
type(editorWidget, "<Backspace>")
|
||||
test.compare(str(lineUnderCursor(editorWidget)).strip(), "retu",
|
||||
"Step 6: Verifying if: Suggestion is displayed but text is not "
|
||||
"completed automatically even there is only one suggestion.")
|
||||
invokeMenuItem('File', 'Revert "main.cpp" to Saved')
|
||||
clickButton(waitForObject(":Revert to Saved.Proceed_QPushButton"))
|
||||
# exit qt creator
|
||||
invokeMenuItem("File", "Save All")
|
||||
invokeMenuItem("File", "Exit")
|
||||
editorWidget = waitForObject(":Qt Creator_CppEditor::Internal::CPPEditorWidget")
|
||||
resetLine(editorWidget)
|
||||
type(editorWidget, "retu")
|
||||
triggerCompletion(editorWidget)
|
||||
try:
|
||||
proposal = "return"
|
||||
if useClang:
|
||||
# clang adds a whitespace because the function needs to return a value
|
||||
proposal += " "
|
||||
waitForObjectItem(":popupFrame_Proposal_QListView", proposal)
|
||||
except:
|
||||
test.fail("Could not find proposal popup.")
|
||||
type(editorWidget, "<Right>")
|
||||
type(editorWidget, "<Backspace>")
|
||||
test.compare(str(lineUnderCursor(editorWidget)).strip(), "retu",
|
||||
"Step 6: Verifying if: Suggestion is displayed but text is not "
|
||||
"completed automatically even there is only one suggestion.")
|
||||
invokeMenuItem('File', 'Revert "main.cpp" to Saved')
|
||||
clickButton(waitForObject(":Revert to Saved.Proceed_QPushButton"))
|
||||
# exit qt creator
|
||||
invokeMenuItem("File", "Save All")
|
||||
invokeMenuItem("File", "Exit")
|
||||
|
@@ -28,61 +28,62 @@ source("../../shared/qtcreator.py")
|
||||
# entry of test
|
||||
def main():
|
||||
for useClang in [False, True]:
|
||||
if not startCreator(useClang):
|
||||
continue
|
||||
# create qt quick application
|
||||
with TestSection(getCodeModelString(useClang)):
|
||||
if not startCreator(useClang):
|
||||
continue
|
||||
# create qt quick application
|
||||
# Step 1: Open test .pro project.
|
||||
createNewQtQuickApplication(tempDir(), "SampleApp")
|
||||
checkCodeModelSettings(useClang)
|
||||
createNewQtQuickApplication(tempDir(), "SampleApp")
|
||||
checkCodeModelSettings(useClang)
|
||||
# Step 2: Open .cpp file in Edit mode.
|
||||
if not openDocument("SampleApp.Sources.main\\.cpp"):
|
||||
test.fatal("Could not open main.cpp")
|
||||
invokeMenuItem("File", "Exit")
|
||||
return
|
||||
test.verify(checkIfObjectExists(":Qt Creator_CppEditor::Internal::CPPEditorWidget"),
|
||||
"Step 2: Verifying if: .cpp file is opened in Edit mode.")
|
||||
if not openDocument("SampleApp.Sources.main\\.cpp"):
|
||||
test.fatal("Could not open main.cpp")
|
||||
invokeMenuItem("File", "Exit")
|
||||
return
|
||||
test.verify(checkIfObjectExists(":Qt Creator_CppEditor::Internal::CPPEditorWidget"),
|
||||
"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.
|
||||
# Focus "class derived from QObject" in the list and press Tab or Enter to complete the code.
|
||||
editorWidget = findObject(":Qt Creator_CppEditor::Internal::CPPEditorWidget")
|
||||
mouseClick(editorWidget, 5, 5, 0, Qt.LeftButton)
|
||||
type(editorWidget, "<Return>")
|
||||
type(editorWidget, "<Up>")
|
||||
type(editorWidget, "class")
|
||||
if useClang and JIRA.isBugStillOpen(18769):
|
||||
snooze(4)
|
||||
if platform.system() == "Darwin":
|
||||
type(editorWidget, "<Meta+Space>")
|
||||
else:
|
||||
type(editorWidget, "<Ctrl+Space>")
|
||||
listView = waitForObject(":popupFrame_Proposal_QListView")
|
||||
shownProposals = dumpItems(listView.model())
|
||||
usedProposal = "class derived from QObject"
|
||||
expectedProposals = ["class", "class ", "class template",
|
||||
usedProposal, "class derived from QWidget"]
|
||||
test.compare(len(shownProposals), len(expectedProposals), "Number of proposed templates")
|
||||
test.compare(set(shownProposals), set(expectedProposals),
|
||||
"Expected proposals shown, ignoring order?")
|
||||
doubleClickItem(listView, usedProposal, 5, 5, 0, Qt.LeftButton)
|
||||
pattern = ("(?<=class)\s+name\s*:\s*public\s+QObject\s*\{\s*Q_OBJECT\s+"
|
||||
"public:\s+name\(\)\s*\{\}\s+virtual\s+~name\(\)\s*\{\}\s+\};")
|
||||
test.verify(re.search(pattern, str(editorWidget.plainText)),
|
||||
"Code with several variables is inserted?")
|
||||
editorWidget = findObject(":Qt Creator_CppEditor::Internal::CPPEditorWidget")
|
||||
mouseClick(editorWidget, 5, 5, 0, Qt.LeftButton)
|
||||
type(editorWidget, "<Return>")
|
||||
type(editorWidget, "<Up>")
|
||||
type(editorWidget, "class")
|
||||
if useClang and JIRA.isBugStillOpen(18769):
|
||||
snooze(4)
|
||||
if platform.system() == "Darwin":
|
||||
type(editorWidget, "<Meta+Space>")
|
||||
else:
|
||||
type(editorWidget, "<Ctrl+Space>")
|
||||
listView = waitForObject(":popupFrame_Proposal_QListView")
|
||||
shownProposals = dumpItems(listView.model())
|
||||
usedProposal = "class derived from QObject"
|
||||
expectedProposals = ["class", "class ", "class template",
|
||||
usedProposal, "class derived from QWidget"]
|
||||
test.compare(len(shownProposals), len(expectedProposals), "Number of proposed templates")
|
||||
test.compare(set(shownProposals), set(expectedProposals),
|
||||
"Expected proposals shown, ignoring order?")
|
||||
doubleClickItem(listView, usedProposal, 5, 5, 0, Qt.LeftButton)
|
||||
pattern = ("(?<=class)\s+name\s*:\s*public\s+QObject\s*\{\s*Q_OBJECT\s+"
|
||||
"public:\s+name\(\)\s*\{\}\s+virtual\s+~name\(\)\s*\{\}\s+\};")
|
||||
test.verify(re.search(pattern, str(editorWidget.plainText)),
|
||||
"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".
|
||||
type(editorWidget, "<Tab>")
|
||||
type(editorWidget, "<Tab>")
|
||||
type(editorWidget, "<Tab>")
|
||||
type(editorWidget, "Myname")
|
||||
result = re.search(pattern.replace("name", "Myname"), str(editorWidget.plainText))
|
||||
if result:
|
||||
test.passes("Step 5: Verifying if: A value for a variable is inserted and all "
|
||||
"instances of the variable within the snippet are renamed.")
|
||||
else:
|
||||
test.fail("Step 5: Seems that not all instances of variable had been renamed "
|
||||
"- Content of editor:\n%s" % editorWidget.plainText)
|
||||
invokeMenuItem('File', 'Revert "main.cpp" to Saved')
|
||||
clickButton(waitForObject(":Revert to Saved.Proceed_QPushButton"))
|
||||
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
|
||||
invokeMenuItem('File', 'Close "main.cpp"')
|
||||
# exit qt creator
|
||||
invokeMenuItem("File", "Exit")
|
||||
type(editorWidget, "<Tab>")
|
||||
type(editorWidget, "<Tab>")
|
||||
type(editorWidget, "<Tab>")
|
||||
type(editorWidget, "Myname")
|
||||
result = re.search(pattern.replace("name", "Myname"), str(editorWidget.plainText))
|
||||
if result:
|
||||
test.passes("Step 5: Verifying if: A value for a variable is inserted and all "
|
||||
"instances of the variable within the snippet are renamed.")
|
||||
else:
|
||||
test.fail("Step 5: Seems that not all instances of variable had been renamed "
|
||||
"- Content of editor:\n%s" % editorWidget.plainText)
|
||||
invokeMenuItem('File', 'Revert "main.cpp" to Saved')
|
||||
clickButton(waitForObject(":Revert to Saved.Proceed_QPushButton"))
|
||||
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
|
||||
invokeMenuItem('File', 'Close "main.cpp"')
|
||||
# exit qt creator
|
||||
invokeMenuItem("File", "Exit")
|
||||
|
@@ -76,44 +76,45 @@ def main():
|
||||
"do while" : ["", "int dummy = 0;", "do", "++dummy;", "while (dummy < 10);"]
|
||||
}
|
||||
for useClang in [False, True]:
|
||||
if not startCreator(useClang):
|
||||
continue
|
||||
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
|
||||
with TestSection(getCodeModelString(useClang)):
|
||||
if not startCreator(useClang):
|
||||
continue
|
||||
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
|
||||
typeLines(editor, codeLines)
|
||||
if not placeCursorToLine(editor, codeLines[2]):
|
||||
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()
|
||||
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()
|
||||
snooze(1) # "Close All" might be disabled
|
||||
invokeMenuItem('File', 'Close All')
|
||||
invokeMenuItem('File', 'Exit')
|
||||
snooze(1) # "Close All" might be disabled
|
||||
invokeMenuItem('File', 'Close All')
|
||||
invokeMenuItem('File', 'Exit')
|
||||
|
@@ -36,41 +36,42 @@ def main():
|
||||
templateDir = prepareTemplate(sourceExample)
|
||||
examplePath = os.path.join(templateDir, proFile)
|
||||
for useClang in [False, True]:
|
||||
if not startCreator(useClang):
|
||||
continue
|
||||
# open example project
|
||||
openQmakeProject(examplePath)
|
||||
# wait for parsing to complete
|
||||
progressBarWait(30000)
|
||||
checkCodeModelSettings(useClang)
|
||||
# open .cpp file in editor
|
||||
if not openDocument("property-animation.Sources.main\\.cpp"):
|
||||
test.fatal("Could not open main.cpp")
|
||||
with TestSection(getCodeModelString(useClang)):
|
||||
if not startCreator(useClang):
|
||||
continue
|
||||
# open example project
|
||||
openQmakeProject(examplePath)
|
||||
# wait for parsing to complete
|
||||
progressBarWait(30000)
|
||||
checkCodeModelSettings(useClang)
|
||||
# open .cpp file in editor
|
||||
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")
|
||||
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():
|
||||
templateDir = prepareTemplate(sourceExample)
|
||||
examplePath = os.path.join(templateDir, proFile)
|
||||
for useClang in [False, True]:
|
||||
if not startCreator(useClang):
|
||||
continue
|
||||
# open example project
|
||||
openQmakeProject(examplePath)
|
||||
# wait for parsing to complete
|
||||
progressBarWait(30000)
|
||||
checkCodeModelSettings(useClang)
|
||||
# open .cpp file in editor
|
||||
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.")
|
||||
# select some word for example "viewer" and press Ctrl+F.
|
||||
editorWidget = findObject(":Qt Creator_CppEditor::Internal::CPPEditorWidget")
|
||||
if not placeCursorToLine(editorWidget, "QmlApplicationViewer viewer;"):
|
||||
invokeMenuItem("File", "Exit")
|
||||
return
|
||||
type(editorWidget, "<Left>")
|
||||
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):
|
||||
with TestSection(getCodeModelString(useClang)):
|
||||
if not startCreator(useClang):
|
||||
continue
|
||||
# open example project
|
||||
openQmakeProject(examplePath)
|
||||
# wait for parsing to complete
|
||||
progressBarWait(30000)
|
||||
checkCodeModelSettings(useClang)
|
||||
# open .cpp file in editor
|
||||
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.")
|
||||
# select some word for example "viewer" and press Ctrl+F.
|
||||
editorWidget = findObject(":Qt Creator_CppEditor::Internal::CPPEditorWidget")
|
||||
if not placeCursorToLine(editorWidget, "QmlApplicationViewer viewer;"):
|
||||
invokeMenuItem("File", "Exit")
|
||||
return
|
||||
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
|
||||
test.compare(newCodeText, oldCodeText.replace("QmlApplicationfind::", "QmlApplicationViewer::"),
|
||||
"Verifying if: Only selected word is replaced, the rest of found words are not replaced.")
|
||||
# close Find/Replace tab.
|
||||
clickButton(waitForObject(":Qt Creator.CloseFind_QToolButton"))
|
||||
test.verify(checkIfObjectExists(":*Qt Creator.Find_Find::Internal::FindToolBar", False),
|
||||
"Verifying if: Find/Replace tab is closed.")
|
||||
invokeMenuItem("File", "Close All")
|
||||
clickButton(waitForObject(":Save Changes.Do not Save_QPushButton"))
|
||||
invokeMenuItem("File", "Exit")
|
||||
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>")
|
||||
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
|
||||
test.compare(newCodeText, oldCodeText.replace("QmlApplicationfind::", "QmlApplicationViewer::"),
|
||||
"Verifying if: Only selected word is replaced, the rest of found words are not replaced.")
|
||||
# close Find/Replace tab.
|
||||
clickButton(waitForObject(":Qt Creator.CloseFind_QToolButton"))
|
||||
test.verify(checkIfObjectExists(":*Qt Creator.Find_Find::Internal::FindToolBar", False),
|
||||
"Verifying if: Find/Replace tab is closed.")
|
||||
invokeMenuItem("File", "Close All")
|
||||
clickButton(waitForObject(":Save Changes.Do not Save_QPushButton"))
|
||||
invokeMenuItem("File", "Exit")
|
||||
|
@@ -162,20 +162,21 @@ def main():
|
||||
templateDir = prepareTemplate(examplePath)
|
||||
examplePath = os.path.join(templateDir, "cplusplus-tools.pro")
|
||||
for useClang in [False, True]:
|
||||
if not startCreator(useClang):
|
||||
continue
|
||||
openQmakeProject(examplePath, [Targets.DESKTOP_531_DEFAULT])
|
||||
checkCodeModelSettings(useClang)
|
||||
if not openDocument("cplusplus-tools.Sources.main\\.cpp"):
|
||||
earlyExit("Failed to open main.cpp.")
|
||||
return
|
||||
editor = getEditorForFileSuffix("main.cpp")
|
||||
if editor:
|
||||
checkIncludeCompletion(editor, useClang)
|
||||
checkSymbolCompletion(editor, useClang)
|
||||
invokeMenuItem('File', 'Revert "main.cpp" to Saved')
|
||||
clickButton(waitForObject(":Revert to Saved.Proceed_QPushButton"))
|
||||
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
|
||||
invokeMenuItem('File', 'Close "main.cpp"')
|
||||
invokeMenuItem("File", "Exit")
|
||||
with TestSection(getCodeModelString(useClang)):
|
||||
if not startCreator(useClang):
|
||||
continue
|
||||
openQmakeProject(examplePath, [Targets.DESKTOP_531_DEFAULT])
|
||||
checkCodeModelSettings(useClang)
|
||||
if not openDocument("cplusplus-tools.Sources.main\\.cpp"):
|
||||
earlyExit("Failed to open main.cpp.")
|
||||
return
|
||||
editor = getEditorForFileSuffix("main.cpp")
|
||||
if editor:
|
||||
checkIncludeCompletion(editor, useClang)
|
||||
checkSymbolCompletion(editor, useClang)
|
||||
invokeMenuItem('File', 'Revert "main.cpp" to Saved')
|
||||
clickButton(waitForObject(":Revert to Saved.Proceed_QPushButton"))
|
||||
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
|
||||
invokeMenuItem('File', 'Close "main.cpp"')
|
||||
invokeMenuItem("File", "Exit")
|
||||
|
@@ -27,29 +27,30 @@ source("../../shared/qtcreator.py")
|
||||
|
||||
def main():
|
||||
for useClang in [False, True]:
|
||||
if not startCreator(useClang):
|
||||
continue
|
||||
createProject_Qt_Console(tempDir(), "SquishProject")
|
||||
checkCodeModelSettings(useClang)
|
||||
selectFromLocator("main.cpp")
|
||||
cppwindow = waitForObject(":Qt Creator_CppEditor::Internal::CPPEditorWidget")
|
||||
with TestSection(getCodeModelString(useClang)):
|
||||
if not startCreator(useClang):
|
||||
continue
|
||||
createProject_Qt_Console(tempDir(), "SquishProject")
|
||||
checkCodeModelSettings(useClang)
|
||||
selectFromLocator("main.cpp")
|
||||
cppwindow = waitForObject(":Qt Creator_CppEditor::Internal::CPPEditorWidget")
|
||||
|
||||
for record in testData.dataset("usages.tsv"):
|
||||
include = testData.field(record, "include")
|
||||
if include:
|
||||
placeCursorToLine(cppwindow, "#include <QCoreApplication>")
|
||||
typeLines(cppwindow, ("", "#include " + include))
|
||||
placeCursorToLine(cppwindow, "return a.exec();")
|
||||
typeLines(cppwindow, ("<Up>", testData.field(record, "declaration")))
|
||||
type(cppwindow, testData.field(record, "usage"))
|
||||
snooze(1) # maybe find something better
|
||||
type(cppwindow, testData.field(record, "operator"))
|
||||
waitFor("object.exists(':popupFrame_TextEditor::GenericProposalWidget')", 1500)
|
||||
found = str(lineUnderCursor(cppwindow)).strip()
|
||||
exp = testData.field(record, "expected")
|
||||
test.compare(found, exp)
|
||||
invokeMenuItem("File", 'Revert "main.cpp" to Saved')
|
||||
clickButton(waitForObject(":Revert to Saved.Proceed_QPushButton"))
|
||||
snooze(1)
|
||||
invokeMenuItem("File", "Close All")
|
||||
invokeMenuItem("File", "Exit")
|
||||
for record in testData.dataset("usages.tsv"):
|
||||
include = testData.field(record, "include")
|
||||
if include:
|
||||
placeCursorToLine(cppwindow, "#include <QCoreApplication>")
|
||||
typeLines(cppwindow, ("", "#include " + include))
|
||||
placeCursorToLine(cppwindow, "return a.exec();")
|
||||
typeLines(cppwindow, ("<Up>", testData.field(record, "declaration")))
|
||||
type(cppwindow, testData.field(record, "usage"))
|
||||
snooze(1) # maybe find something better
|
||||
type(cppwindow, testData.field(record, "operator"))
|
||||
waitFor("object.exists(':popupFrame_TextEditor::GenericProposalWidget')", 1500)
|
||||
found = str(lineUnderCursor(cppwindow)).strip()
|
||||
exp = testData.field(record, "expected")
|
||||
test.compare(found, exp)
|
||||
invokeMenuItem("File", 'Revert "main.cpp" to Saved')
|
||||
clickButton(waitForObject(":Revert to Saved.Proceed_QPushButton"))
|
||||
snooze(1)
|
||||
invokeMenuItem("File", "Close All")
|
||||
invokeMenuItem("File", "Exit")
|
||||
|
Reference in New Issue
Block a user