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 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
|
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the test suite of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef QLOCATIONTESTUTILS_P_H
#define QLOCATIONTESTUTILS_P_H
#include <QDebug>
#include <QString>
#include <QTest>
namespace QLocationTestUtils
{
bool hasDefaultSource();
bool hasDefaultMonitor();
QString addNmeaChecksumAndBreaks(const QString &sentence);
QString createRmcSentence(const QDateTime &dt);
QString createGgaSentence(const QTime &time);
QString createGgaSentence(int lat, int lng, const QTime &time);
QString createZdaSentence(const QDateTime &dt);
QString createGsaSentence();
//The purpose of compareEquality() is to test equality
//operators where it is expected that A == B.
template<typename A, typename B>
bool compareEquality(const A &first, const B &second) {
if (first != second) {
qWarning() << "compareEquality() failed: first != second";
return false;
}
if (second != first) {
qWarning() << "compareEquality() failed: second != first";
return false;
}
if (!(first == second)) {
qWarning() << "compareEquality() failed: !(first == second)";
return false;
}
if (!(second == first)) {
qWarning() << "compareEquality() failed: !(second == first)";
return false;
}
return true;
}
//The purpose of compareInequality() is to test equality
//operators where it is expected that A != B.
//Using !compareEquality(...) is not sufficient because
//only the first operator checked would end up being tested.
template<typename A, typename B>
bool compareInequality(const A &first, const B &second) {
if (!(first != second)){
qWarning() << "compareInequality() failed: !(first != second)";
return false;
}
if (!(second != first)) {
qWarning() << "compareInequality() failed: !(second != first)";
return false;
}
if (first == second) {
qWarning() << "compareInequality() failed: first == second)";
return false;
}
if (second == first) {
qWarning() << "compareInequality() failed: second == first";
return false;
}
return true;
}
// Tests conversions between sub and base classes
// TC (test case) must implement:
// SubClass initialSubObject();
// bool checkType(const BaseClass &)
// void detach(BaseClass *) - calls a mutator method, but doesn't actually modify the
// property to something different.
// void setSubClassProperty(SubClass *) - sets a property in the subclass instance
template<typename TC, typename BaseClass, typename SubClass>
void testConversion(TC *tc) {
SubClass sub = tc->initialSubObject();
//check conversion from SubClass -> BaseClass
//using assignment operator
BaseClass base;
base = sub;
QVERIFY(QLocationTestUtils::compareEquality(base, sub));
QVERIFY(tc->checkType(base));
//check comparing base classes
BaseClass base2;
base2 = sub;
QVERIFY(QLocationTestUtils::compareEquality(base, base2));
//check conversion from BaseClass -> SubClass
//using assignment operator
SubClass sub2;
sub2 = base;
QVERIFY(QLocationTestUtils::compareEquality(sub, sub2));
QVERIFY(tc->checkType(sub2));
//check that equality still holds with detachment of underlying data pointer
tc->detach(&base);
sub2 = base;
QVERIFY(QLocationTestUtils::compareEquality(sub, sub2));
QVERIFY(QLocationTestUtils::compareEquality(sub, base));
QVERIFY(QLocationTestUtils::compareEquality(base, base2));
//check that comparing objects are not the same
//when an underlying subclass field has been modified
tc->setSubClassProperty(&sub2);
base2 = sub2;
QVERIFY(QLocationTestUtils::compareInequality(sub, sub2));
QVERIFY(QLocationTestUtils::compareInequality(sub, base2));
QVERIFY(QLocationTestUtils::compareInequality(base, base2));
//check conversion from SubClass -> BaseClass
//using copy constructor
BaseClass base3(sub);
QVERIFY(QLocationTestUtils::compareEquality(sub, base3));
QVERIFY(QLocationTestUtils::compareEquality(base, base3));
//check conversion from BaseClass -> SubClass
//using copy constructor
SubClass sub3(base3);
QVERIFY(QLocationTestUtils::compareEquality(sub, sub3));
//check conversion to subclass using a default base class instance
BaseClass baseDefault;
SubClass subDefault;
SubClass sub4(baseDefault);
QVERIFY(QLocationTestUtils::compareEquality(sub4, subDefault));
SubClass sub5 = baseDefault;
QVERIFY(QLocationTestUtils::compareEquality(sub5, subDefault));
}
};
#endif
|