2013-05-15 13:17:33 +02:00
|
|
|
#############################################################################
|
|
|
|
##
|
2015-01-14 18:07:15 +01:00
|
|
|
## Copyright (C) 2015 The Qt Company Ltd.
|
|
|
|
## Contact: http://www.qt.io/licensing
|
2013-05-15 13:17:33 +02:00
|
|
|
##
|
|
|
|
## 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
|
2015-01-14 18:07:15 +01:00
|
|
|
## a written agreement between you and The Qt Company. For licensing terms and
|
|
|
|
## conditions see http://www.qt.io/terms-conditions. For further information
|
2014-10-01 13:21:18 +02:00
|
|
|
## use the contact form at http://www.qt.io/contact-us.
|
2013-05-15 13:17:33 +02:00
|
|
|
##
|
|
|
|
## GNU Lesser General Public License Usage
|
|
|
|
## Alternatively, this file may be used under the terms of the GNU Lesser
|
2014-10-01 13:21:18 +02:00
|
|
|
## General Public License version 2.1 or version 3 as published by the Free
|
|
|
|
## Software Foundation and appearing in the file LICENSE.LGPLv21 and
|
|
|
|
## LICENSE.LGPLv3 included in the packaging of this file. Please review the
|
|
|
|
## following information to ensure the GNU Lesser General Public License
|
|
|
|
## requirements will be met: https://www.gnu.org/licenses/lgpl.html and
|
2015-02-13 16:51:38 +01:00
|
|
|
## http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
2013-05-15 13:17:33 +02:00
|
|
|
##
|
2015-01-14 18:07:15 +01:00
|
|
|
## In addition, as a special exception, The Qt Company gives you certain additional
|
|
|
|
## rights. These rights are described in The Qt Company LGPL Exception
|
2013-05-15 13:17:33 +02:00
|
|
|
## version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
|
|
|
##
|
|
|
|
#############################################################################
|
|
|
|
|
2012-06-12 17:16:41 +02:00
|
|
|
import __builtin__
|
2012-02-17 17:10:53 +01:00
|
|
|
import re
|
|
|
|
|
2014-08-29 16:32:24 +02:00
|
|
|
def openQbsProject(projectPath):
|
|
|
|
cleanUpUserFiles(projectPath)
|
|
|
|
invokeMenuItem("File", "Open File or Project...")
|
|
|
|
selectFromFileDialog(projectPath)
|
|
|
|
|
2013-04-05 16:58:06 +02:00
|
|
|
def openQmakeProject(projectPath, targets=Targets.desktopTargetClasses(), fromWelcome=False):
|
2012-03-20 11:49:37 +01:00
|
|
|
cleanUpUserFiles(projectPath)
|
2012-09-18 12:48:40 +02:00
|
|
|
if fromWelcome:
|
2015-07-27 16:14:08 +02:00
|
|
|
if isQt54Build:
|
|
|
|
welcomePage = ":WelcomePageStyledBar.WelcomePage_QQuickView"
|
|
|
|
else:
|
|
|
|
welcomePage = ":Qt Creator.WelcomePage_QQuickWidget"
|
|
|
|
mouseClick(waitForObject("{clip='false' container='%s' enabled='true' text='Open Project' "
|
|
|
|
"type='Button' unnamed='1' visible='true'}" % welcomePage),
|
|
|
|
5, 5, 0, Qt.LeftButton)
|
2012-09-18 12:48:40 +02:00
|
|
|
else:
|
|
|
|
invokeMenuItem("File", "Open File or Project...")
|
2012-01-11 17:04:20 +01:00
|
|
|
selectFromFileDialog(projectPath)
|
2012-03-20 11:49:37 +01:00
|
|
|
try:
|
|
|
|
# handle update generated files dialog
|
2012-04-05 14:57:13 +02:00
|
|
|
waitForObject("{type='QLabel' name='qt_msgbox_label' visible='1' "
|
|
|
|
"text?='The following files are either outdated or have been modified*' "
|
|
|
|
"window={type='QMessageBox' unnamed='1' visible='1'}}", 3000)
|
2012-03-20 11:49:37 +01:00
|
|
|
clickButton(waitForObject("{text='Yes' type='QPushButton' unnamed='1' visible='1'}"))
|
|
|
|
except:
|
|
|
|
pass
|
2013-01-18 16:31:48 +01:00
|
|
|
checkedTargets = __chooseTargets__(targets)
|
2012-02-06 14:21:54 +01:00
|
|
|
configureButton = waitForObject("{text='Configure Project' type='QPushButton' unnamed='1' visible='1'"
|
2012-11-02 19:34:38 +01:00
|
|
|
"window=':Qt Creator_Core::Internal::MainWindow'}")
|
2012-02-06 14:21:54 +01:00
|
|
|
clickButton(configureButton)
|
2013-01-18 16:31:48 +01:00
|
|
|
return checkedTargets
|
2011-10-06 20:16:15 +02:00
|
|
|
|
2012-01-26 22:46:25 +01:00
|
|
|
def openCmakeProject(projectPath, buildDir):
|
2011-10-06 20:16:15 +02:00
|
|
|
invokeMenuItem("File", "Open File or Project...")
|
2012-01-11 17:04:20 +01:00
|
|
|
selectFromFileDialog(projectPath)
|
2014-02-14 17:07:48 +01:00
|
|
|
replaceEditorContent("{type='Utils::FancyLineEdit' unnamed='1' visible='1'"
|
2012-01-26 22:46:25 +01:00
|
|
|
"window=':CMake Wizard_CMakeProjectManager::Internal::CMakeOpenProjectWizard'}", buildDir)
|
2012-11-02 19:34:38 +01:00
|
|
|
clickButton(waitForObject(":CMake Wizard.Next_QPushButton"))
|
2013-08-22 16:26:44 +02:00
|
|
|
return __handleCmakeWizardPage__()
|
|
|
|
|
|
|
|
def __handleCmakeWizardPage__():
|
2011-10-06 20:16:15 +02:00
|
|
|
generatorCombo = waitForObject(":Generator:_QComboBox")
|
2014-05-12 14:23:29 +02:00
|
|
|
generatorText = "Unix Generator (Desktop 480 GCC)"
|
|
|
|
if platform.system() in ('Windows', 'Microsoft'):
|
2015-03-18 15:31:36 +01:00
|
|
|
generatorText = "NMake Generator (Desktop 480 MSVC2010)"
|
2013-01-24 16:18:32 +01:00
|
|
|
index = generatorCombo.findText(generatorText)
|
|
|
|
if index == -1:
|
2014-05-12 14:23:29 +02:00
|
|
|
test.warning("No matching CMake generator for found.")
|
2013-01-24 16:18:32 +01:00
|
|
|
else:
|
|
|
|
generatorCombo.setCurrentIndex(index)
|
2012-01-27 15:37:35 +01:00
|
|
|
|
2012-11-02 19:34:38 +01:00
|
|
|
clickButton(waitForObject(":CMake Wizard.Run CMake_QPushButton"))
|
2012-01-24 11:59:54 +01:00
|
|
|
try:
|
|
|
|
clickButton(waitForObject(":CMake Wizard.Finish_QPushButton", 60000))
|
|
|
|
except LookupError:
|
|
|
|
cmakeOutput = waitForObject("{type='QPlainTextEdit' unnamed='1' visible='1' "
|
|
|
|
"window=':CMake Wizard_CMakeProjectManager::Internal::CMakeOpenProjectWizard'}")
|
|
|
|
test.warning("Error while executing cmake - see details for cmake output.",
|
|
|
|
str(cmakeOutput.plainText))
|
|
|
|
clickButton(waitForObject(":CMake Wizard.Cancel_QPushButton"))
|
|
|
|
return False
|
|
|
|
return True
|
2011-10-06 20:16:15 +02:00
|
|
|
|
2012-02-16 12:57:24 +01:00
|
|
|
# this function returns a list of available targets - this is not 100% error proof
|
|
|
|
# because the Simulator target is added for some cases even when Simulator has not
|
|
|
|
# been set up inside Qt versions/Toolchains
|
|
|
|
# this list can be used in __chooseTargets__()
|
2012-10-09 14:02:18 +02:00
|
|
|
def __createProjectOrFileSelectType__(category, template, fromWelcome = False, isProject=True):
|
2012-09-18 12:48:40 +02:00
|
|
|
if fromWelcome:
|
2015-07-27 16:14:08 +02:00
|
|
|
if isQt54Build:
|
|
|
|
welcomePage = ":WelcomePageStyledBar.WelcomePage_QQuickView"
|
|
|
|
else:
|
|
|
|
welcomePage = ":Qt Creator.WelcomePage_QQuickWidget"
|
|
|
|
mouseClick(waitForObject("{clip='false' container='%s' enabled='true' text='New Project' "
|
|
|
|
"type='Button' unnamed='1' visible='true'}" % welcomePage),
|
|
|
|
5, 5, 0, Qt.LeftButton)
|
2012-09-18 12:48:40 +02:00
|
|
|
else:
|
|
|
|
invokeMenuItem("File", "New File or Project...")
|
2014-09-17 15:06:39 +02:00
|
|
|
categoriesView = waitForObject(":New.templateCategoryView_QTreeView")
|
2012-10-09 14:02:18 +02:00
|
|
|
if isProject:
|
|
|
|
clickItem(categoriesView, "Projects." + category, 5, 5, 0, Qt.LeftButton)
|
|
|
|
else:
|
|
|
|
clickItem(categoriesView, "Files and Classes." + category, 5, 5, 0, Qt.LeftButton)
|
2012-11-02 19:34:38 +01:00
|
|
|
templatesView = waitForObject("{name='templatesView' type='QListView'}")
|
2011-11-01 13:56:37 +01:00
|
|
|
clickItem(templatesView, template, 5, 5, 0, Qt.LeftButton)
|
2012-02-16 12:57:24 +01:00
|
|
|
text = waitForObject("{type='QTextBrowser' name='templateDescription' visible='1'}").plainText
|
2012-11-02 19:34:38 +01:00
|
|
|
clickButton(waitForObject("{text='Choose...' type='QPushButton' unnamed='1' visible='1'}"))
|
2013-07-18 17:34:27 +02:00
|
|
|
return __getSupportedPlatforms__(str(text), template)[0]
|
2011-11-01 13:56:37 +01:00
|
|
|
|
2014-04-24 16:50:29 +02:00
|
|
|
def __createProjectSetNameAndPath__(path, projectName = None, checks = True, libType = None):
|
2014-02-14 17:07:48 +01:00
|
|
|
directoryEdit = waitForObject("{type='Utils::FancyLineEdit' unnamed='1' visible='1' "
|
|
|
|
"toolTip?='Full path: *'}")
|
2011-10-28 21:42:12 +02:00
|
|
|
replaceEditorContent(directoryEdit, path)
|
|
|
|
projectNameEdit = waitForObject("{name='nameLineEdit' visible='1' "
|
2015-05-18 19:05:49 +02:00
|
|
|
"type='Utils::FancyLineEdit'}")
|
2011-10-28 21:42:12 +02:00
|
|
|
if projectName == None:
|
|
|
|
projectName = projectNameEdit.text
|
|
|
|
else:
|
|
|
|
replaceEditorContent(projectNameEdit, projectName)
|
|
|
|
if checks:
|
|
|
|
stateLabel = findObject("{type='QLabel' name='stateLabel'}")
|
|
|
|
labelCheck = stateLabel.text=="" and stateLabel.styleSheet == ""
|
|
|
|
test.verify(labelCheck, "Project name and base directory without warning or error")
|
|
|
|
# make sure this is not set as default location
|
2011-11-08 13:20:24 +01:00
|
|
|
ensureChecked("{type='QCheckBox' name='projectsDirectoryCheckBox' visible='1'}", False)
|
2014-04-24 16:50:29 +02:00
|
|
|
if libType != None:
|
|
|
|
selectFromCombo(waitForObject("{leftWidget={text='Type' type='QLabel' unnamed='1' "
|
|
|
|
"visible='1'} type='QComboBox' unnamed='1' visible='1'}"),
|
|
|
|
LibType.getStringForLib(libType))
|
2011-10-28 21:42:12 +02:00
|
|
|
clickButton(waitForObject(":Next_QPushButton"))
|
2011-11-09 16:40:35 +01:00
|
|
|
return str(projectName)
|
2011-10-28 21:42:12 +02:00
|
|
|
|
2015-06-19 14:25:55 +02:00
|
|
|
def __createProjectHandleQtQuickSelection__(minimumQtVersion):
|
|
|
|
comboBox = waitForObject("{buddy=':Minimal required Qt version:_QLabel' name='QtVersion' "
|
|
|
|
"type='Utils::TextFieldComboBox' visible='1'}")
|
2014-05-15 13:43:57 +02:00
|
|
|
try:
|
2015-06-19 14:25:55 +02:00
|
|
|
selectFromCombo(comboBox, "Qt %s" % minimumQtVersion)
|
2014-05-15 13:43:57 +02:00
|
|
|
except:
|
|
|
|
t,v = sys.exc_info()[:2]
|
2015-06-19 14:25:55 +02:00
|
|
|
test.fatal("Exception while trying to select Qt version", "%s (%s)" % (str(t), str(v)))
|
2013-11-01 15:39:00 +01:00
|
|
|
clickButton(waitForObject(":Next_QPushButton"))
|
2015-06-19 14:25:55 +02:00
|
|
|
return minimumQtVersion
|
2013-11-01 15:39:00 +01:00
|
|
|
|
2012-01-17 15:39:57 +01:00
|
|
|
# Selects the Qt versions for a project
|
|
|
|
# param checks turns tests in the function on if set to True
|
2012-02-16 12:57:24 +01:00
|
|
|
# param available a list holding the available targets
|
2012-06-27 19:12:18 +02:00
|
|
|
def __selectQtVersionDesktop__(checks, available=None):
|
2013-04-05 16:58:06 +02:00
|
|
|
checkedTargets = __chooseTargets__(Targets.desktopTargetClasses(), available)
|
2012-06-27 19:12:18 +02:00
|
|
|
if checks:
|
2014-03-19 09:16:53 +01:00
|
|
|
for target in checkedTargets:
|
|
|
|
detailsWidget = waitForObject("{type='Utils::DetailsWidget' unnamed='1' visible='1' "
|
|
|
|
"summaryText='%s'}" % Targets.getStringForTarget(target))
|
|
|
|
detailsButton = getChildByClass(detailsWidget, "Utils::DetailsButton")
|
|
|
|
if test.verify(detailsButton != None, "Verifying if 'Details' button could be found"):
|
|
|
|
clickButton(detailsButton)
|
|
|
|
cbObject = ("{type='QCheckBox' text='%s' unnamed='1' visible='1' "
|
|
|
|
"container=%s}")
|
|
|
|
verifyChecked(cbObject % ("Debug", objectMap.realName(detailsWidget)))
|
|
|
|
verifyChecked(cbObject % ("Release", objectMap.realName(detailsWidget)))
|
|
|
|
clickButton(detailsButton)
|
2011-12-13 19:46:10 +01:00
|
|
|
clickButton(waitForObject(":Next_QPushButton"))
|
2013-01-18 16:31:48 +01:00
|
|
|
return checkedTargets
|
2011-12-13 19:46:10 +01:00
|
|
|
|
2013-12-13 15:59:06 +01:00
|
|
|
def __createProjectHandleLastPage__(expectedFiles = None, addToVersionControl = "<None>", addToProject = None):
|
2011-10-14 16:29:46 +02:00
|
|
|
if expectedFiles != None:
|
2013-12-13 15:59:06 +01:00
|
|
|
summary = waitForObject("{name='filesLabel' text?='<qt>Files to be added in<pre>*</pre>' "
|
|
|
|
"type='QLabel' visible='1'}").text
|
|
|
|
verifyItemOrder(expectedFiles, summary)
|
|
|
|
if addToProject:
|
|
|
|
selectFromCombo(":projectComboBox_QComboBox", addToProject)
|
|
|
|
selectFromCombo(":addToVersionControlComboBox_QComboBox", addToVersionControl)
|
2012-11-02 19:34:38 +01:00
|
|
|
clickButton(waitForObject("{type='QPushButton' text~='(Finish|Done)' visible='1'}"))
|
2011-10-14 16:29:46 +02:00
|
|
|
|
2011-12-13 19:46:10 +01:00
|
|
|
def __verifyFileCreation__(path, expectedFiles):
|
|
|
|
for filename in expectedFiles:
|
|
|
|
if filename != path:
|
|
|
|
filename = os.path.join(path, filename)
|
|
|
|
test.verify(os.path.exists(filename), "Checking if '" + filename + "' was created")
|
|
|
|
|
2013-11-21 14:23:33 +01:00
|
|
|
def __modifyAvailableTargets__(available, requiredQt, asStrings=False):
|
|
|
|
threeDigits = re.compile("\d{3}")
|
|
|
|
requiredQtVersion = requiredQt.replace(".", "") + "0"
|
|
|
|
tmp = list(available) # we need a deep copy
|
|
|
|
for currentItem in tmp:
|
|
|
|
if asStrings:
|
|
|
|
item = currentItem
|
|
|
|
else:
|
|
|
|
item = Targets.getStringForTarget(currentItem)
|
|
|
|
found = threeDigits.search(item)
|
|
|
|
if found:
|
|
|
|
if found.group(0) < requiredQtVersion:
|
|
|
|
# Quick 1.1 supports 4.7.4 only for running, debugging is unsupported
|
|
|
|
# so the least required version is 4.8, but 4.7.4 will be still listed
|
|
|
|
if not (requiredQtVersion == "480" and found.group(0) == "474"):
|
|
|
|
available.remove(currentItem)
|
|
|
|
if requiredQtVersion > "480":
|
|
|
|
toBeRemoved = [Targets.EMBEDDED_LINUX, Targets.SIMULATOR]
|
|
|
|
if asStrings:
|
|
|
|
toBeRemoved = Targets.getTargetsAsStrings(toBeRemoved)
|
|
|
|
for t in toBeRemoved:
|
|
|
|
if t in available:
|
|
|
|
available.remove(t)
|
|
|
|
|
2012-01-17 15:39:57 +01:00
|
|
|
# Creates a Qt GUI project
|
|
|
|
# param path specifies where to create the project
|
|
|
|
# param projectName is the name for the new project
|
|
|
|
# param checks turns tests in the function on if set to True
|
2013-12-13 15:59:06 +01:00
|
|
|
def createProject_Qt_GUI(path, projectName, checks = True, addToVersionControl = "<None>"):
|
2013-10-23 18:04:41 +02:00
|
|
|
template = "Qt Widgets Application"
|
2014-09-17 15:06:39 +02:00
|
|
|
available = __createProjectOrFileSelectType__(" Application", template)
|
2011-11-01 15:58:45 +01:00
|
|
|
__createProjectSetNameAndPath__(path, projectName, checks)
|
2013-01-18 16:31:48 +01:00
|
|
|
checkedTargets = __selectQtVersionDesktop__(checks, available)
|
2011-10-05 13:18:42 +02:00
|
|
|
|
|
|
|
if checks:
|
|
|
|
exp_filename = "mainwindow"
|
|
|
|
h_file = exp_filename + ".h"
|
|
|
|
cpp_file = exp_filename + ".cpp"
|
|
|
|
ui_file = exp_filename + ".ui"
|
|
|
|
pro_file = projectName + ".pro"
|
|
|
|
|
|
|
|
waitFor("object.exists(':headerFileLineEdit_Utils::FileNameValidatingLineEdit')", 20000)
|
|
|
|
waitFor("object.exists(':sourceFileLineEdit_Utils::FileNameValidatingLineEdit')", 20000)
|
|
|
|
waitFor("object.exists(':formFileLineEdit_Utils::FileNameValidatingLineEdit')", 20000)
|
|
|
|
|
|
|
|
test.compare(findObject(":headerFileLineEdit_Utils::FileNameValidatingLineEdit").text, h_file)
|
|
|
|
test.compare(findObject(":sourceFileLineEdit_Utils::FileNameValidatingLineEdit").text, cpp_file)
|
|
|
|
test.compare(findObject(":formFileLineEdit_Utils::FileNameValidatingLineEdit").text, ui_file)
|
|
|
|
|
2011-12-13 19:46:10 +01:00
|
|
|
clickButton(waitForObject(":Next_QPushButton"))
|
2011-10-05 13:18:42 +02:00
|
|
|
|
2011-10-14 16:29:46 +02:00
|
|
|
expectedFiles = None
|
2011-10-05 13:18:42 +02:00
|
|
|
if checks:
|
2011-12-13 19:46:10 +01:00
|
|
|
if platform.system() in ('Windows', 'Microsoft'):
|
|
|
|
path = os.path.abspath(path)
|
2011-12-13 13:54:14 +01:00
|
|
|
path = os.path.join(path, projectName)
|
2012-03-09 17:17:34 +01:00
|
|
|
expectedFiles = [path]
|
2012-04-05 19:19:01 +02:00
|
|
|
expectedFiles.extend(__sortFilenamesOSDependent__(["main.cpp", cpp_file, h_file, ui_file, pro_file]))
|
2013-12-13 15:59:06 +01:00
|
|
|
__createProjectHandleLastPage__(expectedFiles, addToVersionControl)
|
2011-10-05 13:18:42 +02:00
|
|
|
|
2013-04-25 19:08:55 +02:00
|
|
|
progressBarWait(20000)
|
2014-05-19 12:20:57 +02:00
|
|
|
if checks:
|
|
|
|
__verifyFileCreation__(path, expectedFiles)
|
2013-01-18 16:31:48 +01:00
|
|
|
return checkedTargets
|
2011-12-13 19:46:10 +01:00
|
|
|
|
2012-01-31 15:49:59 +01:00
|
|
|
# Creates a Qt Console project
|
|
|
|
# param path specifies where to create the project
|
|
|
|
# param projectName is the name for the new project
|
|
|
|
# param checks turns tests in the function on if set to True
|
2012-06-27 19:12:18 +02:00
|
|
|
def createProject_Qt_Console(path, projectName, checks = True):
|
2014-09-17 15:06:39 +02:00
|
|
|
available = __createProjectOrFileSelectType__(" Application", "Qt Console Application")
|
2011-12-13 19:46:10 +01:00
|
|
|
__createProjectSetNameAndPath__(path, projectName, checks)
|
2013-01-18 16:31:48 +01:00
|
|
|
checkedTargets = __selectQtVersionDesktop__(checks, available)
|
2011-10-05 13:18:42 +02:00
|
|
|
|
2011-12-13 19:46:10 +01:00
|
|
|
expectedFiles = None
|
|
|
|
if checks:
|
|
|
|
if platform.system() in ('Windows', 'Microsoft'):
|
|
|
|
path = os.path.abspath(path)
|
|
|
|
path = os.path.join(path, projectName)
|
|
|
|
cpp_file = "main.cpp"
|
|
|
|
pro_file = projectName + ".pro"
|
2012-04-05 19:19:01 +02:00
|
|
|
expectedFiles = [path]
|
|
|
|
expectedFiles.extend(__sortFilenamesOSDependent__([cpp_file, pro_file]))
|
2011-12-13 19:46:10 +01:00
|
|
|
__createProjectHandleLastPage__(expectedFiles)
|
2011-10-05 13:18:42 +02:00
|
|
|
|
2013-04-25 19:08:55 +02:00
|
|
|
progressBarWait(10000)
|
2014-05-19 12:20:57 +02:00
|
|
|
if checks:
|
|
|
|
__verifyFileCreation__(path, expectedFiles)
|
2013-01-18 16:31:48 +01:00
|
|
|
return checkedTargets
|
2011-10-07 15:05:55 +02:00
|
|
|
|
2013-11-01 15:39:00 +01:00
|
|
|
def createNewQtQuickApplication(workingDir, projectName = None,
|
2015-06-19 14:25:55 +02:00
|
|
|
targets=Targets.desktopTargetClasses(), minimumQtVersion="5.3",
|
2015-06-24 12:27:01 +02:00
|
|
|
withControls = False, fromWelcome=False):
|
|
|
|
if withControls:
|
|
|
|
template = "Qt Quick Controls Application"
|
|
|
|
else:
|
|
|
|
template = "Qt Quick Application"
|
|
|
|
available = __createProjectOrFileSelectType__(" Application", template, fromWelcome)
|
2012-02-16 12:57:24 +01:00
|
|
|
projectName = __createProjectSetNameAndPath__(workingDir, projectName)
|
2015-06-19 14:25:55 +02:00
|
|
|
requiredQt = __createProjectHandleQtQuickSelection__(minimumQtVersion)
|
2013-11-21 14:23:33 +01:00
|
|
|
__modifyAvailableTargets__(available, requiredQt)
|
2013-01-18 16:31:48 +01:00
|
|
|
checkedTargets = __chooseTargets__(targets, available)
|
2011-10-07 15:05:55 +02:00
|
|
|
snooze(1)
|
2015-06-24 12:27:01 +02:00
|
|
|
if len(checkedTargets):
|
|
|
|
clickButton(waitForObject(":Next_QPushButton"))
|
|
|
|
__createProjectHandleLastPage__()
|
|
|
|
progressBarWait(10000)
|
|
|
|
else:
|
|
|
|
clickButton(waitForObject("{type='QPushButton' text='Cancel' visible='1'}"))
|
2013-02-07 20:48:00 +01:00
|
|
|
|
2013-01-18 16:31:48 +01:00
|
|
|
return checkedTargets, projectName
|
2011-10-13 14:29:51 +02:00
|
|
|
|
2015-06-24 12:27:01 +02:00
|
|
|
def createNewQtQuickUI(workingDir, qtVersion = "5.3", withControls = False):
|
|
|
|
if withControls:
|
|
|
|
template = 'Qt Quick Controls UI'
|
|
|
|
else:
|
|
|
|
template = 'Qt Quick UI'
|
2015-07-03 07:33:18 +02:00
|
|
|
__createProjectOrFileSelectType__(" Other Project", template)
|
2011-10-13 14:29:51 +02:00
|
|
|
if workingDir == None:
|
|
|
|
workingDir = tempDir()
|
2011-11-29 16:00:18 +01:00
|
|
|
projectName = __createProjectSetNameAndPath__(workingDir)
|
2015-06-24 12:27:01 +02:00
|
|
|
__createProjectHandleQtQuickSelection__(qtVersion)
|
2011-11-01 15:58:45 +01:00
|
|
|
__createProjectHandleLastPage__()
|
2015-06-24 12:27:01 +02:00
|
|
|
progressBarWait(10000)
|
|
|
|
|
2011-11-29 16:00:18 +01:00
|
|
|
return projectName
|
2011-10-13 14:29:51 +02:00
|
|
|
|
2013-08-26 11:30:54 +02:00
|
|
|
def createNewQmlExtension(workingDir, targets=Targets.DESKTOP_474_GCC, qtQuickVersion=1):
|
2014-09-17 15:06:39 +02:00
|
|
|
available = __createProjectOrFileSelectType__(" Library", "Qt Quick %d Extension Plugin"
|
2013-08-26 11:30:54 +02:00
|
|
|
% qtQuickVersion)
|
2011-10-13 14:29:51 +02:00
|
|
|
if workingDir == None:
|
|
|
|
workingDir = tempDir()
|
2011-11-01 15:58:45 +01:00
|
|
|
__createProjectSetNameAndPath__(workingDir)
|
2013-08-26 11:30:54 +02:00
|
|
|
checkedTargets = __chooseTargets__(targets, available)
|
2011-10-28 21:42:12 +02:00
|
|
|
nextButton = waitForObject(":Next_QPushButton")
|
2011-10-13 14:29:51 +02:00
|
|
|
clickButton(nextButton)
|
2013-05-16 16:58:25 +02:00
|
|
|
nameLineEd = waitForObject("{buddy={type='QLabel' text='Object class-name:' unnamed='1' visible='1'} "
|
2012-11-02 19:34:38 +01:00
|
|
|
"type='QLineEdit' unnamed='1' visible='1'}")
|
2011-10-13 14:29:51 +02:00
|
|
|
replaceEditorContent(nameLineEd, "TestItem")
|
|
|
|
uriLineEd = waitForObject("{buddy={type='QLabel' text='URI:' unnamed='1' visible='1'} "
|
2012-11-02 19:34:38 +01:00
|
|
|
"type='QLineEdit' unnamed='1' visible='1'}")
|
2012-10-09 12:47:18 +02:00
|
|
|
replaceEditorContent(uriLineEd, "org.qt-project.test.qmlcomponents")
|
2011-10-13 14:29:51 +02:00
|
|
|
clickButton(nextButton)
|
2011-11-01 15:58:45 +01:00
|
|
|
__createProjectHandleLastPage__()
|
2013-01-18 16:31:48 +01:00
|
|
|
return checkedTargets
|
2011-11-29 16:00:18 +01:00
|
|
|
|
2013-08-22 16:26:44 +02:00
|
|
|
def createEmptyQtProject(workingDir=None, projectName=None, targets=Targets.desktopTargetClasses()):
|
2014-11-04 10:13:35 +01:00
|
|
|
__createProjectOrFileSelectType__(" Other Project", "Empty qmake Project")
|
2013-08-22 16:26:44 +02:00
|
|
|
if workingDir == None:
|
|
|
|
workingDir = tempDir()
|
|
|
|
projectName = __createProjectSetNameAndPath__(workingDir, projectName)
|
|
|
|
checkedTargets = __chooseTargets__(targets)
|
|
|
|
snooze(1)
|
|
|
|
clickButton(waitForObject(":Next_QPushButton"))
|
|
|
|
__createProjectHandleLastPage__()
|
|
|
|
return projectName, checkedTargets
|
|
|
|
|
|
|
|
def createNewNonQtProject(workingDir=None, projectName=None, target=Targets.DESKTOP_474_GCC,
|
2015-06-26 15:03:10 +02:00
|
|
|
plainC=False, cmake=False, qbs=False):
|
2013-08-22 16:26:44 +02:00
|
|
|
if plainC:
|
2015-06-26 15:03:10 +02:00
|
|
|
template = "Plain C Application"
|
2013-08-22 16:26:44 +02:00
|
|
|
else:
|
2015-06-26 15:03:10 +02:00
|
|
|
template = "Plain C++ Application"
|
|
|
|
|
2013-08-22 16:26:44 +02:00
|
|
|
available = __createProjectOrFileSelectType__(" Non-Qt Project", template)
|
|
|
|
if workingDir == None:
|
|
|
|
workingDir = tempDir()
|
|
|
|
projectName = __createProjectSetNameAndPath__(workingDir, projectName)
|
2015-06-26 15:03:10 +02:00
|
|
|
|
|
|
|
buildSystem = "qmake"
|
|
|
|
if qbs:
|
|
|
|
buildSystem = "Qbs"
|
|
|
|
if cmake:
|
|
|
|
test.warning("Unsupported combination, at least one of parameters cmake and qbs must "
|
|
|
|
"be False, ignoring the value of cmake")
|
|
|
|
elif cmake:
|
|
|
|
buildSystem = "CMake"
|
|
|
|
selectFromCombo("{name='BuildSystem' type='Utils::TextFieldComboBox' visible='1'}", buildSystem)
|
|
|
|
clickButton(waitForObject(":Next_QPushButton"))
|
|
|
|
|
|
|
|
__chooseTargets__(target, availableTargets=available)
|
|
|
|
clickButton(waitForObject(":Next_QPushButton"))
|
|
|
|
__createProjectHandleLastPage__()
|
2013-08-22 16:26:44 +02:00
|
|
|
return projectName
|
|
|
|
|
2014-04-24 16:50:29 +02:00
|
|
|
def createNewCPPLib(projectDir = None, projectName = None, className = None, fromWelcome = False,
|
|
|
|
target = Targets.DESKTOP_474_GCC, isStatic = False, modules = ["QtCore"]):
|
2014-09-17 15:06:39 +02:00
|
|
|
available = __createProjectOrFileSelectType__(" Library", "C++ Library", fromWelcome, True)
|
2014-04-24 16:50:29 +02:00
|
|
|
if isStatic:
|
|
|
|
libType = LibType.STATIC
|
|
|
|
else:
|
|
|
|
libType = LibType.SHARED
|
|
|
|
if projectDir == None:
|
|
|
|
projectDir = tempDir()
|
|
|
|
projectName = __createProjectSetNameAndPath__(projectDir, projectName, False, libType)
|
|
|
|
checkedTargets = __chooseTargets__(target, available)
|
|
|
|
snooze(1)
|
|
|
|
clickButton(waitForObject(":Next_QPushButton"))
|
|
|
|
__createProjectHandleModuleSelection__(modules)
|
|
|
|
className = __createProjectHandleClassInformation__(className)
|
|
|
|
__createProjectHandleLastPage__()
|
|
|
|
return checkedTargets, projectName, className
|
|
|
|
|
|
|
|
def createNewQtPlugin(projectDir=None, projectName=None, className=None, fromWelcome=False,
|
|
|
|
target=Targets.DESKTOP_474_GCC, baseClass="QGenericPlugin"):
|
2014-09-17 15:06:39 +02:00
|
|
|
available = __createProjectOrFileSelectType__(" Library", "C++ Library", fromWelcome, True)
|
2014-04-24 16:50:29 +02:00
|
|
|
if projectDir == None:
|
|
|
|
projectDir = tempDir()
|
|
|
|
projectName = __createProjectSetNameAndPath__(projectDir, projectName, False, LibType.QT_PLUGIN)
|
|
|
|
checkedTargets = __chooseTargets__(target, available)
|
|
|
|
snooze(1)
|
|
|
|
clickButton(waitForObject(":Next_QPushButton"))
|
|
|
|
className = __createProjectHandleClassInformation__(className, baseClass)
|
|
|
|
__createProjectHandleLastPage__()
|
|
|
|
return checkedTargets, projectName, className
|
|
|
|
|
2013-04-05 16:58:06 +02:00
|
|
|
# parameter target can be an OR'd value of Targets
|
2013-08-22 16:26:44 +02:00
|
|
|
# parameter availableTargets should be the result of __createProjectOrFileSelectType__()
|
2012-02-16 12:57:24 +01:00
|
|
|
# or use None as a fallback
|
2013-10-24 12:06:42 +02:00
|
|
|
def __chooseTargets__(targets=Targets.DESKTOP_474_GCC, availableTargets=None):
|
2012-02-16 12:57:24 +01:00
|
|
|
if availableTargets != None:
|
|
|
|
available = availableTargets
|
|
|
|
else:
|
|
|
|
# following targets depend on the build environment - added for further/later tests
|
2015-03-31 15:48:03 +02:00
|
|
|
available = list(Targets.ALL_TARGETS)
|
2012-02-16 12:57:24 +01:00
|
|
|
if platform.system() in ('Windows', 'Microsoft'):
|
2013-04-05 16:58:06 +02:00
|
|
|
available.remove(Targets.EMBEDDED_LINUX)
|
2015-03-19 17:22:12 +01:00
|
|
|
elif platform.system() == 'Darwin':
|
|
|
|
available.remove(Targets.DESKTOP_541_GCC)
|
2013-01-18 16:31:48 +01:00
|
|
|
checkedTargets = []
|
2011-11-29 16:00:18 +01:00
|
|
|
for current in available:
|
|
|
|
mustCheck = targets & current == current
|
|
|
|
try:
|
2013-04-05 16:58:06 +02:00
|
|
|
ensureChecked("{type='QCheckBox' text='%s' visible='1'}" % Targets.getStringForTarget(current),
|
2012-07-13 11:37:56 +02:00
|
|
|
mustCheck, 3000)
|
2013-01-18 16:31:48 +01:00
|
|
|
if (mustCheck):
|
|
|
|
checkedTargets.append(current)
|
2011-11-29 16:00:18 +01:00
|
|
|
except LookupError:
|
|
|
|
if mustCheck:
|
2013-04-05 16:58:06 +02:00
|
|
|
test.fail("Failed to check target '%s'." % Targets.getStringForTarget(current))
|
2012-01-30 17:03:41 +01:00
|
|
|
else:
|
2012-02-16 12:57:24 +01:00
|
|
|
# Simulator has been added without knowing whether configured or not - so skip warning here?
|
2013-04-12 18:10:10 +02:00
|
|
|
if current != Targets.SIMULATOR:
|
2013-04-05 16:58:06 +02:00
|
|
|
test.warning("Target '%s' is not set up correctly." % Targets.getStringForTarget(current))
|
2013-01-18 16:31:48 +01:00
|
|
|
return checkedTargets
|
2011-11-29 16:00:18 +01:00
|
|
|
|
2014-04-24 16:50:29 +02:00
|
|
|
def __createProjectHandleModuleSelection__(modules):
|
|
|
|
modulesPage = waitForObject("{type='QmakeProjectManager::Internal::ModulesPage' unnamed='1' "
|
|
|
|
"visible='1'}")
|
|
|
|
chckBoxes = filter(lambda x: className(x) == 'QCheckBox', object.children(modulesPage))
|
|
|
|
chckBoxLabels = set([str(cb.text) for cb in chckBoxes])
|
|
|
|
if not set(modules).issubset(chckBoxLabels):
|
|
|
|
test.fatal("You want to check module(s) not available at 'Module Selection' page.",
|
|
|
|
"Not available: %s" % str(set(modules).difference(chckBoxLabels)))
|
|
|
|
for checkBox in chckBoxes:
|
|
|
|
test.log("(Un)Checking module checkbox '%s'" % str(checkBox.text))
|
|
|
|
ensureChecked(checkBox, str(checkBox.text) in modules, 3000)
|
|
|
|
clickButton(waitForObject(":Next_QPushButton"))
|
|
|
|
|
|
|
|
def __createProjectHandleClassInformation__(className, baseClass=None):
|
|
|
|
if baseClass:
|
|
|
|
selectFromCombo("{name='baseClassComboBox' type='QComboBox' visible='1'}", baseClass)
|
|
|
|
classLineEd = waitForObject("{name='classLineEdit' type='Utils::ClassNameValidatingLineEdit' "
|
|
|
|
"visible='1'}")
|
|
|
|
result = str(classLineEd.text)
|
|
|
|
if className:
|
|
|
|
replaceEditorContent(classLineEd, className)
|
|
|
|
try:
|
|
|
|
waitForObject("{text='The class name contains invalid characters.' type='QLabel' "
|
|
|
|
"unnamed='1' visible='1'}", 1000)
|
|
|
|
test.fatal("Class name contains invalid characters - using default.")
|
|
|
|
replaceEditorContent(classLineEd, result)
|
|
|
|
except:
|
|
|
|
result = className
|
|
|
|
clickButton(waitForObject(":Next_QPushButton"))
|
|
|
|
return result
|
|
|
|
|
2014-01-20 12:48:35 +01:00
|
|
|
def waitForProcessRunning(running=True):
|
2014-01-06 16:13:17 +01:00
|
|
|
outputButton = waitForObject(":Qt Creator_AppOutput_Core::Internal::OutputPaneToggleButton")
|
|
|
|
if not waitFor("outputButton.checked", 10000):
|
|
|
|
ensureChecked(outputButton)
|
|
|
|
waitFor("object.exists(':Qt Creator.ReRun_QToolButton')", 20000)
|
|
|
|
reRunButton = findObject(":Qt Creator.ReRun_QToolButton")
|
|
|
|
waitFor("object.exists(':Qt Creator.Stop_QToolButton')", 20000)
|
|
|
|
stopButton = findObject(":Qt Creator.Stop_QToolButton")
|
2014-01-20 12:48:35 +01:00
|
|
|
return waitFor("(reRunButton.enabled != running) and (stopButton.enabled == running)", 10000)
|
2014-01-06 16:13:17 +01:00
|
|
|
|
2011-11-29 16:00:18 +01:00
|
|
|
# run and close an application
|
|
|
|
# withHookInto - if set to True the function tries to attach to the sub-process instead of simply pressing Stop inside Creator
|
|
|
|
# executable - must be defined when using hook-into
|
|
|
|
# port - must be defined when using hook-into
|
|
|
|
# function - can be a string holding a function name or a reference to the function itself - this function will be called on
|
|
|
|
# the sub-process when hooking-into has been successful - if its missing simply closing the Qt Quick app will be done
|
|
|
|
# sType the SubprocessType - is nearly mandatory - except when using the function parameter
|
|
|
|
# userDefinedType - if you set sType to SubprocessType.USER_DEFINED you must(!) specify the WindowType for hooking into
|
|
|
|
# by yourself (or use the function parameter)
|
|
|
|
# ATTENTION! Make sure this function won't fail and the sub-process will end when the function returns
|
2014-01-23 16:29:05 +01:00
|
|
|
# returns None if the build failed, False if the subprocess did not start, and True otherwise
|
2014-02-14 13:04:07 +01:00
|
|
|
def runAndCloseApp(withHookInto=False, executable=None, port=None, function=None, sType=None, userDefinedType=None, quickVersion="1.1"):
|
2013-04-23 12:39:05 +02:00
|
|
|
runButton = waitForObject(":*Qt Creator.Run_Core::Internal::FancyToolButton")
|
2011-11-29 16:00:18 +01:00
|
|
|
clickButton(runButton)
|
|
|
|
if sType != SubprocessType.QT_QUICK_UI:
|
2014-01-21 17:29:35 +01:00
|
|
|
waitForCompile(300000)
|
2011-11-29 16:00:18 +01:00
|
|
|
buildSucceeded = checkLastBuild()
|
2014-01-06 16:13:17 +01:00
|
|
|
ensureChecked(waitForObject(":Qt Creator_AppOutput_Core::Internal::OutputPaneToggleButton"))
|
2011-11-29 16:00:18 +01:00
|
|
|
if not buildSucceeded:
|
|
|
|
test.fatal("Build inside run wasn't successful - leaving test")
|
2014-01-23 16:29:05 +01:00
|
|
|
return None
|
2014-01-20 12:48:35 +01:00
|
|
|
if not waitForProcessRunning():
|
2011-11-29 16:00:18 +01:00
|
|
|
test.fatal("Couldn't start application - leaving test")
|
|
|
|
return False
|
2012-04-02 13:33:10 +02:00
|
|
|
if sType == SubprocessType.QT_QUICK_UI and os.getenv("SYSTEST_QMLVIEWER_NO_HOOK_INTO", "0") == "1":
|
2012-01-23 11:19:01 +01:00
|
|
|
withHookInto = False
|
2014-01-22 09:39:04 +01:00
|
|
|
if withHookInto and not validType(sType, userDefinedType, quickVersion):
|
2011-11-29 16:00:18 +01:00
|
|
|
if function != None:
|
|
|
|
test.warning("You did not provide a valid value for the SubprocessType value - sType, but you have "
|
|
|
|
"provided a function to execute on the subprocess. Please ensure that your function "
|
|
|
|
"closes the subprocess before exiting, or this test will not complete.")
|
|
|
|
else:
|
|
|
|
test.warning("You did not provide a valid value for the SubprocessType value - sType, nor a "
|
|
|
|
"function to execute on the subprocess. Falling back to pushing the STOP button "
|
|
|
|
"inside creator to terminate execution of the subprocess.")
|
|
|
|
withHookInto = False
|
|
|
|
if withHookInto and not executable in ("", None):
|
2014-01-22 09:39:04 +01:00
|
|
|
__closeSubprocessByHookingInto__(executable, port, function, sType, userDefinedType, quickVersion)
|
2011-11-29 16:00:18 +01:00
|
|
|
else:
|
|
|
|
__closeSubprocessByPushingStop__(sType)
|
|
|
|
return True
|
|
|
|
|
2014-01-22 09:39:04 +01:00
|
|
|
def validType(sType, userDef, quickVersion):
|
2011-11-29 16:00:18 +01:00
|
|
|
if sType == None:
|
|
|
|
return False
|
2014-01-22 09:39:04 +01:00
|
|
|
ty = SubprocessType.getWindowType(sType, quickVersion)
|
2011-11-29 16:00:18 +01:00
|
|
|
return ty != None and not (ty == "user-defined" and (userDef == None or userDef.strip() == ""))
|
|
|
|
|
|
|
|
def __closeSubprocessByPushingStop__(sType):
|
2011-12-12 13:58:18 +01:00
|
|
|
ensureChecked(":Qt Creator_AppOutput_Core::Internal::OutputPaneToggleButton")
|
2012-04-05 18:35:59 +02:00
|
|
|
try:
|
|
|
|
waitForObject(":Qt Creator.Stop_QToolButton", 5000)
|
|
|
|
except:
|
|
|
|
pass
|
2011-11-29 16:00:18 +01:00
|
|
|
playButton = verifyEnabled(":Qt Creator.ReRun_QToolButton", False)
|
|
|
|
stopButton = verifyEnabled(":Qt Creator.Stop_QToolButton")
|
|
|
|
if stopButton.enabled:
|
|
|
|
clickButton(stopButton)
|
2014-01-08 10:48:00 +01:00
|
|
|
test.verify(waitFor("playButton.enabled", 5000), "Play button should be enabled")
|
|
|
|
test.compare(stopButton.enabled, False, "Stop button should be disabled")
|
2011-11-29 16:00:18 +01:00
|
|
|
if sType == SubprocessType.QT_QUICK_UI and platform.system() == "Darwin":
|
2012-02-14 12:24:14 +01:00
|
|
|
waitFor("stopButton.enabled==False")
|
2011-11-29 16:00:18 +01:00
|
|
|
snooze(2)
|
|
|
|
nativeType("<Escape>")
|
|
|
|
else:
|
|
|
|
test.fatal("Subprocess does not seem to have been started.")
|
|
|
|
|
2014-01-22 09:39:04 +01:00
|
|
|
def __closeSubprocessByHookingInto__(executable, port, function, sType, userDefType, quickVersion):
|
2011-12-12 13:58:18 +01:00
|
|
|
ensureChecked(":Qt Creator_AppOutput_Core::Internal::OutputPaneToggleButton")
|
2012-11-02 19:34:38 +01:00
|
|
|
output = waitForObject("{type='Core::OutputWindow' visible='1' windowTitle='Application Output Window'}")
|
2011-11-29 16:00:18 +01:00
|
|
|
if port == None:
|
|
|
|
test.warning("I need a port number or attaching might fail.")
|
|
|
|
else:
|
|
|
|
waitFor("'Listening on port %d for incoming connectionsdone' in str(output.plainText)" % port, 5000)
|
|
|
|
try:
|
|
|
|
attachToApplication(executable)
|
|
|
|
except:
|
|
|
|
resetApplicationContextToCreator()
|
2014-03-27 17:45:32 +01:00
|
|
|
if ("Loading Qt Wrapper failed" in str(output.plainText)
|
|
|
|
or "Failed to assign process to job object" in str(output.plainText)):
|
2013-02-25 16:42:57 +01:00
|
|
|
test.warning("Loading of Qt Wrapper failed - probably different Qt versions.",
|
|
|
|
"Resetting hook-into settings to continue.")
|
|
|
|
# assuming we're still on the build settings of the current project (TODO)
|
|
|
|
switchViewTo(ViewConstants.PROJECTS)
|
|
|
|
if sType == SubprocessType.QT_QUICK_UI:
|
2013-11-01 15:39:00 +01:00
|
|
|
if "qmlscene" in executable:
|
|
|
|
selectConfig = "QML Scene"
|
|
|
|
else:
|
|
|
|
selectConfig = "QML Viewer"
|
2013-02-25 16:42:57 +01:00
|
|
|
else:
|
|
|
|
selectConfig = executable
|
|
|
|
selectFromCombo(waitForObject("{buddy={text='Run configuration:' type='QLabel' "
|
|
|
|
"unnamed='1' visible='1'} type='QComboBox' unnamed='1' "
|
|
|
|
"visible='1'}"), selectConfig)
|
|
|
|
switchViewTo(ViewConstants.EDIT)
|
2013-04-23 12:39:05 +02:00
|
|
|
runButton = waitForObject(":*Qt Creator.Run_Core::Internal::FancyToolButton")
|
2013-02-25 16:42:57 +01:00
|
|
|
clickButton(runButton)
|
2014-01-20 12:48:35 +01:00
|
|
|
if not waitForProcessRunning():
|
2013-02-25 16:42:57 +01:00
|
|
|
test.fatal("Something seems to be really wrong.", "Application output:"
|
|
|
|
% str(output.plainText))
|
|
|
|
return False
|
|
|
|
else:
|
|
|
|
test.log("Application seems to be started without hooking-into.")
|
|
|
|
else:
|
|
|
|
test.warning("Could not attach to '%s' - using fallback of pushing STOP inside Creator." % executable)
|
2011-11-29 16:00:18 +01:00
|
|
|
__closeSubprocessByPushingStop__(sType)
|
|
|
|
return False
|
|
|
|
if function == None:
|
|
|
|
if sType==SubprocessType.USER_DEFINED:
|
|
|
|
sendEvent("QCloseEvent", "{type='%s' unnamed='1' visible='1'}" % userDefType)
|
|
|
|
else:
|
2014-01-22 09:39:04 +01:00
|
|
|
sendEvent("QCloseEvent", "{type='%s' unnamed='1' visible='1'}" % SubprocessType.getWindowType(sType, quickVersion))
|
2011-11-29 16:00:18 +01:00
|
|
|
resetApplicationContextToCreator()
|
|
|
|
else:
|
|
|
|
try:
|
|
|
|
if isinstance(function, (str, unicode)):
|
|
|
|
globals()[function]()
|
|
|
|
else:
|
|
|
|
function()
|
|
|
|
except:
|
|
|
|
test.fatal("Function to execute on sub-process could not be found.",
|
|
|
|
"Using fallback of pushing STOP inside Creator.")
|
|
|
|
resetApplicationContextToCreator()
|
|
|
|
__closeSubprocessByPushingStop__(sType)
|
2014-01-20 12:48:35 +01:00
|
|
|
resetApplicationContextToCreator()
|
2014-01-21 16:59:09 +01:00
|
|
|
if not (waitForProcessRunning(False) and waitFor("'exited with code' in str(output.plainText)", 10000)):
|
2011-11-29 16:00:18 +01:00
|
|
|
test.warning("Sub-process seems not to have closed properly.")
|
|
|
|
try:
|
|
|
|
__closeSubprocessByPushingStop__(sType)
|
|
|
|
except:
|
|
|
|
pass
|
2014-01-24 10:57:56 +01:00
|
|
|
if (platform.system() in ('Microsoft', 'Windows') and
|
|
|
|
'Listening on port %d for incoming connectionsdone' % port not in str(output.plainText)):
|
|
|
|
checkForStillRunningQmlExecutable([executable + ".exe"])
|
2011-11-29 16:00:18 +01:00
|
|
|
return True
|
|
|
|
|
|
|
|
# this helper tries to reset the current application context back
|
|
|
|
# to creator - this strange work-around is needed _sometimes_ on MacOS
|
|
|
|
def resetApplicationContextToCreator():
|
|
|
|
appCtxt = applicationContext("qtcreator")
|
|
|
|
if appCtxt.name == "":
|
|
|
|
appCtxt = applicationContext("Qt Creator")
|
|
|
|
setApplicationContext(appCtxt)
|
2012-02-16 12:57:24 +01:00
|
|
|
|
|
|
|
# helper that examines the text (coming from the create project wizard)
|
|
|
|
# to figure out which available targets we have
|
|
|
|
# Simulator must be handled in a special way, because this depends on the
|
|
|
|
# configured Qt versions and Toolchains and cannot be looked up the same way
|
2012-02-17 17:10:53 +01:00
|
|
|
# if you set getAsStrings to True this function returns a list of strings instead
|
2013-04-05 16:58:06 +02:00
|
|
|
# of the constants defined in Targets
|
2013-07-18 17:34:27 +02:00
|
|
|
def __getSupportedPlatforms__(text, templateName, getAsStrings=False):
|
2012-02-17 17:10:53 +01:00
|
|
|
reqPattern = re.compile("requires qt (?P<version>\d+\.\d+(\.\d+)?)", re.IGNORECASE)
|
|
|
|
res = reqPattern.search(text)
|
|
|
|
if res:
|
|
|
|
version = res.group("version")
|
|
|
|
else:
|
|
|
|
version = None
|
2012-02-16 12:57:24 +01:00
|
|
|
if 'Supported Platforms' in text:
|
|
|
|
supports = text[text.find('Supported Platforms'):].split(":")[1].strip().split(" ")
|
|
|
|
result = []
|
|
|
|
if 'Desktop' in supports:
|
2013-08-26 11:17:33 +02:00
|
|
|
if version == None or version < "5.0":
|
|
|
|
result.append(Targets.DESKTOP_474_GCC)
|
2015-03-18 15:31:36 +01:00
|
|
|
result.append(Targets.DESKTOP_480_DEFAULT)
|
2013-08-26 11:17:33 +02:00
|
|
|
if platform.system() in ("Linux", "Darwin"):
|
|
|
|
result.append(Targets.EMBEDDED_LINUX)
|
2014-07-28 16:01:11 +02:00
|
|
|
result.extend([Targets.DESKTOP_521_DEFAULT, Targets.DESKTOP_531_DEFAULT])
|
2015-02-20 13:54:44 +01:00
|
|
|
if platform.system() != 'Darwin':
|
|
|
|
result.append(Targets.DESKTOP_541_GCC)
|
2015-07-13 17:07:39 +02:00
|
|
|
if not templateName == "Qt Creator Plugin" and (version == None or version < "5.0"):
|
2013-04-05 16:58:06 +02:00
|
|
|
result.append(Targets.SIMULATOR)
|
2012-02-16 12:57:24 +01:00
|
|
|
elif 'Platform independent' in text:
|
2015-03-31 15:48:03 +02:00
|
|
|
result = list(Targets.ALL_TARGETS)
|
2015-03-19 17:22:12 +01:00
|
|
|
result.remove(Targets.EMBEDDED_LINUX)
|
|
|
|
if platform.system() == 'Darwin':
|
|
|
|
result.remove(Targets.DESKTOP_541_GCC)
|
2012-02-16 12:57:24 +01:00
|
|
|
else:
|
|
|
|
test.warning("Returning None (__getSupportedPlatforms__())",
|
|
|
|
"Parsed text: '%s'" % text)
|
2015-06-25 16:06:48 +02:00
|
|
|
return [], None
|
2012-02-17 17:10:53 +01:00
|
|
|
if getAsStrings:
|
2013-04-05 16:58:06 +02:00
|
|
|
result = Targets.getTargetsAsStrings(result)
|
2012-02-17 17:10:53 +01:00
|
|
|
return result, version
|
2012-04-05 14:29:13 +02:00
|
|
|
|
|
|
|
# copy example project (sourceExample is path to project) to temporary directory inside repository
|
|
|
|
def prepareTemplate(sourceExample):
|
|
|
|
templateDir = os.path.abspath(tempDir() + "/template")
|
2012-10-09 15:00:17 +02:00
|
|
|
try:
|
|
|
|
shutil.copytree(sourceExample, templateDir)
|
|
|
|
except:
|
|
|
|
test.fatal("Error while copying '%s' to '%s'" % (sourceExample, templateDir))
|
|
|
|
return None
|
2012-04-05 14:29:13 +02:00
|
|
|
return templateDir
|
2012-04-05 19:19:01 +02:00
|
|
|
|
2014-04-22 16:02:37 +02:00
|
|
|
# check and copy files of given dataset to an existing templateDir
|
|
|
|
def checkAndCopyFiles(dataSet, fieldName, templateDir):
|
|
|
|
files = map(lambda record:
|
|
|
|
os.path.normpath(os.path.join(srcPath, testData.field(record, fieldName))),
|
|
|
|
dataSet)
|
|
|
|
for currentFile in files:
|
|
|
|
if not neededFilePresent(currentFile):
|
|
|
|
return []
|
|
|
|
return copyFilesToDir(files, templateDir)
|
|
|
|
|
|
|
|
# copy a list of files to an existing targetDir
|
|
|
|
def copyFilesToDir(files, targetDir):
|
|
|
|
result = []
|
|
|
|
for filepath in files:
|
|
|
|
dst = os.path.join(targetDir, os.path.basename(filepath))
|
|
|
|
shutil.copyfile(filepath, dst)
|
|
|
|
result.append(dst)
|
|
|
|
return result
|
|
|
|
|
2012-04-05 19:19:01 +02:00
|
|
|
def __sortFilenamesOSDependent__(filenames):
|
|
|
|
if platform.system() in ('Windows', 'Microsoft'):
|
|
|
|
filenames.sort(key=str.lower)
|
|
|
|
else:
|
|
|
|
filenames.sort()
|
|
|
|
return filenames
|
2012-07-19 09:16:52 +02:00
|
|
|
|
2012-06-12 17:16:41 +02:00
|
|
|
def __iterateChildren__(model, parent, nestingLevel=0):
|
|
|
|
children = []
|
2012-10-25 12:59:03 +02:00
|
|
|
for currentIndex in dumpIndices(model, parent):
|
2012-06-12 17:16:41 +02:00
|
|
|
children.append([str(currentIndex.text), nestingLevel])
|
|
|
|
if model.hasChildren(currentIndex):
|
|
|
|
children.extend(__iterateChildren__(model, currentIndex, nestingLevel + 1))
|
|
|
|
return children
|
|
|
|
|
|
|
|
# This will write the data to a file which can then be used for comparing
|
|
|
|
def __writeProjectTreeFile__(projectTree, filename):
|
|
|
|
f = open(filename, "w+")
|
|
|
|
f.write('"text"\t"nestinglevel"\n')
|
|
|
|
for elem in projectTree:
|
|
|
|
f.write('"%s"\t"%s"\n' % (elem[0], elem[1]))
|
|
|
|
f.close()
|
|
|
|
|
|
|
|
def __getTestData__(record):
|
|
|
|
return [testData.field(record, "text"),
|
|
|
|
__builtin__.int(testData.field(record, "nestinglevel"))]
|
|
|
|
|
|
|
|
def compareProjectTree(rootObject, dataset):
|
|
|
|
root = waitForObject(rootObject)
|
|
|
|
tree = __iterateChildren__(root.model(), root)
|
|
|
|
|
|
|
|
# __writeProjectTreeFile__(tree, dataset)
|
|
|
|
|
|
|
|
for i, current in enumerate(map(__getTestData__, testData.dataset(dataset))):
|
|
|
|
try:
|
|
|
|
# Just removing everything up to the found item
|
|
|
|
# Writing a pass would result in truly massive logs
|
|
|
|
tree = tree[tree.index(current) + 1:]
|
|
|
|
except ValueError:
|
|
|
|
test.fail('Could not find "%s" with nesting level %s' % tuple(current),
|
|
|
|
'Line %s in dataset' % str(i + 1))
|
|
|
|
return
|
|
|
|
test.passes("No errors found in project tree")
|
2012-10-09 15:00:17 +02:00
|
|
|
|
2013-12-13 15:59:06 +01:00
|
|
|
def addCPlusPlusFileToCurrentProject(name, template, forceOverwrite=False, addToVCS = "<None>"):
|
2012-10-09 15:00:17 +02:00
|
|
|
if name == None:
|
|
|
|
test.fatal("File must have a name - got None.")
|
|
|
|
return
|
|
|
|
__createProjectOrFileSelectType__(" C++", template, isProject=False)
|
2014-10-08 12:31:37 +02:00
|
|
|
window = "{type='ProjectExplorer::JsonWizard' unnamed='1' visible='1'}"
|
2014-02-14 17:07:48 +01:00
|
|
|
basePath = str(waitForObject("{type='Utils::FancyLineEdit' unnamed='1' visible='1' "
|
2012-10-09 15:00:17 +02:00
|
|
|
"window=%s}" % window).text)
|
|
|
|
lineEdit = waitForObject("{name='nameLineEdit' type='Utils::FileNameValidatingLineEdit' "
|
|
|
|
"visible='1' window=%s}" % window)
|
|
|
|
replaceEditorContent(lineEdit, name)
|
|
|
|
clickButton(waitForObject(":Next_QPushButton"))
|
2013-09-11 23:17:28 +02:00
|
|
|
fileExistedBefore = os.path.exists(os.path.join(basePath, name))
|
2013-12-13 15:59:06 +01:00
|
|
|
__createProjectHandleLastPage__(addToVersionControl = addToVCS)
|
2013-09-11 23:17:28 +02:00
|
|
|
if (fileExistedBefore):
|
2012-10-09 15:00:17 +02:00
|
|
|
overwriteDialog = "{type='Core::Internal::PromptOverwriteDialog' unnamed='1' visible='1'}"
|
|
|
|
waitForObject(overwriteDialog)
|
|
|
|
if forceOverwrite:
|
|
|
|
buttonToClick = 'OK'
|
|
|
|
else:
|
|
|
|
buttonToClick = 'Cancel'
|
|
|
|
clickButton("{text='%s' type='QPushButton' unnamed='1' visible='1' window=%s}"
|
|
|
|
% (buttonToClick, overwriteDialog))
|