summaryrefslogtreecommitdiff
path: root/tests/system/suite_CSUP/tst_CSUP03/test.py
blob: bd4478000eff5da14d8a2bfa0224925b22b94a4a (plain)
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
############################################################################
#
# Copyright (C) 2016 The Qt Company Ltd.
# Contact: https://www.qt.io/licensing/
#
# This file is part of Qt Creator.
#
# Commercial License Usage
# Licensees holding valid commercial Qt licenses may use this file in
# accordance with the commercial license agreement provided with the
# Software or, alternatively, in accordance with the terms contained in
# a written agreement between you and The Qt Company. For licensing terms
# and conditions see https://www.qt.io/terms-conditions. For further
# information use the contact form at https://www.qt.io/contact-us.
#
# GNU General Public License Usage
# Alternatively, this file may be used under the terms of the GNU
# General Public License version 3 as published by the Free Software
# Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
# included in the packaging of this file. Please review the following
# information to ensure the GNU General Public License requirements will
# be met: https://www.gnu.org/licenses/gpl-3.0.html.
#
############################################################################

source("../../shared/qtcreator.py")

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    }"
    # QTCREATORBUG-12118: last line has 4 additional blanks
    if JIRA.isBugStillOpen(12118):
        generatedFunc += "    "
    else:
        test.warning("Remove unnecessary code - QTCREATORBUG-12118 is closed.")
    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 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]):
                    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')