1// (C) Copyright 2008 CodeRage, LLC (turkanis at coderage dot com)
2// (C) Copyright 2004-2007 Jonathan Turkanis
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// See http://www.boost.org/libs/iostreams for documentation.
7
8#include <algorithm> // equal.
9#include <fstream>
10#include <boost/iostreams/device/array.hpp>
11#include <boost/iostreams/detail/adapter/direct_adapter.hpp>
12#include <boost/iostreams/stream.hpp>
13#include <boost/test/test_tools.hpp>
14#include <boost/test/unit_test.hpp>
15#include "detail/sequence.hpp"
16#include "detail/temp_file.hpp"
17#include "detail/verification.hpp"
18
19using namespace std;
20using namespace boost::iostreams;
21using namespace boost::iostreams::test;
22using boost::unit_test::test_suite;
23
24void direct_adapter_test()
25{
26
27 typedef boost::iostreams::detail::direct_adapter<array_source>
28 indirect_array_source;
29 typedef boost::iostreams::detail::direct_adapter<array_sink>
30 indirect_array_sink;
31 typedef boost::iostreams::detail::direct_adapter<boost::iostreams::array>
32 indirect_array;
33 typedef stream<indirect_array_source>
34 indirect_array_istream;
35 typedef stream<indirect_array_sink>
36 indirect_array_ostream;
37 typedef stream<indirect_array>
38 indirect_array_stream;
39
40 test_file test;
41 test_sequence<> seq;
42
43 //--------------indirect_array_istream------------------------------------//
44
45 {
46 indirect_array_istream first(&seq[0], &seq[0] + seq.size());
47 ifstream second(test.name().c_str());
48 BOOST_CHECK_MESSAGE(
49 compare_streams_in_chars(first, second),
50 "failed reading from indirect_array_istream in chars"
51 );
52 }
53
54 {
55 indirect_array_istream first(&seq[0], &seq[0] + seq.size());
56 ifstream second(test.name().c_str());
57 BOOST_CHECK_MESSAGE(
58 compare_streams_in_chunks(first, second),
59 "failed reading from indirect_array_istream in chunks"
60 );
61 }
62
63 //--------------indirect_array_ostream------------------------------------//
64
65 {
66 vector<char> dest(data_reps * data_length(), '?');
67 indirect_array_ostream out(&dest[0], &dest[0] + dest.size());
68 write_data_in_chars(os&: out);
69 BOOST_CHECK_MESSAGE(
70 std::equal(seq.begin(), seq.end(), dest.begin()),
71 "failed writing to indirect_array_ostream in chunks"
72 );
73 }
74
75 {
76 vector<char> dest(data_reps * data_length(), '?');
77 indirect_array_ostream out(&dest[0], &dest[0] + dest.size());
78 write_data_in_chunks(os&: out);
79 BOOST_CHECK_MESSAGE(
80 std::equal(seq.begin(), seq.end(), dest.begin()),
81 "failed writing to indirect_array_ostream in chunks"
82 );
83 }
84
85 //--------------indirect_array_stream-------------------------------------//
86
87 {
88 vector<char> test(data_reps * data_length(), '?');
89 indirect_array_stream io(&test[0], &test[0] + test.size());
90 BOOST_CHECK_MESSAGE(
91 test_seekable_in_chars(io),
92 "failed seeking within indirect_array_stream, in chars"
93 );
94 }
95
96 {
97 vector<char> test(data_reps * data_length(), '?');
98 indirect_array_stream io(&test[0], &test[0] + test.size());
99 BOOST_CHECK_MESSAGE(
100 test_seekable_in_chunks(io),
101 "failed seeking within indirect_array_stream, in chunks"
102 );
103 }
104}
105
106test_suite* init_unit_test_suite(int, char* [])
107{
108 test_suite* test = BOOST_TEST_SUITE("direct_adapter test");
109 test->add(BOOST_TEST_CASE(&direct_adapter_test));
110 return test;
111}
112

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