1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0
source("../../shared/qtcreator.py")
inputDialog = "{type='QDialog' unnamed='1' visible='1' windowTitle='Extract Function Refactoring'}"
def revertMainCpp():
invokeMenuItem('File', 'Revert "main.cpp" to Saved')
waitFor("object.exists(':Revert to Saved_QMessageBox')", 1000)
clickButton(waitForObject(":Revert to Saved.Proceed_QPushButton"))
def constructExpectedCode(original, codeLines, funcSuffix):
withBraces = 'WithBraces' in funcSuffix
myFuncCall = " myFunc%s(dummy);" % funcSuffix
if not withBraces:
myFuncCall += "\n "
tmp = original.splitlines()
tmp.insert(tmp.index("{") + 1, "\n".join([" %s" % codeLines[1], myFuncCall]))
insertHere = tmp.index("using namespace std;")
if insertHere == -1:
test.fatal("Template code seems to have changed.")
return original
generatedFunc = "\nvoid myFunc%s(int dummy)\n{" % funcSuffix
for line in codeLines[2:]:
if line.endswith(";") and not line.startswith("while"):
generatedFunc += "\n %s" % line
else:
generatedFunc += "\n %s" % line
if withBraces:
generatedFunc += "\n \n }"
generatedFunc += "\n}"
tmp.insert(insertHere + 1, generatedFunc)
return "\n".join(tmp) + "\n"
def main():
if platform.system() == 'Darwin':
home = '<Ctrl+Left>'
else:
home = '<Home>'
code = {"if" : ["", "int dummy = 0;", "if (dummy < 10)", "++dummy;"],
"if with braces" : ["", "int dummy = 0;", "if (dummy < 10) {", "++dummy;"],
"if else" : ["", "int dummy = 0;", "if (dummy < 10)", "++dummy;", "else", "--dummy;"],
"if else with braces" : ["", "int dummy = 0;", "if (dummy < 10) {",
"++dummy;", "} else {", "--dummy;"],
"while" : ["", "int dummy = 0;", "while (dummy < 10)", "++dummy;"],
"while with braces" : ["", "int dummy = 0;", "while (dummy < 10) {", "++dummy;"],
"do while" : ["", "int dummy = 0;", "do", "++dummy;", "while (dummy < 10);"]
}
for useClang in [False, True]:
with TestSection(getCodeModelString(useClang)):
if (useClang and platform.system() in ('Windows', 'Microsoft')
and JIRA.isBugStillOpen(18607)):
test.warning("Skipping unstable tests on Windows", "See QTCREATORBUG-18607")
continue
if not startCreatorVerifyingClang(useClang):
continue
projectName = createNewNonQtProject(tempDir(), "project-csup03",
[Targets.DESKTOP_5_14_1_DEFAULT])
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()
invokeMenuItem('File', 'Exit')
waitForCleanShutdown()
|