Files
qt-creator/tests/system/suite_debugger/tst_qml_locals/test.py
Christian Stenger 1016dc0603 Squish: Refactor starting Qt Creator from Squish
Change-Id: I7cbce7db2a22a7cb327965b9b7918eb46266b260
Reviewed-by: Robert Loehning <robert.loehning@qt.io>
2018-09-05 09:24:18 +00:00

160 lines
7.4 KiB
Python

############################################################################
#
# Copyright (C) 2016 The Qt Company Ltd.
# Contact: https://www.qt.io/licensing/
#
# 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 The Qt Company. For licensing terms
# and conditions see https://www.qt.io/terms-conditions. For further
# information use the contact form at https://www.qt.io/contact-us.
#
# GNU General Public License Usage
# Alternatively, this file may be used under the terms of the GNU
# General Public License version 3 as published by the Free Software
# Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
# included in the packaging of this file. Please review the following
# information to ensure the GNU General Public License requirements will
# be met: https://www.gnu.org/licenses/gpl-3.0.html.
#
############################################################################
source("../../shared/qtcreator.py")
source("Tree.py")
def main():
if os.getenv("SYSTEST_OPENGL_MISSING") == "1":
test.xfail("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
startQC(['"%s"' % qmlProjFile])
if not startedWithoutPluginError():
return
waitFor('object.exists(":Qt Creator_Utils::NavigationTreeView")', 10000)
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.getDefaultKit()),
"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(Targets.getDefaultKit(), ProjectSettings.RUN)
ensureChecked("{container=':Qt Creator.scrollArea_QScrollArea' text='Enable QML' "
"type='QCheckBox' unnamed='1' visible='1'}")
switchViewTo(ViewConstants.EDIT)
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", 2, {"Properties":1}, {"width":"50", "height":"50", "color":"#008000"}],
["Rectangle", 1, {"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))
invokeMenuItem("File", "Exit")
def __unfoldTree__():
rootIndex = getQModelIndexStr("text='Rectangle'",
':Locals and Expressions_Debugger::Internal::WatchTreeView')
unfoldQModelIndexIncludingProperties(rootIndex)
subItems = ["text='Rectangle'", "text='Rectangle' occurrence='2'", "text='Text'"]
for item in subItems:
unfoldQModelIndexIncludingProperties(getQModelIndexStr(item, rootIndex))
def unfoldQModelIndexIncludingProperties(indexStr):
tv = waitForObject(':Locals and Expressions_Debugger::Internal::WatchTreeView')
# HACK to avoid failing clicks
tv.scrollToBottom()
doubleClick(waitForObject(indexStr))
propIndex = getQModelIndexStr("text='Properties'", indexStr)
# HACK to avoid failing clicks
tv.scrollToBottom()
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