// (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 #include #include #include #include #include #include "detail/filters.hpp" #include "detail/temp_file.hpp" #include "detail/verification.hpp" // Must come last. #include // BCC 5.x. using namespace boost::iostreams; using boost::unit_test::test_suite; struct toupper_stdio_filter : stdio_filter { void do_filter() { int c; while ((c = std::cin.get()) != EOF) std::cout.put(std::toupper((unsigned char)c)); } }; struct tolower_stdio_filter : stdio_filter { void do_filter() { int c; while ((c = std::cin.get()) != EOF) std::cout.put(std::tolower((unsigned char)c)); } }; struct padding_stdio_filter : stdio_filter { padding_stdio_filter(char pad_char) : pad_char_(pad_char) { } void do_filter() { int c; while ((c = std::cin.get()) != EOF) { std::cout.put(c); std::cout.put(pad_char_); } } char pad_char_; }; void read_stdio_filter() { using namespace boost::iostreams::test; test_file src1, src2; filtering_istream first, second; first.push(toupper_filter()); first.push(padding_filter('a')); first.push(file_source(src1.name(), in_mode)); second.push(toupper_stdio_filter()); second.push(padding_stdio_filter('a')); second.push(file_source(src2.name(), in_mode)); BOOST_CHECK_MESSAGE( compare_streams_in_chunks(first, second), "failed reading from a stdio_filter" ); first.reset(); first.push(padding_filter('a')); first.push(toupper_filter()); first.push(file_source(src1.name(), in_mode)); second.reset(); second.push(padding_stdio_filter('a')); second.push(toupper_stdio_filter()); second.push(file_source(src2.name(), in_mode)); BOOST_CHECK_MESSAGE( compare_streams_in_chunks(first, second), "failed reading from a stdio_filter" ); } void write_stdio_filter() { using namespace std; using namespace boost::iostreams::test; temp_file dest1, dest2; filtering_ostream out1, out2; out1.push(tolower_filter()); out1.push(padding_filter('a')); out1.push(file_sink(dest1.name(), in_mode)); out2.push(tolower_stdio_filter()); out2.push(padding_stdio_filter('a')); out2.push(file_sink(dest2.name(), in_mode)); write_data_in_chunks(out1); write_data_in_chunks(out2); out1.reset(); out2.reset(); { ifstream first(dest1.name().c_str()); ifstream second(dest2.name().c_str()); BOOST_CHECK_MESSAGE( compare_streams_in_chunks(first, second), "failed writing to a stdio_filter" ); } out1.push(padding_filter('a')); out1.push(tolower_filter()); out1.push(file_sink(dest1.name(), in_mode)); out2.push(padding_stdio_filter('a')); out2.push(tolower_stdio_filter()); out2.push(file_sink(dest2.name(), in_mode)); write_data_in_chunks(out1); write_data_in_chunks(out2); out1.reset(); out2.reset(); { ifstream first(dest1.name().c_str()); ifstream second(dest2.name().c_str()); BOOST_CHECK_MESSAGE( compare_streams_in_chunks(first, second), "failed writing to a stdio_filter" ); } } test_suite* init_unit_test_suite(int, char* []) { test_suite* test = BOOST_TEST_SUITE("line_filter test"); test->add(BOOST_TEST_CASE(&read_stdio_filter)); test->add(BOOST_TEST_CASE(&write_stdio_filter)); return test; } #include // BCC 5.x.