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 test suite of the Qt Toolkit. 7 ** 8 ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ 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 General Public License Usage 18 ** Alternatively, this file may be used under the terms of the GNU 19 ** General Public License version 3 as published by the Free Software 20 ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT 21 ** included in the packaging of this file. Please review the following 22 ** information to ensure the GNU General Public License requirements will 23 ** be met: https://www.gnu.org/licenses/gpl-3.0.html. 24 ** 25 ** $QT_END_LICENSE$ 26 ** 27 ****************************************************************************/ 28 29 #ifndef QLOCATIONTESTUTILS_P_H 30 #define QLOCATIONTESTUTILS_P_H 31 32 #include <QDebug> 33 #include <QString> 34 #include <QTest> 35 36 namespace QLocationTestUtils 37 { 38 bool hasDefaultSource(); 39 bool hasDefaultMonitor(); 40 41 QString addNmeaChecksumAndBreaks(const QString &sentence); 42 43 QString createRmcSentence(const QDateTime &dt); 44 QString createGgaSentence(const QTime &time); 45 QString createGgaSentence(int lat, int lng, const QTime &time); 46 QString createZdaSentence(const QDateTime &dt); 47 QString createGsaSentence(); 48 49 //The purpose of compareEquality() is to test equality 50 //operators where it is expected that A == B. 51 template<typename A, typename B> compareEquality(const A & first,const B & second)52 bool compareEquality(const A &first, const B &second) { 53 if (first != second) { 54 qWarning() << "compareEquality() failed: first != second"; 55 return false; 56 } 57 58 if (second != first) { 59 qWarning() << "compareEquality() failed: second != first"; 60 return false; 61 } 62 63 if (!(first == second)) { 64 qWarning() << "compareEquality() failed: !(first == second)"; 65 return false; 66 } 67 68 if (!(second == first)) { 69 qWarning() << "compareEquality() failed: !(second == first)"; 70 return false; 71 } 72 73 return true; 74 } 75 76 //The purpose of compareInequality() is to test equality 77 //operators where it is expected that A != B. 78 //Using !compareEquality(...) is not sufficient because 79 //only the first operator checked would end up being tested. 80 template<typename A, typename B> compareInequality(const A & first,const B & second)81 bool compareInequality(const A &first, const B &second) { 82 if (!(first != second)){ 83 qWarning() << "compareInequality() failed: !(first != second)"; 84 return false; 85 } 86 87 if (!(second != first)) { 88 qWarning() << "compareInequality() failed: !(second != first)"; 89 return false; 90 } 91 92 if (first == second) { 93 qWarning() << "compareInequality() failed: first == second)"; 94 return false; 95 } 96 97 if (second == first) { 98 qWarning() << "compareInequality() failed: second == first"; 99 return false; 100 } 101 return true; 102 } 103 104 // Tests conversions between sub and base classes 105 // TC (test case) must implement: 106 // SubClass initialSubObject(); 107 // bool checkType(const BaseClass &) 108 // void detach(BaseClass *) - calls a mutator method, but doesn't actually modify the 109 // property to something different. 110 // void setSubClassProperty(SubClass *) - sets a property in the subclass instance 111 template<typename TC, typename BaseClass, typename SubClass> testConversion(TC * tc)112 void testConversion(TC *tc) { 113 SubClass sub = tc->initialSubObject(); 114 //check conversion from SubClass -> BaseClass 115 //using assignment operator 116 BaseClass base; 117 base = sub; 118 QVERIFY(QLocationTestUtils::compareEquality(base, sub)); 119 QVERIFY(tc->checkType(base)); 120 121 //check comparing base classes 122 BaseClass base2; 123 base2 = sub; 124 QVERIFY(QLocationTestUtils::compareEquality(base, base2)); 125 126 //check conversion from BaseClass -> SubClass 127 //using assignment operator 128 SubClass sub2; 129 sub2 = base; 130 QVERIFY(QLocationTestUtils::compareEquality(sub, sub2)); 131 QVERIFY(tc->checkType(sub2)); 132 133 //check that equality still holds with detachment of underlying data pointer 134 tc->detach(&base); 135 sub2 = base; 136 QVERIFY(QLocationTestUtils::compareEquality(sub, sub2)); 137 QVERIFY(QLocationTestUtils::compareEquality(sub, base)); 138 QVERIFY(QLocationTestUtils::compareEquality(base, base2)); 139 140 //check that comparing objects are not the same 141 //when an underlying subclass field has been modified 142 tc->setSubClassProperty(&sub2); 143 base2 = sub2; 144 QVERIFY(QLocationTestUtils::compareInequality(sub, sub2)); 145 QVERIFY(QLocationTestUtils::compareInequality(sub, base2)); 146 QVERIFY(QLocationTestUtils::compareInequality(base, base2)); 147 148 //check conversion from SubClass -> BaseClass 149 //using copy constructor 150 BaseClass base3(sub); 151 QVERIFY(QLocationTestUtils::compareEquality(sub, base3)); 152 QVERIFY(QLocationTestUtils::compareEquality(base, base3)); 153 154 //check conversion from BaseClass -> SubClass 155 //using copy constructor 156 SubClass sub3(base3); 157 QVERIFY(QLocationTestUtils::compareEquality(sub, sub3)); 158 159 //check conversion to subclass using a default base class instance 160 BaseClass baseDefault; 161 SubClass subDefault; 162 SubClass sub4(baseDefault); 163 QVERIFY(QLocationTestUtils::compareEquality(sub4, subDefault)); 164 165 SubClass sub5 = baseDefault; 166 QVERIFY(QLocationTestUtils::compareEquality(sub5, subDefault)); 167 } 168 }; 169 170 #endif 171