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 //TESTED_COMPONENT=src/location
30 
31 #include "qnmeapositioninfosourceproxyfactory.h"
32 #include "../qgeopositioninfosource/testqgeopositioninfosource_p.h"
33 #include "../utils/qlocationtestutils_p.h"
34 
35 #include <QtPositioning/qnmeapositioninfosource.h>
36 #include <QSignalSpy>
37 #include <QTest>
38 
39 Q_DECLARE_METATYPE(QNmeaPositionInfoSource::UpdateMode)
40 
41 class DummyNmeaPositionInfoSource : public QNmeaPositionInfoSource
42 {
43     Q_OBJECT
44 
45 public:
46     DummyNmeaPositionInfoSource(QNmeaPositionInfoSource::UpdateMode mode, QObject *parent = 0);
47 
48 protected:
49     virtual bool parsePosInfoFromNmeaData(const char *data,
50                                           int size,
51                                           QGeoPositionInfo *posInfo,
52                                           bool *hasFix);
53 
54 private:
55     int callCount;
56 };
57 
DummyNmeaPositionInfoSource(QNmeaPositionInfoSource::UpdateMode mode,QObject * parent)58 DummyNmeaPositionInfoSource::DummyNmeaPositionInfoSource(QNmeaPositionInfoSource::UpdateMode mode, QObject *parent) :
59         QNmeaPositionInfoSource(mode, parent),
60         callCount(0)
61 {
62 }
63 
parsePosInfoFromNmeaData(const char * data,int size,QGeoPositionInfo * posInfo,bool * hasFix)64 bool DummyNmeaPositionInfoSource::parsePosInfoFromNmeaData(const char* data,
65                                                            int size,
66                                                            QGeoPositionInfo *posInfo,
67                                                            bool *hasFix)
68 {
69     Q_UNUSED(data);
70     Q_UNUSED(size);
71 
72     posInfo->setCoordinate(QGeoCoordinate(callCount * 1.0, callCount * 1.0, callCount * 1.0));
73     posInfo->setTimestamp(QDateTime::currentDateTime().toUTC());
74     *hasFix = true;
75     ++callCount;
76 
77     return true;
78 }
79 
80 class tst_DummyNmeaPositionInfoSource : public QObject
81 {
82     Q_OBJECT
83 
84 public:
85     tst_DummyNmeaPositionInfoSource();
86 
87 private slots:
88     void initTestCase();
89     void testOverloadedParseFunction();
90 };
91 
92 
tst_DummyNmeaPositionInfoSource()93 tst_DummyNmeaPositionInfoSource::tst_DummyNmeaPositionInfoSource() {}
94 
initTestCase()95 void tst_DummyNmeaPositionInfoSource::initTestCase()
96 {
97 
98 }
99 
testOverloadedParseFunction()100 void tst_DummyNmeaPositionInfoSource::testOverloadedParseFunction()
101 {
102     DummyNmeaPositionInfoSource source(QNmeaPositionInfoSource::RealTimeMode);
103     QNmeaPositionInfoSourceProxyFactory factory;
104     QNmeaPositionInfoSourceProxy *proxy = static_cast<QNmeaPositionInfoSourceProxy*>(factory.createProxy(&source));
105 
106     QSignalSpy spy(proxy->source(), SIGNAL(positionUpdated(QGeoPositionInfo)));
107 
108     QGeoPositionInfo pos;
109 
110     proxy->source()->startUpdates();
111 
112     proxy->feedBytes(QString("The parser converts\n").toLatin1());
113 
114     QTRY_VERIFY_WITH_TIMEOUT((spy.count() == 1), 10000);
115     pos = spy.at(0).at(0).value<QGeoPositionInfo>();
116 
117     QVERIFY((pos.coordinate().latitude() == 0.0)
118         && (pos.coordinate().longitude() == 0.0)
119         && (pos.coordinate().altitude() == 0.0));
120 
121     spy.clear();
122 
123     proxy->feedBytes(QString("any data it receives\n").toLatin1());
124 
125     QTRY_VERIFY_WITH_TIMEOUT((spy.count() == 1), 10000);
126     pos = spy.at(0).at(0).value<QGeoPositionInfo>();
127 
128     QVERIFY((pos.coordinate().latitude() == 1.0)
129         && (pos.coordinate().longitude() == 1.0)
130         && (pos.coordinate().altitude() == 1.0));
131 
132     spy.clear();
133 
134     proxy->feedBytes(QString("into positions\n").toLatin1());
135 
136     QTRY_VERIFY_WITH_TIMEOUT((spy.count() == 1), 10000);
137     pos = spy.at(0).at(0).value<QGeoPositionInfo>();
138 
139     QVERIFY((pos.coordinate().latitude() == 2.0)
140         && (pos.coordinate().longitude() == 2.0)
141         && (pos.coordinate().altitude() == 2.0));
142 
143     spy.clear();
144 }
145 
146 #include "tst_dummynmeapositioninfosource.moc"
147 
148 QTEST_GUILESS_MAIN(tst_DummyNmeaPositionInfoSource);
149