Skip to content

Commit

Permalink
add grammar parsing
Browse files Browse the repository at this point in the history
  • Loading branch information
karenzshea committed Dec 11, 2017
1 parent 43da8dd commit ea432ae
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 0 deletions.
17 changes: 17 additions & 0 deletions include/server/api/match_parameter_grammar.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,17 +28,32 @@ struct MatchParametersGrammar final : public RouteParametersGrammar<Iterator, Si

MatchParametersGrammar() : BaseGrammar(root_rule)
{
#ifdef BOOST_HAS_LONG_LONG
if (std::is_same<std::size_t, unsigned long long>::value)
size_t_ = qi::ulong_long;
else
size_t_ = qi::ulong_;
#else
size_t_ = qi::ulong_;
#endif

timestamps_rule =
qi::lit("timestamps=") >
(qi::uint_ %
';')[ph::bind(&engine::api::MatchParameters::timestamps, qi::_r1) = qi::_1];

waypoints_rule =
qi::lit("waypoints=") >
(size_t_ %
';')[ph::bind(&engine::api::MatchParameters::waypoints, qi::_r1) = qi::_1];

gaps_type.add("split", engine::api::MatchParameters::GapsType::Split)(
"ignore", engine::api::MatchParameters::GapsType::Ignore);

root_rule =
BaseGrammar::query_rule(qi::_r1) > -qi::lit(".json") >
-('?' > (timestamps_rule(qi::_r1) | BaseGrammar::base_rule(qi::_r1) |
waypoints_rule(qi::_r1) |
(qi::lit("gaps=") >
gaps_type[ph::bind(&engine::api::MatchParameters::gaps, qi::_r1) = qi::_1]) |
(qi::lit("tidy=") >
Expand All @@ -49,6 +64,8 @@ struct MatchParametersGrammar final : public RouteParametersGrammar<Iterator, Si
private:
qi::rule<Iterator, Signature> root_rule;
qi::rule<Iterator, Signature> timestamps_rule;
qi::rule<Iterator, Signature> waypoints_rule;
qi::rule<Iterator, std::size_t()> size_t_;

qi::symbols<char, engine::api::MatchParameters::GapsType> gaps_type;
};
Expand Down
19 changes: 19 additions & 0 deletions unit_tests/server/parameters_parser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -532,6 +532,9 @@ BOOST_AUTO_TEST_CASE(valid_table_urls)
CHECK_EQUAL_RANGE(reference_1.coordinates, result_3->coordinates);
}

// TODO invalid_match_urls
// test for invalid waypoints values, e.g. 2.0, a, etc
// test for waypoint value that doesn't correspond with an input coordinate index
BOOST_AUTO_TEST_CASE(valid_match_urls)
{
std::vector<util::Coordinate> coords_1 = {{util::FloatLongitude{1}, util::FloatLatitude{2}},
Expand All @@ -557,6 +560,22 @@ BOOST_AUTO_TEST_CASE(valid_match_urls)
CHECK_EQUAL_RANGE(reference_2.radiuses, result_2->radiuses);
CHECK_EQUAL_RANGE(reference_2.approaches, result_2->approaches);
CHECK_EQUAL_RANGE(reference_2.coordinates, result_2->coordinates);

std::vector<util::Coordinate> coords_2 = {{util::FloatLongitude{1}, util::FloatLatitude{2}},
{util::FloatLongitude{3}, util::FloatLatitude{4}},
{util::FloatLongitude{5}, util::FloatLatitude{6}}};

MatchParameters reference_3{};
reference_3.coordinates = coords_2;
reference_3.waypoints = {0, 2};
auto result_3 = parseParameters<MatchParameters>("1,2;3,4;5,6?waypoints=0;2");
BOOST_CHECK(result_3);
CHECK_EQUAL_RANGE(reference_3.waypoints, result_3->waypoints);
CHECK_EQUAL_RANGE(reference_3.timestamps, result_3->timestamps);
CHECK_EQUAL_RANGE(reference_3.bearings, result_3->bearings);
CHECK_EQUAL_RANGE(reference_3.radiuses, result_3->radiuses);
CHECK_EQUAL_RANGE(reference_3.approaches, result_3->approaches);
CHECK_EQUAL_RANGE(reference_3.coordinates, result_3->coordinates);
}

BOOST_AUTO_TEST_CASE(valid_nearest_urls)
Expand Down

0 comments on commit ea432ae

Please sign in to comment.