/*============================================================================= Copyright (c) 2001-2015 Joel de Guzman Copyright (c) 2001-2011 Hartmut Kaiser Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) =============================================================================*/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "test.hpp" namespace x3 = boost::spirit::x3; x3::rule> const pair_rule("pair"); x3::rule const string_rule("string"); auto const pair_rule_def = string_rule > x3::lit('=') > string_rule; auto const string_rule_def = x3::lexeme[*x3::alnum]; BOOST_SPIRIT_DEFINE(pair_rule, string_rule) template void test_map_support() { using spirit_test::test_attr; Container container; Container const compare {{"k1", "v1"}, {"k2", "v2"}}; auto const rule = pair_rule % x3::lit(','); BOOST_TEST(test_attr("k1=v1,k2=v2,k2=v3", rule, container)); BOOST_TEST(container.size() == 2); BOOST_TEST(container == compare); // test sequences parsing into containers auto const seq_rule = pair_rule >> ',' >> pair_rule >> ',' >> pair_rule; container.clear(); BOOST_TEST(test_attr("k1=v1,k2=v2,k2=v3", seq_rule, container)); // test parsing container into container auto const cic_rule = pair_rule >> +(',' >> pair_rule); container.clear(); BOOST_TEST(test_attr("k1=v1,k2=v2,k2=v3", cic_rule, container)); } template void test_multimap_support() { using spirit_test::test_attr; Container container; Container const compare {{"k1", "v1"}, {"k2", "v2"}, {"k2", "v3"}}; auto const rule = pair_rule % x3::lit(','); BOOST_TEST(test_attr("k1=v1,k2=v2,k2=v3", rule, container)); BOOST_TEST(container.size() == 3); BOOST_TEST(container == compare); // test sequences parsing into containers auto const seq_rule = pair_rule >> ',' >> pair_rule >> ',' >> pair_rule; container.clear(); BOOST_TEST(test_attr("k1=v1,k2=v2,k2=v3", seq_rule, container)); // test parsing container into container auto const cic_rule = pair_rule >> +(',' >> pair_rule); container.clear(); BOOST_TEST(test_attr("k1=v1,k2=v2,k2=v3", cic_rule, container)); } template void test_sequence_support() { using spirit_test::test_attr; Container container; Container const compare {"e1", "e2", "e2"}; auto const rule = string_rule % x3::lit(','); BOOST_TEST(test_attr("e1,e2,e2", rule, container)); BOOST_TEST(container.size() == 3); BOOST_TEST(container == compare); // test sequences parsing into containers auto const seq_rule = string_rule >> ',' >> string_rule >> ',' >> string_rule; container.clear(); BOOST_TEST(test_attr("e1,e2,e2", seq_rule, container)); // test parsing container into container auto const cic_rule = string_rule >> +(',' >> string_rule); container.clear(); BOOST_TEST(test_attr("e1,e2,e2", cic_rule, container)); } template void test_set_support() { using spirit_test::test_attr; Container container; Container const compare {"e1", "e2"}; auto const rule = string_rule % x3::lit(','); BOOST_TEST(test_attr("e1,e2,e2", rule, container)); BOOST_TEST(container.size() == 2); BOOST_TEST(container == compare); // test sequences parsing into containers auto const seq_rule = string_rule >> ',' >> string_rule >> ',' >> string_rule; container.clear(); BOOST_TEST(test_attr("e1,e2,e2", seq_rule, container)); // test parsing container into container auto const cic_rule = string_rule >> +(',' >> string_rule); container.clear(); BOOST_TEST(test_attr("e1,e2,e2", cic_rule, container)); } template void test_multiset_support() { using spirit_test::test_attr; Container container; Container const compare {"e1", "e2", "e2"}; auto const rule = string_rule % x3::lit(','); BOOST_TEST(test_attr("e1,e2,e2", rule, container)); BOOST_TEST(container.size() == 3); BOOST_TEST(container == compare); // test sequences parsing into containers auto const seq_rule = string_rule >> ',' >> string_rule >> ',' >> string_rule; container.clear(); BOOST_TEST(test_attr("e1,e2,e2", seq_rule, container)); // test parsing container into container auto const cic_rule = string_rule >> +(',' >> string_rule); container.clear(); BOOST_TEST(test_attr("e1,e2,e2", cic_rule, container)); } template void test_string_support() { using spirit_test::test_attr; Container container; Container const compare {"e1e2e2"}; auto const rule = string_rule % x3::lit(','); BOOST_TEST(test_attr("e1,e2,e2", rule, container)); BOOST_TEST(container.size() == 6); BOOST_TEST(container == compare); // test sequences parsing into containers auto const seq_rule = string_rule >> ',' >> string_rule >> ',' >> string_rule; container.clear(); BOOST_TEST(test_attr("e1,e2,e2", seq_rule, container)); // test parsing container into container auto const cic_rule = string_rule >> +(',' >> string_rule); container.clear(); BOOST_TEST(test_attr("e1,e2,e2", cic_rule, container)); } int main() { using x3::traits::is_associative; using x3::traits::is_reservable; static_assert(is_reservable>::value, "is_reservable problem"); static_assert(is_reservable::value, "is_reservable problem"); static_assert(is_reservable>::value, "is_reservable problem"); static_assert(is_reservable>::value, "is_reservable problem"); static_assert(is_reservable>::value, "is_reservable problem"); static_assert(is_reservable>::value, "is_reservable problem"); static_assert(is_reservable>::value, "is_reservable problem"); static_assert(is_reservable>::value, "is_reservable problem"); static_assert(is_reservable>::value, "is_reservable problem"); static_assert(is_reservable>::value, "is_reservable problem"); static_assert(!is_reservable>::value, "is_reservable problem"); static_assert(!is_reservable>::value, "is_reservable problem"); static_assert(!is_reservable>::value, "is_reservable problem"); static_assert(!is_reservable>::value, "is_reservable problem"); static_assert(!is_reservable>::value, "is_reservable problem"); static_assert(!is_reservable>::value, "is_reservable problem"); // ------------------------------------------------------------------ static_assert(is_associative>::value, "is_associative problem"); static_assert(is_associative>::value, "is_associative problem"); static_assert(is_associative>::value, "is_associative problem"); static_assert(is_associative>::value, "is_associative problem"); static_assert(is_associative>::value, "is_associative problem"); static_assert(is_associative>::value, "is_associative problem"); static_assert(is_associative>::value, "is_associative problem"); static_assert(is_associative>::value, "is_associative problem"); static_assert(is_associative>::value, "is_associative problem"); static_assert(is_associative>::value, "is_associative problem"); static_assert(is_associative>::value, "is_associative problem"); static_assert(is_associative>::value, "is_associative problem"); static_assert(!is_associative>::value, "is_associative problem"); static_assert(!is_associative::value, "is_associative problem"); static_assert(!is_associative>::value, "is_associative problem"); static_assert(!is_associative>::value, "is_associative problem"); // ------------------------------------------------------------------ test_string_support(); test_sequence_support>(); test_sequence_support>(); test_sequence_support>(); test_set_support>(); test_set_support>(); test_set_support>(); test_multiset_support>(); test_multiset_support>(); test_multiset_support>(); test_map_support>(); test_map_support>(); test_map_support>(); test_multimap_support>(); test_multimap_support>(); test_multimap_support>(); return boost::report_errors(); }