diff --git a/src/plugins/debugger/qml/qmlv8debuggerclient.cpp b/src/plugins/debugger/qml/qmlv8debuggerclient.cpp index d1260a98f77..02b10ea5461 100644 --- a/src/plugins/debugger/qml/qmlv8debuggerclient.cpp +++ b/src/plugins/debugger/qml/qmlv8debuggerclient.cpp @@ -1770,11 +1770,19 @@ QmlJS::ConsoleItem *constructLogItemTree(QmlJS::ConsoleItem *parent, ConsoleItem *item = new ConsoleItem(parent, ConsoleItem::UndefinedType, text); + QSet childrenFetched; foreach (const QVariant &property, objectData.properties) { - ConsoleItem *child = constructLogItemTree(item, extractData(property, refsVal), - refsVal); - if (child) + const QmlV8ObjectData childObjectData = extractData(property, refsVal); + if (childObjectData.handle == objectData.handle) + continue; + ConsoleItem *child = constructLogItemTree(item, childObjectData, refsVal); + if (child) { + const QString text = child->text(); + if (childrenFetched.contains(text)) + continue; + childrenFetched.insert(text); item->insertChild(child, sorted); + } } return item; diff --git a/src/plugins/git/branchdialog.cpp b/src/plugins/git/branchdialog.cpp index 78a7ba1648b..c4252761023 100644 --- a/src/plugins/git/branchdialog.cpp +++ b/src/plugins/git/branchdialog.cpp @@ -221,7 +221,7 @@ void BranchDialog::checkout() } if (!stashMessage.isEmpty() && branchCheckoutDialog.moveLocalChangesToNextBranch()) - gitClient->stashPop(m_repository); + gitClient->endStashScope(m_repository); else if (branchCheckoutDialog.popStashOfNextBranch()) gitClient->synchronousStashRestore(m_repository, stashName, true); } diff --git a/src/plugins/projectexplorer/gnumakeparser.cpp b/src/plugins/projectexplorer/gnumakeparser.cpp index c8f028633e7..e478255382a 100644 --- a/src/plugins/projectexplorer/gnumakeparser.cpp +++ b/src/plugins/projectexplorer/gnumakeparser.cpp @@ -105,7 +105,7 @@ void GnuMakeParser::stdError(const QString &line) m_suppressIssues = true; QString description = m_makeLine.cap(8); Task::TaskType type = Task::Error; - if (description.startsWith(QLatin1String("warning: "))) { + if (description.startsWith(QLatin1String("warning: "), Qt::CaseInsensitive)) { description = description.mid(9); type = Task::Warning; } diff --git a/src/plugins/vcsbase/vcsbaseeditor.cpp b/src/plugins/vcsbase/vcsbaseeditor.cpp index 733982d8533..680eb485c6f 100644 --- a/src/plugins/vcsbase/vcsbaseeditor.cpp +++ b/src/plugins/vcsbase/vcsbaseeditor.cpp @@ -1162,7 +1162,7 @@ DiffChunk VcsBaseEditorWidget::diffChunk(QTextCursor cursor) const unicode.append(QLatin1Char('\n')); for (block = block.next() ; block.isValid() ; block = block.next()) { const QString line = block.text(); - if (checkChunkLine(line, &chunkStart)) { + if (checkChunkLine(line, &chunkStart) || d->m_diffFilePattern.indexIn(line) == 0) { break; } else { unicode += line; diff --git a/tests/system/objects.map b/tests/system/objects.map index 152f208d224..93019bf52ae 100644 --- a/tests/system/objects.map +++ b/tests/system/objects.map @@ -43,6 +43,7 @@ :DebugModeWidget.Breakpoints_QDockWidget {container=':Qt Creator.DebugModeWidget_QSplitter' name='Debugger.Docks.Break' type='QDockWidget' visible='1' windowTitle='Breakpoints'} :DebugModeWidget.Debugger Log_QDockWidget {container=':Qt Creator.DebugModeWidget_QSplitter' name='Debugger.Docks.Output' type='QDockWidget' visible='1' windowTitle='Debugger Log'} :DebugModeWidget.Debugger Toolbar_QDockWidget {container=':Qt Creator.DebugModeWidget_QSplitter' name='Debugger Toolbar' type='QDockWidget' visible='1' windowTitle='Debugger Toolbar'} +:DebugModeWidget.Locals and Expressions_QDockWidget {container=':Qt Creator.DebugModeWidget_QSplitter' name='Debugger.Docks.LocalsAndWatchers' type='QDockWidget' visible='1' windowTitle='Locals and Expressions'} :DebugModeWidget.OK_QPushButton {container=':Qt Creator.DebugModeWidget_QSplitter' text='OK' type='QPushButton' unnamed='1' visible='1'} :DebugModeWidget_QComboBox {container=':Qt Creator.DebugModeWidget_QSplitter' occurrence='2' type='QComboBox' unnamed='1' visible='1'} :Debugger Toolbar.Continue_QToolButton {container=':DebugModeWidget.Debugger Toolbar_QDockWidget' text='Continue' type='QToolButton' unnamed='1' visible='1'} @@ -69,6 +70,7 @@ :JavaScript.QmlProfilerV8ProfileTable_QmlProfiler::Internal::QmlProfilerEventsMainView {container=':*Qt Creator.JavaScript_QDockWidget' name='QmlProfilerV8ProfileTable' type='QmlProfiler::Internal::QmlProfilerEventsMainView' visible='1'} :Kits_Or_Compilers_QTreeView {container=':qt_tabwidget_stackedwidget_QWidget' type='QTreeView' unnamed='1' visible='1'} :Kits_QtVersion_QComboBox {container=':qt_tabwidget_stackedwidget_QWidget' occurrence='4' type='QComboBox' unnamed='1' visible='1'} +:Locals and Expressions_Debugger::Internal::WatchTreeView {container=':DebugModeWidget.Locals and Expressions_QDockWidget' name='WatchWindow' type='Debugger::Internal::WatchTreeView' visible='1' windowTitle='Locals and Expressions'} :New.frame_QFrame {name='frame' type='QFrame' visible='1' window=':New_Core::Internal::NewDialog'} :New.templateCategoryView_QTreeView {name='templateCategoryView' type='QTreeView' visible='1' window=':New_Core::Internal::NewDialog'} :New_Core::Internal::NewDialog {name='Core__Internal__NewDialog' type='Core::Internal::NewDialog' visible='1' windowTitle='New'} @@ -119,6 +121,7 @@ :Qt Creator_HelpSelector_QComboBox {occurrence='3' type='QComboBox' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator_Issues_Core::Internal::OutputPaneToggleButton {occurrence='1' type='Core::Internal::OutputPaneToggleButton' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator_ProFileEditorWidget {type='Qt4ProjectManager::Internal::ProFileEditorWidget' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} +:Qt Creator_PythonEditor::EditorWidget {type='PythonEditor::EditorWidget' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator_QDeclarativeView {type='QDeclarativeView' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator_QHelpContentWidget {type='QHelpContentWidget' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator_QTableView {type='QTableView' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} diff --git a/tests/system/shared/editor_utils.py b/tests/system/shared/editor_utils.py index 10b7aa18f78..17208e7c960 100644 --- a/tests/system/shared/editor_utils.py +++ b/tests/system/shared/editor_utils.py @@ -244,6 +244,7 @@ def getEditorForFileSuffix(curFile): qmlEditorSuffixes = ["qml", "qmlproject", "js", "qs", "qtt"] proEditorSuffixes = ["pro", "pri", "prf"] glslEditorSuffixes= ["frag", "vert", "fsh", "vsh", "glsl", "shader", "gsh"] + pytEditorSuffixes = ["py", "pyw", "wsgi"] suffix = __getFileSuffix__(curFile) if suffix in cppEditorSuffixes: editor = waitForObject(":Qt Creator_CppEditor::Internal::CPPEditorWidget") @@ -254,6 +255,8 @@ def getEditorForFileSuffix(curFile): elif suffix in glslEditorSuffixes: editor = waitForObject("{type='GLSLEditor::GLSLTextEditorWidget' unnamed='1' " "visible='1' window=':Qt Creator_Core::Internal::MainWindow'}") + elif suffix in pytEditorSuffixes: + editor = waitForObject(":Qt Creator_PythonEditor::EditorWidget") else: test.log("Trying PlainTextEditor (file suffix: %s)" % suffix) try: diff --git a/tests/system/shared/project_explorer.py b/tests/system/shared/project_explorer.py index 96ab52279b7..edd99e78bdb 100644 --- a/tests/system/shared/project_explorer.py +++ b/tests/system/shared/project_explorer.py @@ -242,6 +242,18 @@ def __getTargetFromToolTip__(toolTip): return None return target.group(1).split("
")[0].strip() +def getExecutableAndTargetFromToolTip(toolTip): + target = __getTargetFromToolTip__(toolTip) + if toolTip == None or not isinstance(toolTip, (str, unicode)): + return None, target + pattern = re.compile('.*Run:(.*)")[1].strip() tmp = qCall.split() diff --git a/tests/system/shared/utils.py b/tests/system/shared/utils.py index d90f39ad0bc..c64f1f90166 100644 --- a/tests/system/shared/utils.py +++ b/tests/system/shared/utils.py @@ -667,3 +667,12 @@ def clickOnTab(tabBarStr, tabText, timeout=5000): test.log("Using workaround for Mac.") setWindowState(tabBar, WindowState.Normal) clickTab(waitForObject(tabBarStr, timeout), tabText) + +# constructs a string holding the properties for a QModelIndex +# param property a string holding additional properties including their values +# ATTENTION! use single quotes for values (e.g. "text='Text'", "text='Text' occurrence='2'") +# param container the container (str) to be used for this QModelIndex +def getQModelIndexStr(property, container): + if (container.startswith(":")): + container = "'%s'" % container + return ("{column='0' container=%s %s type='QModelIndex'}" % (container, property)) diff --git a/tests/system/suite_CSUP/tst_CSUP01/test.py b/tests/system/suite_CSUP/tst_CSUP01/test.py index 68e3789ecaf..35813568278 100644 --- a/tests/system/suite_CSUP/tst_CSUP01/test.py +++ b/tests/system/suite_CSUP/tst_CSUP01/test.py @@ -89,7 +89,10 @@ def main(): type(editorWidget, "") else: type(editorWidget, "") - waitForObjectItem(":popupFrame_Proposal_QListView", "return") + try: + waitForObjectItem(":popupFrame_Proposal_QListView", "return") + except: + test.fail("Could not find proposal popup.") type(editorWidget, "") type(editorWidget, "") test.verify(str(editorWidget.plainText).startswith("ret#"), diff --git a/tests/system/suite_HELP/tst_HELP06/test.py b/tests/system/suite_HELP/tst_HELP06/test.py index 1e682543155..c06648abbee 100755 --- a/tests/system/suite_HELP/tst_HELP06/test.py +++ b/tests/system/suite_HELP/tst_HELP06/test.py @@ -44,12 +44,6 @@ def invokeContextMenuItemOnBookmarkFolder(view, item, menuItem): activateItem(waitForObject("{aboveWidget=%s type='QMenu' unnamed='1' visible='1' " "window=':Add Bookmark_BookmarkDialog'}" % aboveWidget), menuItem) -def getQModelIndexStr(textProperty, container): - if (container.startswith(":")): - container = "'%s'" % container - return ("{column='0' container=%s %s type='QModelIndex'}" - % (container, textProperty)) - def main(): startApplication("qtcreator" + SettingsPath) if not startedWithoutPluginError(): diff --git a/tests/system/suite_QMLS/tst_QMLS01/test.py b/tests/system/suite_QMLS/tst_QMLS01/test.py index 0b65f47b43c..c767e2a1acd 100644 --- a/tests/system/suite_QMLS/tst_QMLS01/test.py +++ b/tests/system/suite_QMLS/tst_QMLS01/test.py @@ -95,8 +95,10 @@ def testSuggestionsManual(lineText, textToType, expectedText): else: type(editorArea, "") # check if suggestions are shown - test.verify(checkIfObjectExists(":popupFrame_Proposal_QListView"), - "Verifying if suggestions in manual mode are shown manually") + if not test.verify(checkIfObjectExists(":popupFrame_Proposal_QListView"), + "Verifying if suggestions in manual mode are shown manually"): + __endTestSuggestions__(editorArea) + return False # verify proposed suggestions verifySuggestions(textToType) # test if suggestion can be used diff --git a/tests/system/suite_debugger/shared/testdata/simpleQuickUI2/simpleQuickUI2.qml b/tests/system/suite_debugger/shared/testdata/simpleQuickUI2/simpleQuickUI2.qml new file mode 100644 index 00000000000..033793eb987 --- /dev/null +++ b/tests/system/suite_debugger/shared/testdata/simpleQuickUI2/simpleQuickUI2.qml @@ -0,0 +1,50 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + +import QtQuick 2.0 + +Rectangle { + width: 360 + height: 360 + Rectangle { + width: 100; height: 100 + anchors.centerIn: parent + color: "red" + } + Rectangle { + width: 50; height: 50 + anchors.centerIn: parent + color: "green" + } + Text { + anchors.centerIn: parent + text: "Check" + } +} + diff --git a/tests/system/suite_debugger/shared/testdata/simpleQuickUI2/simpleQuickUI2.qmlproject b/tests/system/suite_debugger/shared/testdata/simpleQuickUI2/simpleQuickUI2.qmlproject new file mode 100644 index 00000000000..6204a82b07e --- /dev/null +++ b/tests/system/suite_debugger/shared/testdata/simpleQuickUI2/simpleQuickUI2.qmlproject @@ -0,0 +1,15 @@ +import QmlProject 1.1 + +Project { + mainFile: "simpleQuickUI2.qml" + + QmlFiles { + directory: "." + } + JavaScriptFiles { + directory: "." + } + ImageFiles { + directory: "." + } +} diff --git a/tests/system/suite_debugger/suite.conf b/tests/system/suite_debugger/suite.conf index 5df48ea58e5..f317ed4700b 100644 --- a/tests/system/suite_debugger/suite.conf +++ b/tests/system/suite_debugger/suite.conf @@ -7,6 +7,6 @@ HOOK_SUB_PROCESSES=false IMPLICITAUTSTART=0 LANGUAGE=Python OBJECTMAP=../objects.map -TEST_CASES=tst_build_new_project tst_cli_output_console tst_simple_analyze tst_simple_debug +TEST_CASES=tst_build_new_project tst_cli_output_console tst_qml_locals tst_simple_analyze tst_simple_debug VERSION=2 WRAPPERS=Qt diff --git a/tests/system/suite_debugger/tst_qml_locals/Tree.py b/tests/system/suite_debugger/tst_qml_locals/Tree.py new file mode 100644 index 00000000000..b241fe32e8b --- /dev/null +++ b/tests/system/suite_debugger/tst_qml_locals/Tree.py @@ -0,0 +1,99 @@ +############################################################################# +## +## Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +## Contact: http://www.qt-project.org/legal +## +## This file is part of Qt Creator. +## +## Commercial License Usage +## Licensees holding valid commercial Qt licenses may use this file in +## accordance with the commercial license agreement provided with the +## Software or, alternatively, in accordance with the terms contained in +## a written agreement between you and Digia. For licensing terms and +## conditions see http://qt.digia.com/licensing. For further information +## use the contact form at http://qt.digia.com/contact-us. +## +## GNU Lesser General Public License Usage +## Alternatively, this file may be used under the terms of the GNU Lesser +## General Public License version 2.1 as published by the Free Software +## Foundation and appearing in the file LICENSE.LGPL included in the +## packaging of this file. Please review the following information to +## ensure the GNU Lesser General Public License version 2.1 requirements +## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +## +## In addition, as a special exception, Digia gives you certain additional +## rights. These rights are described in the Digia Qt LGPL Exception +## version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +## +############################################################################# + +import os + +# Helper class to create a tree structure +class Tree: + def __init__(self, name=None, value=None, children=None): + self.__name__ = name + self.__value__ = value + self.__children__ = children + + # getter functions + def getChild(self, name, occurrence=1): + if self.__children__: + for ch in self.__children__: + if ch.__name__ == name: + if occurrence == 1: + return ch + occurrence -= 1 + return None + + def getChildren(self): + return self.__children__ + + def getName(self): + return self.__name__ + + def getValue(self): + return self.__value__ + + # setter function + def setChildren(self, children): + self.__children__ = children + + def setName(self, name): + self.__name__ = name + + def setValue(self, value): + self.__value__ = value + + # other functions + def addChild(self, child): + if self.__children__ == None: + self.__children__ = [] + self.__children__.append(child) + + def childrenCount(self): + if self.__children__: + return len(self.__children__) + return 0 + + def countChildOccurrences(self, name): + if not self.__children__: + return 0 + return len(filter(lambda x: x.getName() == name, self.__children__)) + + # internal functions + def __repr__(self): + return self.__str__() + + def __strIndented__(self, indent): + result = "%s%s (%s)" % (" " * indent, self.__name__, self.__value__) + if self.__children__: + for ch in self.__children__: + if isinstance(ch, Tree): + result += os.linesep + ch.__strIndented__(indent + 2) + else: + result += os.linesep + " " * (indent + 2) + str(ch) + return result + + def __str__(self): + return self.__strIndented__(1) diff --git a/tests/system/suite_debugger/tst_qml_locals/test.py b/tests/system/suite_debugger/tst_qml_locals/test.py new file mode 100644 index 00000000000..335f3ebcb24 --- /dev/null +++ b/tests/system/suite_debugger/tst_qml_locals/test.py @@ -0,0 +1,167 @@ +############################################################################# +## +## Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +## Contact: http://www.qt-project.org/legal +## +## This file is part of Qt Creator. +## +## Commercial License Usage +## Licensees holding valid commercial Qt licenses may use this file in +## accordance with the commercial license agreement provided with the +## Software or, alternatively, in accordance with the terms contained in +## a written agreement between you and Digia. For licensing terms and +## conditions see http://qt.digia.com/licensing. For further information +## use the contact form at http://qt.digia.com/contact-us. +## +## GNU Lesser General Public License Usage +## Alternatively, this file may be used under the terms of the GNU Lesser +## General Public License version 2.1 as published by the Free Software +## Foundation and appearing in the file LICENSE.LGPL included in the +## packaging of this file. Please review the following information to +## ensure the GNU Lesser General Public License version 2.1 requirements +## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +## +## In addition, as a special exception, Digia gives you certain additional +## rights. These rights are described in the Digia Qt LGPL Exception +## version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +## +############################################################################# + +source("../../shared/qtcreator.py") +source("Tree.py") + +def main(): + if os.getenv("SYSTEST_OPENGL_MISSING") == "1": + test.xverify(False, "This test needs OpenGL - skipping...") + return + projName = "simpleQuickUI2.qmlproject" + projFolder = os.path.dirname(findFile("testdata", "simpleQuickUI2/%s" % projName)) + if not neededFilePresent(os.path.join(projFolder, projName)): + return + qmlProjDir = prepareTemplate(projFolder) + if qmlProjDir == None: + test.fatal("Could not prepare test files - leaving test") + return + qmlProjFile = os.path.join(qmlProjDir, projName) + # start Creator by passing a .qmlproject file + startApplication('qtcreator' + SettingsPath + ' "%s"' % qmlProjFile) + if not startedWithoutPluginError(): + return + fancyConfButton = findObject(":*Qt Creator_Core::Internal::FancyToolButton") + fancyRunButton = findObject(":*Qt Creator.Run_Core::Internal::FancyToolButton") + fancyDebugButton = findObject(":*Qt Creator.Start Debugging_Core::Internal::FancyToolButton") + exe, target = getExecutableAndTargetFromToolTip(str(waitForObject(fancyConfButton).toolTip)) + if not (test.verify(fancyRunButton.enabled and fancyDebugButton.enabled, + "Verifying Run and Debug are enabled (Qt5 is available).") + and test.compare(target, Targets.getStringForTarget(Targets.DESKTOP_501_DEFAULT), + "Verifying selected Target is Qt5.") + and test.compare(exe, "QML Scene", "Verifying selected executable is QML Scene.")): + earlyExit("Something went wrong opening Qml project - probably missing Qt5.") + return + switchViewTo(ViewConstants.PROJECTS) + switchToBuildOrRunSettingsFor(1, 0, ProjectSettings.RUN, True) + ensureChecked("{container=':Qt Creator.scrollArea_QScrollArea' text='Enable QML' " + "type='QCheckBox' unnamed='1' visible='1'}") + switchViewTo(ViewConstants.EDIT) + if platform.system() in ('Microsoft', 'Windows'): + qmake = getQtInformationForQmlProject()[3] + if qmake == None: + earlyExit("Could not figure out which qmake is used.") + return + qmlScenePath = os.path.abspath(os.path.dirname(qmake)) + qmlScene = "qmlscene.exe" + allowAppThroughWinFW(qmlScenePath, qmlScene, None) + clickButton(fancyDebugButton) + locAndExprTV = waitForObject(":Locals and Expressions_Debugger::Internal::WatchTreeView") + # Locals and Expressions populates treeview only on demand - so the tree must be expanded + __unfoldTree__() + items = fetchItems(QModelIndex(), QModelIndex(), locAndExprTV) + # reduce items to Locals (invisible object) + items = items.getChild("Inspector") + if items == None: + earlyExit("Could not find expected Inspector tree inside Locals and Expressions.") + return + # reduce items to outer Rectangle object + items = items.getChild("Rectangle") + if items == None: + earlyExit("Could not find expected Rectangle tree inside Locals and Expressions.") + return + checkForEmptyRows(items) + check = [[None, 0, {"Properties":1, "Rectangle":2, "Text":1}, {"width":"360", "height":"360"}], + ["Text", 1, {"Properties":1}, {"text":"Check"}], + ["Rectangle", 1, {"Properties":1}, {"width":"50", "height":"50", "color":"#008000"}], + ["Rectangle", 2, {"Properties":1}, {"width":"100", "height":"100", "color":"#ff0000"}] + ] + for current in check: + if current[0]: + subItem = items.getChild(current[0], current[1]) + else: + subItem = items + checkForExpectedValues(subItem, current[2], current[3]) + clickButton(waitForObject(':Debugger Toolbar.Exit Debugger_QToolButton', 5000)) + if platform.system() in ('Microsoft', 'Windows'): + deleteAppFromWinFW(qmlScenePath, qmlScene) + invokeMenuItem("File", "Exit") + +def __unfoldTree__(): + rootIndex = getQModelIndexStr("text='Rectangle'", + ':Locals and Expressions_Debugger::Internal::WatchTreeView') + unfoldQModelIndexIncludingProperties(rootIndex) + subItems = ["text='Rectangle' occurrence='2'", "text='Rectangle'", "text='Text'"] + for item in subItems: + unfoldQModelIndexIncludingProperties(getQModelIndexStr(item, rootIndex)) + +def unfoldQModelIndexIncludingProperties(indexStr): + doubleClick(waitForObject(indexStr)) + propIndex = getQModelIndexStr("text='Properties'", indexStr) + doubleClick(waitForObject(propIndex)) + +def fetchItems(index, valIndex, treeView): + tree = Tree() + model = treeView.model() + if index.isValid(): + name = str(model.data(index).toString()) + value = str(model.data(valIndex).toString()) + 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)) + return tree + +def checkForEmptyRows(items, isRootCheck=True): + # check for QTCREATORBUG-9069 + noEmptyRowsFound = True + if items.getName().strip() == "": + noEmptyRowsFound = False + test.fail('Found empty row inside Locals and Expressions', '%s' % items) + if items.childrenCount(): + for item in items.getChildren(): + noEmptyRowsFound &= checkForEmptyRows(item, False) + if isRootCheck and noEmptyRowsFound: + test.passes("No empty rows inside Locals and Expressions found.") + return noEmptyRowsFound + +def checkForExpectedValues(items, expectedChildren, expectedProperties): + if items == None: + test.fatal("Got a None object to inspect") + return + for subItemName in expectedChildren.keys(): + test.compare(items.countChildOccurrences(subItemName), expectedChildren[subItemName], + "Verify number of children named %s for %s" % (subItemName, items.getName())) + properties = items.getChild("Properties") + if properties: + children = properties.getChildren() + for property,value in expectedProperties.iteritems(): + foundProperty = getProperty(property, children) + if foundProperty: + test.compare(foundProperty.getValue(), value, "Verifying value for %s" % property) + else: + test.fail("Could not find property %s for object %s" % (property, items.getName())) + else: + test.fail("Missing properties for %s" % items.getName()) + +def getProperty(property, propertyList): + for prop in propertyList: + if prop.getName() == property: + return prop + return None diff --git a/tests/system/suite_editors/shared/testdata/files.tsv b/tests/system/suite_editors/shared/testdata/files.tsv index cfdf5d87933..7845540756b 100644 --- a/tests/system/suite_editors/shared/testdata/files.tsv +++ b/tests/system/suite_editors/shared/testdata/files.tsv @@ -6,3 +6,4 @@ "creator/tests/manual/cplusplus-frontend/conf.c++" "creator/src/plugins/coreplugin/basefilewizard.cpp" "creator/src/plugins/coreplugin/basefilewizard.h" +"creator/tests/system/suite_debugger/tst_simple_debug/test.py"