difference.cpp 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. /*=============================================================================
  2. Copyright (c) 2001-2015 Joel de Guzman
  3. Distributed under the Boost Software License, Version 1.0. (See accompanying
  4. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  5. =============================================================================*/
  6. #include <boost/detail/lightweight_test.hpp>
  7. #include <boost/spirit/home/x3.hpp>
  8. #include <string>
  9. #include <iostream>
  10. #include "test.hpp"
  11. int
  12. main()
  13. {
  14. using boost::spirit::x3::ascii::char_;
  15. using boost::spirit::x3::ascii::space;
  16. using boost::spirit::x3::lit;
  17. using spirit_test::test;
  18. using spirit_test::test_attr;
  19. // Basic tests
  20. {
  21. BOOST_TEST(test("b", char_ - 'a'));
  22. BOOST_TEST(!test("a", char_ - 'a'));
  23. BOOST_TEST(test("/* abcdefghijk */", "/*" >> *(char_ - "*/") >> "*/"));
  24. BOOST_TEST(!test("switch", lit("switch") - "switch"));
  25. }
  26. // Test attributes
  27. {
  28. char attr;
  29. BOOST_TEST(test_attr("xg", (char_ - 'g') >> 'g', attr));
  30. BOOST_TEST(attr == 'x');
  31. }
  32. // Test handling of container attributes
  33. {
  34. std::string attr;
  35. BOOST_TEST(test_attr("abcdefg", *(char_ - 'g') >> 'g', attr));
  36. BOOST_TEST(attr == "abcdef");
  37. }
  38. {
  39. using boost::spirit::x3::_attr;
  40. std::string s;
  41. BOOST_TEST(test(
  42. "/*abcdefghijk*/"
  43. , "/*" >> *(char_ - "*/")[([&](auto& ctx){ s += _attr(ctx); })] >> "*/"
  44. ));
  45. BOOST_TEST(s == "abcdefghijk");
  46. s.clear();
  47. BOOST_TEST(test(
  48. " /*abcdefghijk*/"
  49. , "/*" >> *(char_ - "*/")[([&](auto& ctx){ s += _attr(ctx); })] >> "*/"
  50. , space
  51. ));
  52. BOOST_TEST(s == "abcdefghijk");
  53. }
  54. return boost::report_errors();
  55. }