test.py 5.39 KB
Newer Older
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
source("../../shared/qtcreator.py")

workingDir = None

def main():
    global workingDir
    startApplication("qtcreator" + SettingsPath)
    # using a temporary directory won't mess up a potentially existing
    workingDir = tempDir()
    checkedTargets, projectName = createNewQtQuickApplication(workingDir)
    editor = waitForObject(":Qt Creator_QmlJSEditor::QmlJSTextEditorWidget")
    if placeCursorToLine(editor, "MouseArea.*", True):
        type(editor, '<Up>')
        type(editor, '<Return>')
        typeLines(editor, ['Timer {',
                           'interval: 2000',
                           'repeat: true',
                           'running: true',
                           'onTriggered: {',
                           'var i;',
                           'for (i = 1; i < 2500; ++i) {',
                           'var j = i * i;',
                           'console.log(j);'])
        invokeMenuItem("File", "Save All")
        availableConfigs = iterateBuildConfigs(len(checkedTargets), "Debug")
        if not availableConfigs:
            test.fatal("Haven't found a suitable Qt version (need Qt 4.7.4) - leaving without debugging.")
        for kit, config in availableConfigs:
29 30 31
            qtVersion = selectBuildConfig(len(checkedTargets), kit, config)[0]
            test.log("Selected kit using Qt %s" % qtVersion)
            progressBarWait() # progress bars move buttons
32 33 34 35 36 37 38 39 40 41 42
            verifyBuildConfig(len(checkedTargets), kit, True, enableQmlDebug=True)
            # explicitly build before start debugging for adding the executable as allowed program to WinFW
            invokeMenuItem("Build", "Rebuild All")
            waitForSignal("{type='ProjectExplorer::BuildManager' unnamed='1'}",
                          "buildQueueFinished(bool)")
            if not checkCompile():
                test.fatal("Compile had errors... Skipping current build config")
                continue
            allowAppThroughWinFW(workingDir, projectName, False)
            switchViewTo(ViewConstants.ANALYZE)
            selectFromCombo(":Analyzer Toolbar.AnalyzerManagerToolBox_QComboBox", "QML Profiler")
43 44 45 46 47 48
            recordButton = waitForObject("{container=':Qt Creator.Analyzer Toolbar_QDockWidget' "
                                         "type='QToolButton' unnamed='1' visible='1' "
                                         "toolTip?='*able profiling'}")
            if not test.verify(recordButton.checked, "Verifying recording is enabled."):
                test.log("Enabling recording for the test run")
                clickButton(recordButton)
49 50 51 52 53 54 55 56 57 58 59 60 61 62
            clickButton(waitForObject(":Analyzer Toolbar.Start_QToolButton"))
            stopButton = waitForObject(":Qt Creator.Stop_QToolButton")
            elapsedLabel = waitForObject(":Analyzer Toolbar.Elapsed:_QLabel", 3000)
            waitFor('"Elapsed:    5" in str(elapsedLabel.text)', 20000)
            clickButton(stopButton)
            if safeClickTab("JavaScript"):
                model = waitForObject(":JavaScript.QmlProfilerV8ProfileTable_QmlProfiler::"
                                      "Internal::QmlProfilerEventsMainView").model()
                test.compare(model.rowCount(), 1) # Could change, see QTCREATORBUG-8994
                test.compare([str(model.index(0, column).data()) for column in range(6)],
                             ['<program>', '100.00 %', '0.000 \xc2\xb5s', '0.00 %', '0.000 \xc2\xb5s', 'Main Program'])
            if safeClickTab("Events"):
                model = waitForObject(":Events.QmlProfilerEventsTable_QmlProfiler::"
                                      "Internal::QmlProfilerEventsMainView").model()
63 64 65 66 67 68 69
                if qtVersion.startswith("5."):
                    compareEventsTab(model, "events_qt50.tsv")
                else:
                    compareEventsTab(model, "events_qt47.tsv")
                    test.verify(str(model.index(0, 8).data()).endswith(' ms'))
                    test.xverify(str(model.index(1, 8).data()).endswith(' ms')) # QTCREATORBUG-8996
                test.compare(dumpItems(model, column=2)[0], '100.00 %')
70
                for i in [3, 5, 6, 7]:
71
                    for item in dumpItems(model, column=i)[:4]:
72 73 74 75
                        test.verify(item.endswith(' ms'))
            deleteAppFromWinFW(workingDir, projectName, False)
    invokeMenuItem("File", "Exit")

76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
def compareEventsTab(model, file):
    significantColumns = [0, 1, 4, 9]

    expectedTable = []
    for record in testData.dataset(file):
        expectedTable.append([testData.field(record, str(col)) for col in significantColumns])
    foundTable = []
    for row in range(model.rowCount()):
        foundTable.append([str(model.index(row, col).data()) for col in significantColumns])

    test.compare(model.rowCount(), len(expectedTable),
                 "Checking number of rows in Events table")
    if not test.verify(containsOnce(expectedTable, foundTable),
                       "Verifying that Events table matches expected values"):
        test.log("Events displayed by Creator: %s" % foundTable)

def containsOnce(tuple, items):
    for item in items:
        if tuple.count(item) != 1:
            return False
    return True

98 99 100 101 102 103 104 105 106 107
def safeClickTab(tab):
    for bar in [":*Qt Creator.JavaScript_QTabBar",
                ":*Qt Creator.Events_QTabBar"]:
        try:
            clickTab(waitForObject(bar, 1000), tab)
            return True
        except:
            pass
    test.fail("Tab %s is not being shown." % tab)
    return False