diff --git a/routing/routing_quality/routing_quality_tests/CMakeLists.txt b/routing/routing_quality/routing_quality_tests/CMakeLists.txt index 3838f4df2f..ce91c392cd 100644 --- a/routing/routing_quality/routing_quality_tests/CMakeLists.txt +++ b/routing/routing_quality/routing_quality_tests/CMakeLists.txt @@ -2,6 +2,9 @@ project(routing_quality_tests) set( SRC + bigger_roads_tests.cpp + ferry_tests.cpp + passby_roads_tests.cpp waypoints_tests.cpp ) diff --git a/routing/routing_quality/routing_quality_tests/bigger_roads_tests.cpp b/routing/routing_quality/routing_quality_tests/bigger_roads_tests.cpp index 6f70f09bee..75cb7bbbe5 100644 --- a/routing/routing_quality/routing_quality_tests/bigger_roads_tests.cpp +++ b/routing/routing_quality/routing_quality_tests/bigger_roads_tests.cpp @@ -1 +1,17 @@ -#pragma once +#include "testing/testing.hpp" + +#include "routing/routing_quality/waypoints.hpp" + +using namespace routing_quality; + +// Test on preferring better but longer roads should be grouped in this file. +namespace +{ +UNIT_TEST(RoutingQuality_MoscowTushino) +{ + // Test in Tushino on routing along big routes. + TEST(CheckCarRoute({55.84398, 37.45018} /* start */, {55.85489, 37.43784} /* finish */, + {{{55.84343, 37.43949}}} /* reference track */), + ()); +} +} // namespace diff --git a/routing/routing_quality/routing_quality_tests/ferry_tests.cpp b/routing/routing_quality/routing_quality_tests/ferry_tests.cpp index 6f70f09bee..1ce81501fa 100644 --- a/routing/routing_quality/routing_quality_tests/ferry_tests.cpp +++ b/routing/routing_quality/routing_quality_tests/ferry_tests.cpp @@ -1 +1,15 @@ -#pragma once +#include "testing/testing.hpp" + +#include "routing/routing_quality/waypoints.hpp" + +using namespace routing_quality; + +namespace +{ +UNIT_TEST(RoutingQuality_FinlandBridgeInsteadOfFerry) +{ + TEST(CheckCarRoute({56.11155, 12.81101} /* start */, {55.59857, 12.3069} /* finish */, + {{{55.56602, 12.88537}}} /* reference track */), + ()); +} +} // namespace diff --git a/routing/routing_quality/routing_quality_tests/passby_roads_tests.cpp b/routing/routing_quality/routing_quality_tests/passby_roads_tests.cpp index 6f70f09bee..f49b1a912c 100644 --- a/routing/routing_quality/routing_quality_tests/passby_roads_tests.cpp +++ b/routing/routing_quality/routing_quality_tests/passby_roads_tests.cpp @@ -1 +1,35 @@ -#pragma once +#include "testing/testing.hpp" + +#include "routing/routing_quality/waypoints.hpp" + +using namespace routing_quality; + +// In most cases a passby road should be preferred in case of going pass a city. +// Test on such cases should be grouped in this file. +namespace +{ +UNIT_TEST(RoutingQuality_Zelegonrad2Domodedovo) +{ + // From Zelenograd to Domodedovo. MKAD should be preferred. + TEST(CheckCarRoute({55.98301, 37.21141} /* start */, {55.42081, 37.89361} /* finish */, + {{{55.99751, 37.23804}, // Through M-11 and MKAD. + {56.00719, 37.28533}, + {55.88759, 37.48068}, + {55.83513, 37.39569}, + {55.57103, 37.69203}}, + {{55.99775, 37.24941}, // Through M-10 and MKAD. + {55.88627, 37.43915}, + {55.86882, 37.40784}, + {55.58645, 37.71672}, + {55.57855, 37.75468}}} /* reference tracks */), + ()); +} + +UNIT_TEST(RoutingQuality_BelarusKobrin) +{ + // Test on using a passby road around Kobirn. + TEST(CheckCarRoute({52.18429, 24.20225} /* start */, {52.24404, 24.45842} /* finish */, + {{{52.18694, 24.39903}}} /* reference track */), + ()); +} +} // namespace diff --git a/routing/routing_quality/routing_quality_tests/waypoints_tests.cpp b/routing/routing_quality/routing_quality_tests/waypoints_tests.cpp index 5cce3c207d..3c6450838c 100644 --- a/routing/routing_quality/routing_quality_tests/waypoints_tests.cpp +++ b/routing/routing_quality/routing_quality_tests/waypoints_tests.cpp @@ -1,88 +1,28 @@ #include "testing/testing.hpp" +#include "routing/vehicle_mask.hpp" + #include "routing/routing_quality/utils.hpp" #include "routing/routing_quality/waypoints.hpp" #include #include -using namespace std; +using namespace routing; using namespace routing_quality; +using namespace std; namespace { UNIT_TEST(RoutingQuality_CompareSmoke) { // From office to Aseeva 6. - RouteParams params; - params.m_waypoints = {{55.79723, 37.53777}, - {55.80634, 37.52886}}; - - ReferenceRoutes candidates; - ReferenceRoute first; - first.m_waypoints = {{55.79676, 37.54138}, + TEST(CheckCarRoute({55.79723, 37.53777} /* start */, {55.80634, 37.52886} /* finish */, + {{{55.79676, 37.54138}, {55.79914, 37.53582}, {55.80353, 37.52478}, - {55.80556, 37.52770}}; - first.m_factor = 1.0; - candidates.emplace_back(move(first)); - - TEST_EQUAL(CheckWaypoints(move(params), move(candidates)), 1.0, ()); -} - -UNIT_TEST(RoutingQuality_Zelegonrad2Domodedovo) -{ - // From Zelenograd to Domodedovo. - RouteParams params; - params.m_waypoints = {{55.98301, 37.21141}, - {55.42081, 37.89361}}; - - ReferenceRoutes candidates; - - // Through M-11 and MKAD. - ReferenceRoute first; - first.m_waypoints = {{55.99751, 37.23804}, - {56.00719, 37.28533}, - {55.88759, 37.48068}, - {55.83513, 37.39569}, - {55.57103, 37.69203}}; - first.m_factor = 1.0; - candidates.emplace_back(move(first)); - - // Through M-10 and MKAD. - ReferenceRoute second; - second.m_waypoints = {{55.99775, 37.24941}, - {55.88627, 37.43915}, - {55.86882, 37.40784}, - {55.58645, 37.71672}, - {55.57855, 37.75468}}; - second.m_factor = 1.0; - candidates.emplace_back(move(second)); - - // Through M-10 and Moscow center. - ReferenceRoute third; - third.m_waypoints = {{55.98974, 37.26966}, - {55.87625, 37.45129}, - {55.78288, 37.57118}, - {55.76092, 37.60087}, - {55.75662, 37.59861}, - {55.74976, 37.60654}, - {55.73173, 37.62060}, - {55.71785, 37.62237}, - {55.65615, 37.64623}, - {55.57855, 37.75468}}; - third.m_factor = 1.0; - - // Through M-10 and Sadovoe ring. - ReferenceRoute fourth; - third.m_waypoints = {{55.98974, 37.26966}, - {55.78288, 37.57118}, - {55.73677, 37.59012}, - {55.71785, 37.62237}, - {55.57855, 37.75468}}; - candidates.emplace_back(move(third)); - - TEST_EQUAL(CheckWaypoints(move(params), move(candidates)), 1.0, ()); + {55.80556, 37.52770}}} /* reference track */), + ()); } UNIT_TEST(RoutingQuality_Sokol2Mayakovskaya) diff --git a/routing/routing_quality/waypoints.cpp b/routing/routing_quality/waypoints.cpp index 7744838759..53e068a2d2 100644 --- a/routing/routing_quality/waypoints.cpp +++ b/routing/routing_quality/waypoints.cpp @@ -59,4 +59,28 @@ Similarity CheckWaypoints(RouteParams && params, ReferenceRoutes && candidates) { return metrics::CompareByNumberOfMatchedWaypoints(GetRouteFollowedPolyline(move(params)), move(candidates)); } + +bool CheckRoute(routing::VehicleType type, ms::LatLon const & start, ms::LatLon const & finish, + vector && referenceTracks) +{ + RouteParams params; + params.m_waypoints = {start, finish}; + params.m_type = type; + + ReferenceRoutes candidates(referenceTracks.size()); + + for (size_t i = 0; i < candidates.size(); ++i) + { + candidates[i].m_factor = 1.0; + candidates[i].m_waypoints = move(referenceTracks[i]); + } + + return CheckWaypoints(move(params), move(candidates)) == 1.0; +} + +bool CheckCarRoute(ms::LatLon const & start, ms::LatLon const & finish, + std::vector && referenceTracks) +{ + return CheckRoute(routing::VehicleType::Car, start, finish, move(referenceTracks)); +} } // namespace routing_quality diff --git a/routing/routing_quality/waypoints.hpp b/routing/routing_quality/waypoints.hpp index f97a1b3c7b..2e28d774c9 100644 --- a/routing/routing_quality/waypoints.hpp +++ b/routing/routing_quality/waypoints.hpp @@ -13,18 +13,25 @@ struct RouteParams; struct ReferenceRoute { - /// Waypoints which the route passes through. + /// \brief Waypoints which the route passes through. Coordinates m_waypoints; - /// Value in range (0.0; 1.0] which indicates how desirable the route is. + /// \brief Value in range (0.0; 1.0] which indicates how desirable the route is. double m_factor = 1.0; }; -/// There can be more than one reference route. +/// \brief There can be more than one reference route. using ReferenceRoutes = std::vector; using Similarity = double; -/// Checks how many reference waypoints the route contains. -/// Returns normalized value in range [0.0; 1.0]. +/// \brief Checks how many reference waypoints the route contains. +/// \returns normalized value in range [0.0; 1.0]. Similarity CheckWaypoints(RouteParams && params, ReferenceRoutes && candidates); + +/// \returns true if route from |start| to |finish| fully conforms one of |candidates| +/// and false otherwise. +bool CheckRoute(routing::VehicleType type, ms::LatLon const & start, ms::LatLon const & finish, + std::vector && referenceTracks); +bool CheckCarRoute(ms::LatLon const & start, ms::LatLon const & finish, + std::vector && referenceTracks); } // namespace routing_quality