direct_adapter_test.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  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 <algorithm> // equal.
  7. #include <fstream>
  8. #include <boost/iostreams/device/array.hpp>
  9. #include <boost/iostreams/detail/adapter/direct_adapter.hpp>
  10. #include <boost/iostreams/stream.hpp>
  11. #include <boost/test/test_tools.hpp>
  12. #include <boost/test/unit_test.hpp>
  13. #include "detail/sequence.hpp"
  14. #include "detail/temp_file.hpp"
  15. #include "detail/verification.hpp"
  16. using namespace std;
  17. using namespace boost::iostreams;
  18. using namespace boost::iostreams::test;
  19. using boost::unit_test::test_suite;
  20. void direct_adapter_test()
  21. {
  22. typedef boost::iostreams::detail::direct_adapter<array_source>
  23. indirect_array_source;
  24. typedef boost::iostreams::detail::direct_adapter<array_sink>
  25. indirect_array_sink;
  26. typedef boost::iostreams::detail::direct_adapter<boost::iostreams::array>
  27. indirect_array;
  28. typedef stream<indirect_array_source>
  29. indirect_array_istream;
  30. typedef stream<indirect_array_sink>
  31. indirect_array_ostream;
  32. typedef stream<indirect_array>
  33. indirect_array_stream;
  34. test_file test;
  35. test_sequence<> seq;
  36. //--------------indirect_array_istream------------------------------------//
  37. {
  38. indirect_array_istream first(&seq[0], &seq[0] + seq.size());
  39. ifstream second(test.name().c_str());
  40. BOOST_CHECK_MESSAGE(
  41. compare_streams_in_chars(first, second),
  42. "failed reading from indirect_array_istream in chars"
  43. );
  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_chunks(first, second),
  50. "failed reading from indirect_array_istream in chunks"
  51. );
  52. }
  53. //--------------indirect_array_ostream------------------------------------//
  54. {
  55. vector<char> dest(data_reps * data_length(), '?');
  56. indirect_array_ostream out(&dest[0], &dest[0] + dest.size());
  57. write_data_in_chars(out);
  58. BOOST_CHECK_MESSAGE(
  59. std::equal(seq.begin(), seq.end(), dest.begin()),
  60. "failed writing to indirect_array_ostream in chunks"
  61. );
  62. }
  63. {
  64. vector<char> dest(data_reps * data_length(), '?');
  65. indirect_array_ostream out(&dest[0], &dest[0] + dest.size());
  66. write_data_in_chunks(out);
  67. BOOST_CHECK_MESSAGE(
  68. std::equal(seq.begin(), seq.end(), dest.begin()),
  69. "failed writing to indirect_array_ostream in chunks"
  70. );
  71. }
  72. //--------------indirect_array_stream-------------------------------------//
  73. {
  74. vector<char> test(data_reps * data_length(), '?');
  75. indirect_array_stream io(&test[0], &test[0] + test.size());
  76. BOOST_CHECK_MESSAGE(
  77. test_seekable_in_chars(io),
  78. "failed seeking within indirect_array_stream, in chars"
  79. );
  80. }
  81. {
  82. vector<char> test(data_reps * data_length(), '?');
  83. indirect_array_stream io(&test[0], &test[0] + test.size());
  84. BOOST_CHECK_MESSAGE(
  85. test_seekable_in_chunks(io),
  86. "failed seeking within indirect_array_stream, in chunks"
  87. );
  88. }
  89. }
  90. test_suite* init_unit_test_suite(int, char* [])
  91. {
  92. test_suite* test = BOOST_TEST_SUITE("direct_adapter test");
  93. test->add(BOOST_TEST_CASE(&direct_adapter_test));
  94. return test;
  95. }