############################################################################# ## ## 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() expectedNo = sum(issueTypes) startApplication("qtcreator" + SettingsPath) if not startedWithoutPluginError(): return ensureChecked(":Qt Creator_Issues_Core::Internal::OutputPaneToggleButton") model = waitForObject(":Qt Creator.Issues_QListView").model() test.verify(model.rowCount() == 0, 'Got an empty issue list to start from.') invokeMenuItem("File", "Open File or Project...") selectFromFileDialog(tasksFile) starttime = datetime.utcnow() waitFor("model.rowCount() == expectedNo", 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) 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() == expectedNo", 2000) test.compare(model.rowCount(), expectedNo, "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() == expectedNo", 2000) test.compare(model.rowCount(), expectedNo, "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() == expectedNo", 2000) test.compare(model.rowCount(), expectedNo, "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")