1 /****************************************************************************
2 **
3 ** Copyright (C) 2016 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the QtTest module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 3 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL3 included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 3 requirements
23 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24 **
25 ** GNU General Public License Usage
26 ** Alternatively, this file may be used under the terms of the GNU
27 ** General Public License version 2.0 or (at your option) the GNU General
28 ** Public license version 3 or any later version approved by the KDE Free
29 ** Qt Foundation. The licenses are as published by the Free Software
30 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31 ** included in the packaging of this file. Please review the following
32 ** information to ensure the GNU General Public License requirements will
33 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34 ** https://www.gnu.org/licenses/gpl-3.0.html.
35 **
36 ** $QT_END_LICENSE$
37 **
38 ****************************************************************************/
39
40 #include <QtTest/private/qtesttable_p.h>
41 #include <QtTest/qtestdata.h>
42 #include <QtTest/qtestassert.h>
43
44 #include <QtCore/qmetaobject.h>
45
46 #include <string.h>
47 #include <vector>
48 #include <algorithm>
49
50 QT_BEGIN_NAMESPACE
51
52 class QTestTablePrivate
53 {
54 public:
~QTestTablePrivate()55 ~QTestTablePrivate()
56 {
57 qDeleteAll(dataList.begin(), dataList.end());
58 }
59
60 struct Element {
61 Element() = default;
ElementQTestTablePrivate::Element62 Element(const char *n, int t) : name(n), type(t) {}
63
64 const char *name = nullptr;
65 int type = 0;
66 };
67
68 using ElementList = std::vector<Element>;
69 ElementList elementList;
70
71 using DataList = std::vector<QTestData *>;
72 DataList dataList;
73
addColumn(int elemType,const char * elemName)74 void addColumn(int elemType, const char *elemName) { elementList.push_back(Element(elemName, elemType)); }
addRow(QTestData * data)75 void addRow(QTestData *data) { dataList.push_back(data); }
76
77 static QTestTable *currentTestTable;
78 static QTestTable *gTable;
79 };
80
81 QTestTable *QTestTablePrivate::currentTestTable = nullptr;
82 QTestTable *QTestTablePrivate::gTable = nullptr;
83
addColumn(int type,const char * name)84 void QTestTable::addColumn(int type, const char *name)
85 {
86 QTEST_ASSERT(type);
87 QTEST_ASSERT(name);
88
89 d->addColumn(type, name);
90 }
91
elementCount() const92 int QTestTable::elementCount() const
93 {
94 return int(d->elementList.size());
95 }
96
dataCount() const97 int QTestTable::dataCount() const
98 {
99 return int(d->dataList.size());
100 }
101
isEmpty() const102 bool QTestTable::isEmpty() const
103 {
104 return d->elementList.empty();
105 }
106
newData(const char * tag)107 QTestData *QTestTable::newData(const char *tag)
108 {
109 QTestData *dt = new QTestData(tag, this);
110 d->addRow(dt);
111 return dt;
112 }
113
QTestTable()114 QTestTable::QTestTable()
115 {
116 d = new QTestTablePrivate;
117 QTestTablePrivate::currentTestTable = this;
118 }
119
~QTestTable()120 QTestTable::~QTestTable()
121 {
122 QTestTablePrivate::currentTestTable = nullptr;
123 delete d;
124 }
125
elementTypeId(int index) const126 int QTestTable::elementTypeId(int index) const
127 {
128 return size_t(index) < d->elementList.size() ? d->elementList[index].type : -1;
129 }
130
dataTag(int index) const131 const char *QTestTable::dataTag(int index) const
132 {
133 return size_t(index) < d->elementList.size() ? d->elementList[index].name : nullptr;
134 }
135
testData(int index) const136 QTestData *QTestTable::testData(int index) const
137 {
138 return size_t(index) < d->dataList.size() ? d->dataList[index] : nullptr;
139 }
140
141 class NamePredicate
142 {
143 public:
NamePredicate(const char * needle)144 explicit NamePredicate(const char *needle) : m_needle(needle) {}
145
operator ()(const QTestTablePrivate::Element & e) const146 bool operator()(const QTestTablePrivate::Element &e) const
147 { return !strcmp(e.name, m_needle); }
148
149 private:
150 const char *m_needle;
151 };
152
indexOf(const char * elementName) const153 int QTestTable::indexOf(const char *elementName) const
154 {
155 QTEST_ASSERT(elementName);
156
157 const QTestTablePrivate::ElementList &elementList = d->elementList;
158
159 const auto it = std::find_if(elementList.begin(), elementList.end(),
160 NamePredicate(elementName));
161 return it != elementList.end() ?
162 int(it - elementList.begin()) : -1;
163 }
164
globalTestTable()165 QTestTable *QTestTable::globalTestTable()
166 {
167 if (!QTestTablePrivate::gTable)
168 QTestTablePrivate::gTable = new QTestTable();
169 return QTestTablePrivate::gTable;
170 }
171
clearGlobalTestTable()172 void QTestTable::clearGlobalTestTable()
173 {
174 delete QTestTablePrivate::gTable;
175 QTestTablePrivate::gTable = nullptr;
176 }
177
currentTestTable()178 QTestTable *QTestTable::currentTestTable()
179 {
180 return QTestTablePrivate::currentTestTable;
181 }
182
183 QT_END_NAMESPACE
184