summaryrefslogtreecommitdiff
path: root/tests/system/suite_CSUP/tst_CSUP03/test.py
blob: 136a55b59ba2d93f7bf9bce56fcae8acb50fded4 (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
121
122
123
124
125
126
#############################################################################
##
## Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
## Contact: http://www.qt-project.org/legal
##
## 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 Digia.  For licensing terms and
## conditions see http://qt.digia.com/licensing.  For further information
## use the contact form at http://qt.digia.com/contact-us.
##
## GNU Lesser General Public License Usage
## Alternatively, this file may be used under the terms of the GNU Lesser
## General Public License version 2.1 as published by the Free Software
## Foundation and appearing in the file LICENSE.LGPL included in the
## packaging of this file.  Please review the following information to
## ensure the GNU Lesser General Public License version 2.1 requirements
## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
##
## In addition, as a special exception, Digia gives you certain additional
## rights.  These rights are described in the Digia Qt LGPL Exception
## version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
##
#############################################################################

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

inputDialog = "{type='QInputDialog' unnamed='1' visible='1'}"

def revertMainCpp():
    invokeMenuItem('File', 'Revert "main.cpp" to Saved')
    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():
    startCreatorTryingClang()
    if not startedWithoutPluginError():
        return
    projectName = createNewNonQtProject()
    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);"]
            }
    models = iterateAvailableCodeModels()
    for current in models:
        if current != models[0]:
            selectCodeModel(current)
        test.log("Testing code model: %s" % current)
        openDocument("untitled.Sources.main\\.cpp")
        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='Enter function name' type='QLabel' unnamed='1' "
                                     "visible='1' window=%s} type='QLineEdit' 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', 'Close All')

    invokeMenuItem('File', 'Exit')