binary.cpp 6.0 KB

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