blob: 05c325fd4563805aa1c907611d38486a160b69f9 [file] [log] [blame]
/****************************************************************************
**
** 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