Fix parameter parsing tests

This commit is contained in:
Patrick Niklaus
2016-02-13 04:23:59 +01:00
parent 83addd6bba
commit 64e5ebb55f
10 changed files with 227 additions and 103 deletions
+35
View File
@@ -0,0 +1,35 @@
#ifndef SERVER_API_ROUTE_PARAMETERS_PARSER_HPP
#define SERVER_API_ROUTE_PARAMETERS_PARSER_HPP
#include "engine/api/route_parameters.hpp"
#include "engine/api/table_parameters.hpp"
namespace osrm
{
namespace server
{
namespace api
{
// Starts parsing and iter and modifies it until iter == end or parsing failed
template<typename ParameterT>
boost::optional<ParameterT> parseParameters(std::string::iterator& iter, std::string::iterator end);
// copy on purpose because we need mutability
template<typename ParameterT>
inline boost::optional<ParameterT> parseParameters(std::string options_string)
{
auto iter = options_string.begin();
return parseParameters<ParameterT>(iter, options_string.end());
}
template<>
boost::optional<engine::api::RouteParameters> parseParameters(std::string::iterator& iter, std::string::iterator end);
template<>
boost::optional<engine::api::TableParameters> parseParameters(std::string::iterator& iter, std::string::iterator end);
}
}
}
#endif
+10 -10
View File
@@ -29,40 +29,40 @@ struct RouteParametersGrammar : public BaseParametersGrammar
using UturnsT = std::vector<boost::optional<bool>>;
RouteParametersGrammar()
: BaseParametersGrammar(root_rule, route_parameters)
: BaseParametersGrammar(root_rule, parameters)
{
const auto set_geojson_type = [this]()
{
route_parameters.geometries = engine::api::RouteParameters::GeometriesType::GeoJSON;
parameters.geometries = engine::api::RouteParameters::GeometriesType::GeoJSON;
};
const auto set_polyline_type = [this]()
{
route_parameters.geometries = engine::api::RouteParameters::GeometriesType::Polyline;
parameters.geometries = engine::api::RouteParameters::GeometriesType::Polyline;
};
const auto set_simplified_type = [this]()
{
route_parameters.overview = engine::api::RouteParameters::OverviewType::Simplified;
parameters.overview = engine::api::RouteParameters::OverviewType::Simplified;
};
const auto set_full_type = [this]()
{
route_parameters.overview = engine::api::RouteParameters::OverviewType::Full;
parameters.overview = engine::api::RouteParameters::OverviewType::Full;
};
const auto set_false_type = [this]()
{
route_parameters.overview = engine::api::RouteParameters::OverviewType::False;
parameters.overview = engine::api::RouteParameters::OverviewType::False;
};
const auto set_steps = [this](const StepsT steps)
{
route_parameters.steps = steps;
parameters.steps = steps;
};
const auto set_alternative = [this](const AlternativeT alternative)
{
route_parameters.alternative = alternative;
parameters.alternative = alternative;
};
const auto set_uturns = [this](UturnsT &uturns)
{
route_parameters.uturns = std::move(uturns);
parameters.uturns = std::move(uturns);
};
alternative_rule = qi::lit("alternative=") >> qi::bool_;
@@ -78,7 +78,7 @@ struct RouteParametersGrammar : public BaseParametersGrammar
root_rule = -((base_rule | route_rule) % '&');
}
engine::api::RouteParameters route_parameters;
engine::api::RouteParameters parameters;
private:
qi::rule<Iterator> root_rule, route_rule, geometries_rule, overview_rule;
qi::rule<Iterator, UturnsT()> uturns_rule;
@@ -1,28 +0,0 @@
#ifndef SERVER_API_ROUTE_PARAMETERS_PARSER_HPP
#define SERVER_API_ROUTE_PARAMETERS_PARSER_HPP
#include "engine/api/route_parameters.hpp"
#include "server/api/route_parameters_parser.hpp"
namespace osrm
{
namespace server
{
namespace api
{
// Starts parsing and iter and modifies it until iter == end or parsing failed
boost::optional<engine::api::RouteParameters> parseRouteParameters(std::string::iterator& iter, std::string::iterator end);
// copy on purpose because we need mutability
inline boost::optional<engine::api::RouteParameters> parseRouteParameters(std::string options_string)
{
auto iter = options_string.begin();
return parseRouteParameters(iter, options_string.end());
}
}
}
}
#endif
@@ -0,0 +1,55 @@
#ifndef TABLE_PARAMETERS_GRAMMAR_HPP
#define TABLE_PARAMETERS_GRAMMAR_HPP
#include "engine/api/table_parameters.hpp"
#include "server/api/base_parameters_grammar.hpp"
#include <boost/spirit/include/qi_lit.hpp>
#include <boost/spirit/include/qi_uint.hpp>
#include <boost/spirit/include/qi_grammar.hpp>
#include <boost/spirit/include/qi_action.hpp>
#include <boost/spirit/include/qi_optional.hpp>
namespace osrm
{
namespace server
{
namespace api
{
namespace qi = boost::spirit::qi;
struct TableParametersGrammar : public BaseParametersGrammar
{
using Iterator = std::string::iterator;
using SourcesT = std::vector<std::size_t>;
using DestinationsT = std::vector<std::size_t>;
TableParametersGrammar() : BaseParametersGrammar(root_rule, parameters)
{
const auto set_destiantions = [this](DestinationsT &dests)
{
parameters.destinations = std::move(dests);
};
const auto set_sources = [this](SourcesT &sources)
{
parameters.sources = std::move(sources);
};
destinations_rule = qi::lit("destinations=") >> -qi::uint_ % ";";
sources_rule = qi::lit("sources=") >> -qi::uint_ % ";";
table_rule = destinations_rule[set_destiantions] | sources_rule[set_sources];
root_rule = -((base_rule | table_rule) % '&');
}
engine::api::TableParameters parameters;
private:
qi::rule<Iterator> root_rule, table_rule;
qi::rule<Iterator, SourcesT()> sources_rule;
qi::rule<Iterator, DestinationsT()> destinations_rule;
};
}
}
}
#endif