assign_key_test.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. /*=============================================================================
  2. Copyright (c) 2003 Jonathan de Halleux (dehalleux@pelikhan.com)
  3. http://spirit.sourceforge.net/
  4. Use, modification and distribution is subject to the Boost Software
  5. License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  6. http://www.boost.org/LICENSE_1_0.txt)
  7. =============================================================================*/
  8. ///////////////////////////////////////////////////////////////////////////////
  9. // Test suite for assign_key_actor
  10. ///////////////////////////////////////////////////////////////////////////////
  11. #include "action_tests.hpp"
  12. #include <boost/spirit/include/classic_core.hpp>
  13. #include <boost/spirit/include/classic_confix.hpp>
  14. #include <boost/spirit/include/classic_lists.hpp>
  15. #include <map>
  16. #include <cstring>
  17. #include <iostream>
  18. #include <boost/spirit/include/classic_assign_key_actor.hpp>
  19. #include <boost/spirit/include/classic_assign_actor.hpp>
  20. void assign_key_single_argument_test()
  21. {
  22. using namespace BOOST_SPIRIT_CLASSIC_NS;
  23. const char* cp = "(one,0),(two,1),(three,2)";
  24. const char* cp_first = cp;
  25. const char* cp_last = cp + test_impl::string_length(cp);
  26. const char* cp_i[] = {"one","two","three"};
  27. int i;
  28. typedef std::map<int,std::string> map_string_type;
  29. map_string_type c;
  30. map_string_type::const_iterator it_find;
  31. std::string str;
  32. scanner<char const*> scan( cp_first, cp_last );
  33. match<> hit;
  34. hit = list_p(
  35. confix_p(
  36. '(',
  37. (*alpha_p)[ assign(str)]
  38. >>ch_p(',')
  39. >> int_p[ assign_key_a(c,str)]
  40. ,
  41. ')'
  42. )
  43. ,
  44. ch_p(',')
  45. ).parse(scan);
  46. BOOST_CHECK(hit);
  47. BOOST_CHECK_EQUAL(scan.first, scan.last);
  48. BOOST_CHECK_EQUAL( c.size(), static_cast<map_string_type::size_type>(3));
  49. for (i=0;i<3;++i)
  50. {
  51. it_find = c.find(i);
  52. BOOST_CHECK( it_find != c.end() );
  53. BOOST_CHECK_EQUAL( i,it_find->first);
  54. BOOST_CHECK_EQUAL( cp_i[i],it_find->second);
  55. }
  56. }
  57. void assign_key_two_arguments_test()
  58. {
  59. using namespace BOOST_SPIRIT_CLASSIC_NS;
  60. const char* cp = "(0,one),(1,two),(2,three)";
  61. const char* cp_first = cp;
  62. const char* cp_last = cp + test_impl::string_length(cp);
  63. const char* cp_i[] = {"one","two","three"};
  64. int i;
  65. typedef std::map<std::string, int> map_string_type;
  66. map_string_type c;
  67. map_string_type::const_iterator it_find;
  68. std::string str;
  69. scanner<char const*> scan( cp_first, cp_last );
  70. match<> hit;
  71. hit = list_p(
  72. confix_p(
  73. '(',
  74. int_p[ assign_a(i)]
  75. >>ch_p(',')
  76. >> (*alpha_p)[ assign_key_a(c,i)]
  77. ,
  78. ')'
  79. )
  80. ,
  81. ch_p(',')
  82. ).parse(scan);
  83. BOOST_CHECK(hit);
  84. BOOST_CHECK_EQUAL(scan.first, scan.last);
  85. BOOST_CHECK_EQUAL( c.size(), static_cast<map_string_type::size_type>(3));
  86. for (i=0;i<3;++i)
  87. {
  88. it_find = c.find(cp_i[i]);
  89. BOOST_CHECK( it_find != c.end() );
  90. BOOST_CHECK_EQUAL( i,it_find->second);
  91. BOOST_CHECK_EQUAL( cp_i[i],it_find->first);
  92. }
  93. scan.first = cp;
  94. }
  95. void assign_key_action_test()
  96. {
  97. assign_key_single_argument_test();
  98. assign_key_two_arguments_test();
  99. }