// (C) Copyright 2008 CodeRage, LLC (turkanis at coderage dot com) // (C) Copyright 2004-2007 Jonathan Turkanis // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.) // See http://www.boost.org/libs/iostreams for documentation. #include // equal. #include #include #include #include #include #include #include #include #include #include "detail/filters.hpp" #include "detail/temp_file.hpp" #include "detail/verification.hpp" using namespace std; using namespace boost; using namespace boost::iostreams; using namespace boost::iostreams::test; using boost::unit_test::test_suite; void flush_test() { { stream_buffer null; null.open(null_sink()); BOOST_CHECK_MESSAGE( iostreams::flush(null), "failed flushing stream_buffer" ); BOOST_CHECK_MESSAGE( null.strict_sync(), "failed strict-syncing stream_buffer with " "non-flushable resource" ); } { stream null; null.open(null_sink()); BOOST_CHECK_MESSAGE( iostreams::flush(null), "failed flushing stream" ); BOOST_CHECK_MESSAGE( null.strict_sync(), "failed strict-syncing stream with " "non-flushable resource" ); } { filtering_ostream null; null.push(null_sink()); BOOST_CHECK_MESSAGE( iostreams::flush(null), "failed flushing filtering_ostream" ); BOOST_CHECK_MESSAGE( null.strict_sync(), "failed strict-syncing filtering_ostream with " "non-flushable resource" ); } { filtering_ostream null; null.push(tolower_filter()); null.push(null_sink()); BOOST_CHECK_MESSAGE( iostreams::flush(null), "failed flushing filtering_ostream with non-flushable filter" ); BOOST_CHECK_MESSAGE( !null.strict_sync(), "strict-syncing filtering_ostream with " "non-flushable filter succeeded" ); } { vector dest1; vector dest2; filtering_ostream out; out.set_auto_close(false); out.push(flushable_output_filter()); // Write to dest1. out.push(iostreams::back_inserter(dest1)); write_data_in_chunks(out); out.flush(); // Write to dest2. out.pop(); out.push(iostreams::back_inserter(dest2)); write_data_in_chunks(out); out.flush(); BOOST_CHECK_MESSAGE( dest1.size() == dest2.size() && std::equal(dest1.begin(), dest1.end(), dest2.begin()), "failed flush filtering_ostream with auto_close disabled" ); } { vector dest1; vector dest2; filtering_ostream out; out.set_auto_close(false); out.push(flushable_output_filter()); out.push(flushable_output_filter()); // Write to dest1. out.push(iostreams::back_inserter(dest1)); write_data_in_chunks(out); out.flush(); // Write to dest2. out.pop(); out.push(iostreams::back_inserter(dest2)); write_data_in_chunks(out); out.flush(); BOOST_CHECK_MESSAGE( dest1.size() == dest2.size() && std::equal(dest1.begin(), dest1.end(), dest2.begin()), "failed flush filtering_ostream with two flushable filters " "with auto_close disabled" ); } } test_suite* init_unit_test_suite(int, char* []) { test_suite* test = BOOST_TEST_SUITE("flush test"); test->add(BOOST_TEST_CASE(&flush_test)); return test; }