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