/**************************************************************************** ** ** 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. ** ****************************************************************************/ #include "qttest_utils.h" #include "qttesttreeitem.h" #include "../testframeworkmanager.h" #include #include #include #include namespace Autotest { namespace Internal { namespace QTestUtils { static const QByteArrayList valid = {"QTEST_MAIN", "QTEST_APPLESS_MAIN", "QTEST_GUILESS_MAIN"}; bool isQTestMacro(const QByteArray ¯o) { return valid.contains(macro); } QHash testCaseNamesForFiles(const Core::Id &id, const QStringList &files) { QHash result; TestTreeItem *rootNode = TestFrameworkManager::instance()->rootNodeForTestFramework(id); QTC_ASSERT(rootNode, return result); rootNode->forFirstLevelChildren([&result, &files](TestTreeItem *child) { if (files.contains(child->filePath())) result.insert(child->filePath(), child->name()); child->forFirstLevelChildren([&result, &files, child](TestTreeItem *grandChild) { if (files.contains(grandChild->filePath())) result.insert(grandChild->filePath(), child->name()); }); }); return result; } QMultiHash alternativeFiles(const Core::Id &id, const QStringList &files) { QMultiHash result; TestTreeItem *rootNode = TestFrameworkManager::instance()->rootNodeForTestFramework(id); QTC_ASSERT(rootNode, return result); rootNode->forFirstLevelChildren([&result, &files](TestTreeItem *child) { const QString &baseFilePath = child->filePath(); for (int childRow = 0, count = child->childCount(); childRow < count; ++childRow) { auto grandChild = static_cast(child->childAt(childRow)); const QString &filePath = grandChild->filePath(); if (grandChild->inherited() && baseFilePath != filePath && files.contains(filePath)) { if (!result.contains(filePath, baseFilePath)) result.insert(filePath, baseFilePath); } } }); return result; } QStringList filterInterfering(const QStringList &provided, QStringList *omitted, bool isQuickTest) { static const QSet knownInterferingSingleOptions { "-txt", "-xml", "-csv", "-xunitxml", "-lightxml", "-silent", "-v1", "-v2", "-vs", "-vb", "-functions", "-datatags", "-nocrashhandler", "-callgrind", "-perf", "-perfcounterlist", "-tickcounter", "-eventcounter", "-help" }; static const QSet knownInterferingOptionWithParameter = { "-o" }; static const QSet knownAllowedOptionsWithParameter { "-eventdelay", "-keydelay", "-mousedelay", "-maxwarnings", "-perfcounter", "-minimumvalue", "-minimumtotal", "-iterations", "-median" }; // handle Quick options as well static const QSet knownInterferingQuickOption = { "-qtquick1" }; static const QSet knownAllowedQuickOptionsWithParameter { "-import", "-plugins", "-input", "-translation" }; static const QSet knownAllowedSingleQuickOptions = { "-opengl", "-widgets" }; QStringList allowed; auto it = provided.cbegin(); auto end = provided.cend(); for ( ; it != end; ++it) { QString currentOpt = *it; if (knownAllowedOptionsWithParameter.contains(currentOpt)) { allowed.append(currentOpt); ++it; QTC_ASSERT(it != end, return QStringList()); allowed.append(*it); } else if (knownInterferingOptionWithParameter.contains(currentOpt)) { if (omitted) { omitted->append(currentOpt); ++it; QTC_ASSERT(it != end, return QStringList()); omitted->append(*it); } } else if (knownInterferingSingleOptions.contains(currentOpt)) { if (omitted) omitted->append(currentOpt); } else if (isQuickTest) { if (knownAllowedQuickOptionsWithParameter.contains(currentOpt)) { allowed.append(currentOpt); ++it; QTC_ASSERT(it != end, return QStringList()); allowed.append(*it); } else if (knownAllowedSingleQuickOptions.contains(currentOpt)) { allowed.append(currentOpt); } else if (knownInterferingQuickOption.contains(currentOpt)) { if (omitted) omitted->append(currentOpt); } } else { // might be bad, but we cannot know anything allowed.append(currentOpt); } } return allowed; } } // namespace QTestUtils } // namespace Internal } // namespace Autotest