00001 #include <boost/test/unit_test.hpp>
00002 #include "PostlistBuilder.hpp"
00003 #include "PostlistWriter.hpp"
00004 #include "PostlistReader.hpp"
00005
00006 using namespace aitools::invertedindex;
00007
00008 BOOST_AUTO_TEST_SUITE(postlist_reader);
00009
00015 void
00016 write_postlist(PostlistWriter& writer, size_t num, size_t length, size_t esize)
00017 {
00018 PostlistBuilder builder;
00019 ByteBuffer buffer(esize);
00020 for (unsigned i(0); i != length; ++i)
00021 {
00022 if (esize == 0) buffer.resize(i);
00023 builder.append(buffer);
00024 }
00025 Iterator::SharedPointer iterator(builder.build());
00026 for (unsigned i(0); i != num; ++i)
00027 {
00028 writer.write(iterator);
00029 }
00030 }
00031
00032 void
00033 read_postlist(PostlistReader& reader, size_t num, size_t length, size_t esize)
00034 {
00035 BOOST_CHECK_EQUAL(reader.tell(), 0);
00036
00037 std::string buffer;
00038 Iterator::SharedPointer iterator;
00039 for (unsigned i(0); i != num; ++i)
00040 {
00041 BOOST_CHECK(iterator = reader.read(length));
00042 BOOST_CHECK_EQUAL(iterator->length(), length);
00043 if (iterator->payload() > Iterator::max_chunk_size)
00044 {
00045 BOOST_CHECK(iterator->is_paged());
00046 }
00047 for (unsigned j(0); j != length; ++j)
00048 {
00049 BOOST_CHECK_EQUAL(iterator->size(), esize == 0 ? j : esize);
00050 iterator->advance();
00051 }
00052 }
00053 }
00054
00055
00056
00057
00058
00059
00060
00061 BOOST_AUTO_TEST_CASE(read_empty_postlist)
00062 {
00063 size_t num(10);
00064 size_t length(0);
00065 size_t value_size(0);
00066
00067
00068 bfs::path path("test.postlist.reader");
00069 PostlistWriter writer(path);
00070 write_postlist(writer, num, length, value_size);
00071 writer.close();
00072
00073 PostlistReader reader(path);
00074 read_postlist(reader, num, length, value_size);
00075 reader.close();
00076 bfs::remove(path);
00077 }
00078
00079 BOOST_AUTO_TEST_CASE(read_non_paged_postlist_with_constant_value_size)
00080 {
00081 size_t num(10);
00082 size_t length(100);
00083 size_t value_size(1);
00084
00085
00086 bfs::path path("test.postlist.reader");
00087 PostlistWriter writer(path);
00088 write_postlist(writer, num, length, value_size);
00089 writer.close();
00090
00091 PostlistReader reader(path);
00092 read_postlist(reader, num, length, value_size);
00093
00094 reader.rewind();
00095 read_postlist(reader, num, length / 2, value_size);
00096 reader.close();
00097 bfs::remove(path);
00098 }
00099
00100 BOOST_AUTO_TEST_CASE(read_non_paged_postlist_with_variable_value_size)
00101 {
00102 size_t num(10);
00103 size_t length(100);
00104 size_t value_size(0);
00105
00106
00107 bfs::path path("test.postlist.reader");
00108 PostlistWriter writer(path);
00109 write_postlist(writer, num, length, value_size);
00110 writer.close();
00111
00112 PostlistReader reader(path);
00113 read_postlist(reader, num, length, value_size);
00114
00115 reader.rewind();
00116 read_postlist(reader, num, length / 2, value_size);
00117 reader.close();
00118 bfs::remove(path);
00119 reader.close();
00120 bfs::remove(path);
00121 }
00122
00123 BOOST_AUTO_TEST_CASE(read_paged_postlist_with_constant_value_size)
00124 {
00125 size_t num(3);
00126 size_t length(100000);
00127 size_t value_size(110);
00128
00129
00130 bfs::path path("test.postlist.reader");
00131 PostlistWriter writer(path);
00132 write_postlist(writer, num, length, value_size);
00133 writer.close();
00134
00135 PostlistReader reader(path);
00136 read_postlist(reader, num, length, value_size);
00137
00138 reader.rewind();
00139 read_postlist(reader, num, length / 2, value_size);
00140 reader.close();
00141 bfs::remove(path);
00142 reader.close();
00143 bfs::remove(path);
00144 }
00145
00146 BOOST_AUTO_TEST_CASE(read_paged_postlist_with_variable_value_size)
00147 {
00148 size_t num(3);
00149 size_t length(5000);
00150 size_t value_size(0);
00151
00152
00153 bfs::path path("test.postlist.reader");
00154 PostlistWriter writer(path);
00155 write_postlist(writer, num, length, value_size);
00156 writer.close();
00157
00158 PostlistReader reader(path);
00159 read_postlist(reader, num, length, value_size);
00160
00161 reader.rewind();
00162 read_postlist(reader, num, length / 2, value_size);
00163 reader.close();
00164 bfs::remove(path);
00165 reader.close();
00166 bfs::remove(path);
00167 }
00168
00169 BOOST_AUTO_TEST_SUITE_END();