diff options
author | Christian Stenger <christian.stenger@digia.com> | 2014-05-05 15:19:32 +0200 |
---|---|---|
committer | Christian Stenger <christian.stenger@digia.com> | 2014-05-23 12:56:56 +0200 |
commit | f1fb669b5b73b3634985234824b049c71439d55d (patch) | |
tree | 6c09ef0d3ff4377dfd59fbeee9b7932384db8182 | |
parent | c229093b1d1c3ddbd5cbe612b1c844f4271d472d (diff) | |
download | qt-creator-f1fb669b5b73b3634985234824b049c71439d55d.tar.gz |
Squish: Add test for tasks handling
Change-Id: Ib45ac05c3aed4659e0777725e46a7a8c5dacc19e
Reviewed-by: Robert Loehning <robert.loehning@digia.com>
-rw-r--r-- | tests/system/suite_general/suite.conf | 2 | ||||
-rw-r--r-- | tests/system/suite_general/tst_tasks_handling/test.py | 155 |
2 files changed, 156 insertions, 1 deletions
diff --git a/tests/system/suite_general/suite.conf b/tests/system/suite_general/suite.conf index e5e8f93c06..21cd97a16a 100644 --- a/tests/system/suite_general/suite.conf +++ b/tests/system/suite_general/suite.conf @@ -7,6 +7,6 @@ HOOK_SUB_PROCESSES=false IMPLICITAUTSTART=0 LANGUAGE=Python OBJECTMAP=../objects.map -TEST_CASES=tst_build_speedcrunch tst_cmake_speedcrunch tst_create_proj_wizard tst_default_settings tst_installed_languages tst_openqt_creator tst_rename_file tst_save_before_build tst_session_handling +TEST_CASES=tst_build_speedcrunch tst_cmake_speedcrunch tst_create_proj_wizard tst_default_settings tst_installed_languages tst_openqt_creator tst_rename_file tst_save_before_build tst_session_handling tst_tasks_handling VERSION=2 WRAPPERS=Qt diff --git a/tests/system/suite_general/tst_tasks_handling/test.py b/tests/system/suite_general/tst_tasks_handling/test.py new file mode 100644 index 0000000000..aec3cf5087 --- /dev/null +++ b/tests/system/suite_general/tst_tasks_handling/test.py @@ -0,0 +1,155 @@ +############################################################################# +## +## Copyright (C) 2014 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 random +import string +source("../../shared/qtcreator.py") + +toolButton = ("{toolTip='%s' type='QToolButton' unnamed='1' visible='1' " + "window=':Qt Creator_Core::Internal::MainWindow'}") + +def generateRandomFilePath(isWin, isHeader): + # generate random (fake) file path + filePath = ''.join(random.choice(string.ascii_letters + string.digits + "/") + for _ in range(random.randint(3, 15))) + if not filePath.startswith("/"): + filePath = "/" + filePath + if isWin: + filePath = "C:" + filePath + if isHeader: + filePath += ".h" + else: + filePath += ".cpp" + return filePath + +def generateRandomTaskType(): + ranType = random.randint(1, 100) + if ranType <= 45: + return 0 + if ranType <= 90: + return 1 + return 2 + +def generateMockTasksFile(): + descriptions = ["", "dummy information", "unknown error", "not found", "syntax error", + "missing information", "unused"] + tasks = ["warn", "error", "other"] + isWin = platform.system() in ('Microsoft', 'Windows') + fileName = os.path.join(tempDir(), "dummy_taskfile.tasks") + tFile = open(fileName, "w") + tasksCount = [0, 0, 0] + for counter in range(1100): + fData = generateRandomFilePath(isWin, counter % 2 == 0) + lData = random.randint(-1, 10000) + tasksType = generateRandomTaskType() + tasksCount[tasksType] += 1 + tData = tasks[tasksType] + dData = descriptions[random.randint(0, 6)] + tFile.write("%s\t%d\t%s\t%s\n" % (fData, lData, tData, dData)) + tFile.close() + test.log("Wrote tasks file with %d warnings, %d errors and %d other tasks." % tuple(tasksCount)) + return fileName, tasksCount + +def checkOrUncheckMyTasks(): + filterButton = waitForObject(toolButton % 'Filter by categories') + clickButton(filterButton) + if platform.system() == 'Darwin': + waitFor("macHackActivateContextMenuItem('My Tasks')", 5000) + else: + activateItem(waitForObjectItem("{type='QMenu' unnamed='1' visible='1' " + "window=':Qt Creator_Core::Internal::MainWindow'}", + "My Tasks")) + +def getBuildIssuesTypeCounts(model): + issueTypes = map(lambda x: x.data(Qt.UserRole + 5).toInt(), dumpIndices(model)) + result = [issueTypes.count(0), issueTypes.count(1), issueTypes.count(2)] + if len(issueTypes) != sum(result): + test.fatal("Found unexpected value(s) for TaskType...") + return result + +def main(): + tasksFile, issueTypes = generateMockTasksFile() + issuesLabel = ("{text='%d' type='QLabel' unnamed='1' visible='1' " + "window=':Qt Creator_Core::Internal::MainWindow'}" % (sum(issueTypes))) + startApplication("qtcreator" + SettingsPath) + if not startedWithoutPluginError(): + return + invokeMenuItem("File", "Open File or Project...") + selectFromFileDialog(tasksFile) + starttime = datetime.utcnow() + waitFor("object.exists(issuesLabel)", 10000) + endtime = datetime.utcnow() + differenceMS = (endtime - starttime).microseconds + (endtime - starttime).seconds * 1000000 + test.verify(differenceMS < 2000000, "Verifying whether loading the tasks " + "file took less than 2s. (%dµs)" % differenceMS) + ensureChecked(":Qt Creator_Issues_Core::Internal::OutputPaneToggleButton") + model = waitForObject(":Qt Creator.Issues_QListView").model() + others, errors, warnings = getBuildIssuesTypeCounts(model) + test.compare(issueTypes, [warnings, errors, others], + "Verifying whether all expected errors, warnings and other tasks are listed.") + + # check filtering by 'Show Warnings' + warnButton = waitForObject(toolButton % 'Show Warnings') + ensureChecked(warnButton, False) + waitFor("model.rowCount() == issueTypes[1]", 2000) + test.compare(model.rowCount(), issueTypes[1], "Verifying only errors are listed.") + ensureChecked(warnButton, True) + waitFor("model.rowCount() == sum(issueTypes)", 2000) + test.compare(model.rowCount(), sum(issueTypes), "Verifying all tasks are listed.") + + # check filtering by 'My Tasks' + checkOrUncheckMyTasks() + waitFor("model.rowCount() == 0", 2000) + test.compare(model.rowCount(), 0, + "Verifying whether unchecking 'My Tasks' hides all tasks from tasks file.") + checkOrUncheckMyTasks() + waitFor("model.rowCount() == sum(issueTypes)", 2000) + test.compare(model.rowCount(), sum(issueTypes), + "Verifying whether checking 'My Tasks' displays all tasks from tasks file.") + + # check filtering by 'My Tasks' and 'Show Warnings' + ensureChecked(warnButton, False) + waitFor("model.rowCount() == issueTypes[1]", 2000) + checkOrUncheckMyTasks() + waitFor("model.rowCount() == 0", 2000) + test.compare(model.rowCount(), 0, + "Verifying whether unchecking 'My Tasks' with disabled 'Show Warnings' hides all.") + ensureChecked(warnButton, True) + waitFor("model.rowCount() != 0", 2000) + test.compare(model.rowCount(), 0, + "Verifying whether enabling 'Show Warnings' still displays nothing.") + checkOrUncheckMyTasks() + waitFor("model.rowCount() == sum(issueTypes)", 2000) + test.compare(model.rowCount(), sum(issueTypes), + "Verifying whether checking 'My Tasks' displays all again.") + ensureChecked(warnButton, False) + waitFor("model.rowCount() == issueTypes[1]", 2000) + test.compare(model.rowCount(), issueTypes[1], "Verifying whether 'My Tasks' with disabled " + "'Show Warnings' displays only error tasks.") + invokeMenuItem("File", "Exit") |