2013-05-15 13:17:33 +02:00
|
|
|
#############################################################################
|
|
|
|
|
##
|
|
|
|
|
## Copyright (C) 2013 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.
|
|
|
|
|
##
|
|
|
|
|
#############################################################################
|
|
|
|
|
|
2013-03-22 12:31:49 +01:00
|
|
|
source("../../shared/qtcreator.py")
|
|
|
|
|
|
|
|
|
|
def main():
|
|
|
|
|
startApplication("qtcreator" + SettingsPath)
|
2013-04-22 17:11:29 +02:00
|
|
|
if not startedWithoutPluginError():
|
|
|
|
|
return
|
2013-03-22 12:31:49 +01:00
|
|
|
# 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 {',
|
2013-07-12 11:58:44 +02:00
|
|
|
'property int runCount: 0',
|
2013-03-22 12:31:49 +01:00
|
|
|
'interval: 2000',
|
|
|
|
|
'repeat: true',
|
2013-07-12 11:58:44 +02:00
|
|
|
'running: runCount < 2',
|
2013-03-22 12:31:49 +01:00
|
|
|
'onTriggered: {',
|
2013-07-12 11:58:44 +02:00
|
|
|
'runCount += 1;',
|
2013-03-22 12:31:49 +01:00
|
|
|
'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:
|
2013-04-05 13:35:13 +02:00
|
|
|
qtVersion = selectBuildConfig(len(checkedTargets), kit, config)[0]
|
2013-07-12 17:21:02 +02:00
|
|
|
if qtVersion == "4.7.4":
|
2013-07-12 11:58:44 +02:00
|
|
|
test.xverify(False, "Skipping Qt 4.7.4 to avoid QTCREATORBUG-9185")
|
|
|
|
|
continue
|
2013-04-05 13:35:13 +02:00
|
|
|
test.log("Selected kit using Qt %s" % qtVersion)
|
|
|
|
|
progressBarWait() # progress bars move buttons
|
2013-03-22 12:31:49 +01:00
|
|
|
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")
|
2013-04-19 13:52:38 +02:00
|
|
|
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)
|
2013-03-22 12:31:49 +01:00
|
|
|
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"):
|
2013-09-06 13:52:30 +02:00
|
|
|
model = waitForObject(":JavaScript.QmlProfilerEventsTable_QmlProfiler::"
|
|
|
|
|
"Internal::QV8ProfilerEventsMainView").model()
|
|
|
|
|
test.compare(model.rowCount(), 0)
|
2013-03-22 12:31:49 +01:00
|
|
|
if safeClickTab("Events"):
|
2013-09-09 12:34:00 +02:00
|
|
|
colPercent, colTotal, colCalls, colMean, colMedian, colLongest, colShortest = range(2, 9)
|
2013-03-22 12:31:49 +01:00
|
|
|
model = waitForObject(":Events.QmlProfilerEventsTable_QmlProfiler::"
|
|
|
|
|
"Internal::QmlProfilerEventsMainView").model()
|
2013-04-05 13:35:13 +02:00
|
|
|
if qtVersion.startswith("5."):
|
|
|
|
|
compareEventsTab(model, "events_qt50.tsv")
|
2013-09-12 14:16:53 +02:00
|
|
|
numberOfMsRows = 3
|
2013-04-05 13:35:13 +02:00
|
|
|
else:
|
2013-07-08 11:25:45 +02:00
|
|
|
if qtVersion.startswith("4.8"):
|
|
|
|
|
compareEventsTab(model, "events_qt48.tsv")
|
|
|
|
|
else:
|
|
|
|
|
compareEventsTab(model, "events_qt47.tsv")
|
2013-07-12 11:58:44 +02:00
|
|
|
numberOfMsRows = 2
|
2013-09-09 12:34:00 +02:00
|
|
|
test.compare(dumpItems(model, column=colPercent)[0], '100.00 %')
|
|
|
|
|
for i in [colTotal, colMean, colMedian, colLongest, colShortest]:
|
2013-07-12 11:58:44 +02:00
|
|
|
for item in dumpItems(model, column=i)[:numberOfMsRows]:
|
2013-09-11 13:32:24 +02:00
|
|
|
test.verify(item.endswith(' ms'), "Verify that '%s' ends with ' ms'" % item)
|
2013-09-09 12:34:00 +02:00
|
|
|
for row in range(model.rowCount()):
|
|
|
|
|
if str(model.index(row, colCalls).data()) == "1":
|
|
|
|
|
for col in [colMedian, colLongest, colShortest]:
|
|
|
|
|
test.compare(model.index(row, colMean).data(), model.index(row, col).data(),
|
|
|
|
|
"For just one call, no differences in execution time may be shown.")
|
|
|
|
|
elif str(model.index(row, colCalls).data()) == "2":
|
|
|
|
|
test.compare(model.index(row, colMedian).data(), model.index(row, colLongest).data(),
|
|
|
|
|
"For two calls, median and longest time must be the same.")
|
2013-03-22 12:31:49 +01:00
|
|
|
deleteAppFromWinFW(workingDir, projectName, False)
|
|
|
|
|
invokeMenuItem("File", "Exit")
|
|
|
|
|
|
2013-04-05 13:35:13 +02:00
|
|
|
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
|
|
|
|
|
|
2013-03-22 12:31:49 +01:00
|
|
|
def safeClickTab(tab):
|
|
|
|
|
for bar in [":*Qt Creator.JavaScript_QTabBar",
|
|
|
|
|
":*Qt Creator.Events_QTabBar"]:
|
|
|
|
|
try:
|
2013-05-22 09:41:37 +02:00
|
|
|
clickOnTab(bar, tab, 1000)
|
2013-03-22 12:31:49 +01:00
|
|
|
return True
|
|
|
|
|
except:
|
|
|
|
|
pass
|
|
|
|
|
test.fail("Tab %s is not being shown." % tab)
|
|
|
|
|
return False
|
2013-05-23 14:01:40 +02:00
|
|
|
|
|
|
|
|
def init():
|
|
|
|
|
removeQmlDebugFolderIfExists()
|
|
|
|
|
|
|
|
|
|
def cleanup():
|
|
|
|
|
removeQmlDebugFolderIfExists()
|