Add viaroute suport for new API
This commit is contained in:
@@ -0,0 +1,168 @@
|
||||
#include "server/api/route_parameters_parser.hpp"
|
||||
|
||||
#include <fstream>
|
||||
|
||||
namespace osrm
|
||||
{
|
||||
namespace engine
|
||||
{
|
||||
namespace api
|
||||
{
|
||||
std::ostream &operator<<(std::ostream &out, api::RouteParameters::GeometriesType geometries)
|
||||
{
|
||||
switch (geometries)
|
||||
{
|
||||
case api::RouteParameters::GeometriesType::GeoJSON:
|
||||
out << "GeoJSON";
|
||||
break;
|
||||
case api::RouteParameters::GeometriesType::Polyline:
|
||||
out << "Polyline";
|
||||
break;
|
||||
default:
|
||||
BOOST_ASSERT_MSG(false, "GeometriesType not fully captured");
|
||||
}
|
||||
return out;
|
||||
}
|
||||
std::ostream &operator<<(std::ostream &out, api::RouteParameters::OverviewType overview)
|
||||
{
|
||||
switch (overview)
|
||||
{
|
||||
case api::RouteParameters::OverviewType::False:
|
||||
out << "False";
|
||||
break;
|
||||
case api::RouteParameters::OverviewType::Full:
|
||||
out << "Full";
|
||||
break;
|
||||
case api::RouteParameters::OverviewType::Simplified:
|
||||
out << "Simplified";
|
||||
break;
|
||||
default:
|
||||
BOOST_ASSERT_MSG(false, "OverviewType not fully captured");
|
||||
}
|
||||
return out;
|
||||
}
|
||||
std::ostream &operator<<(std::ostream &out, api::RouteParameters::Bearing bearing)
|
||||
{
|
||||
out << bearing.bearing << "," << bearing.range;
|
||||
return out;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#include <boost/test/unit_test.hpp>
|
||||
#include <boost/test/test_tools.hpp>
|
||||
#include <boost/optional/optional_io.hpp>
|
||||
|
||||
#define CHECK_EQUAL_RANGE(R1, R2) \
|
||||
BOOST_CHECK_EQUAL_COLLECTIONS(R1.begin(), R1.end(), R2.begin(), R2.end());
|
||||
|
||||
BOOST_AUTO_TEST_SUITE(api_route_parameters_parser)
|
||||
|
||||
using namespace osrm;
|
||||
using namespace osrm::server;
|
||||
|
||||
// returns distance to front
|
||||
std::size_t testInvalidOptions(std::string options)
|
||||
{
|
||||
auto iter = options.begin();
|
||||
auto result = api::parseRouteParameters(iter, options.end());
|
||||
BOOST_CHECK(!result);
|
||||
return std::distance(options.begin(), iter);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(invalid_urls)
|
||||
{
|
||||
BOOST_CHECK_EQUAL(testInvalidOptions("overview=false&bla=foo"), 14UL);
|
||||
BOOST_CHECK_EQUAL(testInvalidOptions("overview=false&bearings=foo"), 24UL);
|
||||
BOOST_CHECK_EQUAL(testInvalidOptions("overview=false&uturns=foo"), 22UL);
|
||||
BOOST_CHECK_EQUAL(testInvalidOptions("overview=false&radiuses=foo"), 24UL);
|
||||
BOOST_CHECK_EQUAL(testInvalidOptions("overview=false&hints=foo"), 14UL);
|
||||
BOOST_CHECK_EQUAL(testInvalidOptions("overview=false&geometries=foo"), 14UL);
|
||||
BOOST_CHECK_EQUAL(testInvalidOptions("overview=false&overview=foo"), 14UL);
|
||||
BOOST_CHECK_EQUAL(testInvalidOptions("overview=false&alternative=foo"), 14UL);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(valid_urls)
|
||||
{
|
||||
engine::api::RouteParameters reference_1{};
|
||||
auto result_1 = api::parseRouteParameters("");
|
||||
BOOST_CHECK(result_1);
|
||||
BOOST_CHECK_EQUAL(reference_1.steps, result_1->steps);
|
||||
BOOST_CHECK_EQUAL(reference_1.alternative, result_1->alternative);
|
||||
BOOST_CHECK_EQUAL(reference_1.geometries, result_1->geometries);
|
||||
BOOST_CHECK_EQUAL(reference_1.overview, result_1->overview);
|
||||
CHECK_EQUAL_RANGE(reference_1.uturns, result_1->uturns);
|
||||
CHECK_EQUAL_RANGE(reference_1.bearings, result_1->bearings);
|
||||
CHECK_EQUAL_RANGE(reference_1.radiuses, result_1->radiuses);
|
||||
CHECK_EQUAL_RANGE(reference_1.coordinates, result_1->coordinates);
|
||||
|
||||
// bool steps = true;
|
||||
// bool alternative = true;
|
||||
// GeometriesType geometries = GeometriesType::Polyline;
|
||||
// OverviewType overview = OverviewType::False;
|
||||
// std::vector<boost::optional<bool>> uturns;
|
||||
|
||||
engine::api::RouteParameters reference_2{};
|
||||
auto result_2 = api::parseRouteParameters(
|
||||
"steps=true&alternative=true&geometries=polyline&overview=simplified");
|
||||
BOOST_CHECK(result_2);
|
||||
BOOST_CHECK_EQUAL(reference_2.steps, result_2->steps);
|
||||
BOOST_CHECK_EQUAL(reference_2.alternative, result_2->alternative);
|
||||
BOOST_CHECK_EQUAL(reference_2.geometries, result_2->geometries);
|
||||
BOOST_CHECK_EQUAL(reference_2.overview, result_2->overview);
|
||||
CHECK_EQUAL_RANGE(reference_2.uturns, result_2->uturns);
|
||||
CHECK_EQUAL_RANGE(reference_2.bearings, result_2->bearings);
|
||||
CHECK_EQUAL_RANGE(reference_2.radiuses, result_2->radiuses);
|
||||
CHECK_EQUAL_RANGE(reference_2.coordinates, result_2->coordinates);
|
||||
|
||||
std::vector<boost::optional<bool>> uturns_3 = {true, false, boost::none};
|
||||
engine::api::RouteParameters reference_3{
|
||||
false, false, engine::api::RouteParameters::GeometriesType::GeoJSON,
|
||||
engine::api::RouteParameters::OverviewType::False, uturns_3};
|
||||
auto result_3 = api::parseRouteParameters(
|
||||
"steps=false&alternative=false&geometries=geojson&overview=false&uturns=true;false;");
|
||||
BOOST_CHECK(result_3);
|
||||
BOOST_CHECK_EQUAL(reference_3.steps, result_3->steps);
|
||||
BOOST_CHECK_EQUAL(reference_3.alternative, result_3->alternative);
|
||||
BOOST_CHECK_EQUAL(reference_3.geometries, result_3->geometries);
|
||||
BOOST_CHECK_EQUAL(reference_3.overview, result_3->overview);
|
||||
CHECK_EQUAL_RANGE(reference_3.uturns, result_3->uturns);
|
||||
CHECK_EQUAL_RANGE(reference_3.bearings, result_3->bearings);
|
||||
CHECK_EQUAL_RANGE(reference_3.radiuses, result_3->radiuses);
|
||||
CHECK_EQUAL_RANGE(reference_3.coordinates, result_3->coordinates);
|
||||
|
||||
std::vector<boost::optional<engine::Hint>> hints_4 = {
|
||||
engine::Hint::FromBase64(
|
||||
"rVghAzxMzABMAwAA5h4CAKMIAAAQAAAAGAAAAAYAAAAAAAAAch8BAJ4AAACpWCED_0vMAAEAAQGLSzmR"),
|
||||
engine::Hint::FromBase64(
|
||||
"_4ghA4JuzAD_IAAAo28BAOYAAAAzAAAAAgAAAEwAAAAAAAAAdIwAAJ4AAAAXiSEDfm7MAAEAAQGLSzmR"),
|
||||
engine::Hint::FromBase64(
|
||||
"03AhA0vnzAA_SAAA_____3wEAAAYAAAAQAAAAB4AAABAAAAAoUYBAJ4AAADlcCEDSefMAAMAAQGLSzmR")};
|
||||
engine::api::RouteParameters reference_4{false,
|
||||
true,
|
||||
engine::api::RouteParameters::GeometriesType::Polyline,
|
||||
engine::api::RouteParameters::OverviewType::Simplified,
|
||||
std::vector<boost::optional<bool>>{},
|
||||
std::vector<util::FixedPointCoordinate>{},
|
||||
hints_4,
|
||||
std::vector<boost::optional<double>>{},
|
||||
std::vector<boost::optional<engine::api::BaseParameters::Bearing>>{}
|
||||
};
|
||||
auto result_4 = api::parseRouteParameters(
|
||||
"steps=false&hints=rVghAzxMzABMAwAA5h4CAKMIAAAQAAAAGAAAAAYAAAAAAAAAch8BAJ4AAACpWCED_"
|
||||
"0vMAAEAAQGLSzmR;_4ghA4JuzAD_"
|
||||
"IAAAo28BAOYAAAAzAAAAAgAAAEwAAAAAAAAAdIwAAJ4AAAAXiSEDfm7MAAEAAQGLSzmR;03AhA0vnzAA_SAAA_____"
|
||||
"3wEAAAYAAAAQAAAAB4AAABAAAAAoUYBAJ4AAADlcCEDSefMAAMAAQGLSzmR");
|
||||
BOOST_CHECK(result_3);
|
||||
BOOST_CHECK_EQUAL(reference_4.steps, result_4->steps);
|
||||
BOOST_CHECK_EQUAL(reference_4.alternative, result_4->alternative);
|
||||
BOOST_CHECK_EQUAL(reference_4.geometries, result_4->geometries);
|
||||
BOOST_CHECK_EQUAL(reference_4.overview, result_4->overview);
|
||||
CHECK_EQUAL_RANGE(reference_4.uturns, result_4->uturns);
|
||||
CHECK_EQUAL_RANGE(reference_4.bearings, result_4->bearings);
|
||||
CHECK_EQUAL_RANGE(reference_4.radiuses, result_4->radiuses);
|
||||
CHECK_EQUAL_RANGE(reference_4.coordinates, result_4->coordinates);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
@@ -0,0 +1,110 @@
|
||||
#include "server/api/url_parser.hpp"
|
||||
|
||||
#include <fstream>
|
||||
|
||||
// needed for BOOST_CHECK_EQUAL
|
||||
namespace osrm
|
||||
{
|
||||
namespace server
|
||||
{
|
||||
namespace api
|
||||
{
|
||||
std::ostream& operator<<(std::ostream& out, const osrm::server::api::ParsedURL& url)
|
||||
{
|
||||
out << url.service << ", " << url.version << ", " << url.profile << ", ";
|
||||
for (auto c : url.coordinates)
|
||||
{
|
||||
out << c << " ";
|
||||
}
|
||||
out << ", " << url.options;
|
||||
|
||||
return out;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#include <boost/test/unit_test.hpp>
|
||||
#include <boost/test/test_tools.hpp>
|
||||
|
||||
#define CHECK_EQUAL_RANGE(R1, R2) \
|
||||
BOOST_CHECK_EQUAL_COLLECTIONS(R1.begin(), R1.end(), R2.begin(), R2.end());
|
||||
|
||||
BOOST_AUTO_TEST_SUITE(api_url_parser)
|
||||
|
||||
using namespace osrm;
|
||||
using namespace osrm::server;
|
||||
|
||||
// returns distance to front
|
||||
std::size_t testInvalidURL(std::string url)
|
||||
{
|
||||
auto iter = url.begin();
|
||||
auto result = api::parseURL(iter, url.end());
|
||||
BOOST_CHECK(!result);
|
||||
return std::distance(url.begin(), iter);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(invalid_urls)
|
||||
{
|
||||
BOOST_CHECK_EQUAL(testInvalidURL("/route/"), 0UL);
|
||||
BOOST_CHECK_EQUAL(testInvalidURL("/route/bla"), 0UL);
|
||||
BOOST_CHECK_EQUAL(testInvalidURL("/route/1/1,2;3;4"), 0UL);
|
||||
BOOST_CHECK_EQUAL(testInvalidURL("/route/v1/pro_file/1,2;3,4"), 0UL);
|
||||
BOOST_CHECK_EQUAL(testInvalidURL("/route/v1/profile"), 0UL);
|
||||
BOOST_CHECK_EQUAL(testInvalidURL("/route/v1/profile/"), 0UL);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(valid_urls)
|
||||
{
|
||||
std::vector<util::FixedPointCoordinate> coords_1 = {
|
||||
// lat,lon
|
||||
util::FixedPointCoordinate(1 * COORDINATE_PRECISION, 0 * COORDINATE_PRECISION),
|
||||
util::FixedPointCoordinate(3 * COORDINATE_PRECISION, 2 * COORDINATE_PRECISION),
|
||||
util::FixedPointCoordinate(5 * COORDINATE_PRECISION, 4 * COORDINATE_PRECISION),
|
||||
};
|
||||
api::ParsedURL reference_1{"route", 1, "profile", coords_1, "options=value&foo=bar"};
|
||||
auto result_1 = api::parseURL("/route/v1/profile/0,1;2,3;4,5?options=value&foo=bar");
|
||||
BOOST_CHECK(result_1);
|
||||
BOOST_CHECK_EQUAL(reference_1.service, result_1->service);
|
||||
BOOST_CHECK_EQUAL(reference_1.version, result_1->version);
|
||||
BOOST_CHECK_EQUAL(reference_1.profile, result_1->profile);
|
||||
CHECK_EQUAL_RANGE(reference_1.coordinates, result_1->coordinates);
|
||||
BOOST_CHECK_EQUAL(reference_1.options, result_1->options);
|
||||
|
||||
// no options
|
||||
api::ParsedURL reference_2{"route", 1, "profile", coords_1, ""};
|
||||
auto result_2 = api::parseURL("/route/v1/profile/0,1;2,3;4,5");
|
||||
BOOST_CHECK(result_2);
|
||||
BOOST_CHECK_EQUAL(reference_2.service, result_2->service);
|
||||
BOOST_CHECK_EQUAL(reference_2.version, result_2->version);
|
||||
BOOST_CHECK_EQUAL(reference_2.profile, result_2->profile);
|
||||
CHECK_EQUAL_RANGE(reference_2.coordinates, result_2->coordinates);
|
||||
BOOST_CHECK_EQUAL(reference_2.options, result_2->options);
|
||||
|
||||
// one coordinate
|
||||
std::vector<util::FixedPointCoordinate> coords_3 = {
|
||||
// lat,lon
|
||||
util::FixedPointCoordinate(1 * COORDINATE_PRECISION, 0 * COORDINATE_PRECISION),
|
||||
};
|
||||
api::ParsedURL reference_3{"route", 1, "profile", coords_3, ""};
|
||||
auto result_3 = api::parseURL("/route/v1/profile/0,1");
|
||||
BOOST_CHECK(result_3);
|
||||
BOOST_CHECK_EQUAL(reference_3.service, result_3->service);
|
||||
BOOST_CHECK_EQUAL(reference_3.version, result_3->version);
|
||||
BOOST_CHECK_EQUAL(reference_3.profile, result_3->profile);
|
||||
CHECK_EQUAL_RANGE(reference_3.coordinates, result_3->coordinates);
|
||||
BOOST_CHECK_EQUAL(reference_3.options, result_3->options);
|
||||
|
||||
// polyline
|
||||
api::ParsedURL reference_5{"route", 1, "profile", coords_1, ""};
|
||||
auto result_5 = api::parseURL("/route/v1/profile/polyline(_ibE?_seK_seK_seK_seK)?");
|
||||
BOOST_CHECK(result_5);
|
||||
BOOST_CHECK_EQUAL(reference_5.service, result_5->service);
|
||||
BOOST_CHECK_EQUAL(reference_5.version, result_5->version);
|
||||
BOOST_CHECK_EQUAL(reference_5.profile, result_5->profile);
|
||||
CHECK_EQUAL_RANGE(reference_5.coordinates, result_5->coordinates);
|
||||
BOOST_CHECK_EQUAL(reference_5.options, result_5->options);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
Reference in New Issue
Block a user