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#include <qgeoroutexmlparser.h>
30#include <qgeocoordinate.h>
31#include <qtest.h>
32#include <qgeoroute.h>
33
34#include <QMetaType>
35#include <QDebug>
36#include <QFile>
37#include <QSignalSpy>
38
39Q_DECLARE_METATYPE(QList<QGeoRoute>)
40
41QT_USE_NAMESPACE
42
43class tst_QGeoRouteXmlParser : public QObject
44{
45 Q_OBJECT
46
47public:
48 tst_QGeoRouteXmlParser()
49 : start(0.0, 0.0),
50 end(1.0, 1.0)
51 {
52 qRegisterMetaType<QList<QGeoRoute> >();
53 }
54
55private:
56 // dummy values for creating the request object
57 QGeoCoordinate start;
58 QGeoCoordinate end;
59
60private slots:
61 void test_realData1()
62 {
63 QFile f(":/route1.xml");
64 if (!f.open(flags: QIODevice::ReadOnly))
65 QFAIL("could not open route1.xml");
66
67 QGeoRouteRequest req(start, end);
68 QGeoRouteXmlParser xp(req);
69 xp.setAutoDelete(false);
70
71 QSignalSpy resultsSpy(&xp, SIGNAL(results(QList<QGeoRoute>)));
72
73 xp.parse(data: f.readAll());
74
75 QTRY_COMPARE(resultsSpy.count(), 1);
76
77 QVariantList arguments = resultsSpy.first();
78
79 // xml contains exactly 1 route
80 QList<QGeoRoute> results = arguments.at(i: 0).value<QList<QGeoRoute> >();
81 QCOMPARE(results.size(), 1);
82 QGeoRoute route = results.first();
83
84 QList<QGeoRouteSegment> segments;
85 // get all the segments on the route
86 segments << route.firstRouteSegment();
87 while (segments.last().isValid())
88 segments << segments.last().nextRouteSegment();
89
90 // should be 9 segments in the list (last one invalid)
91 QCOMPARE(segments.size(), 9);
92
93 // check the first maneuver is correct
94 QGeoManeuver first = segments.at(i: 0).maneuver();
95 QCOMPARE(first.instructionText(), QStringLiteral("Head toward Logan Rd (95) on Padstow Rd (56). Go for 0.3 miles."));
96 QCOMPARE(first.position(), QGeoCoordinate(-27.5752144, 153.0879669));
97
98 QCOMPARE(first.timeToNextInstruction(), 24);
99 QCOMPARE(first.distanceToNextInstruction(), 403.0);
100
101 // check the last two maneuvers -- route1.xml has a directionless final maneuver
102 QGeoManeuver secondLast = segments.at(i: 6).maneuver();
103 QVERIFY(secondLast.instructionText().contains("Turn right onto Bartley St"));
104 QCOMPARE(secondLast.position(), QGeoCoordinate(-27.4655991, 153.0231628));
105 QCOMPARE(secondLast.distanceToNextInstruction(), 181.0);
106 QCOMPARE(secondLast.timeToNextInstruction(), 41);
107
108 QGeoManeuver last = segments.at(i: 7).maneuver();
109 QVERIFY(last.instructionText().contains("Arrive at Bartley St"));
110 QCOMPARE(last.position(), QGeoCoordinate(-27.4650097, 153.0230255));
111 QCOMPARE(last.distanceToNextInstruction(), 0.0);
112 QCOMPARE(last.timeToNextInstruction(), 0);
113 }
114
115 void test_realData2()
116 {
117 QFile f(":/route2.xml");
118 if (!f.open(flags: QIODevice::ReadOnly))
119 QFAIL("could not open route2.xml");
120
121 QGeoRouteRequest req(start, end);
122 QGeoRouteXmlParser xp(req);
123 xp.setAutoDelete(false);
124
125 QSignalSpy resultsSpy(&xp, SIGNAL(results(QList<QGeoRoute>)));
126
127 xp.parse(data: f.readAll());
128
129 QTRY_COMPARE(resultsSpy.count(), 1);
130
131 QVariantList arguments = resultsSpy.first();
132
133 // xml contains exactly 1 route
134 QList<QGeoRoute> results = arguments.at(i: 0).value<QList<QGeoRoute> >();
135 QCOMPARE(results.size(), 1);
136 QGeoRoute route = results.first();
137
138 QList<QGeoRouteSegment> segments;
139 // get all the segments on the route
140 segments << route.firstRouteSegment();
141 while (segments.last().isValid())
142 segments << segments.last().nextRouteSegment();
143
144 // should be 14 segments in the list (last one invalid)
145 QCOMPARE(segments.size(), 14);
146
147 QCOMPARE(route.path().size(), 284);
148 QCOMPARE(route.path().at(57), QGeoCoordinate(-27.5530605, 153.0691223));
149 QCOMPARE(route.path().at(283), QGeoCoordinate(-27.4622307, 153.0397949));
150
151 QVERIFY(segments.at(0).maneuver().instructionText().contains("Head toward Electronics St"));
152 QCOMPARE(segments.at(0).maneuver().direction(), QGeoManeuver::DirectionForward);
153 QVERIFY(segments.at(1).maneuver().instructionText().contains("Turn left onto Miles Platting"));
154 QCOMPARE(segments.at(1).maneuver().direction(), QGeoManeuver::DirectionLeft);
155 QVERIFY(segments.at(2).maneuver().instructionText().contains("Turn right onto Logan Rd"));
156 QCOMPARE(segments.at(2).maneuver().direction(), QGeoManeuver::DirectionRight);
157 QVERIFY(segments.at(3).maneuver().instructionText().contains("Take exit #14/M3/City"));
158 QCOMPARE(segments.at(3).maneuver().direction(), QGeoManeuver::DirectionLightLeft);
159 QVERIFY(segments.at(4).maneuver().instructionText().contains("Take exit #2/41"));
160 QCOMPARE(segments.at(4).maneuver().direction(), QGeoManeuver::DirectionLightLeft);
161 QVERIFY(segments.at(5).maneuver().instructionText().contains("Turn right onto Allen St"));
162 QCOMPARE(segments.at(5).maneuver().direction(), QGeoManeuver::DirectionRight);
163 QVERIFY(segments.at(6).maneuver().instructionText().contains("Bear right to stay on"));
164 QCOMPARE(segments.at(6).maneuver().direction(), QGeoManeuver::DirectionLightRight);
165 QVERIFY(segments.at(7).maneuver().instructionText().contains("Bear right onto Vulture St"));
166 QCOMPARE(segments.at(7).maneuver().direction(), QGeoManeuver::DirectionLightRight);
167 }
168};
169
170QTEST_GUILESS_MAIN(tst_QGeoRouteXmlParser)
171#include "tst_qgeoroutexmlparser.moc"
172
173

source code of qtlocation/tests/auto/qgeoroutexmlparser/tst_qgeoroutexmlparser.cpp