1 | // (C) Copyright 2014 Jorge Lodos |
2 | // (C) Copyright 2008 CodeRage, LLC (turkanis at coderage dot com) |
3 | // (C) Copyright 2004-2007 Jonathan Turkanis |
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 | // See http://www.boost.org/libs/iostreams for documentation. |
8 | |
9 | #include <sstream> |
10 | #include <boost/iostreams/device/file.hpp> |
11 | #include <boost/iostreams/filtering_stream.hpp> |
12 | #include <boost/test/test_tools.hpp> |
13 | #include <boost/test/unit_test.hpp> |
14 | #include "detail/temp_file.hpp" |
15 | #include "detail/verification.hpp" |
16 | |
17 | using namespace std; |
18 | using namespace boost; |
19 | using namespace boost::iostreams; |
20 | using namespace boost::iostreams::test; |
21 | using boost::unit_test::test_suite; |
22 | |
23 | void verification_function_seekable_test() |
24 | { |
25 | { |
26 | temp_file f; |
27 | fstream io(f.name().c_str(), BOOST_IOS::in | BOOST_IOS::out | BOOST_IOS::binary | BOOST_IOS::trunc); |
28 | BOOST_CHECK_MESSAGE( |
29 | test_seekable_in_chars(io), |
30 | "failed using test_seekable_in_chars" |
31 | ); |
32 | io.close(); |
33 | } |
34 | |
35 | { |
36 | temp_file f; |
37 | fstream io(f.name().c_str(), BOOST_IOS::in | BOOST_IOS::out | BOOST_IOS::binary | BOOST_IOS::trunc); |
38 | BOOST_CHECK_MESSAGE( |
39 | test_seekable_in_chunks(io), |
40 | "failed using test_seekable_in_chunks" |
41 | ); |
42 | io.close(); |
43 | } |
44 | |
45 | { |
46 | temp_file f; |
47 | fstream io(f.name().c_str(), BOOST_IOS::in | BOOST_IOS::out | BOOST_IOS::binary | BOOST_IOS::trunc); |
48 | for (int i = 0; i < data_reps; ++i) |
49 | io.write(s: narrow_data(), n: chunk_size); |
50 | io.seekg(0, BOOST_IOS::beg); |
51 | BOOST_CHECK_MESSAGE( |
52 | test_input_seekable(io), |
53 | "failed using test_input_seekable" |
54 | ); |
55 | io.close(); |
56 | } |
57 | |
58 | { |
59 | temp_file f; |
60 | fstream io(f.name().c_str(), BOOST_IOS::in | BOOST_IOS::out | BOOST_IOS::binary | BOOST_IOS::trunc); |
61 | BOOST_CHECK_MESSAGE( |
62 | test_output_seekable(io), |
63 | "failed using test_output_seekable" |
64 | ); |
65 | io.close(); |
66 | } |
67 | } |
68 | |
69 | void verification_function_dual_seekable_test() |
70 | { |
71 | { |
72 | stringstream ss(BOOST_IOS::in | BOOST_IOS::out); |
73 | BOOST_CHECK_MESSAGE( |
74 | test_seekable_in_chars(ss), |
75 | "failed using test_seekable_in_chars" |
76 | ); |
77 | } |
78 | |
79 | { |
80 | stringstream ss(BOOST_IOS::in | BOOST_IOS::out); |
81 | BOOST_CHECK_MESSAGE( |
82 | test_seekable_in_chunks(ss), |
83 | "failed using test_seekable_in_chunks" |
84 | ); |
85 | } |
86 | |
87 | { |
88 | string s; |
89 | for (int i = 0; i < data_reps; ++i) |
90 | s.append(s: narrow_data(), n: chunk_size); |
91 | stringstream ss(s, BOOST_IOS::in | BOOST_IOS::out); |
92 | BOOST_CHECK_MESSAGE( |
93 | test_input_seekable(ss), |
94 | "failed using test_input_seekable" |
95 | ); |
96 | } |
97 | |
98 | { |
99 | stringstream ss(BOOST_IOS::in | BOOST_IOS::out); |
100 | BOOST_CHECK_MESSAGE( |
101 | test_output_seekable(ss), |
102 | "failed using test_output_seekable" |
103 | ); |
104 | } |
105 | |
106 | { |
107 | stringstream ss(BOOST_IOS::in | BOOST_IOS::out); |
108 | BOOST_CHECK_MESSAGE( |
109 | test_dual_seekable(ss), |
110 | "failed using test_dual_seekable" |
111 | ); |
112 | } |
113 | } |
114 | |
115 | void dual_seekable_test() |
116 | { |
117 | { |
118 | stringstream ss(BOOST_IOS::in | BOOST_IOS::out); |
119 | filtering_stream<dual_seekable> io(ss); |
120 | io.exceptions(BOOST_IOS::failbit | BOOST_IOS::badbit); |
121 | BOOST_CHECK_MESSAGE( |
122 | test_seekable_in_chars(io), |
123 | "failed seeking within a string, in chars" |
124 | ); |
125 | } |
126 | |
127 | { |
128 | stringstream ss(BOOST_IOS::in | BOOST_IOS::out); |
129 | filtering_stream<dual_seekable> io(ss); |
130 | io.exceptions(BOOST_IOS::failbit | BOOST_IOS::badbit); |
131 | BOOST_CHECK_MESSAGE( |
132 | test_seekable_in_chunks(io), |
133 | "failed seeking within a string, in chunks" |
134 | ); |
135 | } |
136 | |
137 | { |
138 | string s; |
139 | for (int i = 0; i < data_reps; ++i) |
140 | s.append(s: narrow_data(), n: chunk_size); |
141 | stringstream ss(s, BOOST_IOS::in | BOOST_IOS::out); |
142 | filtering_stream<dual_seekable> io(ss); |
143 | io.exceptions(BOOST_IOS::failbit | BOOST_IOS::badbit); |
144 | BOOST_CHECK_MESSAGE( |
145 | test_input_seekable(io), |
146 | "failed seeking within a string source" |
147 | ); |
148 | } |
149 | |
150 | { |
151 | stringstream ss(BOOST_IOS::in | BOOST_IOS::out); |
152 | filtering_stream<dual_seekable> io(ss); |
153 | io.exceptions(BOOST_IOS::failbit | BOOST_IOS::badbit); |
154 | BOOST_CHECK_MESSAGE( |
155 | test_output_seekable(io), |
156 | "failed seeking within a string sink" |
157 | ); |
158 | } |
159 | |
160 | { |
161 | stringstream ss(BOOST_IOS::in | BOOST_IOS::out); |
162 | filtering_stream<dual_seekable> io(ss); |
163 | io.exceptions(BOOST_IOS::failbit | BOOST_IOS::badbit); |
164 | BOOST_CHECK_MESSAGE( |
165 | test_dual_seekable(io), |
166 | "failed dual seeking within a string" |
167 | ); |
168 | } |
169 | } |
170 | |
171 | test_suite* init_unit_test_suite(int, char* []) |
172 | { |
173 | test_suite* test = BOOST_TEST_SUITE("dual seekable test" ); |
174 | test->add(BOOST_TEST_CASE(&verification_function_seekable_test)); |
175 | test->add(BOOST_TEST_CASE(&verification_function_dual_seekable_test)); |
176 | test->add(BOOST_TEST_CASE(&dual_seekable_test)); |
177 | return test; |
178 | } |
179 | |