1/*
2 * Distributed under the Boost Software License, Version 1.0.(See accompanying
3 * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
4 *
5 * See http://www.boost.org/libs/iostreams for documentation.
6 *
7 * Verifies that the close() member functions of filters and devices
8 * are called with the correct arguments in the correct order when
9 * they are combined using combine().
10 *
11 * File: libs/iostreams/test/combine_test.cpp
12 * Date: Sun Jan 06 01:37:37 MST 2008
13 * Copyright: 2007-2008 CodeRage, LLC
14 * Author: Jonathan Turkanis
15 * Contact: turkanis at coderage dot com
16 */
17
18#include <boost/iostreams/chain.hpp>
19#include <boost/iostreams/combine.hpp>
20#include <boost/test/test_tools.hpp>
21#include <boost/test/unit_test.hpp>
22#include "detail/closable.hpp"
23#include "detail/operation_sequence.hpp"
24
25using namespace boost::iostreams;
26using namespace boost::iostreams::test;
27using boost::unit_test::test_suite;
28namespace io = boost::iostreams;
29
30void combine_test()
31{
32 // Combine a source and a sink
33 {
34 operation_sequence seq;
35 chain<bidirectional> ch;
36 ch.push(
37 t: io::combine(
38 in: closable_device<input>(seq.new_operation(id: 1)),
39 out: closable_device<output>(seq.new_operation(id: 2))
40 )
41 );
42 BOOST_CHECK_NO_THROW(ch.reset());
43 BOOST_CHECK_OPERATION_SEQUENCE(seq);
44 }
45
46 // Combine two bidirectional devices
47 {
48 operation_sequence seq;
49 chain<bidirectional> ch;
50 ch.push(
51 t: io::combine(
52 in: closable_device<bidirectional>(
53 seq.new_operation(id: 1),
54 seq.new_operation(id: 2)
55 ),
56 out: closable_device<bidirectional>(
57 seq.new_operation(id: 3),
58 seq.new_operation(id: 4)
59 )
60 )
61 );
62 BOOST_CHECK_NO_THROW(ch.reset());
63 BOOST_CHECK_OPERATION_SEQUENCE(seq);
64 }
65
66 // Combine two seekable devices
67 {
68 operation_sequence seq;
69 chain<bidirectional> ch;
70 ch.push(
71 t: io::combine(
72 in: closable_device<seekable>(seq.new_operation(id: 1)),
73 out: closable_device<seekable>(seq.new_operation(id: 2))
74 )
75 );
76 BOOST_CHECK_NO_THROW(ch.reset());
77 BOOST_CHECK_OPERATION_SEQUENCE(seq);
78 }
79
80 // Combine an input filter and an output filter
81 {
82 operation_sequence seq;
83 chain<bidirectional> ch;
84 ch.push(
85 t: io::combine(
86 in: closable_filter<input>(seq.new_operation(id: 2)),
87 out: closable_filter<output>(seq.new_operation(id: 3))
88 )
89 );
90 ch.push(
91 t: closable_device<bidirectional>(
92 seq.new_operation(id: 1),
93 seq.new_operation(id: 4)
94 )
95 );
96 BOOST_CHECK_NO_THROW(ch.reset());
97 BOOST_CHECK_OPERATION_SEQUENCE(seq);
98 }
99
100 // Combine two bidirectional filters
101 {
102 operation_sequence seq;
103 chain<bidirectional> ch;
104 ch.push(
105 t: io::combine(
106 in: closable_filter<bidirectional>(
107 seq.new_operation(id: 2),
108 seq.new_operation(id: 3)
109 ),
110 out: closable_filter<bidirectional>(
111 seq.new_operation(id: 4),
112 seq.new_operation(id: 5)
113 )
114 )
115 );
116 ch.push(
117 t: closable_device<bidirectional>(
118 seq.new_operation(id: 1),
119 seq.new_operation(id: 6)
120 )
121 );
122 BOOST_CHECK_NO_THROW(ch.reset());
123 BOOST_CHECK_OPERATION_SEQUENCE(seq);
124 }
125
126 // Combine two seekable filters
127 {
128 operation_sequence seq;
129 chain<bidirectional> ch;
130 ch.push(
131 t: io::combine(
132 in: closable_filter<seekable>(seq.new_operation(id: 2)),
133 out: closable_filter<seekable>(seq.new_operation(id: 3))
134 )
135 );
136 ch.push(
137 t: closable_device<bidirectional>(
138 seq.new_operation(id: 1),
139 seq.new_operation(id: 4)
140 )
141 );
142 BOOST_CHECK_NO_THROW(ch.reset());
143 BOOST_CHECK_OPERATION_SEQUENCE(seq);
144 }
145
146 // Combine a dual-use filter and an input filter
147 {
148 operation_sequence seq;
149 chain<bidirectional> ch;
150 operation dummy;
151 ch.push(
152 t: io::combine(
153 in: closable_filter<input>(seq.new_operation(id: 2)),
154 out: closable_filter<dual_use>(
155 dummy,
156 seq.new_operation(id: 3)
157 )
158 )
159 );
160 ch.push(
161 t: closable_device<bidirectional>(
162 seq.new_operation(id: 1),
163 seq.new_operation(id: 4)
164 )
165 );
166 BOOST_CHECK_NO_THROW(ch.reset());
167 BOOST_CHECK_OPERATION_SEQUENCE(seq);
168 }
169
170 // Combine a dual-use filter and an output filter
171 {
172 operation_sequence seq;
173 chain<bidirectional> ch;
174 operation dummy;
175 ch.push(
176 t: io::combine(
177 in: closable_filter<dual_use>(
178 seq.new_operation(id: 2),
179 dummy
180 ),
181 out: closable_filter<output>(seq.new_operation(id: 3))
182 )
183 );
184 ch.push(
185 t: closable_device<bidirectional>(
186 seq.new_operation(id: 1),
187 seq.new_operation(id: 4)
188 )
189 );
190 BOOST_CHECK_NO_THROW(ch.reset());
191 BOOST_CHECK_OPERATION_SEQUENCE(seq);
192 }
193
194 // Combine two dual-use filters
195 {
196 operation_sequence seq;
197 chain<bidirectional> ch;
198 operation dummy;
199 ch.push(
200 t: io::combine(
201 in: closable_filter<dual_use>(
202 seq.new_operation(id: 2),
203 dummy
204 ),
205 out: closable_filter<dual_use>(
206 dummy,
207 seq.new_operation(id: 3)
208 )
209 )
210 );
211 ch.push(
212 t: closable_device<bidirectional>(
213 seq.new_operation(id: 1),
214 seq.new_operation(id: 4)
215 )
216 );
217 BOOST_CHECK_NO_THROW(ch.reset());
218 BOOST_CHECK_OPERATION_SEQUENCE(seq);
219 }
220}
221
222test_suite* init_unit_test_suite(int, char* [])
223{
224 test_suite* test = BOOST_TEST_SUITE("combine test");
225 test->add(BOOST_TEST_CASE(&combine_test));
226 return test;
227}
228

source code of boost/libs/iostreams/test/combine_test.cpp