binary.cpp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. /*=============================================================================
  2. Copyright (c) 2001-2011 Hartmut Kaiser
  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/include/support_argument.hpp>
  8. #include <boost/spirit/include/qi_binary.hpp>
  9. #include <boost/cstdint.hpp>
  10. #include <boost/predef/other/endian.h>
  11. #include "test.hpp"
  12. ///////////////////////////////////////////////////////////////////////////////
  13. int main()
  14. {
  15. using spirit_test::test_attr;
  16. using spirit_test::test;
  17. using spirit_test::binary_test;
  18. using spirit_test::binary_test_attr;
  19. using boost::spirit::qi::byte_;
  20. using boost::spirit::qi::word;
  21. using boost::spirit::qi::dword;
  22. using boost::spirit::qi::big_word;
  23. using boost::spirit::qi::big_dword;
  24. using boost::spirit::qi::little_word;
  25. using boost::spirit::qi::little_dword;
  26. #ifdef BOOST_HAS_LONG_LONG
  27. using boost::spirit::qi::qword;
  28. using boost::spirit::qi::big_qword;
  29. using boost::spirit::qi::little_qword;
  30. #endif
  31. using boost::spirit::qi::bin_float;
  32. using boost::spirit::qi::big_bin_float;
  33. using boost::spirit::qi::little_bin_float;
  34. using boost::spirit::qi::bin_double;
  35. using boost::spirit::qi::big_bin_double;
  36. using boost::spirit::qi::little_bin_double;
  37. boost::uint8_t uc;
  38. boost::uint16_t us;
  39. boost::uint32_t ui;
  40. #ifdef BOOST_HAS_LONG_LONG
  41. boost::uint64_t ul;
  42. #endif
  43. float f;
  44. double d;
  45. { // test native endian binaries
  46. #if BOOST_ENDIAN_LITTLE_BYTE
  47. BOOST_TEST(test_attr("\x01", byte_, uc) && uc == 0x01);
  48. BOOST_TEST(test_attr("\x01\x02", word, us) && us == 0x0201);
  49. BOOST_TEST(test_attr("\x01\x02\x03\x04", dword, ui) && ui == 0x04030201);
  50. #ifdef BOOST_HAS_LONG_LONG
  51. BOOST_TEST(test_attr("\x01\x02\x03\x04\x05\x06\x07\x08", qword, ul) &&
  52. ul == 0x0807060504030201LL);
  53. #endif
  54. BOOST_TEST(binary_test_attr("\x00\x00\x80\x3f", 4, bin_float, f) &&
  55. f == 1.0f);
  56. BOOST_TEST(binary_test_attr("\x00\x00\x00\x00\x00\x00\xf0\x3f",
  57. 8, bin_double, d) && f == 1.0);
  58. #else
  59. BOOST_TEST(test_attr("\x01", byte_, uc) && uc == 0x01);
  60. BOOST_TEST(test_attr("\x01\x02", word, us) && us == 0x0102);
  61. BOOST_TEST(test_attr("\x01\x02\x03\x04", dword, ui) && ui == 0x01020304);
  62. #ifdef BOOST_HAS_LONG_LONG
  63. BOOST_TEST(test_attr("\x01\x02\x03\x04\x05\x06\x07\x08", qword, ul) &&
  64. ul == 0x0102030405060708LL);
  65. #endif
  66. BOOST_TEST(binary_test_attr("\x3f\x80\x00\x00", 4, bin_float, f) &&
  67. f == 1.0f);
  68. BOOST_TEST(binary_test_attr("\x3f\xf0\x00\x00\x00\x00\x00\x00",
  69. 8, bin_double, d) && f == 1.0);
  70. #endif
  71. }
  72. { // test native endian binaries
  73. #if BOOST_ENDIAN_LITTLE_BYTE
  74. BOOST_TEST(test("\x01", byte_(0x01)));
  75. BOOST_TEST(test("\x01\x02", word(0x0201)));
  76. BOOST_TEST(test("\x01\x02\x03\x04", dword(0x04030201)));
  77. #ifdef BOOST_HAS_LONG_LONG
  78. BOOST_TEST(test("\x01\x02\x03\x04\x05\x06\x07\x08",
  79. qword(0x0807060504030201LL)));
  80. #endif
  81. BOOST_TEST(binary_test("\x00\x00\x80\x3f", 4, bin_float(1.0f)));
  82. BOOST_TEST(binary_test("\x00\x00\x00\x00\x00\x00\xf0\x3f", 8,
  83. bin_double(1.0)));
  84. #else
  85. BOOST_TEST(test("\x01", byte_(0x01)));
  86. BOOST_TEST(test("\x01\x02", word(0x0102)));
  87. BOOST_TEST(test("\x01\x02\x03\x04", dword(0x01020304)));
  88. #ifdef BOOST_HAS_LONG_LONG
  89. BOOST_TEST(test("\x01\x02\x03\x04\x05\x06\x07\x08",
  90. qword(0x0102030405060708LL)));
  91. #endif
  92. BOOST_TEST(binary_test("\x3f\x80\x00\x00", 4, bin_float(1.0f)));
  93. BOOST_TEST(binary_test("\x3f\x80\x00\x00\x00\x00\x00\x00", 8,
  94. bin_double(1.0)));
  95. #endif
  96. }
  97. { // test big endian binaries
  98. BOOST_TEST(test_attr("\x01\x02", big_word, us) && us == 0x0102);
  99. BOOST_TEST(test_attr("\x01\x02\x03\x04", big_dword, ui) && ui == 0x01020304);
  100. #ifdef BOOST_HAS_LONG_LONG
  101. BOOST_TEST(test_attr("\x01\x02\x03\x04\x05\x06\x07\x08", big_qword, ul)
  102. && ul == 0x0102030405060708LL);
  103. #endif
  104. BOOST_TEST(binary_test_attr("\x3f\x80\x00\x00", 4, big_bin_float, f) &&
  105. f == 1.0f);
  106. BOOST_TEST(binary_test_attr("\x3f\xf0\x00\x00\x00\x00\x00\x00",
  107. 8, big_bin_double, d) && f == 1.0);
  108. }
  109. {
  110. BOOST_TEST(test("\x01\x02", big_word(0x0102)));
  111. BOOST_TEST(test("\x01\x02\x03\x04", big_dword(0x01020304)));
  112. #ifdef BOOST_HAS_LONG_LONG
  113. BOOST_TEST(test("\x01\x02\x03\x04\x05\x06\x07\x08",
  114. big_qword(0x0102030405060708LL)));
  115. #endif
  116. BOOST_TEST(binary_test("\x3f\x80\x00\x00", 4, big_bin_float(1.0f)));
  117. BOOST_TEST(binary_test("\x3f\xf0\x00\x00\x00\x00\x00\x00", 8,
  118. big_bin_double(1.0)));
  119. }
  120. { // test little endian binaries
  121. BOOST_TEST(test_attr("\x01\x02", little_word, us) && us == 0x0201);
  122. BOOST_TEST(test_attr("\x01\x02\x03\x04", little_dword, ui) && ui == 0x04030201);
  123. #ifdef BOOST_HAS_LONG_LONG
  124. BOOST_TEST(test_attr("\x01\x02\x03\x04\x05\x06\x07\x08", little_qword, ul)
  125. && ul == 0x0807060504030201LL);
  126. #endif
  127. BOOST_TEST(binary_test_attr("\x00\x00\x80\x3f", 4,
  128. little_bin_float, f) && f == 1.0f);
  129. BOOST_TEST(binary_test_attr("\x00\x00\x00\x00\x00\x00\xf0\x3f",
  130. 8, little_bin_double, d) && f == 1.0);
  131. }
  132. {
  133. BOOST_TEST(test("\x01\x02", little_word(0x0201)));
  134. BOOST_TEST(test("\x01\x02\x03\x04", little_dword(0x04030201)));
  135. #ifdef BOOST_HAS_LONG_LONG
  136. BOOST_TEST(test("\x01\x02\x03\x04\x05\x06\x07\x08",
  137. little_qword(0x0807060504030201LL)));
  138. #endif
  139. BOOST_TEST(binary_test("\x00\x00\x80\x3f", 4, little_bin_float(1.0f)));
  140. BOOST_TEST(binary_test("\x00\x00\x00\x00\x00\x00\xf0\x3f", 8,
  141. little_bin_double(1.0)));
  142. }
  143. return boost::report_errors();
  144. }