match_tests.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. /*=============================================================================
  2. Copyright (c) 1998-2003 Joel de Guzman
  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. #include <iostream>
  9. #include <boost/detail/lightweight_test.hpp>
  10. #include <string>
  11. using namespace std;
  12. #include <boost/spirit/include/classic_core.hpp>
  13. using namespace BOOST_SPIRIT_CLASSIC_NS;
  14. ///////////////////////////////////////////////////////////////////////////////
  15. //
  16. // Match tests
  17. //
  18. ///////////////////////////////////////////////////////////////////////////////
  19. struct X {};
  20. struct Y { Y(int) {} }; // not default constructible
  21. struct Z { Z(double n):n(n){} double n; }; // implicitly convertible from double
  22. void
  23. match_tests()
  24. {
  25. match<> m0;
  26. BOOST_TEST(!m0.has_valid_attribute());
  27. match<int> m1(m0);
  28. m1.value(123);
  29. BOOST_TEST(m1.has_valid_attribute());
  30. BOOST_TEST(m1.value() == 123);
  31. match<double> m2(m1);
  32. BOOST_TEST(m2.has_valid_attribute());
  33. BOOST_TEST(m1.value() == int(m2.value()));
  34. m2.value(456);
  35. *&m0 = m0; // match<nil> = match<nil>
  36. m0 = m1; // match<nil> = match<int>
  37. m0 = m2; // match<nil> = match<double>
  38. m1 = m0; // match<int> = match<nil>
  39. BOOST_TEST(!m1);
  40. BOOST_TEST(!m1.has_valid_attribute());
  41. *&m1 = m1; // match<int> = match<int>
  42. m1.value(int(m2.value()));
  43. BOOST_TEST(m1.has_valid_attribute());
  44. BOOST_TEST(m1.value() == int(m2.value()));
  45. m2.value(123.456);
  46. match<Z> mz(m2); // copy from match<double>
  47. mz = m2; // assign from match<double>
  48. BOOST_TEST(mz.value().n == 123.456);
  49. m1.value(123);
  50. m2 = m0;
  51. BOOST_TEST(!m2);
  52. BOOST_TEST(!m2.has_valid_attribute());
  53. m2 = m1; // match<double> = match<int>
  54. BOOST_TEST(m2.has_valid_attribute());
  55. BOOST_TEST(m1.value() == int(m2.value()));
  56. *&m2 = m2; // match<double> = match<double>
  57. cout << "sizeof(int) == " << sizeof(int) << '\n';
  58. cout << "sizeof(match<>) == " << sizeof(m0) << '\n';
  59. cout << "sizeof(match<int>) == " << sizeof(m1) << '\n';
  60. cout << "sizeof(match<double>) == " << sizeof(m2) << '\n';
  61. match<int&> mr;
  62. BOOST_TEST(!mr.has_valid_attribute());
  63. match<int&> mrr(4);
  64. BOOST_TEST(!mrr.has_valid_attribute());
  65. int ri = 3;
  66. match<int&> mr2(4, ri);
  67. BOOST_TEST(mr2.has_valid_attribute());
  68. mr = mr2;
  69. BOOST_TEST(mr.has_valid_attribute());
  70. match<int&> mr3(mrr);
  71. BOOST_TEST(!mr3.has_valid_attribute());
  72. mr2 = mr3;
  73. BOOST_TEST(!mr2.has_valid_attribute());
  74. match<X> mx;
  75. m1 = mx;
  76. m0 = mx;
  77. BOOST_TEST(!mx.has_valid_attribute());
  78. BOOST_TEST(!m0.has_valid_attribute());
  79. BOOST_TEST(!m1.has_valid_attribute());
  80. match<Y> my;
  81. BOOST_TEST(!my.has_valid_attribute());
  82. match<std::string> ms;
  83. BOOST_TEST(!ms.has_valid_attribute());
  84. ms.value("Kimpo Ponchwayla");
  85. BOOST_TEST(ms.has_valid_attribute());
  86. BOOST_TEST(ms.value() == "Kimpo Ponchwayla");
  87. ms = match<>();
  88. BOOST_TEST(!ms.has_valid_attribute());
  89. // let's try a match with a reference:
  90. int i;
  91. match<int&> mr4(4, i);
  92. BOOST_TEST(mr4.has_valid_attribute());
  93. mr4.value(3);
  94. BOOST_TEST(mr4.value() == 3);
  95. BOOST_TEST(i == 3);
  96. (void)i;
  97. int x = 456;
  98. match<int&> mref(1, x);
  99. BOOST_TEST(mref.value() == 456);
  100. mref.value(123);
  101. BOOST_TEST(mref.value() == 123);
  102. x = mref.value();
  103. BOOST_TEST(x == 123);
  104. mref.value() = 986;
  105. BOOST_TEST(x == 986);
  106. std::string s("hello");
  107. match<int> mint(1, x);
  108. BOOST_TEST(mint.value() == x);
  109. match<std::string> mstr(1, s);
  110. BOOST_TEST(mstr.value() == "hello");
  111. mstr = mint;
  112. mint = mstr;
  113. }
  114. ///////////////////////////////////////////////////////////////////////////////
  115. //
  116. // Match Policy tests
  117. //
  118. ///////////////////////////////////////////////////////////////////////////////
  119. void
  120. match_policy_tests()
  121. {
  122. match<> m0;
  123. match<int> m1;
  124. match<double> m2;
  125. match_policy mp;
  126. m0 = mp.no_match(); BOOST_TEST(!m0);
  127. m1 = mp.no_match(); BOOST_TEST(!m1);
  128. m0 = mp.empty_match(); BOOST_TEST(!!m0);
  129. m2 = mp.empty_match(); BOOST_TEST(!!m2);
  130. m1 = mp.create_match(5, 100, 0, 0);
  131. m2 = mp.create_match(5, 10.5, 0, 0);
  132. mp.concat_match(m1, m2);
  133. BOOST_TEST(m1.length() == 10);
  134. }
  135. ///////////////////////////////////////////////////////////////////////////////
  136. //
  137. // Main
  138. //
  139. ///////////////////////////////////////////////////////////////////////////////
  140. int
  141. main()
  142. {
  143. match_tests();
  144. match_policy_tests();
  145. return boost::report_errors();
  146. }