| 
									
										
										
										
											2013-05-15 13:17:33 +02:00
										 |  |  | ############################################################################# | 
					
						
							|  |  |  | ## | 
					
						
							| 
									
										
										
										
											2015-01-14 18:07:15 +01:00
										 |  |  | ## Copyright (C) 2015 The Qt Company Ltd. | 
					
						
							|  |  |  | ## Contact: http://www.qt.io/licensing | 
					
						
							| 
									
										
										
										
											2013-05-15 13:17:33 +02:00
										 |  |  | ## | 
					
						
							|  |  |  | ## This file is part of Qt Creator. | 
					
						
							|  |  |  | ## | 
					
						
							|  |  |  | ## Commercial License Usage | 
					
						
							|  |  |  | ## Licensees holding valid commercial Qt licenses may use this file in | 
					
						
							|  |  |  | ## accordance with the commercial license agreement provided with the | 
					
						
							|  |  |  | ## Software or, alternatively, in accordance with the terms contained in | 
					
						
							| 
									
										
										
										
											2015-01-14 18:07:15 +01:00
										 |  |  | ## a written agreement between you and The Qt Company.  For licensing terms and | 
					
						
							|  |  |  | ## conditions see http://www.qt.io/terms-conditions.  For further information | 
					
						
							| 
									
										
										
										
											2014-10-01 13:21:18 +02:00
										 |  |  | ## use the contact form at http://www.qt.io/contact-us. | 
					
						
							| 
									
										
										
										
											2013-05-15 13:17:33 +02:00
										 |  |  | ## | 
					
						
							|  |  |  | ## GNU Lesser General Public License Usage | 
					
						
							|  |  |  | ## Alternatively, this file may be used under the terms of the GNU Lesser | 
					
						
							| 
									
										
										
										
											2014-10-01 13:21:18 +02:00
										 |  |  | ## General Public License version 2.1 or version 3 as published by the Free | 
					
						
							|  |  |  | ## Software Foundation and appearing in the file LICENSE.LGPLv21 and | 
					
						
							|  |  |  | ## LICENSE.LGPLv3 included in the packaging of this file.  Please review the | 
					
						
							|  |  |  | ## following information to ensure the GNU Lesser General Public License | 
					
						
							|  |  |  | ## requirements will be met: https://www.gnu.org/licenses/lgpl.html and | 
					
						
							| 
									
										
										
										
											2015-02-13 16:51:38 +01:00
										 |  |  | ## http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. | 
					
						
							| 
									
										
										
										
											2013-05-15 13:17:33 +02:00
										 |  |  | ## | 
					
						
							| 
									
										
										
										
											2015-01-14 18:07:15 +01:00
										 |  |  | ## In addition, as a special exception, The Qt Company gives you certain additional | 
					
						
							|  |  |  | ## rights.  These rights are described in The Qt Company LGPL Exception | 
					
						
							| 
									
										
										
										
											2013-05-15 13:17:33 +02:00
										 |  |  | ## version 1.1, included in the file LGPL_EXCEPTION.txt in this package. | 
					
						
							|  |  |  | ## | 
					
						
							|  |  |  | ############################################################################# | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-27 11:39:01 +02:00
										 |  |  | import tempfile | 
					
						
							| 
									
										
										
										
											2011-08-25 10:05:28 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-27 11:04:12 +02:00
										 |  |  | def neededFilePresent(path): | 
					
						
							|  |  |  |     found = os.path.exists(path) | 
					
						
							| 
									
										
										
										
											2012-02-07 14:25:14 +01:00
										 |  |  |     if os.getenv("SYSTEST_DEBUG") == "1": | 
					
						
							|  |  |  |         checkAccess(path) | 
					
						
							|  |  |  |     elif not found: | 
					
						
							| 
									
										
										
										
											2011-09-27 11:04:12 +02:00
										 |  |  |         test.fatal("Missing file or directory: " + path) | 
					
						
							|  |  |  |     return found | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-25 10:05:28 +02:00
										 |  |  | def tempDir(): | 
					
						
							| 
									
										
										
										
											2011-09-21 11:29:21 +02:00
										 |  |  |     Result = os.path.abspath(os.getcwd()+"/../../testing") | 
					
						
							|  |  |  |     if not os.path.exists(Result): | 
					
						
							|  |  |  |         os.mkdir(Result) | 
					
						
							|  |  |  |     return tempfile.mkdtemp(prefix="qtcreator_", dir=Result) | 
					
						
							| 
									
										
										
										
											2011-08-25 10:05:28 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | def deleteDirIfExists(path): | 
					
						
							|  |  |  |     shutil.rmtree(path, True) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def verifyChecked(objectName): | 
					
						
							| 
									
										
										
										
											2012-11-02 19:34:38 +01:00
										 |  |  |     object = waitForObject(objectName) | 
					
						
							| 
									
										
										
										
											2011-08-25 10:05:28 +02:00
										 |  |  |     test.compare(object.checked, True) | 
					
						
							|  |  |  |     return object | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-13 11:37:56 +02:00
										 |  |  | def ensureChecked(objectName, shouldBeChecked = True, timeout=20000): | 
					
						
							| 
									
										
										
										
											2011-11-09 16:40:35 +01:00
										 |  |  |     if shouldBeChecked: | 
					
						
							| 
									
										
										
										
											2013-12-12 14:42:28 +01:00
										 |  |  |         targetState = Qt.Checked | 
					
						
							| 
									
										
										
										
											2011-11-09 16:40:35 +01:00
										 |  |  |         state = "checked" | 
					
						
							|  |  |  |     else: | 
					
						
							| 
									
										
										
										
											2013-12-12 14:42:28 +01:00
										 |  |  |         targetState = Qt.Unchecked | 
					
						
							| 
									
										
										
										
											2011-11-09 16:40:35 +01:00
										 |  |  |         state = "unchecked" | 
					
						
							| 
									
										
										
										
											2013-12-12 14:42:28 +01:00
										 |  |  |     widget = waitForObject(objectName, timeout) | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         # needed for transition Qt::PartiallyChecked -> Qt::Checked -> Qt::Unchecked | 
					
						
							|  |  |  |         clicked = 0 | 
					
						
							|  |  |  |         while not waitFor('widget.checkState() == targetState', 1000) and clicked < 2: | 
					
						
							|  |  |  |             clickButton(widget) | 
					
						
							|  |  |  |             clicked += 1 | 
					
						
							|  |  |  |         test.verify(waitFor("widget.checkState() == targetState", 1000)) | 
					
						
							|  |  |  |     except: | 
					
						
							|  |  |  |         # widgets not derived from QCheckbox don't have checkState() | 
					
						
							|  |  |  |         if not waitFor('widget.checked == shouldBeChecked', 1000): | 
					
						
							|  |  |  |             clickButton(widget) | 
					
						
							|  |  |  |         test.verify(waitFor("widget.checked == shouldBeChecked", 1000)) | 
					
						
							| 
									
										
										
										
											2012-07-13 11:37:56 +02:00
										 |  |  |     test.log("New state for QCheckBox: %s" % state, | 
					
						
							|  |  |  |              str(objectName)) | 
					
						
							| 
									
										
										
										
											2013-12-12 14:42:28 +01:00
										 |  |  |     return widget | 
					
						
							| 
									
										
										
										
											2011-11-08 13:20:24 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-24 15:25:20 +01:00
										 |  |  | # verify that an object is in an expected enable state. Returns the object. | 
					
						
							|  |  |  | # param objectSpec  specifies the object to check. It can either be a string determining an object | 
					
						
							|  |  |  | #                   or the object itself. If it is an object, it must exist already. | 
					
						
							|  |  |  | # param expectedState is the expected enable state of the object | 
					
						
							|  |  |  | def verifyEnabled(objectSpec, expectedState = True): | 
					
						
							|  |  |  |     if isinstance(objectSpec, (str, unicode)): | 
					
						
							| 
									
										
										
										
											2014-04-24 14:15:27 +02:00
										 |  |  |         waitFor("object.exists('" + str(objectSpec).replace("'", "\\'") + "')", 20000) | 
					
						
							| 
									
										
										
										
											2011-11-24 15:25:20 +01:00
										 |  |  |         foundObject = findObject(objectSpec) | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         foundObject = objectSpec | 
					
						
							|  |  |  |     if objectSpec == None: | 
					
						
							|  |  |  |         test.warning("No valid object in function verifyEnabled.") | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         test.compare(foundObject.enabled, expectedState) | 
					
						
							|  |  |  |     return foundObject | 
					
						
							| 
									
										
										
										
											2011-08-25 10:05:28 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-24 15:25:20 +01:00
										 |  |  | # select an item from a combo box | 
					
						
							|  |  |  | # param objectSpec  specifies the combo box. It can either be a string determining an object | 
					
						
							|  |  |  | #                   or the object itself. If it is an object, it must exist already. | 
					
						
							|  |  |  | # param itemName is the item to be selected in the combo box | 
					
						
							| 
									
										
										
										
											2012-01-17 13:47:47 +01:00
										 |  |  | # returns True if selection was changed or False if the wanted value was already selected | 
					
						
							| 
									
										
										
										
											2011-11-24 15:25:20 +01:00
										 |  |  | def selectFromCombo(objectSpec, itemName): | 
					
						
							|  |  |  |     object = verifyEnabled(objectSpec) | 
					
						
							| 
									
										
										
										
											2012-01-17 13:47:47 +01:00
										 |  |  |     if itemName == str(object.currentText): | 
					
						
							|  |  |  |         return False | 
					
						
							|  |  |  |     else: | 
					
						
							| 
									
										
										
										
											2011-12-09 15:47:52 +01:00
										 |  |  |         mouseClick(object, 5, 5, 0, Qt.LeftButton) | 
					
						
							| 
									
										
										
										
											2014-08-14 15:37:33 +02:00
										 |  |  |         snooze(1) | 
					
						
							| 
									
										
										
										
											2011-12-09 15:47:52 +01:00
										 |  |  |         mouseClick(waitForObjectItem(object, itemName.replace(".", "\\.")), 5, 5, 0, Qt.LeftButton) | 
					
						
							| 
									
										
										
										
											2013-05-31 09:57:38 +02:00
										 |  |  |         test.verify(waitFor("str(object.currentText)==itemName", 5000), | 
					
						
							|  |  |  |                     "Switched combo item to '%s'" % itemName) | 
					
						
							| 
									
										
										
										
											2012-01-17 13:47:47 +01:00
										 |  |  |         return True | 
					
						
							| 
									
										
										
										
											2011-08-25 10:05:28 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-01 13:47:26 +01:00
										 |  |  | def selectFromLocator(filter, itemName = None): | 
					
						
							|  |  |  |     if itemName == None: | 
					
						
							|  |  |  |         itemName = filter | 
					
						
							| 
									
										
										
										
											2011-12-15 15:17:29 +01:00
										 |  |  |     itemName = itemName.replace(".", "\\.").replace("_", "\\_") | 
					
						
							| 
									
										
										
										
											2012-11-02 19:34:38 +01:00
										 |  |  |     locator = waitForObject(":*Qt Creator_Utils::FilterLineEdit") | 
					
						
							| 
									
										
										
										
											2011-11-01 13:47:26 +01:00
										 |  |  |     mouseClick(locator, 5, 5, 0, Qt.LeftButton) | 
					
						
							|  |  |  |     replaceEditorContent(locator, filter) | 
					
						
							|  |  |  |     # clicking the wanted item | 
					
						
							|  |  |  |     # if you replace this by pressing ENTER, be sure that something is selected | 
					
						
							|  |  |  |     # otherwise you will run into unwanted behavior | 
					
						
							|  |  |  |     wantedItem = waitForObjectItem("{type='QTreeView' unnamed='1' visible='1'}", itemName) | 
					
						
							|  |  |  |     doubleClick(wantedItem, 5, 5, 0, Qt.LeftButton) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-25 10:05:28 +02:00
										 |  |  | def wordUnderCursor(window): | 
					
						
							| 
									
										
										
										
											2013-12-02 18:57:23 +01:00
										 |  |  |     return textUnderCursor(window, QTextCursor.StartOfWord, QTextCursor.EndOfWord) | 
					
						
							| 
									
										
										
										
											2011-08-25 10:05:28 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | def lineUnderCursor(window): | 
					
						
							| 
									
										
										
										
											2013-12-02 18:57:23 +01:00
										 |  |  |     return textUnderCursor(window, QTextCursor.StartOfLine, QTextCursor.EndOfLine) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def textUnderCursor(window, fromPos, toPos): | 
					
						
							| 
									
										
										
										
											2011-08-25 10:05:28 +02:00
										 |  |  |     cursor = window.textCursor() | 
					
						
							|  |  |  |     oldposition = cursor.position() | 
					
						
							| 
									
										
										
										
											2013-12-02 18:57:23 +01:00
										 |  |  |     cursor.movePosition(fromPos) | 
					
						
							|  |  |  |     cursor.movePosition(toPos, QTextCursor.KeepAnchor) | 
					
						
							| 
									
										
										
										
											2011-08-25 10:05:28 +02:00
										 |  |  |     returnValue = cursor.selectedText() | 
					
						
							|  |  |  |     cursor.setPosition(oldposition) | 
					
						
							|  |  |  |     return returnValue | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def which(program): | 
					
						
							|  |  |  |     def is_exe(fpath): | 
					
						
							|  |  |  |         return os.path.exists(fpath) and os.access(fpath, os.X_OK) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-05 17:16:36 +01:00
										 |  |  |     def callableFile(path): | 
					
						
							|  |  |  |         if is_exe(path): | 
					
						
							|  |  |  |             return path | 
					
						
							| 
									
										
										
										
											2011-08-25 10:05:28 +02:00
										 |  |  |         if platform.system() in ('Windows', 'Microsoft'): | 
					
						
							| 
									
										
										
										
											2012-03-05 17:16:36 +01:00
										 |  |  |             for suffix in suffixes.split(os.pathsep): | 
					
						
							|  |  |  |                 if is_exe(path + suffix): | 
					
						
							|  |  |  |                     return path + suffix | 
					
						
							|  |  |  |         return None | 
					
						
							| 
									
										
										
										
											2011-08-25 10:05:28 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-05 17:16:36 +01:00
										 |  |  |     if platform.system() in ('Windows', 'Microsoft'): | 
					
						
							|  |  |  |         suffixes = os.getenv("PATHEXT") | 
					
						
							|  |  |  |         if not suffixes: | 
					
						
							|  |  |  |             test.fatal("Can't read environment variable PATHEXT. Please check your installation.") | 
					
						
							|  |  |  |             suffixes = "" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     fpath, fname = os.path.split(program) | 
					
						
							|  |  |  |     if fpath: | 
					
						
							|  |  |  |         return callableFile(program) | 
					
						
							| 
									
										
										
										
											2011-08-25 10:05:28 +02:00
										 |  |  |     else: | 
					
						
							| 
									
										
										
										
											2012-03-05 17:16:36 +01:00
										 |  |  |         if platform.system() in ('Windows', 'Microsoft'): | 
					
						
							|  |  |  |             cf = callableFile(os.getcwd() + os.sep + program) | 
					
						
							|  |  |  |             if cf: | 
					
						
							|  |  |  |                 return cf | 
					
						
							| 
									
										
										
										
											2011-08-25 10:05:28 +02:00
										 |  |  |         for path in os.environ["PATH"].split(os.pathsep): | 
					
						
							|  |  |  |             exe_file = os.path.join(path, program) | 
					
						
							| 
									
										
										
										
											2012-03-05 17:16:36 +01:00
										 |  |  |             cf = callableFile(exe_file) | 
					
						
							|  |  |  |             if cf: | 
					
						
							|  |  |  |                 return cf | 
					
						
							|  |  |  |         return None | 
					
						
							| 
									
										
										
										
											2011-08-26 11:14:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-27 11:39:01 +02:00
										 |  |  | # this function removes the user files of given pro file(s) | 
					
						
							|  |  |  | # can be called with a single string object or a list of strings holding path(s) to | 
					
						
							|  |  |  | # the pro file(s) returns False if it could not remove all user files or has been | 
					
						
							|  |  |  | # called with an unsupported object | 
					
						
							|  |  |  | def cleanUpUserFiles(pathsToProFiles=None): | 
					
						
							|  |  |  |     if pathsToProFiles==None: | 
					
						
							|  |  |  |         return False | 
					
						
							| 
									
										
										
										
											2011-10-17 19:09:51 +02:00
										 |  |  |     if isinstance(pathsToProFiles, (str, unicode)): | 
					
						
							| 
									
										
										
										
											2011-09-27 11:39:01 +02:00
										 |  |  |         filelist = glob.glob(pathsToProFiles+".user*") | 
					
						
							| 
									
										
										
										
											2011-10-17 19:09:51 +02:00
										 |  |  |     elif isinstance(pathsToProFiles, (list, tuple)): | 
					
						
							| 
									
										
										
										
											2011-09-27 11:39:01 +02:00
										 |  |  |         filelist = [] | 
					
						
							|  |  |  |         for p in pathsToProFiles: | 
					
						
							|  |  |  |             filelist.extend(glob.glob(p+".user*")) | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         test.fatal("Got an unsupported object.") | 
					
						
							|  |  |  |         return False | 
					
						
							|  |  |  |     doneWithoutErrors = True | 
					
						
							|  |  |  |     for file in filelist: | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             file = os.path.abspath(file) | 
					
						
							|  |  |  |             os.remove(file) | 
					
						
							|  |  |  |         except: | 
					
						
							|  |  |  |             doneWithoutErrors = False | 
					
						
							|  |  |  |     return doneWithoutErrors | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-30 09:32:22 +02:00
										 |  |  | def invokeMenuItem(menu, item, *subItems): | 
					
						
							| 
									
										
										
										
											2013-03-27 12:58:28 +01:00
										 |  |  |     if platform.system() == "Darwin": | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             waitForObject(":Qt Creator.QtCreator.MenuBar_QMenuBar", 2000) | 
					
						
							|  |  |  |         except: | 
					
						
							|  |  |  |             nativeMouseClick(waitForObject(":Qt Creator_Core::Internal::MainWindow", 1000), 20, 20, 0, Qt.LeftButton) | 
					
						
							| 
									
										
										
										
											2013-12-10 16:59:46 +01:00
										 |  |  |     # HACK to avoid squish crash using Qt5.2 on Squish 5.0.1 - remove asap | 
					
						
							| 
									
										
										
										
											2014-10-30 15:57:44 +01:00
										 |  |  |     if platform.system() == "Darwin": | 
					
						
							| 
									
										
										
										
											2013-12-10 16:59:46 +01:00
										 |  |  |         if menu == "Tools" and item == "Options...": | 
					
						
							|  |  |  |             nativeType("<Command+,>") | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  |         if menu == "File" and item == "Exit": | 
					
						
							|  |  |  |             nativeType("<Command+q>") | 
					
						
							|  |  |  |             return | 
					
						
							| 
									
										
										
										
											2012-02-24 15:21:42 +01:00
										 |  |  |     menuObject = waitForObjectItem(":Qt Creator.QtCreator.MenuBar_QMenuBar", menu) | 
					
						
							| 
									
										
										
										
											2015-09-08 12:10:48 +02:00
										 |  |  |     snooze(1) | 
					
						
							| 
									
										
										
										
											2012-04-02 15:26:14 +02:00
										 |  |  |     waitFor("menuObject.visible", 1000) | 
					
						
							| 
									
										
										
										
											2011-10-06 20:16:15 +02:00
										 |  |  |     activateItem(menuObject) | 
					
						
							| 
									
										
										
										
											2011-12-05 18:37:53 +01:00
										 |  |  |     itemObject = waitForObjectItem(objectMap.realName(menuObject), item) | 
					
						
							| 
									
										
										
										
											2012-04-02 15:26:14 +02:00
										 |  |  |     waitFor("itemObject.enabled", 2000) | 
					
						
							| 
									
										
										
										
											2011-12-05 18:37:53 +01:00
										 |  |  |     activateItem(itemObject) | 
					
						
							| 
									
										
										
										
											2013-07-30 09:32:22 +02:00
										 |  |  |     for subItem in subItems: | 
					
						
							| 
									
										
										
										
											2012-02-24 15:21:42 +01:00
										 |  |  |         sub = itemObject.menu() | 
					
						
							|  |  |  |         waitFor("sub.visible", 1000) | 
					
						
							| 
									
										
										
										
											2013-07-30 09:32:22 +02:00
										 |  |  |         itemObject = waitForObjectItem(sub, subItem) | 
					
						
							|  |  |  |         activateItem(itemObject) | 
					
						
							| 
									
										
										
										
											2011-10-06 20:16:15 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | def logApplicationOutput(): | 
					
						
							|  |  |  |     # make sure application output is shown | 
					
						
							| 
									
										
										
										
											2012-09-05 16:49:35 +02:00
										 |  |  |     ensureChecked(":Qt Creator_AppOutput_Core::Internal::OutputPaneToggleButton") | 
					
						
							| 
									
										
										
										
											2012-04-02 15:26:14 +02:00
										 |  |  |     try: | 
					
						
							| 
									
										
										
										
											2012-11-02 19:34:38 +01:00
										 |  |  |         output = waitForObject("{type='Core::OutputWindow' visible='1' windowTitle='Application Output Window'}") | 
					
						
							| 
									
										
										
										
											2012-04-02 15:26:14 +02:00
										 |  |  |         test.log("Application Output:\n%s" % output.plainText) | 
					
						
							| 
									
										
										
										
											2012-05-10 12:46:43 +02:00
										 |  |  |         return str(output.plainText) | 
					
						
							| 
									
										
										
										
											2012-04-02 15:26:14 +02:00
										 |  |  |     except: | 
					
						
							|  |  |  |         test.fail("Could not find any Application Output - did the project run?") | 
					
						
							| 
									
										
										
										
											2012-05-10 12:46:43 +02:00
										 |  |  |         return None | 
					
						
							| 
									
										
										
										
											2011-11-09 16:40:35 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | # get the output from a given cmdline call | 
					
						
							|  |  |  | def getOutputFromCmdline(cmdline): | 
					
						
							|  |  |  |     versCall = subprocess.Popen(cmdline, stdout=subprocess.PIPE, shell=True) | 
					
						
							|  |  |  |     result = versCall.communicate()[0] | 
					
						
							|  |  |  |     versCall.stdout.close() | 
					
						
							|  |  |  |     return result | 
					
						
							| 
									
										
										
										
											2011-12-19 11:18:24 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-28 17:15:04 +01:00
										 |  |  | def selectFromFileDialog(fileName, waitForFile=False): | 
					
						
							| 
									
										
										
										
											2012-01-11 17:04:20 +01:00
										 |  |  |     if platform.system() == "Darwin": | 
					
						
							|  |  |  |         snooze(1) | 
					
						
							|  |  |  |         nativeType("<Command+Shift+g>") | 
					
						
							|  |  |  |         snooze(1) | 
					
						
							|  |  |  |         nativeType(fileName) | 
					
						
							|  |  |  |         snooze(1) | 
					
						
							|  |  |  |         nativeType("<Return>") | 
					
						
							| 
									
										
										
										
											2013-03-28 14:20:15 +01:00
										 |  |  |         snooze(3) | 
					
						
							| 
									
										
										
										
											2012-01-11 17:04:20 +01:00
										 |  |  |         nativeType("<Return>") | 
					
						
							| 
									
										
										
										
											2012-09-25 13:32:12 +02:00
										 |  |  |         snooze(1) | 
					
						
							| 
									
										
										
										
											2012-01-11 17:04:20 +01:00
										 |  |  |     else: | 
					
						
							| 
									
										
										
										
											2012-02-03 16:15:36 +01:00
										 |  |  |         fName = os.path.basename(os.path.abspath(fileName)) | 
					
						
							| 
									
										
										
										
											2012-02-06 11:23:21 +01:00
										 |  |  |         pName = os.path.dirname(os.path.abspath(fileName)) + os.sep | 
					
						
							| 
									
										
										
										
											2014-08-12 16:14:53 +02:00
										 |  |  |         try: | 
					
						
							|  |  |  |             waitForObject("{name='QFileDialog' type='QFileDialog' visible='1'}", 5000) | 
					
						
							|  |  |  |             pathLine = waitForObject("{name='fileNameEdit' type='QLineEdit' visible='1'}") | 
					
						
							|  |  |  |             snooze(1) | 
					
						
							|  |  |  |             replaceEditorContent(pathLine, pName) | 
					
						
							|  |  |  |             clickButton(waitForObject("{text='Open' type='QPushButton'}")) | 
					
						
							|  |  |  |             waitFor("str(pathLine.text)==''") | 
					
						
							|  |  |  |             snooze(1) | 
					
						
							|  |  |  |             replaceEditorContent(pathLine, fName) | 
					
						
							|  |  |  |             clickButton(waitForObject("{text='Open' type='QPushButton'}")) | 
					
						
							|  |  |  |         except: | 
					
						
							| 
									
										
										
										
											2014-08-13 15:29:45 +02:00
										 |  |  |             nativeType("<Ctrl+a>") | 
					
						
							|  |  |  |             nativeType("<Delete>") | 
					
						
							| 
									
										
										
										
											2014-08-12 16:14:53 +02:00
										 |  |  |             nativeType(pName + fName) | 
					
						
							|  |  |  |             snooze(1) | 
					
						
							|  |  |  |             nativeType("<Return>") | 
					
						
							|  |  |  |             snooze(3) | 
					
						
							| 
									
										
										
										
											2013-02-28 17:15:04 +01:00
										 |  |  |     if waitForFile: | 
					
						
							|  |  |  |         fileCombo = waitForObject(":Qt Creator_FilenameQComboBox") | 
					
						
							| 
									
										
										
										
											2013-03-01 11:42:39 +01:00
										 |  |  |         if not waitFor("str(fileCombo.currentText) in fileName", 5000): | 
					
						
							|  |  |  |             test.fail("%s could not be opened in time." % fileName) | 
					
						
							| 
									
										
										
										
											2012-01-11 17:04:20 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-18 10:27:42 +02:00
										 |  |  | # add Qt documentations from given paths | 
					
						
							|  |  |  | # param which a list/tuple of the paths to the qch files to be added | 
					
						
							|  |  |  | def addHelpDocumentation(which): | 
					
						
							| 
									
										
										
										
											2011-12-19 11:18:24 +01:00
										 |  |  |     global sdkPath | 
					
						
							|  |  |  |     invokeMenuItem("Tools", "Options...") | 
					
						
							|  |  |  |     waitForObjectItem(":Options_QListView", "Help") | 
					
						
							|  |  |  |     clickItem(":Options_QListView", "Help", 14, 15, 0, Qt.LeftButton) | 
					
						
							|  |  |  |     waitForObject("{container=':Options.qt_tabwidget_tabbar_QTabBar' type='TabItem' text='Documentation'}") | 
					
						
							| 
									
										
										
										
											2013-05-22 09:41:37 +02:00
										 |  |  |     clickOnTab(":Options.qt_tabwidget_tabbar_QTabBar", "Documentation") | 
					
						
							| 
									
										
										
										
											2011-12-19 11:18:24 +01:00
										 |  |  |     # get rid of all docs already registered | 
					
						
							|  |  |  |     listWidget = waitForObject("{type='QListWidget' name='docsListWidget' visible='1'}") | 
					
						
							| 
									
										
										
										
											2013-03-28 15:53:35 +01:00
										 |  |  |     if listWidget.count > 0: | 
					
						
							| 
									
										
										
										
											2011-12-19 11:18:24 +01:00
										 |  |  |         rect = listWidget.visualItemRect(listWidget.item(0)) | 
					
						
							|  |  |  |         mouseClick(listWidget, rect.x+5, rect.y+5, 0, Qt.LeftButton) | 
					
						
							| 
									
										
										
										
											2014-08-18 14:37:17 +02:00
										 |  |  |         type(listWidget, "<Ctrl+a>") | 
					
						
							| 
									
										
										
										
											2011-12-19 11:18:24 +01:00
										 |  |  |         mouseClick(waitForObject("{type='QPushButton' name='removeButton' visible='1'}"), 5, 5, 0, Qt.LeftButton) | 
					
						
							| 
									
										
										
										
											2013-06-18 10:27:42 +02:00
										 |  |  |     for qch in which: | 
					
						
							|  |  |  |         clickButton(waitForObject("{type='QPushButton' name='addButton' visible='1' text='Add...'}")) | 
					
						
							|  |  |  |         selectFromFileDialog(qch) | 
					
						
							| 
									
										
										
										
											2011-12-19 11:18:24 +01:00
										 |  |  |     clickButton(waitForObject(":Options.OK_QPushButton")) | 
					
						
							| 
									
										
										
										
											2012-01-31 15:49:59 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-17 17:04:27 +02:00
										 |  |  | def addCurrentCreatorDocumentation(): | 
					
						
							|  |  |  |     currentCreatorPath = currentApplicationContext().cwd | 
					
						
							|  |  |  |     if platform.system() == "Darwin": | 
					
						
							|  |  |  |         docPath = os.path.abspath(os.path.join(currentCreatorPath, "Qt Creator.app", "Contents", | 
					
						
							|  |  |  |                                                "Resources", "doc", "qtcreator.qch")) | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         docPath = os.path.abspath(os.path.join(currentCreatorPath, "..", "share", "doc", | 
					
						
							|  |  |  |                                                "qtcreator", "qtcreator.qch")) | 
					
						
							|  |  |  |     if not os.path.exists(docPath): | 
					
						
							|  |  |  |         test.fatal("Missing current Qt Creator documentation (expected in %s)" % docPath) | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  |     invokeMenuItem("Tools", "Options...") | 
					
						
							|  |  |  |     waitForObjectItem(":Options_QListView", "Help") | 
					
						
							|  |  |  |     clickItem(":Options_QListView", "Help", 14, 15, 0, Qt.LeftButton) | 
					
						
							|  |  |  |     waitForObject("{container=':Options.qt_tabwidget_tabbar_QTabBar' type='TabItem' text='Documentation'}") | 
					
						
							|  |  |  |     clickOnTab(":Options.qt_tabwidget_tabbar_QTabBar", "Documentation") | 
					
						
							|  |  |  |     clickButton(waitForObject("{type='QPushButton' name='addButton' visible='1' text='Add...'}")) | 
					
						
							|  |  |  |     selectFromFileDialog(docPath) | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         waitForObject("{type='QMessageBox' unnamed='1' visible='1' " | 
					
						
							|  |  |  |                       "text?='Unable to register documentation.*'}", 3000) | 
					
						
							|  |  |  |         test.passes("Qt Creator's documentation found already registered.") | 
					
						
							|  |  |  |         clickButton(waitForObject("{type='QPushButton' text='OK' unnamed='1' visible='1' " | 
					
						
							|  |  |  |                                   "container={name='groupBox' type='QGroupBox' visible='1'}}")) | 
					
						
							|  |  |  |     except: | 
					
						
							|  |  |  |         test.fail("Added Qt Creator's documentation explicitly.") | 
					
						
							|  |  |  |     clickButton(waitForObject(":Options.OK_QPushButton")) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-01-31 15:49:59 +01:00
										 |  |  | def verifyOutput(string, substring, outputFrom, outputIn): | 
					
						
							|  |  |  |     index = string.find(substring) | 
					
						
							|  |  |  |     if (index == -1): | 
					
						
							|  |  |  |         test.fail("Output from " + outputFrom + " could not be found in " + outputIn) | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         test.passes("Output from " + outputFrom + " found at position " + str(index) + " of " + outputIn) | 
					
						
							| 
									
										
										
										
											2012-02-07 14:25:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-04 00:12:11 +01:00
										 |  |  | # function that verifies the existence and the read permissions | 
					
						
							| 
									
										
										
										
											2012-02-07 14:25:14 +01:00
										 |  |  | # of the given file path | 
					
						
							|  |  |  | # if the executing user hasn't the read permission it checks | 
					
						
							|  |  |  | # the parent folders for their execute permission | 
					
						
							|  |  |  | def checkAccess(pathToFile): | 
					
						
							|  |  |  |     if os.path.exists(pathToFile): | 
					
						
							|  |  |  |         test.log("Path '%s' exists" % pathToFile) | 
					
						
							|  |  |  |         if os.access(pathToFile, os.R_OK): | 
					
						
							|  |  |  |             test.log("Got read access on '%s'" % pathToFile) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             test.fail("No read permission on '%s'" % pathToFile) | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         test.fatal("Path '%s' does not exist or cannot be accessed" % pathToFile) | 
					
						
							|  |  |  |         __checkParentAccess__(pathToFile) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # helper function for checking the execute rights of all | 
					
						
							|  |  |  | # parents of filePath | 
					
						
							|  |  |  | def __checkParentAccess__(filePath): | 
					
						
							|  |  |  |     for i in range(1, filePath.count(os.sep)): | 
					
						
							|  |  |  |         tmp = filePath.rsplit(os.sep, i)[0] | 
					
						
							|  |  |  |         if os.access(tmp, os.X_OK): | 
					
						
							|  |  |  |             test.log("Got execute permission on '%s'" % tmp) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             test.fail("No execute permission on '%s'" % tmp) | 
					
						
							| 
									
										
										
										
											2012-02-17 17:10:53 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | # this function checks for all configured Qt versions inside | 
					
						
							| 
									
										
										
										
											2012-09-04 16:59:27 +02:00
										 |  |  | # options dialog and returns a dict holding the kits as keys | 
					
						
							|  |  |  | # and a list of information of its configured Qt | 
					
						
							| 
									
										
										
										
											2013-10-24 12:06:42 +02:00
										 |  |  | def getConfiguredKits(): | 
					
						
							| 
									
										
										
										
											2012-08-22 12:39:37 +02:00
										 |  |  |     def __retrieveQtVersionName__(target, version): | 
					
						
							|  |  |  |         treeWidget = waitForObject(":QtSupport__Internal__QtVersionManager.qtdirList_QTreeWidget") | 
					
						
							|  |  |  |         return treeWidget.currentItem().text(0) | 
					
						
							| 
									
										
										
										
											2012-10-02 11:46:44 +02:00
										 |  |  |     # end of internal function for iterateQtVersions | 
					
						
							|  |  |  |     def __setQtVersionForKit__(kit, kitName, kitsQtVersionName): | 
					
						
							| 
									
										
										
										
											2013-12-17 13:52:28 +01:00
										 |  |  |         treeView = waitForObject(":BuildAndRun_QTreeView") | 
					
						
							| 
									
										
										
										
											2012-10-02 11:46:44 +02:00
										 |  |  |         clickItem(treeView, kit, 5, 5, 0, Qt.LeftButton) | 
					
						
							|  |  |  |         qtVersionStr = str(waitForObject(":Kits_QtVersion_QComboBox").currentText) | 
					
						
							|  |  |  |         kitsQtVersionName[kitName] = qtVersionStr | 
					
						
							|  |  |  |     # end of internal function for iterate kits | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     kitsWithQtVersionName = {} | 
					
						
							| 
									
										
										
										
											2012-02-17 17:10:53 +01:00
										 |  |  |     result = {} | 
					
						
							| 
									
										
										
										
											2012-10-02 11:46:44 +02:00
										 |  |  |     # collect kits and their Qt versions | 
					
						
							|  |  |  |     targetsQtVersions, qtVersionNames = iterateQtVersions(True, False, __retrieveQtVersionName__) | 
					
						
							|  |  |  |     # update collected Qt versions with their configured device and version | 
					
						
							|  |  |  |     iterateKits(True, True, __setQtVersionForKit__, kitsWithQtVersionName) | 
					
						
							| 
									
										
										
										
											2012-08-22 12:39:37 +02:00
										 |  |  |     # merge defined target names with their configured Qt versions and devices | 
					
						
							| 
									
										
										
										
											2013-03-15 12:59:44 +01:00
										 |  |  |     for kit, qtVersion in kitsWithQtVersionName.iteritems(): | 
					
						
							| 
									
										
										
										
											2015-06-25 16:06:48 +02:00
										 |  |  |         if kit in ('Fremantle', 'Harmattan', 'Qt Simulator'): | 
					
						
							| 
									
										
										
										
											2015-05-29 17:26:13 +02:00
										 |  |  |             test.verify(qtVersion == 'None', | 
					
						
							|  |  |  |                         "The outdated kit '%s' should not have a Qt version" % kit) | 
					
						
							| 
									
										
										
										
											2013-02-07 15:42:15 +01:00
										 |  |  |         elif qtVersion in qtVersionNames: | 
					
						
							| 
									
										
										
										
											2012-09-07 15:59:15 +02:00
										 |  |  |             result[kit] = targetsQtVersions[qtVersionNames.index(qtVersion)].items()[0] | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             test.fail("Qt version '%s' for kit '%s' can't be found in qtVersionNames." | 
					
						
							|  |  |  |                       % (qtVersion, kit)) | 
					
						
							| 
									
										
										
										
											2012-08-22 12:39:37 +02:00
										 |  |  |     clickButton(waitForObject(":Options.Cancel_QPushButton")) | 
					
						
							| 
									
										
										
										
											2012-09-04 16:59:27 +02:00
										 |  |  |     test.log("Configured kits: %s" % str(result)) | 
					
						
							| 
									
										
										
										
											2012-04-02 17:20:22 +02:00
										 |  |  |     return result | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def visibleCheckBoxExists(text): | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         findObject("{type='QCheckBox' text='%s' visible='1'}" % text) | 
					
						
							|  |  |  |         return True | 
					
						
							|  |  |  |     except: | 
					
						
							|  |  |  |         return False | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # this function verifies if the text matches the given | 
					
						
							|  |  |  | # regex inside expectedTexts | 
					
						
							|  |  |  | # param text must be a single str/unicode | 
					
						
							|  |  |  | # param expectedTexts can be str/unicode/list/tuple | 
					
						
							|  |  |  | def regexVerify(text, expectedTexts): | 
					
						
							|  |  |  |     if isinstance(expectedTexts, (str,unicode)): | 
					
						
							|  |  |  |         expectedTexts = [expectedTexts] | 
					
						
							|  |  |  |     for curr in expectedTexts: | 
					
						
							|  |  |  |         pattern = re.compile(curr) | 
					
						
							|  |  |  |         if pattern.match(text): | 
					
						
							|  |  |  |             return True | 
					
						
							|  |  |  |     return False | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # function that opens Options Dialog and parses the configured Qt versions | 
					
						
							|  |  |  | # param keepOptionsOpen set to True if the Options dialog should stay open when | 
					
						
							|  |  |  | #       leaving this function | 
					
						
							| 
									
										
										
										
											2012-10-02 11:46:44 +02:00
										 |  |  | # param alreadyOnOptionsDialog set to True if you already have opened the Options Dialog | 
					
						
							|  |  |  | #       (if False this function will open it via the MenuBar -> Tools -> Options...) | 
					
						
							| 
									
										
										
										
											2012-04-02 17:20:22 +02:00
										 |  |  | # param additionalFunction pass a function or name of a defined function to execute | 
					
						
							| 
									
										
										
										
											2012-05-03 11:47:35 +02:00
										 |  |  | #       for each correctly configured item on the list of Qt versions | 
					
						
							|  |  |  | #       (Qt versions having no assigned toolchain, failing qmake,... will be skipped) | 
					
						
							| 
									
										
										
										
											2012-04-02 17:20:22 +02:00
										 |  |  | #       this function must take at least 2 parameters - the first is the target name | 
					
						
							|  |  |  | #       and the second the version of the current selected Qt version item | 
					
						
							|  |  |  | # param argsForAdditionalFunc you can specify as much parameters as you want to pass | 
					
						
							|  |  |  | #       to additionalFunction from the outside | 
					
						
							|  |  |  | # the function returns a list of dict holding target-version mappings if used without | 
					
						
							|  |  |  | # additionalFunction | 
					
						
							|  |  |  | # WATCH OUT! if you're using the additionalFunction parameter - this function will | 
					
						
							|  |  |  | # return the list mentioned above as well as the returned value(s) from | 
					
						
							|  |  |  | # additionalFunction. You MUST call this function like | 
					
						
							|  |  |  | # result, additionalResult = _iterateQtVersions(...) | 
					
						
							|  |  |  | # where additionalResult is the result of all executions of additionalFunction which | 
					
						
							|  |  |  | # means it is a list of results. | 
					
						
							| 
									
										
										
										
											2012-10-02 11:46:44 +02:00
										 |  |  | def iterateQtVersions(keepOptionsOpen=False, alreadyOnOptionsDialog=False, | 
					
						
							|  |  |  |                       additionalFunction=None, *argsForAdditionalFunc): | 
					
						
							| 
									
										
										
										
											2012-04-02 17:20:22 +02:00
										 |  |  |     result = [] | 
					
						
							|  |  |  |     additionalResult = [] | 
					
						
							| 
									
										
										
										
											2012-10-02 11:46:44 +02:00
										 |  |  |     if not alreadyOnOptionsDialog: | 
					
						
							|  |  |  |         invokeMenuItem("Tools", "Options...") | 
					
						
							| 
									
										
										
										
											2012-02-17 17:10:53 +01:00
										 |  |  |     waitForObjectItem(":Options_QListView", "Build & Run") | 
					
						
							|  |  |  |     clickItem(":Options_QListView", "Build & Run", 14, 15, 0, Qt.LeftButton) | 
					
						
							| 
									
										
										
										
											2013-05-22 09:41:37 +02:00
										 |  |  |     clickOnTab(":Options.qt_tabwidget_tabbar_QTabBar", "Qt Versions") | 
					
						
							| 
									
										
										
										
											2012-02-17 17:10:53 +01:00
										 |  |  |     pattern = re.compile("Qt version (?P<version>.*?) for (?P<target>.*)") | 
					
						
							|  |  |  |     treeWidget = waitForObject(":QtSupport__Internal__QtVersionManager.qtdirList_QTreeWidget") | 
					
						
							|  |  |  |     root = treeWidget.invisibleRootItem() | 
					
						
							| 
									
										
										
										
											2012-10-25 12:59:03 +02:00
										 |  |  |     for rootChild in dumpChildren(root): | 
					
						
							| 
									
										
										
										
											2013-03-26 17:42:54 +01:00
										 |  |  |         rootChildText = str(rootChild.text(0)).replace(".", "\\.").replace("_", "\\_") | 
					
						
							| 
									
										
										
										
											2012-10-25 12:59:03 +02:00
										 |  |  |         for subChild in dumpChildren(rootChild): | 
					
						
							| 
									
										
										
										
											2013-03-26 17:42:54 +01:00
										 |  |  |             subChildText = str(subChild.text(0)).replace(".", "\\.").replace("_", "\\_") | 
					
						
							| 
									
										
										
										
											2012-02-17 17:10:53 +01:00
										 |  |  |             clickItem(treeWidget, ".".join([rootChildText,subChildText]), 5, 5, 0, Qt.LeftButton) | 
					
						
							|  |  |  |             currentText = str(waitForObject(":QtSupport__Internal__QtVersionManager.QLabel").text) | 
					
						
							|  |  |  |             matches = pattern.match(currentText) | 
					
						
							|  |  |  |             if matches: | 
					
						
							| 
									
										
										
										
											2012-02-23 09:44:16 +01:00
										 |  |  |                 target = matches.group("target").strip() | 
					
						
							|  |  |  |                 version = matches.group("version").strip() | 
					
						
							| 
									
										
										
										
											2012-04-02 17:20:22 +02:00
										 |  |  |                 result.append({target:version}) | 
					
						
							| 
									
										
										
										
											2012-05-03 11:47:35 +02:00
										 |  |  |                 if additionalFunction: | 
					
						
							|  |  |  |                     try: | 
					
						
							|  |  |  |                         if isinstance(additionalFunction, (str, unicode)): | 
					
						
							|  |  |  |                             currResult = globals()[additionalFunction](target, version, *argsForAdditionalFunc) | 
					
						
							|  |  |  |                         else: | 
					
						
							|  |  |  |                             currResult = additionalFunction(target, version, *argsForAdditionalFunc) | 
					
						
							|  |  |  |                     except: | 
					
						
							|  |  |  |                         import sys | 
					
						
							|  |  |  |                         t,v,tb = sys.exc_info() | 
					
						
							|  |  |  |                         currResult = None | 
					
						
							|  |  |  |                         test.fatal("Function to additionally execute on Options Dialog could not be found or " | 
					
						
							| 
									
										
										
										
											2014-03-04 00:12:11 +01:00
										 |  |  |                                    "an exception occurred while executing it.", "%s(%s)" % (str(t), str(v))) | 
					
						
							| 
									
										
										
										
											2012-05-03 11:47:35 +02:00
										 |  |  |                     additionalResult.append(currResult) | 
					
						
							| 
									
										
										
										
											2012-04-02 17:20:22 +02:00
										 |  |  |     if not keepOptionsOpen: | 
					
						
							| 
									
										
										
										
											2012-10-02 11:46:44 +02:00
										 |  |  |         clickButton(waitForObject(":Options.Cancel_QPushButton")) | 
					
						
							|  |  |  |     if additionalFunction: | 
					
						
							|  |  |  |         return result, additionalResult | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         return result | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # function that opens Options Dialog (if necessary) and parses the configured Kits | 
					
						
							|  |  |  | # param keepOptionsOpen set to True if the Options dialog should stay open when | 
					
						
							|  |  |  | #       leaving this function | 
					
						
							|  |  |  | # param alreadyOnOptionsDialog set to True if you already have opened the Options Dialog | 
					
						
							|  |  |  | #       (if False this functions will open it via the MenuBar -> Tools -> Options...) | 
					
						
							|  |  |  | # param additionalFunction pass a function or name of a defined function to execute | 
					
						
							|  |  |  | #       for each configured item on the list of Kits | 
					
						
							|  |  |  | #       this function must take at least 2 parameters - the first is the item (QModelIndex) | 
					
						
							|  |  |  | #       of the current Kit (if you need to click on it) and the second the Kit name itself | 
					
						
							|  |  |  | # param argsForAdditionalFunc you can specify as much parameters as you want to pass | 
					
						
							|  |  |  | #       to additionalFunction from the outside | 
					
						
							|  |  |  | # the function returns a list of Kit names if used without an additional function | 
					
						
							|  |  |  | # WATCH OUT! if you're using the additionalFunction parameter - this function will | 
					
						
							|  |  |  | # return the list mentioned above as well as the returned value(s) from | 
					
						
							|  |  |  | # additionalFunction. You MUST call this function like | 
					
						
							|  |  |  | # result, additionalResult = _iterateQtVersions(...) | 
					
						
							|  |  |  | # where additionalResult is the result of all executions of additionalFunction which | 
					
						
							|  |  |  | # means it is a list of results. | 
					
						
							|  |  |  | def iterateKits(keepOptionsOpen=False, alreadyOnOptionsDialog=False, | 
					
						
							|  |  |  |                 additionalFunction=None, *argsForAdditionalFunc): | 
					
						
							|  |  |  |     result = [] | 
					
						
							|  |  |  |     additionalResult = [] | 
					
						
							|  |  |  |     if not alreadyOnOptionsDialog: | 
					
						
							|  |  |  |         invokeMenuItem("Tools", "Options...") | 
					
						
							|  |  |  |     waitForObjectItem(":Options_QListView", "Build & Run") | 
					
						
							|  |  |  |     clickItem(":Options_QListView", "Build & Run", 14, 15, 0, Qt.LeftButton) | 
					
						
							| 
									
										
										
										
											2013-05-22 09:41:37 +02:00
										 |  |  |     clickOnTab(":Options.qt_tabwidget_tabbar_QTabBar", "Kits") | 
					
						
							| 
									
										
										
										
											2013-12-17 13:52:28 +01:00
										 |  |  |     treeView = waitForObject(":BuildAndRun_QTreeView") | 
					
						
							| 
									
										
										
										
											2012-10-02 11:46:44 +02:00
										 |  |  |     model = treeView.model() | 
					
						
							|  |  |  |     test.compare(model.rowCount(), 2, "Verifying expected target section count") | 
					
						
							|  |  |  |     autoDetected = model.index(0, 0) | 
					
						
							|  |  |  |     test.compare(autoDetected.data().toString(), "Auto-detected", | 
					
						
							|  |  |  |                  "Verifying label for target section") | 
					
						
							|  |  |  |     manual = model.index(1, 0) | 
					
						
							|  |  |  |     test.compare(manual.data().toString(), "Manual", "Verifying label for target section") | 
					
						
							|  |  |  |     for section in [autoDetected, manual]: | 
					
						
							| 
									
										
										
										
											2012-10-25 12:59:03 +02:00
										 |  |  |         for currentItem in dumpItems(model, section): | 
					
						
							|  |  |  |             kitName = currentItem | 
					
						
							| 
									
										
										
										
											2012-10-02 11:46:44 +02:00
										 |  |  |             if (kitName.endswith(" (default)")): | 
					
						
							|  |  |  |                 kitName = kitName.rsplit(" (default)", 1)[0] | 
					
						
							|  |  |  |             result.append(kitName) | 
					
						
							|  |  |  |             item = ".".join([str(section.data().toString()), | 
					
						
							| 
									
										
										
										
											2012-10-25 12:59:03 +02:00
										 |  |  |                              currentItem.replace(".", "\\.")]) | 
					
						
							| 
									
										
										
										
											2012-10-02 11:46:44 +02:00
										 |  |  |             if additionalFunction: | 
					
						
							|  |  |  |                 try: | 
					
						
							|  |  |  |                     if isinstance(additionalFunction, (str, unicode)): | 
					
						
							|  |  |  |                         currResult = globals()[additionalFunction](item, kitName, *argsForAdditionalFunc) | 
					
						
							|  |  |  |                     else: | 
					
						
							|  |  |  |                         currResult = additionalFunction(item, kitName, *argsForAdditionalFunc) | 
					
						
							|  |  |  |                 except: | 
					
						
							|  |  |  |                     import sys | 
					
						
							|  |  |  |                     t,v,tb = sys.exc_info() | 
					
						
							|  |  |  |                     currResult = None | 
					
						
							|  |  |  |                     test.fatal("Function to additionally execute on Options Dialog could not be " | 
					
						
							| 
									
										
										
										
											2014-03-04 00:12:11 +01:00
										 |  |  |                                "found or an exception occurred while executing it.", "%s(%s)" % | 
					
						
							| 
									
										
										
										
											2012-10-02 11:46:44 +02:00
										 |  |  |                                (str(t), str(v))) | 
					
						
							|  |  |  |                 additionalResult.append(currResult) | 
					
						
							|  |  |  |     if not keepOptionsOpen: | 
					
						
							| 
									
										
										
										
											2012-04-02 17:20:22 +02:00
										 |  |  |         clickButton(waitForObject(":Options.Cancel_QPushButton")) | 
					
						
							|  |  |  |     if additionalFunction: | 
					
						
							|  |  |  |         return result, additionalResult | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         return result | 
					
						
							| 
									
										
										
										
											2012-09-18 12:48:40 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | # set "Always Start Full Help" in "Tools" -> "Options..." -> "Help" -> "General" | 
					
						
							|  |  |  | def setAlwaysStartFullHelp(): | 
					
						
							|  |  |  |     invokeMenuItem("Tools", "Options...") | 
					
						
							|  |  |  |     waitForObjectItem(":Options_QListView", "Help") | 
					
						
							|  |  |  |     clickItem(":Options_QListView", "Help", 5, 5, 0, Qt.LeftButton) | 
					
						
							| 
									
										
										
										
											2013-05-22 09:41:37 +02:00
										 |  |  |     clickOnTab(":Options.qt_tabwidget_tabbar_QTabBar", "General") | 
					
						
							| 
									
										
										
										
											2014-07-22 16:33:43 +02:00
										 |  |  |     selectFromCombo(":Startup.contextHelpComboBox_QComboBox", "Always Show in Help Mode") | 
					
						
							| 
									
										
										
										
											2012-09-18 12:48:40 +02:00
										 |  |  |     clickButton(waitForObject(":Options.OK_QPushButton")) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def removePackagingDirectory(projectPath): | 
					
						
							|  |  |  |     qtcPackaging = os.path.join(projectPath, "qtc_packaging") | 
					
						
							|  |  |  |     if os.path.exists(qtcPackaging): | 
					
						
							|  |  |  |         test.log("Removing old packaging directory '%s'" % qtcPackaging) | 
					
						
							|  |  |  |         deleteDirIfExists(qtcPackaging) | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         test.log("Couldn't remove packaging directory '%s' - did not exist." % qtcPackaging) | 
					
						
							| 
									
										
										
										
											2012-10-25 12:59:03 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | # returns the indices from a QAbstractItemModel | 
					
						
							|  |  |  | def dumpIndices(model, parent=None, column=0): | 
					
						
							|  |  |  |     if parent: | 
					
						
							|  |  |  |         return [model.index(row, column, parent) for row in range(model.rowCount(parent))] | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         return [model.index(row, column) for row in range(model.rowCount())] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | DisplayRole = 0 | 
					
						
							|  |  |  | # returns the data from a QAbstractItemModel as strings | 
					
						
							|  |  |  | def dumpItems(model, parent=None, role=DisplayRole, column=0): | 
					
						
							|  |  |  |     return [str(index.data(role)) for index in dumpIndices(model, parent, column)] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # returns the children of a QTreeWidgetItem | 
					
						
							|  |  |  | def dumpChildren(item): | 
					
						
							|  |  |  |     return [item.child(index) for index in range(item.childCount())] | 
					
						
							| 
									
										
										
										
											2013-03-04 11:02:55 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | def writeTestResults(folder): | 
					
						
							|  |  |  |     if not os.path.exists(folder): | 
					
						
							|  |  |  |         print "Skipping writing test results (folder '%s' does not exist)." % folder | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  |     resultFile = open("%s.srf" % os.path.join(folder, os.path.basename(squishinfo.testCase)), "w") | 
					
						
							|  |  |  |     resultFile.write("suite:%s\n" % os.path.basename(os.path.dirname(squishinfo.testCase))) | 
					
						
							|  |  |  |     categories = ["passes", "fails", "fatals", "errors", "tests", "warnings", "xfails", "xpasses"] | 
					
						
							|  |  |  |     for cat in categories: | 
					
						
							|  |  |  |         resultFile.write("%s:%d\n" % (cat, test.resultCount(cat))) | 
					
						
							|  |  |  |     resultFile.close() | 
					
						
							| 
									
										
										
										
											2013-04-05 13:35:13 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | # wait and verify if object exists/not exists | 
					
						
							|  |  |  | def checkIfObjectExists(name, shouldExist = True, timeout = 3000, verboseOnFail = False): | 
					
						
							|  |  |  |     result = waitFor("object.exists(name) == shouldExist", timeout) | 
					
						
							|  |  |  |     if verboseOnFail and not result: | 
					
						
							|  |  |  |         test.log("checkIfObjectExists() failed for '%s'" % name) | 
					
						
							|  |  |  |     return result | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # wait for progress bar(s) to appear and disappear | 
					
						
							| 
									
										
										
										
											2013-07-08 12:24:22 +02:00
										 |  |  | def progressBarWait(timeout=60000, warn=True): | 
					
						
							| 
									
										
										
										
											2013-06-20 13:57:47 +02:00
										 |  |  |     if not checkIfObjectExists(":Qt Creator_Core::Internal::ProgressBar", True, 6000): | 
					
						
							| 
									
										
										
										
											2013-07-08 12:24:22 +02:00
										 |  |  |         if warn: | 
					
						
							|  |  |  |             test.warning("progressBarWait() timed out when waiting for ProgressBar.", | 
					
						
							|  |  |  |                          "This may lead to unforeseen behavior. Consider increasing the timeout.") | 
					
						
							| 
									
										
										
										
											2013-04-25 18:57:02 +02:00
										 |  |  |     checkIfObjectExists(":Qt Creator_Core::Internal::ProgressBar", False, timeout) | 
					
						
							| 
									
										
										
										
											2013-04-25 16:04:36 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | def readFile(filename): | 
					
						
							|  |  |  |     f = open(filename, "r") | 
					
						
							|  |  |  |     content = f.read() | 
					
						
							|  |  |  |     f.close() | 
					
						
							|  |  |  |     return content | 
					
						
							| 
									
										
										
										
											2013-05-22 17:19:25 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | def simpleFileName(navigatorFileName): | 
					
						
							| 
									
										
										
										
											2014-06-04 09:44:20 +02:00
										 |  |  |     # try to find the last part of the given name, assume it's inside a (folder) structure | 
					
						
							|  |  |  |     search = re.search(".*[^\\\\]\.(.*)$", navigatorFileName) | 
					
						
							|  |  |  |     if search: | 
					
						
							|  |  |  |         return search.group(1).replace("\\", "") | 
					
						
							|  |  |  |     # it's just the filename | 
					
						
							|  |  |  |     return navigatorFileName.replace("\\", "") | 
					
						
							| 
									
										
										
										
											2013-05-22 09:41:37 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | def clickOnTab(tabBarStr, tabText, timeout=5000): | 
					
						
							| 
									
										
										
										
											2014-03-20 11:09:41 +01:00
										 |  |  |     if not waitFor("object.exists(tabBarStr)", timeout): | 
					
						
							|  |  |  |         raise LookupError("Could not find QTabBar: %s" % objectMap.realName(tabBarStr)) | 
					
						
							|  |  |  |     tabBar = findObject(tabBarStr) | 
					
						
							|  |  |  |     if platform.system() == 'Darwin' and not tabBar.visible: | 
					
						
							|  |  |  |         test.log("Using workaround for Mac.") | 
					
						
							|  |  |  |         setWindowState(tabBar, WindowState.Normal) | 
					
						
							|  |  |  |     clickTab(tabBar, tabText) | 
					
						
							|  |  |  |     waitFor("str(tabBar.tabText(tabBar.currentIndex)) == '%s'" % tabText, timeout) | 
					
						
							| 
									
										
										
										
											2013-05-02 15:21:05 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | # 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)) | 
					
						
							| 
									
										
										
										
											2013-12-13 15:59:06 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | def verifyItemOrder(items, text): | 
					
						
							|  |  |  |     text = str(text) | 
					
						
							|  |  |  |     lastIndex = 0 | 
					
						
							|  |  |  |     for item in items: | 
					
						
							|  |  |  |         index = text.find(item) | 
					
						
							|  |  |  |         test.verify(index > lastIndex, "'" + item + "' found at index " + str(index)) | 
					
						
							|  |  |  |         lastIndex = index | 
					
						
							| 
									
										
										
										
											2014-03-13 15:05:35 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | def openVcsLog(): | 
					
						
							| 
									
										
										
										
											2014-04-17 13:26:27 +02:00
										 |  |  |     try: | 
					
						
							|  |  |  |         foundObj = waitForObject("{type='QPlainTextEdit' unnamed='1' visible='1' " | 
					
						
							|  |  |  |                                  "window=':Qt Creator_Core::Internal::MainWindow'}", 2000) | 
					
						
							|  |  |  |         if className(foundObj) != 'QPlainTextEdit': | 
					
						
							|  |  |  |             raise Exception("Found derived class, but not a pure QPlainTextEdit.") | 
					
						
							|  |  |  |     except: | 
					
						
							|  |  |  |         invokeMenuItem("Window", "Output Panes", "Version Control") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def openGeneralMessages(): | 
					
						
							|  |  |  |     if not object.exists(":Qt Creator_Core::OutputWindow"): | 
					
						
							|  |  |  |         invokeMenuItem("Window", "Output Panes", "General Messages") | 
					
						
							| 
									
										
										
										
											2014-03-19 09:16:53 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | # function that retrieves a specific child object by its class | 
					
						
							|  |  |  | # this is sometimes the best way to avoid using waitForObject() on objects that | 
					
						
							|  |  |  | # occur more than once - but could easily be found by using a compound object | 
					
						
							|  |  |  | # (e.g. search for Utils::PathChooser instead of Utils::FancyLineEdit and get the child) | 
					
						
							|  |  |  | def getChildByClass(parent, classToSearchFor, occurrence=1): | 
					
						
							|  |  |  |     children = [child for child in object.children(parent) if className(child) == classToSearchFor] | 
					
						
							|  |  |  |     if len(children) < occurrence: | 
					
						
							|  |  |  |         return None | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         return children[occurrence - 1] | 
					
						
							| 
									
										
										
										
											2014-05-20 15:56:27 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | def getHelpViewer(): | 
					
						
							|  |  |  |     try: | 
					
						
							| 
									
										
										
										
											2014-07-02 12:52:15 +02:00
										 |  |  |         return waitForObject(":Qt Creator_Help::Internal::HelpViewer", 3000) | 
					
						
							| 
									
										
										
										
											2014-05-20 15:56:27 +02:00
										 |  |  |     except: | 
					
						
							|  |  |  |         return waitForObject("{type='Help::Internal::TextBrowserHelpWidget' unnamed='1' " | 
					
						
							|  |  |  |                              "visible='1' window=':Qt Creator_Core::Internal::MainWindow'}", 1000) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def getHelpTitle(): | 
					
						
							|  |  |  |     hv = getHelpViewer() | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         return str(hv.title) | 
					
						
							|  |  |  |     except: | 
					
						
							|  |  |  |         return str(hv.documentTitle) | 
					
						
							| 
									
										
										
										
											2014-07-22 16:33:43 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | def canTestEmbeddedQtQuick(): | 
					
						
							|  |  |  |     return (squishinfo.major * 0x10000 + squishinfo.minor * 0x100 | 
					
						
							|  |  |  |             + squishinfo.patch) > 0x050100 |