stdio_filter_test.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  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. // See http://www.boost.org/libs/iostreams for documentation.
  6. #include <cctype>
  7. #include <boost/iostreams/device/file.hpp>
  8. #include <boost/iostreams/filter/stdio.hpp>
  9. #include <boost/iostreams/filtering_stream.hpp>
  10. #include <boost/test/test_tools.hpp>
  11. #include <boost/test/unit_test.hpp>
  12. #include "detail/filters.hpp"
  13. #include "detail/temp_file.hpp"
  14. #include "detail/verification.hpp"
  15. // Must come last.
  16. #include <boost/iostreams/detail/config/disable_warnings.hpp> // BCC 5.x.
  17. using namespace boost::iostreams;
  18. using boost::unit_test::test_suite;
  19. struct toupper_stdio_filter : stdio_filter {
  20. void do_filter()
  21. {
  22. int c;
  23. while ((c = std::cin.get()) != EOF)
  24. std::cout.put(std::toupper((unsigned char)c));
  25. }
  26. };
  27. struct tolower_stdio_filter : stdio_filter {
  28. void do_filter()
  29. {
  30. int c;
  31. while ((c = std::cin.get()) != EOF)
  32. std::cout.put(std::tolower((unsigned char)c));
  33. }
  34. };
  35. struct padding_stdio_filter : stdio_filter {
  36. padding_stdio_filter(char pad_char) : pad_char_(pad_char) { }
  37. void do_filter()
  38. {
  39. int c;
  40. while ((c = std::cin.get()) != EOF) {
  41. std::cout.put(c);
  42. std::cout.put(pad_char_);
  43. }
  44. }
  45. char pad_char_;
  46. };
  47. void read_stdio_filter()
  48. {
  49. using namespace boost::iostreams::test;
  50. test_file src1, src2;
  51. filtering_istream first, second;
  52. first.push(toupper_filter());
  53. first.push(padding_filter('a'));
  54. first.push(file_source(src1.name(), in_mode));
  55. second.push(toupper_stdio_filter());
  56. second.push(padding_stdio_filter('a'));
  57. second.push(file_source(src2.name(), in_mode));
  58. BOOST_CHECK_MESSAGE(
  59. compare_streams_in_chunks(first, second),
  60. "failed reading from a stdio_filter"
  61. );
  62. first.reset();
  63. first.push(padding_filter('a'));
  64. first.push(toupper_filter());
  65. first.push(file_source(src1.name(), in_mode));
  66. second.reset();
  67. second.push(padding_stdio_filter('a'));
  68. second.push(toupper_stdio_filter());
  69. second.push(file_source(src2.name(), in_mode));
  70. BOOST_CHECK_MESSAGE(
  71. compare_streams_in_chunks(first, second),
  72. "failed reading from a stdio_filter"
  73. );
  74. }
  75. void write_stdio_filter()
  76. {
  77. using namespace std;
  78. using namespace boost::iostreams::test;
  79. temp_file dest1, dest2;
  80. filtering_ostream out1, out2;
  81. out1.push(tolower_filter());
  82. out1.push(padding_filter('a'));
  83. out1.push(file_sink(dest1.name(), in_mode));
  84. out2.push(tolower_stdio_filter());
  85. out2.push(padding_stdio_filter('a'));
  86. out2.push(file_sink(dest2.name(), in_mode));
  87. write_data_in_chunks(out1);
  88. write_data_in_chunks(out2);
  89. out1.reset();
  90. out2.reset();
  91. {
  92. ifstream first(dest1.name().c_str());
  93. ifstream second(dest2.name().c_str());
  94. BOOST_CHECK_MESSAGE(
  95. compare_streams_in_chunks(first, second),
  96. "failed writing to a stdio_filter"
  97. );
  98. }
  99. out1.push(padding_filter('a'));
  100. out1.push(tolower_filter());
  101. out1.push(file_sink(dest1.name(), in_mode));
  102. out2.push(padding_stdio_filter('a'));
  103. out2.push(tolower_stdio_filter());
  104. out2.push(file_sink(dest2.name(), in_mode));
  105. write_data_in_chunks(out1);
  106. write_data_in_chunks(out2);
  107. out1.reset();
  108. out2.reset();
  109. {
  110. ifstream first(dest1.name().c_str());
  111. ifstream second(dest2.name().c_str());
  112. BOOST_CHECK_MESSAGE(
  113. compare_streams_in_chunks(first, second),
  114. "failed writing to a stdio_filter"
  115. );
  116. }
  117. }
  118. test_suite* init_unit_test_suite(int, char* [])
  119. {
  120. test_suite* test = BOOST_TEST_SUITE("line_filter test");
  121. test->add(BOOST_TEST_CASE(&read_stdio_filter));
  122. test->add(BOOST_TEST_CASE(&write_stdio_filter));
  123. return test;
  124. }
  125. #include <boost/iostreams/detail/config/enable_warnings.hpp> // BCC 5.x.