forked from qt-creator/qt-creator
Merge remote-tracking branch 'origin/4.7'
Conflicts: src/plugins/debugger/debuggerruncontrol.cpp Change-Id: I72882df605bc3fc8a8d20118fd4e49207ac92664
This commit is contained in:
@@ -744,11 +744,10 @@
|
||||
|
||||
\section3 Null Pointers
|
||||
|
||||
Using a plain zero (0) for null pointer constants is always correct and
|
||||
least effort to type.
|
||||
Use nullptr for null pointer constants.
|
||||
|
||||
\code
|
||||
void *p = 0;
|
||||
void *p = nullptr;
|
||||
|
||||
-NOT-
|
||||
|
||||
@@ -764,7 +763,7 @@
|
||||
\endcode
|
||||
|
||||
\note As an exception, imported third party code as well as code
|
||||
interfacing the native APIs (src/support/os_*) can use NULL.
|
||||
interfacing the native APIs (src/support/os_*) can use NULL or 0.
|
||||
|
||||
\section2 C++11 and C++14 Features
|
||||
|
||||
|
@@ -303,7 +303,7 @@ The minimum API level required by the kit is %1.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Android run settings</source>
|
||||
<translation>Настройки запуска Android</translation>
|
||||
<translation>Настройки запуска под Android</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The project file "%1" is currently being parsed.</source>
|
||||
@@ -357,7 +357,7 @@ The minimum API level required by the kit is %1.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Install the missing emulator tool (%1) to the installed Android SDK.</source>
|
||||
<translation>Установите отсутствующую утилиту эмуляции (%1) в установленный Android SDK.</translation>
|
||||
<translation>Установите утилиту эмуляции (%1) в установленный Android SDK.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -929,7 +929,7 @@ Do you want to uninstall the existing package?</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot attach jdb to the running application</source>
|
||||
<translation>Не удалось подключить jdb к работающему приложению</translation>
|
||||
<translation>Не удалось подключить jdb к запущенному приложению</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>"%1" died.</source>
|
||||
@@ -1909,7 +1909,7 @@ Executable: %2</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Select on what grouping the tests should be based.</source>
|
||||
<translation>Выберите основание для группировки тестов.</translation>
|
||||
<translation>Выберите критерий для группировки тестов.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Directory</source>
|
||||
@@ -14156,7 +14156,7 @@ You can choose between waiting longer or aborting debugging.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Attached to running application.</source>
|
||||
<translation>Присоединено к работающему приложению.</translation>
|
||||
<translation>Присоединено к запущенному приложению.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Failed to attach to application: %1</source>
|
||||
|
@@ -49,8 +49,10 @@ public:
|
||||
toReplace.append(':');
|
||||
toReplace.append(lib.path());
|
||||
|
||||
if (ldLibraryPath.startsWith(toReplace))
|
||||
set("LD_LIBRARY_PATH", ldLibraryPath.remove(0, toReplace.length()));
|
||||
if (ldLibraryPath.startsWith(toReplace + ':'))
|
||||
set("LD_LIBRARY_PATH", ldLibraryPath.remove(0, toReplace.length() + 1));
|
||||
else if (ldLibraryPath == toReplace)
|
||||
unset("LD_LIBRARY_PATH");
|
||||
}
|
||||
}
|
||||
};
|
||||
|
@@ -238,7 +238,8 @@ void TestRunner::cancelCurrent(TestRunner::CancelReason reason)
|
||||
|
||||
void TestRunner::onProcessFinished()
|
||||
{
|
||||
if (m_currentConfig) {
|
||||
if (m_executingTests && QTC_GUARD(m_currentConfig)) {
|
||||
QTC_CHECK(m_fakeFutureInterface);
|
||||
m_fakeFutureInterface->setProgressValue(m_fakeFutureInterface->progressValue()
|
||||
+ m_currentConfig->testCaseCount());
|
||||
if (!m_fakeFutureInterface->isCanceled()) {
|
||||
@@ -257,6 +258,10 @@ void TestRunner::onProcessFinished()
|
||||
}
|
||||
resetInternalPointers();
|
||||
|
||||
if (!m_fakeFutureInterface) {
|
||||
QTC_ASSERT(!m_executingTests, m_executingTests = false);
|
||||
return;
|
||||
}
|
||||
if (!m_selectedTests.isEmpty() && !m_fakeFutureInterface->isCanceled())
|
||||
scheduleNext();
|
||||
else
|
||||
@@ -552,8 +557,9 @@ void TestRunner::debugTests()
|
||||
outputreader, &QObject::deleteLater);
|
||||
}
|
||||
|
||||
connect(this, &TestRunner::requestStopTestRun, runControl,
|
||||
&ProjectExplorer::RunControl::initiateStop);
|
||||
m_stopDebugConnect = connect(this, &TestRunner::requestStopTestRun,
|
||||
runControl, &ProjectExplorer::RunControl::initiateStop);
|
||||
|
||||
connect(runControl, &ProjectExplorer::RunControl::stopped, this, &TestRunner::onFinished);
|
||||
ProjectExplorer::ProjectExplorerPlugin::startRunControl(runControl);
|
||||
}
|
||||
@@ -611,6 +617,7 @@ void TestRunner::onFinished()
|
||||
qDeleteAll(m_selectedTests);
|
||||
m_selectedTests.clear();
|
||||
|
||||
disconnect(m_stopDebugConnect);
|
||||
disconnect(m_targetConnect);
|
||||
m_fakeFutureInterface = nullptr;
|
||||
m_executingTests = false;
|
||||
|
@@ -98,6 +98,8 @@ private:
|
||||
|
||||
// temporarily used if building before running is necessary
|
||||
QMetaObject::Connection m_buildConnect;
|
||||
// temporarily used when debugging
|
||||
QMetaObject::Connection m_stopDebugConnect;
|
||||
// temporarily used for handling of switching the current target
|
||||
QMetaObject::Connection m_targetConnect;
|
||||
};
|
||||
|
@@ -40,6 +40,7 @@ namespace CppTools {
|
||||
|
||||
class CPPTOOLS_EXPORT VirtualFunctionAssistProvider : public TextEditor::IAssistProvider
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
VirtualFunctionAssistProvider();
|
||||
|
||||
|
@@ -2603,9 +2603,13 @@ void GdbEngine::changeBreakpoint(Breakpoint bp)
|
||||
cmd.callback = [this, bp](const DebuggerResponse &r) { handleBreakLineNumber(r, bp); };
|
||||
} else if (data.command != response.command) {
|
||||
cmd.function = "-break-commands " + bpnr;
|
||||
foreach (const QString &command, data.command.split(QLatin1String("\n"))) {
|
||||
if (!command.isEmpty())
|
||||
for (QString command : data.command.split('\n')) {
|
||||
if (!command.isEmpty()) {
|
||||
// escape backslashes and quotes
|
||||
command.replace('\\', "\\\\");
|
||||
command.replace('"', "\\\"");
|
||||
cmd.function += " \"" + command + '"';
|
||||
}
|
||||
}
|
||||
cmd.callback = [this, bp](const DebuggerResponse &r) { handleBreakIgnore(r, bp); };
|
||||
} else if (!data.conditionsMatch(response.condition)) {
|
||||
|
@@ -78,8 +78,7 @@ GuiAppWizard::GuiAppWizard()
|
||||
"Includes a Qt Designer-based main window.\n\n"
|
||||
"Preselects a desktop Qt for building the application if available."));
|
||||
setIcon(QIcon(QLatin1String(":/wizards/images/gui.png")));
|
||||
auto qt5 = Core::Id::fromString(QString(QtSupport::Constants::FEATURE_QT_PREFIX).append(".5"));
|
||||
setRequiredFeatures({QtSupport::Constants::FEATURE_QWIDGETS, qt5});
|
||||
setRequiredFeatures({QtSupport::Constants::FEATURE_QWIDGETS});
|
||||
}
|
||||
|
||||
Core::BaseFileWizard *GuiAppWizard::create(QWidget *parent, const Core::WizardDialogParameters ¶meters) const
|
||||
|
@@ -84,7 +84,6 @@ QtProjectParameters GuiAppWizardDialog::projectParameters() const
|
||||
rc.path = path();
|
||||
rc.selectedModules = selectedModulesList();
|
||||
rc.deselectedModules = deselectedModulesList();
|
||||
rc.qtVersionSupport = QtProjectParameters::SupportQt5Only;
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@@ -512,7 +512,7 @@ bool CodeAssistantPrivate::isDestroyEvent(int key, const QString &keyText)
|
||||
{
|
||||
if (keyText.isEmpty())
|
||||
return key != Qt::LeftArrow && key != Qt::RightArrow && key != Qt::Key_Shift;
|
||||
else if (auto *provider = dynamic_cast<CompletionAssistProvider *>(m_requestProvider))
|
||||
if (auto *provider = qobject_cast<CompletionAssistProvider *>(m_requestProvider))
|
||||
return !provider->isContinuationChar(keyText.at(0));
|
||||
return false;
|
||||
}
|
||||
|
Submodule src/shared/qbs updated: 2440b19b28...66131652f1
@@ -159,7 +159,6 @@
|
||||
:Qt Creator_QmlJSEditor::Internal::QmlJSOutlineTreeView {type='QmlJSEditor::Internal::QmlJSOutlineTreeView' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'}
|
||||
:Qt Creator_QmlJSEditor::QmlJSTextEditorWidget {type='QmlJSEditor::Internal::QmlJSEditorWidget' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'}
|
||||
:Qt Creator_SearchResult_Core::Internal::OutputPaneToggleButton {occurrence='2' type='Core::Internal::OutputPaneToggleButton' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'}
|
||||
:Qt Creator_SystemSettings.Details_Utils::DetailsButton {occurrence='4' text='Details' type='Utils::DetailsButton' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'}
|
||||
:Qt Creator_TextEditor::TextEditorWidget {type='TextEditor::TextEditorWidget' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'}
|
||||
:Qt Creator_Utils::BuildDirectoryLineEdit {name='shadowBuildDirEditLineEdit' type='Utils::FancyLineEdit' visible='1' window=':Qt Creator_Core::Internal::MainWindow'}
|
||||
:Qt Creator_Utils::NavigationTreeView {type='Utils::NavigationTreeView' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'}
|
||||
@@ -220,7 +219,6 @@
|
||||
:scrollArea.Edit build configuration:_QComboBox {leftWidget=':scrollArea.Edit build configuration:_QLabel' type='QComboBox' unnamed='1' visible='1'}
|
||||
:scrollArea.Edit build configuration:_QLabel {text='Edit build configuration:' type='QLabel' unnamed='1' visible='1'}
|
||||
:scrollArea.Library not available_QLabel {name='qmlDebuggingWarningText' text?='Library not available*' type='QLabel' visible='1' window=':Qt Creator_Core::Internal::MainWindow'}
|
||||
:scrollArea.environment_QTreeView {container=':Qt Creator.scrollArea_QScrollArea' type='QTreeView' unnamed='1' visible='1'}
|
||||
:scrollArea.qmlDebuggingLibraryCheckBox_QCheckBox {name='qmlDebuggingLibraryCheckBox' type='QCheckBox' visible='1' window=':Qt Creator_Core::Internal::MainWindow'}
|
||||
:sourceFileLineEdit_Utils::FileNameValidatingLineEdit {buddy=':Qt Gui Application.Source file:_QLabel' name='sourceFileLineEdit' type='Utils::FileNameValidatingLineEdit' visible='1'}
|
||||
:splitter.Commit File(s)_VcsBase::QActionPushButton {text~='(Commit .+/.+ File.*)' type='VcsBase::QActionPushButton' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'}
|
||||
|
@@ -25,6 +25,11 @@
|
||||
|
||||
import re;
|
||||
|
||||
def getBuildIssues():
|
||||
ensureChecked(":Qt Creator_Issues_Core::Internal::OutputPaneToggleButton")
|
||||
model = waitForObject(":Qt Creator.Issues_QListView").model()
|
||||
return dumpBuildIssues(model)
|
||||
|
||||
# this method checks the last build (if there's one) and logs the number of errors, warnings and
|
||||
# lines within the Issues output
|
||||
# param expectedToFail can be used to tell this function if the build was expected to fail or not
|
||||
@@ -32,20 +37,17 @@ import re;
|
||||
def checkLastBuild(expectedToFail=False, createTasksFileOnError=True):
|
||||
try:
|
||||
# can't use waitForObject() 'cause visible is always 0
|
||||
buildProg = findObject("{type='ProjectExplorer::Internal::BuildProgress' unnamed='1' }")
|
||||
findObject("{type='ProjectExplorer::Internal::BuildProgress' unnamed='1' }")
|
||||
except LookupError:
|
||||
test.log("checkLastBuild called without a build")
|
||||
return
|
||||
ensureChecked(":Qt Creator_Issues_Core::Internal::OutputPaneToggleButton")
|
||||
model = waitForObject(":Qt Creator.Issues_QListView").model()
|
||||
buildIssues = dumpBuildIssues(model)
|
||||
buildIssues = getBuildIssues()
|
||||
types = map(lambda i: i[5], buildIssues)
|
||||
errors = types.count("1")
|
||||
warnings = types.count("2")
|
||||
gotErrors = errors != 0
|
||||
test.verify(not (gotErrors ^ expectedToFail), "Errors: %s | Warnings: %s" % (errors, warnings))
|
||||
# additional stuff - could be removed... or improved :)
|
||||
test.log("Rows inside issues: %d" % model.rowCount())
|
||||
if gotErrors and createTasksFileOnError:
|
||||
createTasksFile(buildIssues)
|
||||
return not gotErrors
|
||||
@@ -129,15 +131,14 @@ def createTasksFile(buildIssues):
|
||||
file.close()
|
||||
test.log("Written tasks file %s" % outfile)
|
||||
|
||||
# returns a list of pairs each containing the zero based number of a kit
|
||||
# returns a list of pairs each containing the ID of a kit (see class Targets)
|
||||
# and the name of the matching build configuration
|
||||
# param kitCount specifies the number of kits currently defined (must be correct!)
|
||||
# param filter is a regular expression to filter the configuration by their name
|
||||
def iterateBuildConfigs(kitCount, filter = ""):
|
||||
def iterateBuildConfigs(filter = ""):
|
||||
switchViewTo(ViewConstants.PROJECTS)
|
||||
configs = []
|
||||
for currentKit in range(kitCount):
|
||||
switchToBuildOrRunSettingsFor(kitCount, currentKit, ProjectSettings.BUILD)
|
||||
for currentKit in iterateConfiguredKits():
|
||||
switchToBuildOrRunSettingsFor(currentKit, ProjectSettings.BUILD)
|
||||
model = waitForObject(":scrollArea.Edit build configuration:_QComboBox").model()
|
||||
prog = re.compile(filter)
|
||||
# for each row in the model, write its data to a list
|
||||
@@ -149,21 +150,23 @@ def iterateBuildConfigs(kitCount, filter = ""):
|
||||
return configs
|
||||
|
||||
# selects a build configuration for building the current project
|
||||
# param targetCount specifies the number of targets currently defined (must be correct!)
|
||||
# param currentTarget specifies the target for which to switch into the specified settings (zero based index)
|
||||
# param wantedKit specifies the ID of the kit to select (see class Targets)
|
||||
# param configName is the name of the configuration that should be selected
|
||||
# param afterSwitchTo the ViewConstant of the mode to switch to after selecting or None
|
||||
# returns information about the selected kit, see getQtInformationForBuildSettings
|
||||
def selectBuildConfig(targetCount, currentTarget, configName, afterSwitchTo=ViewConstants.EDIT):
|
||||
def selectBuildConfig(wantedKit, configName, afterSwitchTo=ViewConstants.EDIT):
|
||||
switchViewTo(ViewConstants.PROJECTS)
|
||||
switchToBuildOrRunSettingsFor(targetCount, currentTarget, ProjectSettings.BUILD)
|
||||
if selectFromCombo(":scrollArea.Edit build configuration:_QComboBox", configName) or targetCount > 1:
|
||||
if any((switchToBuildOrRunSettingsFor(wantedKit, ProjectSettings.BUILD),
|
||||
selectFromCombo(":scrollArea.Edit build configuration:_QComboBox", configName))):
|
||||
progressBarWait(30000)
|
||||
return getQtInformationForBuildSettings(targetCount, True, afterSwitchTo)
|
||||
if afterSwitchTo:
|
||||
if ViewConstants.FIRST_AVAILABLE <= afterSwitchTo <= ViewConstants.LAST_AVAILABLE:
|
||||
switchViewTo(afterSwitchTo)
|
||||
else:
|
||||
test.warning("Don't know where you trying to switch to (%s)" % afterSwitchTo)
|
||||
|
||||
# This will not trigger a rebuild. If needed, caller has to do this.
|
||||
def verifyBuildConfig(targetCount, currentTarget, configName, shouldBeDebug=False, enableShadowBuild=False, enableQmlDebug=False):
|
||||
qtInfo = selectBuildConfig(targetCount, currentTarget, configName, None)
|
||||
def verifyBuildConfig(currentTarget, configName, shouldBeDebug=False, enableShadowBuild=False, enableQmlDebug=False):
|
||||
selectBuildConfig(currentTarget, configName, None)
|
||||
ensureChecked(waitForObject(":scrollArea.Details_Utils::DetailsButton"))
|
||||
ensureChecked("{name='shadowBuildCheckBox' type='QCheckBox' visible='1'}", enableShadowBuild)
|
||||
buildCfCombo = waitForObject("{type='QComboBox' name='buildConfigurationComboBox' visible='1' "
|
||||
@@ -201,7 +204,6 @@ def verifyBuildConfig(targetCount, currentTarget, configName, shouldBeDebug=Fals
|
||||
clickButton(waitForObject(":QML Debugging.No_QPushButton", 5000))
|
||||
clickButton(waitForObject(":scrollArea.Details_Utils::DetailsButton"))
|
||||
switchViewTo(ViewConstants.EDIT)
|
||||
return qtInfo
|
||||
|
||||
# verify if building and running of project was successful
|
||||
def verifyBuildAndRun():
|
||||
@@ -216,15 +218,15 @@ def verifyBuildAndRun():
|
||||
"Verifying if built app started and closed successfully.")
|
||||
|
||||
# run project for debug and release
|
||||
def runVerify(checkedTargets):
|
||||
availableConfigs = iterateBuildConfigs(len(checkedTargets))
|
||||
def runVerify():
|
||||
availableConfigs = iterateBuildConfigs()
|
||||
if not availableConfigs:
|
||||
test.fatal("Haven't found build configurations, quitting")
|
||||
invokeMenuItem("File", "Save All")
|
||||
invokeMenuItem("File", "Exit")
|
||||
# select debug configuration
|
||||
for kit, config in availableConfigs:
|
||||
selectBuildConfig(len(checkedTargets), kit, config)
|
||||
selectBuildConfig(kit, config)
|
||||
test.log("Using build config '%s'" % config)
|
||||
if runAndCloseApp() == None:
|
||||
checkCompile()
|
||||
|
@@ -24,7 +24,6 @@
|
||||
############################################################################
|
||||
|
||||
import __builtin__
|
||||
import operator
|
||||
|
||||
# for easier re-usage (because Python hasn't an enum type)
|
||||
class Targets:
|
||||
@@ -81,6 +80,13 @@ class Targets:
|
||||
test.fatal("You've passed at least one unknown target!")
|
||||
return result
|
||||
|
||||
@staticmethod
|
||||
def getIdForTargetName(targetName):
|
||||
for id in Targets.ALL_TARGETS:
|
||||
if Targets.getStringForTarget(id) == targetName:
|
||||
return id
|
||||
raise Exception("'%s' is not a known target name" % targetName)
|
||||
|
||||
@staticmethod
|
||||
def getDefaultKit():
|
||||
return Targets.DESKTOP_5_6_1_DEFAULT
|
||||
|
@@ -23,8 +23,6 @@
|
||||
#
|
||||
############################################################################
|
||||
|
||||
import re
|
||||
|
||||
def handleDebuggerWarnings(config, isMsvcBuild=False):
|
||||
if isMsvcBuild:
|
||||
try:
|
||||
@@ -71,8 +69,8 @@ def setBreakpointsForCurrentProject(filesAndLines):
|
||||
if not filesAndLines or not isinstance(filesAndLines, (list,tuple)):
|
||||
test.fatal("This function only takes a non-empty list/tuple holding dicts.")
|
||||
return False
|
||||
navTree = waitForObject("{type='Utils::NavigationTreeView' unnamed='1' visible='1' "
|
||||
"window=':Qt Creator_Core::Internal::MainWindow'}")
|
||||
waitForObject("{type='Utils::NavigationTreeView' unnamed='1' visible='1' "
|
||||
"window=':Qt Creator_Core::Internal::MainWindow'}")
|
||||
for current in filesAndLines:
|
||||
for curFile,curLine in current.iteritems():
|
||||
if not openDocument(curFile):
|
||||
@@ -115,25 +113,24 @@ def removeOldBreakpoints():
|
||||
return test.compare(model.rowCount(), 0, "Check if all breakpoints have been removed.")
|
||||
|
||||
# function to do simple debugging of the current (configured) project
|
||||
# param kitCount specifies the number of kits currently defined (must be correct!)
|
||||
# param currentKit specifies the target to use (zero based index)
|
||||
# param currentKit specifies the ID of the kit to use (see class Targets)
|
||||
# param currentConfigName is the name of the configuration that should be used
|
||||
# param pressContinueCount defines how often it is expected to press
|
||||
# the 'Continue' button while debugging
|
||||
# param expectedBPOrder holds a list of dicts where the dicts contain always
|
||||
# only 1 key:value pair - the key is the name of the file, the value is
|
||||
# line number where the debugger should stop
|
||||
def doSimpleDebugging(kitCount, currentKit, currentConfigName, pressContinueCount=1,
|
||||
def doSimpleDebugging(currentKit, currentConfigName, pressContinueCount=1,
|
||||
expectedBPOrder=[], enableQml=True):
|
||||
expectedLabelTexts = ['Stopped\.', 'Stopped at breakpoint \d+ \(\d+\) in thread \d+\.']
|
||||
if len(expectedBPOrder) == 0:
|
||||
expectedLabelTexts.append("Running\.")
|
||||
switchViewTo(ViewConstants.PROJECTS)
|
||||
switchToBuildOrRunSettingsFor(kitCount, currentKit, ProjectSettings.RUN)
|
||||
switchToBuildOrRunSettingsFor(currentKit, ProjectSettings.RUN)
|
||||
ensureChecked(waitForObject("{container=':Qt Creator.scrollArea_QScrollArea' text='Enable QML' "
|
||||
"type='QCheckBox' unnamed='1' visible='1'}"), enableQml)
|
||||
switchViewTo(ViewConstants.EDIT)
|
||||
if not __startDebugger__(kitCount, currentKit, currentConfigName):
|
||||
if not __startDebugger__(currentKit, currentConfigName):
|
||||
return False
|
||||
statusLabel = findObject(":Debugger Toolbar.StatusText_Utils::StatusLabel")
|
||||
test.log("Continuing debugging %d times..." % pressContinueCount)
|
||||
@@ -167,20 +164,18 @@ def doSimpleDebugging(kitCount, currentKit, currentConfigName, pressContinueCoun
|
||||
# if stopping failed - debugger had already stopped
|
||||
return True
|
||||
|
||||
# param kitCount specifies the number of kits currently defined (must be correct!)
|
||||
# param currentKit specifies the target to use (zero based index)
|
||||
def isMsvcConfig(kitCount, currentKit):
|
||||
# param currentKit specifies the ID of the kit to use (see class Targets)
|
||||
def isMsvcConfig(currentKit):
|
||||
switchViewTo(ViewConstants.PROJECTS)
|
||||
switchToBuildOrRunSettingsFor(kitCount, currentKit, ProjectSettings.BUILD)
|
||||
switchToBuildOrRunSettingsFor(currentKit, ProjectSettings.BUILD)
|
||||
isMsvc = " -spec win32-msvc" in str(waitForObject(":qmakeCallEdit").text)
|
||||
switchViewTo(ViewConstants.EDIT)
|
||||
return isMsvc
|
||||
|
||||
# param kitCount specifies the number of kits currently defined (must be correct!)
|
||||
# param currentKit specifies the target to use (zero based index)
|
||||
# param currentKit specifies the ID of the kit to use (see class Targets)
|
||||
# param config is the name of the configuration that should be used
|
||||
def __startDebugger__(kitCount, currentKit, config):
|
||||
isMsvcBuild = isMsvcConfig(kitCount, currentKit)
|
||||
def __startDebugger__(currentKit, config):
|
||||
isMsvcBuild = isMsvcConfig(currentKit)
|
||||
clickButton(waitForObject(":*Qt Creator.Start Debugging_Core::Internal::FancyToolButton"))
|
||||
handleDebuggerWarnings(config, isMsvcBuild)
|
||||
try:
|
||||
|
@@ -106,7 +106,7 @@ def openContextMenuOnTextCursorPosition(editor):
|
||||
# param direction is one of "Left", "Right", "Up", "Down", but "End" and combinations work as well
|
||||
# param typeCount defines how often the cursor will be moved in the given direction (while marking)
|
||||
def markText(editor, direction, typeCount=1):
|
||||
for i in range(typeCount):
|
||||
for _ in range(typeCount):
|
||||
type(editor, "<Shift+%s>" % direction)
|
||||
|
||||
# works for all standard editors
|
||||
@@ -173,7 +173,7 @@ def verifyHoveringOnEditor(editor, lines, additionalKeyPresses, expectedTypes, e
|
||||
# param expectedVals a dict holding property value pairs that must match
|
||||
def __handleTextTips__(textTip, expectedVals, alternativeVals):
|
||||
props = object.properties(textTip)
|
||||
expFail = altFail = False
|
||||
expFail = False
|
||||
eResult = verifyProperties(props, expectedVals)
|
||||
for val in eResult.itervalues():
|
||||
if not val:
|
||||
@@ -182,7 +182,6 @@ def __handleTextTips__(textTip, expectedVals, alternativeVals):
|
||||
if expFail and alternativeVals != None:
|
||||
aResult = verifyProperties(props, alternativeVals)
|
||||
else:
|
||||
altFail = True
|
||||
aResult = None
|
||||
if not expFail:
|
||||
test.passes("TextTip verified")
|
||||
@@ -360,7 +359,7 @@ def invokeContextMenuItem(editorArea, command1, command2 = None):
|
||||
def invokeFindUsage(editor, line, typeOperation, n=1):
|
||||
if not placeCursorToLine(editor, line, True):
|
||||
return False
|
||||
for i in range(n):
|
||||
for _ in range(n):
|
||||
type(editor, typeOperation)
|
||||
snooze(1)
|
||||
invokeContextMenuItem(editor, "Find Usages")
|
||||
|
@@ -50,10 +50,9 @@ def openQmakeProject(projectPath, targets=Targets.desktopTargetClasses(), fromWe
|
||||
clickButton(waitForObject("{text='Yes' type='QPushButton' unnamed='1' visible='1'}"))
|
||||
except:
|
||||
pass
|
||||
checkedTargets = __chooseTargets__(targets)
|
||||
__chooseTargets__(targets)
|
||||
configureButton = waitForObject(":Qt Creator.Configure Project_QPushButton")
|
||||
clickButton(configureButton)
|
||||
return checkedTargets
|
||||
|
||||
def openCmakeProject(projectPath, buildDir):
|
||||
def additionalFunction():
|
||||
@@ -156,8 +155,12 @@ def __createProjectHandleQtQuickSelection__(minimumQtVersion):
|
||||
# Selects the Qt versions for a project
|
||||
# param checks turns tests in the function on if set to True
|
||||
# param available a list holding the available targets
|
||||
def __selectQtVersionDesktop__(checks, available=None):
|
||||
checkedTargets = __chooseTargets__(Targets.desktopTargetClasses(), available)
|
||||
# withoutQt4 if True Qt4 will get unchecked / not selected while checking the targets
|
||||
def __selectQtVersionDesktop__(checks, available=None, withoutQt4=False):
|
||||
wanted = Targets.desktopTargetClasses()
|
||||
if withoutQt4 and Targets.DESKTOP_4_8_7_DEFAULT in wanted:
|
||||
wanted.remove(Targets.DESKTOP_4_8_7_DEFAULT)
|
||||
checkedTargets = __chooseTargets__(wanted, available)
|
||||
if checks:
|
||||
for target in checkedTargets:
|
||||
detailsWidget = waitForObject("{type='Utils::DetailsWidget' unnamed='1' visible='1' "
|
||||
@@ -171,7 +174,6 @@ def __selectQtVersionDesktop__(checks, available=None):
|
||||
verifyChecked(cbObject % ("Release", objectMap.realName(detailsWidget)))
|
||||
clickButton(detailsButton)
|
||||
clickButton(waitForObject(":Next_QPushButton"))
|
||||
return checkedTargets
|
||||
|
||||
def __createProjectHandleLastPage__(expectedFiles=[], addToVersionControl="<None>", addToProject=None):
|
||||
if len(expectedFiles):
|
||||
@@ -216,7 +218,7 @@ def createProject_Qt_GUI(path, projectName, checks = True, addToVersionControl =
|
||||
template = "Qt Widgets Application"
|
||||
available = __createProjectOrFileSelectType__(" Application", template)
|
||||
__createProjectSetNameAndPath__(path, projectName, checks)
|
||||
checkedTargets = __selectQtVersionDesktop__(checks, available)
|
||||
__selectQtVersionDesktop__(checks, available, True)
|
||||
|
||||
if checks:
|
||||
exp_filename = "mainwindow"
|
||||
@@ -247,7 +249,6 @@ def createProject_Qt_GUI(path, projectName, checks = True, addToVersionControl =
|
||||
progressBarWait(20000)
|
||||
if checks:
|
||||
__verifyFileCreation__(path, expectedFiles)
|
||||
return checkedTargets
|
||||
|
||||
# Creates a Qt Console project
|
||||
# param path specifies where to create the project
|
||||
@@ -257,7 +258,7 @@ def createProject_Qt_Console(path, projectName, checks = True, buildSystem = Non
|
||||
available = __createProjectOrFileSelectType__(" Application", "Qt Console Application")
|
||||
__createProjectSetNameAndPath__(path, projectName, checks)
|
||||
__handleBuildSystem__(buildSystem)
|
||||
checkedTargets = __selectQtVersionDesktop__(checks, available)
|
||||
__selectQtVersionDesktop__(checks, available)
|
||||
|
||||
expectedFiles = []
|
||||
if checks:
|
||||
@@ -273,7 +274,6 @@ def createProject_Qt_Console(path, projectName, checks = True, buildSystem = Non
|
||||
progressBarWait(10000)
|
||||
if checks:
|
||||
__verifyFileCreation__(path, expectedFiles)
|
||||
return checkedTargets
|
||||
|
||||
def createNewQtQuickApplication(workingDir, projectName = None,
|
||||
targets=Targets.desktopTargetClasses(), minimumQtVersion="5.6",
|
||||
@@ -320,7 +320,7 @@ def createNewQmlExtension(workingDir, targets=[Targets.DESKTOP_5_6_1_DEFAULT]):
|
||||
if workingDir == None:
|
||||
workingDir = tempDir()
|
||||
__createProjectSetNameAndPath__(workingDir)
|
||||
checkedTargets = __chooseTargets__(targets, available)
|
||||
__chooseTargets__(targets, available)
|
||||
nextButton = waitForObject(":Next_QPushButton")
|
||||
clickButton(nextButton)
|
||||
nameLineEd = waitForObject("{buddy={type='QLabel' text='Object class-name:' unnamed='1' visible='1'} "
|
||||
@@ -331,18 +331,17 @@ def createNewQmlExtension(workingDir, targets=[Targets.DESKTOP_5_6_1_DEFAULT]):
|
||||
replaceEditorContent(uriLineEd, "org.qt-project.test.qmlcomponents")
|
||||
clickButton(nextButton)
|
||||
__createProjectHandleLastPage__()
|
||||
return checkedTargets
|
||||
|
||||
def createEmptyQtProject(workingDir=None, projectName=None, targets=Targets.desktopTargetClasses()):
|
||||
__createProjectOrFileSelectType__(" Other Project", "Empty qmake Project")
|
||||
if workingDir == None:
|
||||
workingDir = tempDir()
|
||||
projectName = __createProjectSetNameAndPath__(workingDir, projectName)
|
||||
checkedTargets = __chooseTargets__(targets)
|
||||
__chooseTargets__(targets)
|
||||
snooze(1)
|
||||
clickButton(waitForObject(":Next_QPushButton"))
|
||||
__createProjectHandleLastPage__()
|
||||
return projectName, checkedTargets
|
||||
return projectName
|
||||
|
||||
def createNewNonQtProject(workingDir=None, projectName=None, target=[Targets.DESKTOP_4_8_7_DEFAULT],
|
||||
plainC=False, cmake=False, qbs=False):
|
||||
@@ -382,13 +381,13 @@ def createNewCPPLib(projectDir = None, projectName = None, className = None, fro
|
||||
if projectDir == None:
|
||||
projectDir = tempDir()
|
||||
projectName = __createProjectSetNameAndPath__(projectDir, projectName, False, libType)
|
||||
checkedTargets = __chooseTargets__(target, available)
|
||||
__chooseTargets__(target, available)
|
||||
snooze(1)
|
||||
clickButton(waitForObject(":Next_QPushButton"))
|
||||
__createProjectHandleModuleSelection__(modules)
|
||||
className = __createProjectHandleClassInformation__(className)
|
||||
__createProjectHandleLastPage__()
|
||||
return checkedTargets, projectName, className
|
||||
return projectName, className
|
||||
|
||||
def createNewQtPlugin(projectDir=None, projectName=None, className=None, fromWelcome=False,
|
||||
target=[Targets.DESKTOP_4_8_7_DEFAULT], baseClass="QGenericPlugin"):
|
||||
@@ -396,12 +395,12 @@ def createNewQtPlugin(projectDir=None, projectName=None, className=None, fromWel
|
||||
if projectDir == None:
|
||||
projectDir = tempDir()
|
||||
projectName = __createProjectSetNameAndPath__(projectDir, projectName, False, LibType.QT_PLUGIN)
|
||||
checkedTargets = __chooseTargets__(target, available)
|
||||
__chooseTargets__(target, available)
|
||||
snooze(1)
|
||||
clickButton(waitForObject(":Next_QPushButton"))
|
||||
className = __createProjectHandleClassInformation__(className, baseClass)
|
||||
__createProjectHandleLastPage__()
|
||||
return checkedTargets, projectName, className
|
||||
return projectName, className
|
||||
|
||||
# parameter target can be a list of Targets
|
||||
# parameter availableTargets should be the result of __createProjectOrFileSelectType__()
|
||||
@@ -541,7 +540,7 @@ def __getSupportedPlatforms__(text, templateName, getAsStrings=False):
|
||||
supports = text[text.find('Supported Platforms'):].split(":")[1].strip().split(" ")
|
||||
result = []
|
||||
if 'Desktop' in supports:
|
||||
if (version == None or version < "5.0") and templateName != "Qt Widgets Application":
|
||||
if (version == None or version < "5.0"):
|
||||
result.append(Targets.DESKTOP_4_8_7_DEFAULT)
|
||||
if platform.system() in ("Linux", "Darwin"):
|
||||
result.append(Targets.EMBEDDED_LINUX)
|
||||
|
@@ -42,132 +42,73 @@ def switchViewTo(view):
|
||||
text = ""
|
||||
pattern = ViewConstants.getToolTipForViewTab(view)
|
||||
if re.match(pattern, unicode(text), re.UNICODE):
|
||||
test.passes("ToolTip verified")
|
||||
test.passes("ToolTip verified")
|
||||
else:
|
||||
test.warning("ToolTip does not match", "Expected pattern: %s\nGot: %s" % (pattern, text))
|
||||
mouseClick(waitForObject("{type='Core::Internal::FancyTabBar' unnamed='1' visible='1' "
|
||||
"window=':Qt Creator_Core::Internal::MainWindow'}"), 20, 20 + 52 * view, 0, Qt.LeftButton)
|
||||
|
||||
# this function is used to make sure that simple building prerequisites are met
|
||||
# param targetCount specifies how many build targets had been selected (it's important that this one is correct)
|
||||
# param currentTarget specifies which target should be selected for the next build (zero based index)
|
||||
# param setReleaseBuild defines whether the current target(s) will be set to a Release or a Debug build
|
||||
# param disableShadowBuild defines whether to disable shadow build or leave it unchanged (no matter what is defined)
|
||||
# param setForAll defines whether to set Release or Debug and ShadowBuild option for all targets or only for the currentTarget
|
||||
def prepareBuildSettings(targetCount, currentTarget, setReleaseBuild=True, disableShadowBuild=True, setForAll=True):
|
||||
switchViewTo(ViewConstants.PROJECTS)
|
||||
success = True
|
||||
for current in range(targetCount):
|
||||
if setForAll or current == currentTarget:
|
||||
switchToBuildOrRunSettingsFor(targetCount, current, ProjectSettings.BUILD)
|
||||
# TODO: Improve selection of Release/Debug version
|
||||
if setReleaseBuild:
|
||||
chooseThis = "Release"
|
||||
else:
|
||||
chooseThis = "Debug"
|
||||
editBuildCfg = waitForObject("{leftWidget={text='Edit build configuration:' type='QLabel' "
|
||||
"unnamed='1' visible='1'} unnamed='1' type='QComboBox' visible='1'}")
|
||||
selectFromCombo(editBuildCfg, chooseThis)
|
||||
ensureChecked("{name='shadowBuildCheckBox' type='QCheckBox' visible='1'}", not disableShadowBuild)
|
||||
# get back to the current target
|
||||
if currentTarget < 0 or currentTarget >= targetCount:
|
||||
test.warning("Parameter currentTarget is out of range - will be ignored this time!")
|
||||
else:
|
||||
switchToBuildOrRunSettingsFor(targetCount, currentTarget, ProjectSettings.BUILD)
|
||||
switchViewTo(ViewConstants.EDIT)
|
||||
return success
|
||||
def __kitIsActivated__(kit):
|
||||
return not (str(kit.toolTip).startswith("<h3>Click to activate:</h3>")
|
||||
or str(kit.toolTip).startswith("<h3>Kit is unsuited for project</h3>"))
|
||||
|
||||
# this function switches to the build or the run settings (inside the Projects view)
|
||||
# if you haven't already switched to the Projects view this will fail and return False
|
||||
# param currentTarget specifies the target for which to switch into the specified settings (zero based index)
|
||||
# param targetCount specifies the number of targets currently defined (must be correct!)
|
||||
# param projectSettings specifies where to switch to (must be one of ProjectSettings.BUILD or ProjectSettings.RUN)
|
||||
def switchToBuildOrRunSettingsFor(targetCount, currentTarget, projectSettings):
|
||||
def kitIsActivated(kit):
|
||||
return not (str(kit.toolTip).startswith("<h3>Click to activate:</h3>")
|
||||
or str(kit.toolTip).startswith("<h3>Kit is unsuited for project</h3>"))
|
||||
|
||||
try:
|
||||
treeView = waitForObject(":Projects.ProjectNavigationTreeView")
|
||||
except LookupError:
|
||||
return False
|
||||
# returns a list of the IDs (see class Targets) of all kits
|
||||
# which are currently configured for the active project
|
||||
# Creator must be in projects mode when calling
|
||||
def iterateConfiguredKits():
|
||||
treeView = waitForObject(":Projects.ProjectNavigationTreeView")
|
||||
bAndRIndex = getQModelIndexStr("text='Build & Run'", ":Projects.ProjectNavigationTreeView")
|
||||
kitIndices = dumpIndices(treeView.model(), waitForObject(bAndRIndex))
|
||||
configuredKitNames = map(lambda t: str(t.data(0)),
|
||||
filter(__kitIsActivated__, kitIndices))
|
||||
return map(Targets.getIdForTargetName, configuredKitNames)
|
||||
|
||||
targetIndices = dumpIndices(treeView.model(), waitForObject(bAndRIndex))
|
||||
targets = map(lambda t: str(t.data(0)),
|
||||
filter(kitIsActivated, targetIndices))
|
||||
if not test.compare(targetCount, len(targets), "Check whether all chosen targets are listed."):
|
||||
return False
|
||||
# we assume the targets are still ordered the same way
|
||||
currentTargetIndex = getQModelIndexStr("text='%s'" % targets[currentTarget], bAndRIndex)
|
||||
if not test.verify(kitIsActivated(findObject(currentTargetIndex)),
|
||||
"Verifying target '%s' is enabled." % targets[currentTarget]):
|
||||
return False
|
||||
index = waitForObject(currentTargetIndex)
|
||||
treeView.scrollTo(index)
|
||||
mouseClick(index)
|
||||
|
||||
# This function switches to the build or the run settings (inside the Projects view).
|
||||
# If you haven't already switched to the Projects view this will raise a LookupError.
|
||||
# It will return a boolean value indicating whether the selected Kit was changed by the function.
|
||||
# Note that a 'False' return does not indicate any error.
|
||||
# param wantedKit specifies the ID of the kit (see class Targets)
|
||||
# for which to switch into the specified settings
|
||||
# param projectSettings specifies where to switch to (must be one of
|
||||
# ProjectSettings.BUILD or ProjectSettings.RUN)
|
||||
def switchToBuildOrRunSettingsFor(wantedKit, projectSettings):
|
||||
treeView = waitForObject(":Projects.ProjectNavigationTreeView")
|
||||
bAndRIndex = getQModelIndexStr("text='Build & Run'", ":Projects.ProjectNavigationTreeView")
|
||||
wantedKitName = Targets.getStringForTarget(wantedKit)
|
||||
wantedKitIndexString = getQModelIndexStr("text='%s'" % wantedKitName, bAndRIndex)
|
||||
if not test.verify(__kitIsActivated__(findObject(wantedKitIndexString)),
|
||||
"Verifying target '%s' is enabled." % wantedKitName):
|
||||
raise Exception("Kit '%s' is not activated in the project." % wantedKitName)
|
||||
index = waitForObject(wantedKitIndexString)
|
||||
projectAlreadySelected = index.font.bold
|
||||
if projectAlreadySelected:
|
||||
test.log("Kit '%s' is already selected." % wantedKitName)
|
||||
else:
|
||||
test.log("Selecting kit '%s'..." % wantedKitName)
|
||||
treeView.scrollTo(index)
|
||||
mouseClick(index)
|
||||
|
||||
if projectSettings == ProjectSettings.BUILD:
|
||||
settingsIndex = getQModelIndexStr("text='Build'", currentTargetIndex)
|
||||
settingsIndex = getQModelIndexStr("text='Build'", wantedKitIndexString)
|
||||
elif projectSettings == ProjectSettings.RUN:
|
||||
settingsIndex = getQModelIndexStr("text='Run'", currentTargetIndex)
|
||||
settingsIndex = getQModelIndexStr("text='Run'", wantedKitIndexString)
|
||||
else:
|
||||
test.fatal("Don't know what you're trying to switch to")
|
||||
return False
|
||||
raise Exception("Unexpected projectSettings parameter (%s), needs to be BUILD or RUN."
|
||||
% str(projectSettings))
|
||||
mouseClick(waitForObject(settingsIndex))
|
||||
return True
|
||||
return not projectAlreadySelected
|
||||
|
||||
# this function switches "Run in terminal" on or off in a project's run settings
|
||||
# param targetCount specifies the number of targets currently defined (must be correct!)
|
||||
# param currentTarget specifies the target for which to switch into the specified settings (zero based index)
|
||||
# param wantedKit specifies the ID of the kit to edit (see class Targets)
|
||||
# param runInTerminal specifies if "Run in terminal should be turned on (True) or off (False)
|
||||
def setRunInTerminal(targetCount, currentTarget, runInTerminal=True):
|
||||
def setRunInTerminal(wantedKit, runInTerminal=True):
|
||||
switchViewTo(ViewConstants.PROJECTS)
|
||||
switchToBuildOrRunSettingsFor(targetCount, currentTarget, ProjectSettings.RUN)
|
||||
switchToBuildOrRunSettingsFor(wantedKit, ProjectSettings.RUN)
|
||||
ensureChecked("{window=':Qt Creator_Core::Internal::MainWindow' text='Run in terminal'\
|
||||
type='QCheckBox' unnamed='1' visible='1'}", runInTerminal)
|
||||
switchViewTo(ViewConstants.EDIT)
|
||||
|
||||
# helper function to get some Qt information for the current (already configured) project
|
||||
# param kitCount is the number of kits cofigured for the current project
|
||||
# param alreadyOnProjectsBuildSettings if set to True you have to make sure that you're
|
||||
# on the Projects view on the Build settings page (otherwise this function will end
|
||||
# up in a ScriptError)
|
||||
# param afterSwitchTo if you want to leave the Projects view/Build settings when returning
|
||||
# from this function you can set this parameter to one of the ViewConstants
|
||||
# this function returns an array of 4 elements (all could be None):
|
||||
# * the first element holds the Qt version
|
||||
# * the second element holds the mkspec
|
||||
# * the third element holds the Qt bin path
|
||||
# * the fourth element holds the Qt lib path
|
||||
# of the current active project
|
||||
def getQtInformationForBuildSettings(kitCount, alreadyOnProjectsBuildSettings=False, afterSwitchTo=None):
|
||||
if not alreadyOnProjectsBuildSettings:
|
||||
switchViewTo(ViewConstants.PROJECTS)
|
||||
switchToBuildOrRunSettingsFor(kitCount, 0, ProjectSettings.BUILD)
|
||||
clickButton(waitForObject(":Qt Creator_SystemSettings.Details_Utils::DetailsButton"))
|
||||
model = waitForObject(":scrollArea.environment_QTreeView").model()
|
||||
qtDir = None
|
||||
for row in range(model.rowCount()):
|
||||
index = model.index(row, 0)
|
||||
text = str(model.data(index).toString())
|
||||
if text == "QTDIR":
|
||||
qtDir = str(model.data(model.index(row, 1)).toString())
|
||||
break
|
||||
if qtDir == None:
|
||||
test.fatal("UI seems to have changed - couldn't get QTDIR for this configuration.")
|
||||
return None, None, None, None
|
||||
|
||||
qmakeCallLabel = waitForObject("{text?='<b>qmake:</b> qmake*' type='QLabel' unnamed='1' visible='1' "
|
||||
"window=':Qt Creator_Core::Internal::MainWindow'}")
|
||||
qtVersion = getQtInformationByQMakeCall(qtDir)
|
||||
if afterSwitchTo:
|
||||
if ViewConstants.FIRST_AVAILABLE <= afterSwitchTo <= ViewConstants.LAST_AVAILABLE:
|
||||
switchViewTo(afterSwitchTo)
|
||||
else:
|
||||
test.warning("Don't know where you trying to switch to (%s)" % afterSwitchTo)
|
||||
return qtVersion
|
||||
|
||||
def __getTargetFromToolTip__(toolTip):
|
||||
if toolTip == None or not isinstance(toolTip, (str, unicode)):
|
||||
test.warning("Parameter toolTip must be of type str or unicode and can't be None!")
|
||||
@@ -192,19 +133,6 @@ def getExecutableAndTargetFromToolTip(toolTip):
|
||||
return None, target
|
||||
return exe.group(1).strip(), target
|
||||
|
||||
# this function queries the version number from qmake
|
||||
# param qtDir set this to a path that holds a valid Qt
|
||||
# the function will return the wanted information or None if something went wrong
|
||||
def getQtInformationByQMakeCall(qtDir):
|
||||
qmake = os.path.join(qtDir, "bin", "qmake")
|
||||
if platform.system() in ('Microsoft', 'Windows'):
|
||||
qmake += ".exe"
|
||||
if not os.path.exists(qmake):
|
||||
test.fatal("Given Qt directory does not exist or does not contain bin/qmake.",
|
||||
"Constructed path: '%s'" % qmake)
|
||||
return None
|
||||
return getOutputFromCmdline([qmake, "-query", "QT_VERSION"]).strip()
|
||||
|
||||
def invokeContextMenuOnProject(projectName, menuItem):
|
||||
try:
|
||||
projItem = waitForObjectItem(":Qt Creator_Utils::NavigationTreeView", projectName, 3000)
|
||||
@@ -230,7 +158,7 @@ def addAndActivateKit(kit):
|
||||
kitString = Targets.getStringForTarget(kit)
|
||||
switchViewTo(ViewConstants.PROJECTS)
|
||||
try:
|
||||
treeView = waitForObject(":Projects.ProjectNavigationTreeView")
|
||||
waitForObject(":Projects.ProjectNavigationTreeView")
|
||||
wanted = getQModelIndexStr("text='%s'" % kitString, bAndRIndex)
|
||||
index = findObject(wanted)
|
||||
if str(index.toolTip).startswith(clickToActivate):
|
||||
|
@@ -458,7 +458,7 @@ def iterateQtVersions(keepOptionsOpen=False, alreadyOnOptionsDialog=False,
|
||||
currResult = additionalFunction(target, version, *argsForAdditionalFunc)
|
||||
except:
|
||||
import sys
|
||||
t,v,tb = sys.exc_info()
|
||||
t,v,_ = sys.exc_info()
|
||||
currResult = None
|
||||
test.fatal("Function to additionally execute on Options Dialog could not be found or "
|
||||
"an exception occurred while executing it.", "%s(%s)" % (str(t), str(v)))
|
||||
@@ -521,7 +521,7 @@ def iterateKits(keepOptionsOpen=False, alreadyOnOptionsDialog=False,
|
||||
currResult = additionalFunction(item, kitName, *argsForAdditionalFunc)
|
||||
except:
|
||||
import sys
|
||||
t,v,tb = sys.exc_info()
|
||||
t,v,_ = sys.exc_info()
|
||||
currResult = None
|
||||
test.fatal("Function to additionally execute on Options Dialog could not be "
|
||||
"found or an exception occurred while executing it.", "%s(%s)" %
|
||||
@@ -605,10 +605,8 @@ def progressBarWait(timeout=60000, warn=True):
|
||||
checkIfObjectExists(":Qt Creator_Core::Internal::ProgressBar", False, timeout)
|
||||
|
||||
def readFile(filename):
|
||||
f = open(filename, "r")
|
||||
content = f.read()
|
||||
f.close()
|
||||
return content
|
||||
with open(filename, "r") as f:
|
||||
return f.read()
|
||||
|
||||
def simpleFileName(navigatorFileName):
|
||||
# try to find the last part of the given name, assume it's inside a (folder) structure
|
||||
|
@@ -32,8 +32,8 @@ def main():
|
||||
startCreator(False)
|
||||
if not startedWithoutPluginError():
|
||||
return
|
||||
checkedTargets = createProject_Qt_GUI(tempDir(), "SampleApp")
|
||||
createProject_Qt_GUI(tempDir(), "SampleApp")
|
||||
# run project for debug and release and verify results
|
||||
runVerify(checkedTargets)
|
||||
runVerify()
|
||||
#close Qt Creator
|
||||
invokeMenuItem("File", "Exit")
|
||||
|
@@ -30,8 +30,8 @@ def main():
|
||||
startApplication("qtcreator" + SettingsPath)
|
||||
if not startedWithoutPluginError():
|
||||
return
|
||||
checkedTargets, projectName = createNewQtQuickApplication(tempDir(), "SampleApp")
|
||||
createNewQtQuickApplication(tempDir(), "SampleApp")
|
||||
# run project for debug and release and verify results
|
||||
runVerify(checkedTargets)
|
||||
runVerify()
|
||||
#close Qt Creator
|
||||
invokeMenuItem("File", "Exit")
|
||||
|
@@ -56,11 +56,11 @@ def handleInsertVirtualFunctions(expected):
|
||||
clickButton("{text='OK' type='QPushButton' unnamed='1' visible='1'}")
|
||||
|
||||
def checkSimpleCppLib(projectName, static):
|
||||
checkedTargets, projectName, className = createNewCPPLib(tempDir(), projectName, "MyClass",
|
||||
target=Targets.desktopTargetClasses(),
|
||||
isStatic=static)
|
||||
for kit, config in iterateBuildConfigs(len(checkedTargets), "Release"):
|
||||
verifyBuildConfig(len(checkedTargets), kit, config, False, True)
|
||||
projectName, className = createNewCPPLib(tempDir(), projectName, "MyClass",
|
||||
target=Targets.desktopTargetClasses(),
|
||||
isStatic=static)
|
||||
for kit, config in iterateBuildConfigs("Release"):
|
||||
verifyBuildConfig(kit, config, False, True)
|
||||
invokeMenuItem('Build', 'Build Project "%s"' % projectName)
|
||||
waitForCompile(10000)
|
||||
checkCompile()
|
||||
@@ -81,12 +81,12 @@ def main():
|
||||
|
||||
# Qt Plugin needs Qt4.8 for QGenericPlugin which is tested by default
|
||||
targets = Targets.desktopTargetClasses()
|
||||
checkedTargets, projectName, className = createNewQtPlugin(tempDir(), "SampleApp3", "MyPlugin",
|
||||
target=targets)
|
||||
projectName, className = createNewQtPlugin(tempDir(), "SampleApp3", "MyPlugin",
|
||||
target=targets)
|
||||
virtualFunctionsAdded = False
|
||||
for kit, config in iterateBuildConfigs(len(checkedTargets), "Debug"):
|
||||
is487Kit = checkedTargets[kit] in (Targets.DESKTOP_4_8_7_DEFAULT, Targets.EMBEDDED_LINUX)
|
||||
verifyBuildConfig(len(checkedTargets), kit, config, True, True)
|
||||
for kit, config in iterateBuildConfigs("Debug"):
|
||||
is487Kit = kit in (Targets.DESKTOP_4_8_7_DEFAULT, Targets.EMBEDDED_LINUX)
|
||||
verifyBuildConfig(kit, config, True, True)
|
||||
if virtualFunctionsAdded and platform.system() in ('Microsoft', 'Windows') and is487Kit:
|
||||
test.warning("Skipping building of Qt4.8 targets because of QTCREATORBUG-12251.")
|
||||
continue
|
||||
@@ -98,7 +98,7 @@ def main():
|
||||
test.fail("Could not open %s.h - continuing." % className.lower())
|
||||
continue
|
||||
editor = getEditorForFileSuffix("%s.h" % className.lower())
|
||||
oldContent = str(editor.plainText)
|
||||
str(editor.plainText)
|
||||
placeCursorToLine(editor, "class %s.*" % className, True)
|
||||
snooze(4) # avoid timing issue with the parser
|
||||
invokeContextMenuItem(editor, "Refactor", "Insert Virtual Functions of Base Classes")
|
||||
|
@@ -42,13 +42,13 @@ def main():
|
||||
# open example project, supports only Qt 5
|
||||
targets = Targets.desktopTargetClasses()
|
||||
targets.remove(Targets.DESKTOP_4_8_7_DEFAULT)
|
||||
checkedTargets = openQmakeProject(examplePath, targets)
|
||||
openQmakeProject(examplePath, targets)
|
||||
# build and wait until finished - on all build configurations
|
||||
availableConfigs = iterateBuildConfigs(len(checkedTargets))
|
||||
availableConfigs = iterateBuildConfigs()
|
||||
if not availableConfigs:
|
||||
test.fatal("Haven't found a suitable Qt version - leaving without building.")
|
||||
for kit, config in availableConfigs:
|
||||
selectBuildConfig(len(checkedTargets), kit, config)
|
||||
selectBuildConfig(kit, config)
|
||||
# try to build project
|
||||
test.log("Testing build configuration: " + config)
|
||||
invokeMenuItem("Build", "Build All")
|
||||
|
@@ -70,7 +70,7 @@ def main():
|
||||
openDocument("openglwindow.Sources.main\\.cpp")
|
||||
if not placeCursorToLine(editorWidget, 'm_posAttr = m_program->attributeLocation("posAttr");'):
|
||||
return
|
||||
for i in range(13):
|
||||
for _ in range(13):
|
||||
type(editorWidget, "<Left>")
|
||||
type(editorWidget, "<Ctrl+Shift+u>")
|
||||
# wait until search finished and verify search results
|
||||
|
@@ -76,7 +76,7 @@ def main():
|
||||
# select some other word in .cpp file and select "Edit" -> "Find/Replace".
|
||||
clickButton(waitForObject(":Qt Creator.CloseFind_QToolButton"))
|
||||
placeCursorToLine(editorWidget, "void Trianglefind::render()")
|
||||
for i in range(10):
|
||||
for _ in range(10):
|
||||
type(editorWidget, "<Left>")
|
||||
markText(editorWidget, "Left", 12)
|
||||
invokeMenuItem("Edit", "Find/Replace", "Find/Replace")
|
||||
|
@@ -107,7 +107,7 @@ def main():
|
||||
checkIfObjectExists(manualQModelIndex, verboseOnFail = True),
|
||||
"Verifying if all folders and bookmarks are present")
|
||||
mouseClick(waitForObject(":Qt Creator_Bookmarks_TreeView"), 5, 5, 0, Qt.LeftButton)
|
||||
for i in range(6):
|
||||
for _ in range(6):
|
||||
type(waitForObject(":Qt Creator_Bookmarks_TreeView"), "<Right>")
|
||||
type(waitForObject(":Qt Creator_Bookmarks_TreeView"), "<Return>")
|
||||
test.verify(textForQtVersion("Building and Running an Example") in getHelpTitle(),
|
||||
|
@@ -48,7 +48,7 @@ def main():
|
||||
"Verifying if error is properly reported")
|
||||
# repair error - go to written line
|
||||
placeCursorToLine(editorArea, testingCodeLine)
|
||||
for i in range(14):
|
||||
for _ in range(14):
|
||||
type(editorArea, "<Left>")
|
||||
markText(editorArea, "Right")
|
||||
type(editorArea, "c")
|
||||
|
@@ -90,7 +90,7 @@ def main():
|
||||
if not placeCursorToLine(editorArea, "Rectangle {"):
|
||||
invokeMenuItem("File", "Exit")
|
||||
return
|
||||
for i in range(5):
|
||||
for _ in range(5):
|
||||
type(editorArea, "<Left>")
|
||||
invokeContextMenuItem(editorArea, "Find Usages")
|
||||
# check if usage was properly found
|
||||
@@ -109,7 +109,7 @@ def main():
|
||||
if not placeCursorToLine(editorArea, "anchors { left: parent.left; top: parent.top; right: parent.right; bottom: parent.verticalCenter }"):
|
||||
invokeMenuItem("File", "Exit")
|
||||
return
|
||||
for i in range(87):
|
||||
for _ in range(87):
|
||||
type(editorArea, "<Left>")
|
||||
invokeMenuItem("Tools", "QML/JS", "Find Usages")
|
||||
# check if usage was properly found
|
||||
@@ -128,7 +128,7 @@ def main():
|
||||
if not placeCursorToLine(editorArea, "SequentialAnimation on opacity {"):
|
||||
invokeMenuItem("File", "Exit")
|
||||
return
|
||||
for i in range(5):
|
||||
for _ in range(5):
|
||||
type(editorArea, "<Left>")
|
||||
type(editorArea, "<Ctrl+Shift+u>")
|
||||
# check if usage was properly found
|
||||
|
@@ -37,7 +37,7 @@ def main():
|
||||
saveAndExit()
|
||||
return
|
||||
placeCursorToLine(editorArea, "TextEdit {")
|
||||
for i in range(5):
|
||||
for _ in range(5):
|
||||
type(editorArea, "<Left>")
|
||||
# invoke Refactoring - Move Component into separate file
|
||||
invokeContextMenuItem(editorArea, "Refactoring", "Move Component into Separate File")
|
||||
|
@@ -32,13 +32,13 @@ def main():
|
||||
homeKey = "<Home>"
|
||||
if platform.system() == "Darwin":
|
||||
homeKey = "<Ctrl+Left>"
|
||||
for i in range(2):
|
||||
for _ in range(2):
|
||||
type(editorArea, homeKey)
|
||||
type(editorArea, "<Return>")
|
||||
type(editorArea, "<Up>")
|
||||
type(editorArea, "<Tab>")
|
||||
type(editorArea, "Item { x: 10; y: 20; width: 10 }")
|
||||
for i in range(30):
|
||||
for _ in range(30):
|
||||
type(editorArea, "<Left>")
|
||||
invokeMenuItem("File", "Save All")
|
||||
# activate menu and apply 'Refactoring - Split initializer'
|
||||
|
@@ -32,14 +32,14 @@ def main():
|
||||
homeKey = "<Home>"
|
||||
if platform.system() == "Darwin":
|
||||
homeKey = "<Ctrl+Left>"
|
||||
for i in range(2):
|
||||
for _ in range(2):
|
||||
type(editorArea, homeKey)
|
||||
type(editorArea, "<Return>")
|
||||
type(editorArea, "<Up>")
|
||||
type(editorArea, "<Tab>")
|
||||
testingItemText = "Item { x: 10; y: 20; width: 10 }"
|
||||
type(editorArea, testingItemText)
|
||||
for i in range(30):
|
||||
for _ in range(30):
|
||||
type(editorArea, "<Left>")
|
||||
invokeMenuItem("File", "Save All")
|
||||
# invoke Refactoring - Wrap Component in Loader
|
||||
|
@@ -31,7 +31,7 @@ def main():
|
||||
return
|
||||
type(editorArea, "<Return>")
|
||||
type(editorArea, "Color")
|
||||
for i in range(3):
|
||||
for _ in range(3):
|
||||
type(editorArea, "<Left>")
|
||||
invokeMenuItem("File", "Save All")
|
||||
# invoke Refactoring - Add a message suppression comment.
|
||||
|
@@ -71,7 +71,7 @@ def main():
|
||||
return
|
||||
# cancel indentation
|
||||
type(editorArea, "<Ctrl+a>")
|
||||
for i in range(5):
|
||||
for _ in range(5):
|
||||
type(editorArea, "<Shift+Backtab>")
|
||||
# select unindented block
|
||||
type(editorArea, "<Ctrl+a>")
|
||||
|
@@ -31,13 +31,13 @@ def main():
|
||||
if not startedWithoutPluginError():
|
||||
return
|
||||
# create qt quick application
|
||||
checkedTargets, projectName = createNewQtQuickApplication(tempDir(), "SampleApp")
|
||||
createNewQtQuickApplication(tempDir(), "SampleApp")
|
||||
# build it - on all build configurations
|
||||
availableConfigs = iterateBuildConfigs(len(checkedTargets))
|
||||
availableConfigs = iterateBuildConfigs()
|
||||
if not availableConfigs:
|
||||
test.fatal("Haven't found a suitable Qt version - leaving without building.")
|
||||
for kit, config in availableConfigs:
|
||||
selectBuildConfig(len(checkedTargets), kit, config)
|
||||
selectBuildConfig(kit, config)
|
||||
# try to compile
|
||||
test.log("Testing build configuration: " + config)
|
||||
clickButton(waitForObject(":*Qt Creator.Build Project_Core::Internal::FancyToolButton"))
|
||||
|
@@ -39,7 +39,7 @@ def main():
|
||||
if not startedWithoutPluginError():
|
||||
return
|
||||
# create qt quick application
|
||||
checkedTargets, projectName = createNewQtQuickApplication(tempDir(), "SampleApp")
|
||||
createNewQtQuickApplication(tempDir(), "SampleApp")
|
||||
# create syntax error in cpp file
|
||||
openDocument("SampleApp.Sources.main\\.cpp")
|
||||
if not appendToLine(waitForObject(":Qt Creator_CppEditor::Internal::CPPEditorWidget"), "QQmlApplicationEngine engine;", "SyntaxError"):
|
||||
@@ -48,11 +48,11 @@ def main():
|
||||
# save all
|
||||
invokeMenuItem("File", "Save All")
|
||||
# build it - on all build configurations
|
||||
availableConfigs = iterateBuildConfigs(len(checkedTargets))
|
||||
availableConfigs = iterateBuildConfigs()
|
||||
if not availableConfigs:
|
||||
test.fatal("Haven't found a suitable Qt version - leaving without building.")
|
||||
for kit, config in availableConfigs:
|
||||
selectBuildConfig(len(checkedTargets), kit, config)
|
||||
selectBuildConfig(kit, config)
|
||||
# try to compile
|
||||
test.log("Testing build configuration: " + config)
|
||||
clickButton(waitForObject(":*Qt Creator.Build Project_Core::Internal::FancyToolButton"))
|
||||
|
@@ -31,12 +31,12 @@ def main():
|
||||
startApplication("qtcreator" + SettingsPath)
|
||||
if not startedWithoutPluginError():
|
||||
return
|
||||
checkedTargets = createProject_Qt_Console(tempDir(), project)
|
||||
availableConfigs = iterateBuildConfigs(len(checkedTargets))
|
||||
createProject_Qt_Console(tempDir(), project)
|
||||
availableConfigs = iterateBuildConfigs()
|
||||
if not availableConfigs:
|
||||
test.fatal("Haven't found a suitable Qt version - leaving without building.")
|
||||
for kit, config in availableConfigs:
|
||||
selectBuildConfig(len(checkedTargets), kit, config)
|
||||
selectBuildConfig(kit, config)
|
||||
test.log("Testing build configuration: " + config)
|
||||
if runAndCloseApp() == None:
|
||||
checkCompile()
|
||||
|
@@ -34,7 +34,7 @@ def main():
|
||||
startApplication("qtcreator" + SettingsPath)
|
||||
if not startedWithoutPluginError():
|
||||
return
|
||||
checkedTargets = createProject_Qt_Console(tempDir(), project)
|
||||
createProject_Qt_Console(tempDir(), project)
|
||||
|
||||
mainEditor = waitForObject(":Qt Creator_CppEditor::Internal::CPPEditorWidget")
|
||||
replaceEditorContent(mainEditor, "")
|
||||
@@ -52,15 +52,15 @@ def main():
|
||||
test.verify("CONFIG += c++11 console" in str(proEditor.plainText),
|
||||
"Verifying that program is configured with console")
|
||||
|
||||
availableConfigs = iterateBuildConfigs(len(checkedTargets))
|
||||
availableConfigs = iterateBuildConfigs()
|
||||
if not availableConfigs:
|
||||
test.fatal("Haven't found a suitable Qt version - leaving without building.")
|
||||
for kit, config in availableConfigs:
|
||||
selectBuildConfig(len(checkedTargets), kit, config)
|
||||
selectBuildConfig(kit, config)
|
||||
test.log("Testing build configuration: " + config)
|
||||
|
||||
test.log("Running application")
|
||||
setRunInTerminal(len(checkedTargets), kit, False)
|
||||
setRunInTerminal(kit, False)
|
||||
clickButton(waitForObject(":*Qt Creator.Run_Core::Internal::FancyToolButton"))
|
||||
outputButton = waitForObject(":Qt Creator_AppOutput_Core::Internal::OutputPaneToggleButton")
|
||||
waitFor("outputButton.checked", 20000) # Not ensureChecked(), avoid race condition
|
||||
@@ -71,7 +71,7 @@ def main():
|
||||
appOutput = str(waitForObject(":Qt Creator_Core::OutputWindow").plainText)
|
||||
verifyOutput(appOutput, outputStdOut, "std::cout", "Application Output")
|
||||
verifyOutput(appOutput, outputStdErr, "std::cerr", "Application Output")
|
||||
if (checkedTargets[kit] == Targets.DESKTOP_5_4_1_GCC
|
||||
if (kit == Targets.DESKTOP_5_4_1_GCC
|
||||
and platform.system() in ('Windows', 'Microsoft')):
|
||||
test.log("Skipping qDebug() from %s (unstable, QTCREATORBUG-15067)"
|
||||
% Targets.getStringForTarget(Targets.DESKTOP_5_4_1_GCC))
|
||||
@@ -84,7 +84,7 @@ def main():
|
||||
"Did the application run at all?")
|
||||
|
||||
test.log("Debugging application")
|
||||
isMsvc = isMsvcConfig(len(checkedTargets), kit)
|
||||
isMsvc = isMsvcConfig(kit)
|
||||
invokeMenuItem("Debug", "Start Debugging", "Start Debugging")
|
||||
handleDebuggerWarnings(config, isMsvc)
|
||||
ensureChecked(":Qt Creator_AppOutput_Core::Internal::OutputPaneToggleButton")
|
||||
|
@@ -50,12 +50,12 @@ def main():
|
||||
|
||||
# empty Qt
|
||||
workingDir = tempDir()
|
||||
projectName, checkedTargets = createEmptyQtProject(workingDir, "EmptyQtProj", targets)
|
||||
projectName = createEmptyQtProject(workingDir, "EmptyQtProj", targets)
|
||||
addFileToProject(os.path.join(workingDir, projectName), " C++", "C++ Source File", "main.cpp")
|
||||
editor = waitForObject(":Qt Creator_CppEditor::Internal::CPPEditorWidget")
|
||||
typeLines(editor, ["int main() {"])
|
||||
invokeMenuItem("File", "Save All")
|
||||
performDebugging(projectName, checkedTargets)
|
||||
performDebugging(projectName)
|
||||
invokeMenuItem("File", "Close All Projects and Editors")
|
||||
# C/C++
|
||||
for name,isC in {"C":True, "CPP":False}.items():
|
||||
@@ -74,8 +74,8 @@ def main():
|
||||
typeLines(editor, ["int main() {"])
|
||||
invokeMenuItem("File", "Save All")
|
||||
progressBarWait(15000)
|
||||
setRunInTerminal(1, 0, False)
|
||||
performDebugging(projectName, [singleTarget])
|
||||
setRunInTerminal(singleTarget, False)
|
||||
performDebugging(projectName)
|
||||
invokeMenuItem("File", "Close All Projects and Editors")
|
||||
invokeMenuItem("File", "Exit")
|
||||
|
||||
@@ -89,14 +89,14 @@ def __handleAppOutputWaitForDebuggerFinish__():
|
||||
invokeMenuItem("Debug", "Abort Debugging")
|
||||
waitFor("str(appOutput.plainText).endswith('Debugging has finished')", 5000)
|
||||
|
||||
def performDebugging(projectName, checkedTargets):
|
||||
for kit, config in iterateBuildConfigs(len(checkedTargets), "Debug"):
|
||||
def performDebugging(projectName):
|
||||
for kit, config in iterateBuildConfigs("Debug"):
|
||||
test.log("Selecting '%s' as build config" % config)
|
||||
verifyBuildConfig(len(checkedTargets), kit, config, True, True)
|
||||
verifyBuildConfig(kit, config, True, True)
|
||||
waitForObject(":*Qt Creator.Build Project_Core::Internal::FancyToolButton")
|
||||
invokeMenuItem("Build", "Rebuild All")
|
||||
waitForCompile()
|
||||
isMsvc = isMsvcConfig(len(checkedTargets), kit)
|
||||
isMsvc = isMsvcConfig(kit)
|
||||
clickButton(waitForObject(":*Qt Creator.Start Debugging_Core::Internal::FancyToolButton"))
|
||||
handleDebuggerWarnings(config, isMsvc)
|
||||
waitForObject(":Qt Creator.DebugModeWidget_QSplitter")
|
||||
|
@@ -68,7 +68,6 @@ def debuggerHasStopped():
|
||||
|
||||
def getQmlJSConsoleOutput():
|
||||
try:
|
||||
result = []
|
||||
consoleView = waitForObject(":DebugModeWidget_Debugger::Internal::ConsoleView")
|
||||
model = consoleView.model()
|
||||
# old input, output, new input > 2
|
||||
@@ -129,13 +128,13 @@ def main():
|
||||
if test.verify(waitFor('fancyDebugButton.enabled', 5000), "Start Debugging is enabled."):
|
||||
# make sure QML Debugging is enabled
|
||||
switchViewTo(ViewConstants.PROJECTS)
|
||||
switchToBuildOrRunSettingsFor(1, 0, ProjectSettings.RUN)
|
||||
switchToBuildOrRunSettingsFor(Targets.getDefaultKit(), ProjectSettings.RUN)
|
||||
ensureChecked("{container=':Qt Creator.scrollArea_QScrollArea' text='Enable QML' "
|
||||
"type='QCheckBox' unnamed='1' visible='1'}")
|
||||
switchViewTo(ViewConstants.EDIT)
|
||||
# start debugging
|
||||
clickButton(fancyDebugButton)
|
||||
locAndExprTV = waitForObject(":Locals and Expressions_Debugger::Internal::WatchTreeView")
|
||||
waitForObject(":Locals and Expressions_Debugger::Internal::WatchTreeView")
|
||||
rootIndex = getQModelIndexStr("text='Rectangle'",
|
||||
":Locals and Expressions_Debugger::Internal::WatchTreeView")
|
||||
# make sure the items inside the root item are visible
|
||||
|
@@ -56,7 +56,7 @@ def main():
|
||||
earlyExit("Something went wrong opening Qml project - probably missing Qt5.")
|
||||
return
|
||||
switchViewTo(ViewConstants.PROJECTS)
|
||||
switchToBuildOrRunSettingsFor(1, 0, ProjectSettings.RUN)
|
||||
switchToBuildOrRunSettingsFor(Targets.getDefaultKit(), ProjectSettings.RUN)
|
||||
ensureChecked("{container=':Qt Creator.scrollArea_QScrollArea' text='Enable QML' "
|
||||
"type='QCheckBox' unnamed='1' visible='1'}")
|
||||
switchViewTo(ViewConstants.EDIT)
|
||||
@@ -117,7 +117,7 @@ def fetchItems(index, valIndex, treeView):
|
||||
tree.setName(name)
|
||||
tree.setValue(value)
|
||||
for row in range(model.rowCount(index)):
|
||||
tree.addChild(fetchItems(model.index(row, 0, index), model.index(row, 1, index), treeView))
|
||||
tree.addChild(fetchItems(model.index(row, 0, index), model.index(row, 1, index), treeView))
|
||||
return tree
|
||||
|
||||
def checkForEmptyRows(items, isRootCheck=True):
|
||||
|
@@ -31,9 +31,7 @@ def main():
|
||||
return
|
||||
# using a temporary directory won't mess up a potentially existing
|
||||
workingDir = tempDir()
|
||||
# we need a Qt >= 5.3 - we use checkedTargets, so we should get only valid targets
|
||||
analyzerTargets = Targets.desktopTargetClasses()
|
||||
checkedTargets, projectName = createNewQtQuickApplication(workingDir, targets=analyzerTargets)
|
||||
projectName = createNewQtQuickApplication(workingDir)[1]
|
||||
editor = waitForObject(":Qt Creator_QmlJSEditor::QmlJSTextEditorWidget")
|
||||
if placeCursorToLine(editor, "}"):
|
||||
type(editor, '<Left>')
|
||||
@@ -52,14 +50,14 @@ def main():
|
||||
'var j = i * i;',
|
||||
'console.log(j);'])
|
||||
invokeMenuItem("File", "Save All")
|
||||
availableConfigs = iterateBuildConfigs(len(checkedTargets), "Debug")
|
||||
availableConfigs = iterateBuildConfigs("Debug")
|
||||
if not availableConfigs:
|
||||
test.fatal("Haven't found a suitable Qt version (need Qt 5.3+) - leaving without debugging.")
|
||||
else:
|
||||
performTest(workingDir, projectName, len(checkedTargets), availableConfigs)
|
||||
performTest(workingDir, projectName, availableConfigs)
|
||||
invokeMenuItem("File", "Exit")
|
||||
|
||||
def performTest(workingDir, projectName, targetCount, availableConfigs):
|
||||
def performTest(workingDir, projectName, availableConfigs):
|
||||
def __elapsedTime__(elapsedTimeLabelText):
|
||||
return float(re.search("Elapsed:\s+(-?\d+\.\d+) s", elapsedTimeLabelText).group(1))
|
||||
|
||||
@@ -67,7 +65,8 @@ def performTest(workingDir, projectName, targetCount, availableConfigs):
|
||||
# switching from MSVC to MinGW build will fail on the clean step of 'Rebuild All' because
|
||||
# of differences between MSVC's and MinGW's Makefile (so clean before switching kits)
|
||||
invokeMenuItem('Build', 'Clean Project "%s"' % projectName)
|
||||
qtVersion = verifyBuildConfig(targetCount, kit, config, True, True, True)
|
||||
verifyBuildConfig(kit, config, True, True, True)
|
||||
qtVersion = "5.6.1" if kit == Targets.DESKTOP_5_6_1_DEFAULT else "5.10.1"
|
||||
test.log("Selected kit using Qt %s" % qtVersion)
|
||||
# explicitly build before start debugging for adding the executable as allowed program to WinFW
|
||||
invokeMenuItem("Build", "Rebuild All")
|
||||
|
@@ -29,11 +29,9 @@ def main():
|
||||
startApplication("qtcreator" + SettingsPath)
|
||||
if not startedWithoutPluginError():
|
||||
return
|
||||
# Requires Qt 4.8
|
||||
targets = Targets.desktopTargetClasses()
|
||||
# using a temporary directory won't mess up a potentially existing
|
||||
workingDir = tempDir()
|
||||
checkedTargets, projectName = createNewQtQuickApplication(workingDir, targets=targets)
|
||||
projectName = createNewQtQuickApplication(workingDir)[1]
|
||||
editor = waitForObject(":Qt Creator_QmlJSEditor::QmlJSTextEditorWidget")
|
||||
if placeCursorToLine(editor, "}"):
|
||||
type(editor, '<Left>')
|
||||
@@ -54,13 +52,13 @@ def main():
|
||||
if result:
|
||||
expectedBreakpointsOrder = [{os.path.join(workingDir, projectName, "main.cpp"):10},
|
||||
{os.path.join(workingDir, projectName, "main.qml"):13}]
|
||||
availableConfigs = iterateBuildConfigs(len(checkedTargets), "Debug")
|
||||
availableConfigs = iterateBuildConfigs("Debug")
|
||||
progressBarWait()
|
||||
if not availableConfigs:
|
||||
test.fatal("Haven't found a suitable Qt version - leaving without debugging.")
|
||||
for kit, config in availableConfigs:
|
||||
test.log("Selecting '%s' as build config" % config)
|
||||
verifyBuildConfig(len(checkedTargets), kit, config, True, True, True)
|
||||
verifyBuildConfig(kit, config, True, True, True)
|
||||
# explicitly build before start debugging for adding the executable as allowed program to WinFW
|
||||
invokeMenuItem("Build", "Rebuild All")
|
||||
waitForCompile(300000)
|
||||
@@ -69,12 +67,12 @@ def main():
|
||||
continue
|
||||
if platform.system() in ('Microsoft' 'Windows'):
|
||||
switchViewTo(ViewConstants.PROJECTS)
|
||||
switchToBuildOrRunSettingsFor(len(checkedTargets), kit, ProjectSettings.BUILD)
|
||||
switchToBuildOrRunSettingsFor(kit, ProjectSettings.BUILD)
|
||||
buildDir = os.path.join(str(waitForObject(":Qt Creator_Utils::BuildDirectoryLineEdit").text),
|
||||
"debug")
|
||||
switchViewTo(ViewConstants.EDIT)
|
||||
allowAppThroughWinFW(buildDir, projectName, None)
|
||||
if not doSimpleDebugging(len(checkedTargets), kit, config,
|
||||
if not doSimpleDebugging(kit, config,
|
||||
len(expectedBreakpointsOrder), expectedBreakpointsOrder):
|
||||
try:
|
||||
stopB = findObject(':Qt Creator.Stop_QToolButton')
|
||||
|
@@ -44,7 +44,6 @@ def prepareQmlFile():
|
||||
editor = waitForObject(":Qt Creator_QmlJSEditor::QmlJSTextEditorWidget")
|
||||
isDarwin = platform.system() == 'Darwin'
|
||||
for i in range(3):
|
||||
content = "%s" % editor.plainText
|
||||
if not placeCursorToLine(editor, 'title: qsTr("Hello World")'):
|
||||
test.fatal("Couldn't find line(s) I'm looking for - QML file seems to "
|
||||
"have changed!\nLeaving test...")
|
||||
|
@@ -118,7 +118,7 @@ def testRenameMacroAfterSourceMoving():
|
||||
return True
|
||||
|
||||
def performMacroRenaming(newMacroName):
|
||||
for i in range(10):
|
||||
for _ in range(10):
|
||||
type(cppEditorStr, "<Left>")
|
||||
invokeContextMenuItem(waitForObject(cppEditorStr), "Refactor",
|
||||
"Rename Symbol Under Cursor")
|
||||
|
@@ -24,7 +24,6 @@
|
||||
############################################################################
|
||||
|
||||
source("../../shared/qtcreator.py")
|
||||
import re
|
||||
|
||||
SpeedCrunchPath = ""
|
||||
|
||||
@@ -42,16 +41,16 @@ def main():
|
||||
startApplication("qtcreator" + SettingsPath)
|
||||
if not startedWithoutPluginError():
|
||||
return
|
||||
checkedTargets = openQmakeProject(SpeedCrunchPath, [Targets.DESKTOP_4_8_7_DEFAULT])
|
||||
openQmakeProject(SpeedCrunchPath, [Targets.DESKTOP_4_8_7_DEFAULT])
|
||||
progressBarWait(30000)
|
||||
|
||||
fancyToolButton = waitForObject(":*Qt Creator_Core::Internal::FancyToolButton")
|
||||
|
||||
availableConfigs = iterateBuildConfigs(len(checkedTargets), "Release")
|
||||
availableConfigs = iterateBuildConfigs("Release")
|
||||
if not availableConfigs:
|
||||
test.fatal("Haven't found a suitable Qt version (need Release build) - leaving without building.")
|
||||
for kit, config in availableConfigs:
|
||||
selectBuildConfig(len(checkedTargets), kit, config)
|
||||
selectBuildConfig(kit, config)
|
||||
buildConfig = buildConfigFromFancyToolButton(fancyToolButton)
|
||||
if buildConfig != config:
|
||||
test.fatal("Build configuration %s is selected instead of %s" % (buildConfig, config))
|
||||
|
@@ -45,7 +45,6 @@ def main():
|
||||
projects = catModel.index(0, 0)
|
||||
test.compare("Projects", str(projects.data()))
|
||||
comboBox = findObject(":New.comboBox_QComboBox")
|
||||
targets = zip(*kits.values())[0]
|
||||
test.verify(comboBox.enabled, "Verifying whether combobox is enabled.")
|
||||
test.compare(comboBox.currentText, "All Templates")
|
||||
try:
|
||||
|
@@ -26,8 +26,6 @@
|
||||
source("../../shared/qtcreator.py")
|
||||
|
||||
import re
|
||||
import tempfile
|
||||
import __builtin__
|
||||
|
||||
currentSelectedTreeItem = None
|
||||
warningOrError = re.compile('<p><b>((Error|Warning).*?)</p>')
|
||||
|
@@ -46,4 +46,9 @@ def main():
|
||||
else:
|
||||
test.warning("Parsing project timed out")
|
||||
compareProjectTree(rootNodeTemplate % "Qt Creator", "projecttree_creator.tsv")
|
||||
buildIssuesTexts = map(lambda i: str(i[3]), getBuildIssues())
|
||||
deprecationWarnings = filter(lambda s: "deprecated" in s, buildIssuesTexts)
|
||||
if deprecationWarnings:
|
||||
test.warning("Creator claims that the .qbs file uses deprecated features.",
|
||||
"\n".join(set(deprecationWarnings)))
|
||||
invokeMenuItem("File", "Exit")
|
||||
|
@@ -139,9 +139,9 @@ def verifyOutline(outlinePseudoTree, datasetFileName):
|
||||
"Found %d elements, but expected %d" % (len(outlinePseudoTree), len(expected)))
|
||||
return
|
||||
for counter, (expectedItem, foundItem) in enumerate(zip(expected, outlinePseudoTree)):
|
||||
if expectedItem != foundItem:
|
||||
test.fail("Mismatch in element number %d for '%s'" % (counter + 1, fileName),
|
||||
if expectedItem != foundItem:
|
||||
test.fail("Mismatch in element number %d for '%s'" % (counter + 1, fileName),
|
||||
"%s != %s" % (str(expectedItem), str(foundItem)))
|
||||
return
|
||||
return
|
||||
test.passes("All nodes (%d) inside outline match expected nodes for '%s'."
|
||||
% (len(expected), fileName))
|
||||
|
@@ -34,12 +34,11 @@ def main():
|
||||
|
||||
for qtVersion, controls in available:
|
||||
targ = [Targets.DESKTOP_5_6_1_DEFAULT]
|
||||
quick = "2.6"
|
||||
# using a temporary directory won't mess up a potentially existing
|
||||
workingDir = tempDir()
|
||||
checkedTargets, projectName = createNewQtQuickApplication(workingDir, targets=targ,
|
||||
minimumQtVersion=qtVersion,
|
||||
withControls = controls)
|
||||
checkedTargets = createNewQtQuickApplication(workingDir, targets=targ,
|
||||
minimumQtVersion=qtVersion,
|
||||
withControls = controls)[0]
|
||||
if len(checkedTargets) == 0:
|
||||
if controls and qtVersion < "5.7":
|
||||
test.xfail("Could not check wanted target.", "Quick Controls 2 wizard needs Qt5.7+")
|
||||
|
@@ -25,10 +25,14 @@
|
||||
|
||||
source("../../shared/qtcreator.py")
|
||||
import random
|
||||
from datetime import date
|
||||
|
||||
def __platformToBeRunToday__():
|
||||
return (('Linux'), ('Darwin'), ('Microsoft', 'Windows'))[date.today().day % 3]
|
||||
|
||||
# Be careful with Pastebin.Com, there are only 10 pastes per 24h
|
||||
# for all machines using the same IP-address like you.
|
||||
skipPastingToPastebinCom = True
|
||||
skipPastingToPastebinCom = platform.system() not in __platformToBeRunToday__()
|
||||
|
||||
NAME_KDE = "Paste.KDE.Org"
|
||||
NAME_PBCA = "Pastebin.Ca"
|
||||
@@ -43,15 +47,20 @@ def invalidPasteId(protocol):
|
||||
return -1
|
||||
|
||||
def closeHTTPStatusAndPasterDialog(protocol, pasterDialog):
|
||||
mBoxStr = "{type='QMessageBox' unnamed='1' visible='1' windowTitle?='%s *'}" % protocol
|
||||
mBox = waitForObject(mBoxStr, 1000)
|
||||
text = str(mBox.text)
|
||||
# close message box and paster window
|
||||
clickButton("{type='QPushButton' text='Cancel' visible='1' window=%s}" % mBoxStr)
|
||||
clickButton("{type='QPushButton' text='Cancel' visible='1' window='%s'}" % pasterDialog)
|
||||
if 'Service Unavailable' in text:
|
||||
test.warning(text)
|
||||
return True
|
||||
try:
|
||||
mBoxStr = "{type='QMessageBox' unnamed='1' visible='1' windowTitle?='%s *'}" % protocol
|
||||
mBox = waitForObject(mBoxStr, 1000)
|
||||
text = str(mBox.text)
|
||||
# close message box and paster window
|
||||
clickButton("{type='QPushButton' text='Cancel' visible='1' window=%s}" % mBoxStr)
|
||||
clickButton("{type='QPushButton' text='Cancel' visible='1' window='%s'}" % pasterDialog)
|
||||
if 'Service Unavailable' in text:
|
||||
test.warning(text)
|
||||
return True
|
||||
except:
|
||||
t,v = sys.exc_info()[:2]
|
||||
test.warning("An exception occurred in closeHTTPStatusAndPasterDialog(): %s(%s)"
|
||||
% (str(t), str(v)))
|
||||
test.log("Closed dialog without expected error.", text)
|
||||
return False
|
||||
|
||||
@@ -90,11 +99,9 @@ def pasteFile(sourceFile, protocol):
|
||||
output = str(outputWindow.plainText).splitlines()[-1]
|
||||
except:
|
||||
output = ""
|
||||
try:
|
||||
if closeHTTPStatusAndPasterDialog(protocol, ':Send to Codepaster_CodePaster::PasteView'):
|
||||
raise Exception(serverProblems)
|
||||
except:
|
||||
pass
|
||||
if closeHTTPStatusAndPasterDialog(protocol, ':Send to Codepaster_CodePaster::PasteView'):
|
||||
resetFiles()
|
||||
raise Exception(serverProblems)
|
||||
stdErrOut = aut.readStderr()
|
||||
match = re.search("^%s protocol error: (.*)$" % protocol, stdErrOut, re.MULTILINE)
|
||||
if match:
|
||||
@@ -123,11 +130,8 @@ def fetchSnippet(protocol, description, pasteId, skippedPasting):
|
||||
try:
|
||||
pasteModel = waitForObject(":PasteSelectDialog.listWidget_QListWidget").model()
|
||||
except:
|
||||
try:
|
||||
if closeHTTPStatusAndPasterDialog(protocol, ':PasteSelectDialog_CodePaster::PasteSelectDialog'):
|
||||
return -1
|
||||
except:
|
||||
pass
|
||||
closeHTTPStatusAndPasterDialog(protocol, ':PasteSelectDialog_CodePaster::PasteSelectDialog')
|
||||
return -1
|
||||
waitFor("pasteModel.rowCount() > 1", 20000)
|
||||
if (not skippedPasting and not protocol == NAME_PBCA
|
||||
and not any(map(lambda str:pasteId in str, dumpItems(pasteModel)))):
|
||||
@@ -177,44 +181,53 @@ def main():
|
||||
openGeneralMessages()
|
||||
clickButton(waitForObject(":*Qt Creator.Clear_QToolButton"))
|
||||
for protocol in protocolsToTest:
|
||||
skippedPasting = True
|
||||
description = "Paste from 2017-05-11"
|
||||
if protocol == NAME_KDE:
|
||||
pasteId = "pysjk6n2i"
|
||||
pastedText = readFile(os.path.join(os.getcwd(), "testdata", "main-prepasted.cpp"))
|
||||
elif skipPastingToPastebinCom and protocol == NAME_PBCOM:
|
||||
pasteId = "8XHP0ZgH"
|
||||
pastedText = readFile(os.path.join(os.getcwd(), "testdata", "main-prepasted.cpp"))
|
||||
else:
|
||||
skippedPasting = False
|
||||
try:
|
||||
pasteId, description, pastedText = pasteFile(sourceFile, protocol)
|
||||
except Exception as e:
|
||||
if e.message == serverProblems:
|
||||
test.warning("Ignoring server side issues")
|
||||
continue
|
||||
else: # if it was not our own exception re-raise
|
||||
raise e
|
||||
if not pasteId:
|
||||
test.fatal("Could not get id of paste to %s" % protocol)
|
||||
with TestSection(protocol):
|
||||
skippedPasting = True
|
||||
description = "Paste from 2017-05-11"
|
||||
if protocol == NAME_KDE:
|
||||
pasteId = "pysjk6n2i"
|
||||
pastedText = readFile(os.path.join(os.getcwd(), "testdata", "main-prepasted.cpp"))
|
||||
elif skipPastingToPastebinCom and protocol == NAME_PBCOM:
|
||||
pasteId = "8XHP0ZgH"
|
||||
pastedText = readFile(os.path.join(os.getcwd(), "testdata", "main-prepasted.cpp"))
|
||||
else:
|
||||
skippedPasting = False
|
||||
try:
|
||||
pasteId, description, pastedText = pasteFile(sourceFile, protocol)
|
||||
except Exception as e:
|
||||
if e.message == serverProblems:
|
||||
test.warning("Ignoring server side issues")
|
||||
continue
|
||||
else: # if it was not our own exception re-raise
|
||||
raise e
|
||||
if not pasteId:
|
||||
message = "Could not get id of paste to %s" % protocol
|
||||
if protocol == NAME_PBCOM:
|
||||
test.log("%s, using prepasted file instead" % message)
|
||||
skippedPasting = True
|
||||
pasteId = "8XHP0ZgH"
|
||||
pastedText = readFile(os.path.join(os.getcwd(),
|
||||
"testdata", "main-prepasted.cpp"))
|
||||
else:
|
||||
test.fatal(message)
|
||||
continue
|
||||
pasteId = fetchSnippet(protocol, description, pasteId, skippedPasting)
|
||||
if pasteId == -1:
|
||||
continue
|
||||
pasteId = fetchSnippet(protocol, description, pasteId, skippedPasting)
|
||||
if pasteId == -1:
|
||||
continue
|
||||
filenameCombo = waitForObject(":Qt Creator_FilenameQComboBox")
|
||||
waitFor("not filenameCombo.currentText.isEmpty()", 20000)
|
||||
try:
|
||||
editor = waitForObject(":Qt Creator_CppEditor::Internal::CPPEditorWidget")
|
||||
except:
|
||||
outputWindow = waitForObject(":Qt Creator_Core::OutputWindow")
|
||||
test.fail("Could not find editor with snippet", str(outputWindow.plainText))
|
||||
clickButton(waitForObject(":*Qt Creator.Clear_QToolButton"))
|
||||
continue
|
||||
test.compare(filenameCombo.currentText, "%s: %s" % (protocol, pasteId), "Verify title of editor")
|
||||
if protocol in (NAME_KDE, NAME_PBCOM) and pastedText.endswith("\n"):
|
||||
pastedText = pastedText[:-1]
|
||||
test.compare(editor.plainText, pastedText, "Verify that pasted and fetched texts are the same")
|
||||
invokeMenuItem("File", "Close All")
|
||||
filenameCombo = waitForObject(":Qt Creator_FilenameQComboBox")
|
||||
waitFor("not filenameCombo.currentText.isEmpty()", 20000)
|
||||
try:
|
||||
editor = waitForObject(":Qt Creator_CppEditor::Internal::CPPEditorWidget")
|
||||
except:
|
||||
outputWindow = waitForObject(":Qt Creator_Core::OutputWindow")
|
||||
test.fail("Could not find editor with snippet", str(outputWindow.plainText))
|
||||
clickButton(waitForObject(":*Qt Creator.Clear_QToolButton"))
|
||||
continue
|
||||
test.compare(filenameCombo.currentText, "%s: %s" % (protocol, pasteId), "Verify title of editor")
|
||||
if protocol in (NAME_KDE, NAME_PBCOM) and pastedText.endswith("\n"):
|
||||
pastedText = pastedText[:-1]
|
||||
test.compare(editor.plainText, pastedText, "Verify that pasted and fetched texts are the same")
|
||||
invokeMenuItem("File", "Close All")
|
||||
invokeMenuItem("File", "Open File or Project...")
|
||||
selectFromFileDialog(sourceFile)
|
||||
editor = waitForObject(":Qt Creator_CppEditor::Internal::CPPEditorWidget")
|
||||
|
@@ -92,7 +92,7 @@ def __clickCommit__(count):
|
||||
test.fail("Could not find the %d. commit - leaving test" % count)
|
||||
return False
|
||||
placeCursorToLine(gitEditor, line)
|
||||
for i in range(30):
|
||||
for _ in range(30):
|
||||
type(gitEditor, "<Left>")
|
||||
# get the current cursor rectangle which should be positioned on the commit ID
|
||||
rect = gitEditor.cursorRect()
|
||||
@@ -234,7 +234,7 @@ def deleteProject():
|
||||
if os.path.exists(path):
|
||||
try:
|
||||
# Make files in .git writable to remove them
|
||||
for root, dirs, files in os.walk(path):
|
||||
for root, _, files in os.walk(path):
|
||||
for name in files:
|
||||
os.chmod(os.path.join(root, name), stat.S_IWUSR)
|
||||
shutil.rmtree(path)
|
||||
|
Reference in New Issue
Block a user