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