1 /**
2 * This file is part of OpenOrienteering.
3 *
4 * This is a modified version of tst_qglobal.cpp from the Qt Toolkit 5.7.
5 * You can redistribute it and/or modify it under the terms of
6 * the GNU General Public License, version 3, as published by
7 * the Free Software Foundation.
8 *
9 * OpenOrienteering is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with OpenOrienteering. If not, see <http://www.gnu.org/licenses/>
16 *
17 * Changes:
18 * 2016-03-25 Kai Pastor <dg0yt@darc.de>
19 * - Adjustment of legal information
20 * - Reduction to qOverload related tests
21 * - Adaption to our testing framework
22 */
23 /****************************************************************************
24 **
25 ** Copyright (C) 2016 The Qt Company Ltd.
26 ** Contact: https://www.qt.io/licensing/
27 **
28 ****************************************************************************/
29
30
31 #include "tst_qglobal.h"
32
33 #include <QtGlobal>
34 #include <QtTest>
35 #include <QByteArray>
36 #include <QString>
37
38 #include "util/backports.h" // IWYU pragma: keep
39
40
41 // clazy:excludeall=function-args-by-ref
42 struct Overloaded
43 {
fooOverloaded44 void foo() {}
fooOverloaded45 void foo(QByteArray) {}
fooOverloaded46 void foo(QByteArray, const QString &) {}
47
constFooOverloaded48 void constFoo() const {}
constFooOverloaded49 void constFoo(QByteArray) const {}
constFooOverloaded50 void constFoo(QByteArray, const QString &) const {}
51
mixedFooOverloaded52 void mixedFoo() {}
mixedFooOverloaded53 void mixedFoo(QByteArray) const {}
54 };
55
freeOverloaded()56 void freeOverloaded() {}
freeOverloaded(QByteArray)57 void freeOverloaded(QByteArray) {}
freeOverloaded(QByteArray,const QString &)58 void freeOverloaded(QByteArray, const QString &) {}
59
freeOverloadedGet(QByteArray)60 void freeOverloadedGet(QByteArray) {}
freeOverloadedGet()61 QByteArray freeOverloadedGet() { return QByteArray(); }
62
63
testqOverload()64 void tst_QGlobal::testqOverload()
65 {
66 #ifdef Q_COMPILER_VARIADIC_TEMPLATES
67
68 // void returning free overloaded functions
69 QVERIFY(QOverload<>::of(&freeOverloaded) ==
70 static_cast<void (*)()>(&freeOverloaded));
71
72 QVERIFY(QOverload<QByteArray>::of(&freeOverloaded) ==
73 static_cast<void (*)(QByteArray)>(&freeOverloaded));
74
75 QVERIFY((QOverload<QByteArray, const QString &>::of(&freeOverloaded)) ==
76 static_cast<void (*)(QByteArray, const QString &)>(&freeOverloaded));
77
78 // value returning free overloaded functions
79 QVERIFY(QOverload<>::of(&freeOverloadedGet) ==
80 static_cast<QByteArray (*)()>(&freeOverloadedGet));
81
82 QVERIFY(QOverload<QByteArray>::of(&freeOverloadedGet) ==
83 static_cast<void (*)(QByteArray)>(&freeOverloadedGet));
84
85 // void returning overloaded member functions
86 QVERIFY(QOverload<>::of(&Overloaded::foo) ==
87 static_cast<void (Overloaded::*)()>(&Overloaded::foo));
88
89 QVERIFY(QOverload<QByteArray>::of(&Overloaded::foo) ==
90 static_cast<void (Overloaded::*)(QByteArray)>(&Overloaded::foo));
91
92 QVERIFY((QOverload<QByteArray, const QString &>::of(&Overloaded::foo)) ==
93 static_cast<void (Overloaded::*)(QByteArray, const QString &)>(&Overloaded::foo));
94
95 // void returning overloaded const member functions
96 QVERIFY(QOverload<>::of(&Overloaded::constFoo) ==
97 static_cast<void (Overloaded::*)() const>(&Overloaded::constFoo));
98
99 QVERIFY(QOverload<QByteArray>::of(&Overloaded::constFoo) ==
100 static_cast<void (Overloaded::*)(QByteArray) const>(&Overloaded::constFoo));
101
102 QVERIFY((QOverload<QByteArray, const QString &>::of(&Overloaded::constFoo)) ==
103 static_cast<void (Overloaded::*)(QByteArray, const QString &) const>(&Overloaded::constFoo));
104
105 // void returning overloaded const AND non-const member functions
106 QVERIFY(QNonConstOverload<>::of(&Overloaded::mixedFoo) ==
107 static_cast<void (Overloaded::*)()>(&Overloaded::mixedFoo));
108
109 QVERIFY(QConstOverload<QByteArray>::of(&Overloaded::mixedFoo) ==
110 static_cast<void (Overloaded::*)(QByteArray) const>(&Overloaded::mixedFoo));
111
112 #if defined(__cpp_variable_templates) && __cpp_variable_templates >= 201304 // C++14
113
114 // void returning free overloaded functions
115 QVERIFY(qOverload<>(&freeOverloaded) ==
116 static_cast<void (*)()>(&freeOverloaded));
117
118 QVERIFY(qOverload<QByteArray>(&freeOverloaded) ==
119 static_cast<void (*)(QByteArray)>(&freeOverloaded));
120
121 QVERIFY((qOverload<QByteArray, const QString &>(&freeOverloaded) ==
122 static_cast<void (*)(QByteArray, const QString &)>(&freeOverloaded)));
123
124 // value returning free overloaded functions
125 QVERIFY(qOverload<>(&freeOverloadedGet) ==
126 static_cast<QByteArray (*)()>(&freeOverloadedGet));
127
128 QVERIFY(qOverload<QByteArray>(&freeOverloadedGet) ==
129 static_cast<void (*)(QByteArray)>(&freeOverloadedGet));
130
131 // void returning overloaded member functions
132 QVERIFY(qOverload<>(&Overloaded::foo) ==
133 static_cast<void (Overloaded::*)()>(&Overloaded::foo));
134
135 QVERIFY(qOverload<QByteArray>(&Overloaded::foo) ==
136 static_cast<void (Overloaded::*)(QByteArray)>(&Overloaded::foo));
137
138 QVERIFY((qOverload<QByteArray, const QString &>(&Overloaded::foo)) ==
139 static_cast<void (Overloaded::*)(QByteArray, const QString &)>(&Overloaded::foo));
140
141 // void returning overloaded const member functions
142 QVERIFY(qOverload<>(&Overloaded::constFoo) ==
143 static_cast<void (Overloaded::*)() const>(&Overloaded::constFoo));
144
145 QVERIFY(qOverload<QByteArray>(&Overloaded::constFoo) ==
146 static_cast<void (Overloaded::*)(QByteArray) const>(&Overloaded::constFoo));
147
148 QVERIFY((qOverload<QByteArray, const QString &>(&Overloaded::constFoo)) ==
149 static_cast<void (Overloaded::*)(QByteArray, const QString &) const>(&Overloaded::constFoo));
150
151 // void returning overloaded const AND non-const member functions
152 QVERIFY(qNonConstOverload<>(&Overloaded::mixedFoo) ==
153 static_cast<void (Overloaded::*)()>(&Overloaded::mixedFoo));
154
155 QVERIFY(qConstOverload<QByteArray>(&Overloaded::mixedFoo) ==
156 static_cast<void (Overloaded::*)(QByteArray) const>(&Overloaded::mixedFoo));
157 #endif
158
159 #endif
160 }
161
162
163 QTEST_APPLESS_MAIN(tst_QGlobal)
164