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 <vector>
9#include <boost/config.hpp>
10#include <boost/detail/workaround.hpp>
11#include <boost/iostreams/device/array.hpp>
12#include <boost/iostreams/device/array.hpp>
13#include <boost/iostreams/filtering_stream.hpp>
14#include <boost/test/test_tools.hpp>
15#include <boost/test/unit_test.hpp>
16#include "../example/container_device.hpp" // We use container_device instead
17#include "detail/filters.hpp" // of make_iterator_range to
18#include "detail/temp_file.hpp" // reduce dependence on Boost.Range
19#include "detail/verification.hpp"
20
21
22using namespace std;
23using namespace boost;
24using namespace boost::iostreams;
25using namespace boost::iostreams::example;
26using namespace boost::iostreams::test;
27using boost::unit_test::test_suite;
28
29
30// Code generation bugs cause tests to fail with global optimization.
31#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
32# pragma optimize("g", off)
33#endif
34
35void seekable_filter_test()
36{
37 {
38 vector<char> test(data_reps * data_length(), '0');
39 filtering_stream<seekable> io;
40 io.push(t: identity_seekable_filter());
41 io.push(t: container_device< vector<char> >(test));
42 io.exceptions(BOOST_IOS::failbit | BOOST_IOS::badbit);
43 BOOST_CHECK_MESSAGE(
44 test_seekable_in_chars(io),
45 "failed seeking within a file, in chars"
46 );
47 }
48
49 {
50 vector<char> test(data_reps * data_length(), '0');
51 filtering_stream<seekable> io;
52 io.push(t: identity_seekable_filter());
53 io.push(t: container_device< vector<char> >(test));
54 io.exceptions(BOOST_IOS::failbit | BOOST_IOS::badbit);
55 BOOST_CHECK_MESSAGE(
56 test_seekable_in_chunks(io),
57 "failed seeking within a file, in chunks"
58 );
59 }
60
61 {
62 vector<char> test(data_reps * data_length(), '0');
63 filtering_stream<seekable> io;
64 io.push(t: identity_seekable_multichar_filter());
65 io.push(t: container_device< vector<char> >(test));
66 io.exceptions(BOOST_IOS::failbit | BOOST_IOS::badbit);
67 BOOST_CHECK_MESSAGE(
68 test_seekable_in_chars(io),
69 "failed seeking within a file, in chars"
70 );
71 }
72
73 {
74 vector<char> test(data_reps * data_length(), '0');
75 filtering_stream<seekable> io;
76 io.push(t: identity_seekable_multichar_filter());
77 io.push(t: container_device< vector<char> >(test));
78 io.exceptions(BOOST_IOS::failbit | BOOST_IOS::badbit);
79 BOOST_CHECK_MESSAGE(
80 test_seekable_in_chunks(io),
81 "failed seeking within a file, in chunks"
82 );
83 }
84}
85
86#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
87# pragma optimize("", on)
88#endif
89
90test_suite* init_unit_test_suite(int, char* [])
91{
92 test_suite* test = BOOST_TEST_SUITE("seekable filter test");
93 test->add(BOOST_TEST_CASE(&seekable_filter_test));
94 return test;
95}
96

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