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