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.
|
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__():
|
|||||||
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:
|
|||||||
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):
|
|||||||
# 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")
|
|||||||
# 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():
|
|||||||
"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()
|
continue
|
||||||
checkCodeModelSettings(useClang)
|
projectName = createNewNonQtProject()
|
||||||
openDocument("%s.Sources.main\\.cpp" % projectName)
|
checkCodeModelSettings(useClang)
|
||||||
editor = getEditorForFileSuffix("main.cpp")
|
openDocument("%s.Sources.main\\.cpp" % projectName)
|
||||||
if not editor:
|
editor = getEditorForFileSuffix("main.cpp")
|
||||||
test.fatal("Failed to get an editor - leaving test.")
|
if not editor:
|
||||||
invokeMenuItem("File", "Exit")
|
test.fatal("Failed to get an editor - leaving test.")
|
||||||
return
|
invokeMenuItem("File", "Exit")
|
||||||
|
return
|
||||||
|
|
||||||
originalContent = str(editor.plainText)
|
originalContent = str(editor.plainText)
|
||||||
for case, codeLines in code.items():
|
for case, codeLines in code.items():
|
||||||
funcSuffix = case.title().replace(" ", "")
|
funcSuffix = case.title().replace(" ", "")
|
||||||
test.log("Testing: Extract Function for '%s'" % case)
|
test.log("Testing: Extract Function for '%s'" % case)
|
||||||
if not placeCursorToLine(editor, "{"):
|
if not placeCursorToLine(editor, "{"):
|
||||||
continue
|
continue
|
||||||
typeLines(editor, codeLines)
|
typeLines(editor, codeLines)
|
||||||
if not placeCursorToLine(editor, codeLines[2]):
|
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():
|
|||||||
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():
|
|||||||
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
|
||||||
|
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)
|
templateDir = prepareTemplate(examplePath)
|
||||||
examplePath = os.path.join(templateDir, "cplusplus-tools.pro")
|
examplePath = os.path.join(templateDir, "cplusplus-tools.pro")
|
||||||
for useClang in [False, True]:
|
for useClang in [False, True]:
|
||||||
if not startCreator(useClang):
|
with TestSection(getCodeModelString(useClang)):
|
||||||
continue
|
if not startCreator(useClang):
|
||||||
openQmakeProject(examplePath, [Targets.DESKTOP_531_DEFAULT])
|
continue
|
||||||
checkCodeModelSettings(useClang)
|
openQmakeProject(examplePath, [Targets.DESKTOP_531_DEFAULT])
|
||||||
if not openDocument("cplusplus-tools.Sources.main\\.cpp"):
|
checkCodeModelSettings(useClang)
|
||||||
earlyExit("Failed to open main.cpp.")
|
if not openDocument("cplusplus-tools.Sources.main\\.cpp"):
|
||||||
return
|
earlyExit("Failed to open main.cpp.")
|
||||||
editor = getEditorForFileSuffix("main.cpp")
|
return
|
||||||
if editor:
|
editor = getEditorForFileSuffix("main.cpp")
|
||||||
checkIncludeCompletion(editor, useClang)
|
if editor:
|
||||||
checkSymbolCompletion(editor, useClang)
|
checkIncludeCompletion(editor, useClang)
|
||||||
invokeMenuItem('File', 'Revert "main.cpp" to Saved')
|
checkSymbolCompletion(editor, useClang)
|
||||||
clickButton(waitForObject(":Revert to Saved.Proceed_QPushButton"))
|
invokeMenuItem('File', 'Revert "main.cpp" to Saved')
|
||||||
snooze(1) # 'Close "main.cpp"' might still be disabled
|
clickButton(waitForObject(":Revert to Saved.Proceed_QPushButton"))
|
||||||
# editor must be closed to get the second code model applied on re-opening the file
|
snooze(1) # 'Close "main.cpp"' might still be disabled
|
||||||
invokeMenuItem('File', 'Close "main.cpp"')
|
# editor must be closed to get the second code model applied on re-opening the file
|
||||||
invokeMenuItem("File", "Exit")
|
invokeMenuItem('File', 'Close "main.cpp"')
|
||||||
|
invokeMenuItem("File", "Exit")
|
||||||
|
@@ -27,29 +27,30 @@ source("../../shared/qtcreator.py")
|
|||||||
|
|
||||||
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):
|
||||||
createProject_Qt_Console(tempDir(), "SquishProject")
|
continue
|
||||||
checkCodeModelSettings(useClang)
|
createProject_Qt_Console(tempDir(), "SquishProject")
|
||||||
selectFromLocator("main.cpp")
|
checkCodeModelSettings(useClang)
|
||||||
cppwindow = waitForObject(":Qt Creator_CppEditor::Internal::CPPEditorWidget")
|
selectFromLocator("main.cpp")
|
||||||
|
cppwindow = waitForObject(":Qt Creator_CppEditor::Internal::CPPEditorWidget")
|
||||||
|
|
||||||
for record in testData.dataset("usages.tsv"):
|
for record in testData.dataset("usages.tsv"):
|
||||||
include = testData.field(record, "include")
|
include = testData.field(record, "include")
|
||||||
if include:
|
if include:
|
||||||
placeCursorToLine(cppwindow, "#include <QCoreApplication>")
|
placeCursorToLine(cppwindow, "#include <QCoreApplication>")
|
||||||
typeLines(cppwindow, ("", "#include " + include))
|
typeLines(cppwindow, ("", "#include " + include))
|
||||||
placeCursorToLine(cppwindow, "return a.exec();")
|
placeCursorToLine(cppwindow, "return a.exec();")
|
||||||
typeLines(cppwindow, ("<Up>", testData.field(record, "declaration")))
|
typeLines(cppwindow, ("<Up>", testData.field(record, "declaration")))
|
||||||
type(cppwindow, testData.field(record, "usage"))
|
type(cppwindow, testData.field(record, "usage"))
|
||||||
snooze(1) # maybe find something better
|
snooze(1) # maybe find something better
|
||||||
type(cppwindow, testData.field(record, "operator"))
|
type(cppwindow, testData.field(record, "operator"))
|
||||||
waitFor("object.exists(':popupFrame_TextEditor::GenericProposalWidget')", 1500)
|
waitFor("object.exists(':popupFrame_TextEditor::GenericProposalWidget')", 1500)
|
||||||
found = str(lineUnderCursor(cppwindow)).strip()
|
found = str(lineUnderCursor(cppwindow)).strip()
|
||||||
exp = testData.field(record, "expected")
|
exp = testData.field(record, "expected")
|
||||||
test.compare(found, exp)
|
test.compare(found, exp)
|
||||||
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)
|
snooze(1)
|
||||||
invokeMenuItem("File", "Close All")
|
invokeMenuItem("File", "Close All")
|
||||||
invokeMenuItem("File", "Exit")
|
invokeMenuItem("File", "Exit")
|
||||||
|
Reference in New Issue
Block a user