aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/autotest/testresult.h
blob: 51959deb426dcba1847d77c4ff770d6dd6038e28 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0

#pragma once

#include "autotestconstants.h"

#include <utils/filepath.h>

#include <QColor>

#include <optional>

namespace Autotest {

class ITestTreeItem;

enum class ResultType {
    // result types (have icon, color, short text)
    Pass, FIRST_TYPE = Pass,
    Fail,
    ExpectedFail,
    UnexpectedPass,
    Skip,
    BlacklistedPass,
    BlacklistedFail,
    BlacklistedXPass,
    BlacklistedXFail,

    // special (message) types (have icon, color, short text)
    Benchmark,
    MessageDebug,
    MessageInfo,
    MessageWarn,
    MessageFatal,
    MessageSystem,
    MessageError,

    // special message - get's icon (but no color/short text) from parent
    MessageLocation,
    // anything below is an internal message (or a pure message without icon)
    MessageInternal, INTERNAL_MESSAGES_BEGIN = MessageInternal,
    // start item (get icon/short text depending on children)
    TestStart,
    // usually no icon/short text - more or less an indicator (and can contain test duration)
    TestEnd,
    // special global (temporary) message
    MessageCurrentTest, INTERNAL_MESSAGES_END = MessageCurrentTest,

    Application,        // special.. not to be used outside of testresultmodel
    Invalid,            // indicator for unknown result items
    LAST_TYPE = Invalid
};

static inline bool isTestMessage(const ResultType &result)
{
    return result >= ResultType::MessageDebug && result <= ResultType::MessageError;
}

inline auto qHash(const ResultType &result)
{
    return QT_PREPEND_NAMESPACE(qHash(int(result)));
}

class TestResult;

struct ResultHooks
{
    using OutputStringHook = std::function<QString(const TestResult &, bool)>;
    using FindTestItemHook = std::function<ITestTreeItem *(const TestResult &)>;
    using DirectParentHook = std::function<bool(const TestResult &, const TestResult &, bool *)>;
    using IntermediateHook = std::function<bool(const TestResult &, const TestResult &)>;
    using CreateResultHook = std::function<TestResult(const TestResult &)>;
    QVariant extraData;
    OutputStringHook outputString = {};
    FindTestItemHook findTestItem = {};
    DirectParentHook directParent = {};
    IntermediateHook intermediate = {};
    CreateResultHook createResult = {};
};

class TestResult
{
public:
    TestResult() = default;
    TestResult(const QString &id, const QString &name, const ResultHooks &hooks = {});
    virtual ~TestResult() {}

    bool isValid() const;
    const QString outputString(bool selected) const;
    const ITestTreeItem *findTestTreeItem() const;

    QString id() const { return m_id.value_or(QString()); }
    QString name() const { return m_name; }
    ResultType result() const { return m_result; }
    QString description() const { return m_description; }
    Utils::FilePath fileName() const { return m_file; }
    int line() const { return m_line; }
    std::optional<QString> duration() const { return m_duration; }
    QVariant extraData() const { return m_hooks.extraData; }

    void setDescription(const QString &description) { m_description = description; }
    void setFileName(const Utils::FilePath &fileName) { m_file = fileName; }
    void setLine(int line) { m_line = line; }
    void setDuration(const QString &milliSeconds);
    void setResult(ResultType type) { m_result = type; }

    static ResultType resultFromString(const QString &resultString);
    static ResultType toResultType(int rt);
    static QString resultToString(const ResultType type);
    static QColor colorForType(const ResultType type);

    bool isDirectParentOf(const TestResult &other, bool *needsIntermediate) const;
    bool isIntermediateFor(const TestResult &other) const;
    TestResult intermediateResult() const;

private:
    std::optional<QString> m_id = {};
    std::optional<QString> m_duration;
    QString m_name;
    ResultType m_result = ResultType::Invalid;  // the real result..
    QString m_description;
    Utils::FilePath m_file;
    int m_line = 0;
    ResultHooks m_hooks = {};
};

} // namespace Autotest

Q_DECLARE_METATYPE(Autotest::TestResult)
Q_DECLARE_METATYPE(Autotest::ResultType)