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