libmoost
|
00001 /* vim:set ts=3 sw=3 sts=3 et: */ 00028 #include <boost/test/unit_test.hpp> 00029 #include <boost/test/test_tools.hpp> 00030 00031 #include <boost/foreach.hpp> 00032 #define foreach BOOST_FOREACH 00033 00034 #include "../../include/moost/container/bit_filter.hpp" 00035 #include <vector> 00036 #include <set> 00037 00038 using namespace moost::container; 00039 00040 BOOST_AUTO_TEST_SUITE( bit_filter_tests ) 00041 00042 struct Fixture 00043 { 00044 Fixture() 00045 { 00046 } 00047 }; 00048 00049 namespace { 00050 00051 // Arbitrary and unique values 00052 size_t const raw_entropy[] = { 00053 0x7f, 0x00, 0x5d, 0x0c, 0x9c, 0x65, 0xa2, 0xc9, 00054 0x3a, 0x78, 0x59, 0xa7, 0xf0, 0x98, 0x0f, 0xcf, 00055 0xd4, 0xfa, 0x2c, 0xd1, 0x90, 0xb5, 0x6f, 0x4d, 00056 0xc0, 0x73, 0xeb, 0xa6, 0x53, 0xa3, 0x92, 0xa9, 00057 0x69, 0xa0, 0x4a, 0x29, 0xa5, 0xa8, 0x44, 0x61, 00058 0x0e, 0x57, 0x75, 0xc8, 0x8a, 0x7b, 0x14, 0x2f, 00059 0xf3, 0x04, 0xb8, 0xed, 0xd7, 0xe6, 0xb7, 0x70, 00060 0xff, 0xdc, 0x0d, 0x51, 0xc1, 0x41, 0x9a, 0xac, 00061 0x1f, 0xf6, 0xc4, 0xc6, 0x23, 0xaf, 0xbb, 0x5a, 00062 0x4b, 0x87, 0x24, 0x95, 0xa1, 0x27, 0x30, 0xec, 00063 0x2b, 0xe2, 0x88, 0xde, 0x05, 0xdf, 0xef, 0x3d, 00064 0x16, 0x07, 0xf9, 0xd3, 0xd5, 0x06, 0xca, 0x35, 00065 0xcd, 0x6c, 0xfe, 0x5b, 0x5c, 0x0b, 0x4e, 0x25 00066 }; 00067 00068 size_t const raw_entropy_size = sizeof(raw_entropy)/sizeof(raw_entropy[0]); 00069 00070 00071 typedef std::vector<size_t> entropy_t; 00072 00073 entropy_t 00074 create_entroy_vector() 00075 { 00076 return std::vector<size_t> (raw_entropy, raw_entropy + raw_entropy_size); 00077 } 00078 00079 entropy_t 00080 create_alt_entroy_vector() 00081 { 00082 std::set<size_t> s(raw_entropy, raw_entropy + raw_entropy_size); 00083 std::vector<size_t> v; 00084 00085 for(size_t i = 0 ; i <= 0xFF ; ++i) 00086 { 00087 if(s.find(i) == s.end()) 00088 { 00089 v.push_back(i); 00090 } 00091 } 00092 00093 return v; 00094 } 00095 00096 entropy_t 00097 create_all_entroy_vector() 00098 { 00099 std::vector<size_t> v; 00100 00101 for(size_t i = 0 ; i <= 0xFF ; ++i) 00102 { 00103 v.push_back(i); 00104 } 00105 00106 return v; 00107 } 00108 00109 bit_filter<size_t> 00110 create_bit_filter(size_t const size = 0xFFFF, size_t const entry_cnt = raw_entropy_size) 00111 { 00112 entropy_t const & entropy = create_entroy_vector(); 00113 return bit_filter<size_t> (size, entropy.begin(), entropy.begin() + std::min(entry_cnt, entropy.size()), true); 00114 } 00115 00116 bit_filter<size_t> 00117 create_alt_bit_filter(size_t const size = 0xFFFF, size_t const entry_cnt = raw_entropy_size) 00118 { 00119 entropy_t const & entropy = create_alt_entroy_vector(); 00120 return bit_filter<size_t> (size, entropy.begin(), entropy.begin() + std::min(entry_cnt, entropy.size()), true); 00121 } 00122 00123 bit_filter<size_t> 00124 create_all_bit_filter(size_t const size = 0xFFFF, size_t const entry_cnt = raw_entropy_size) 00125 { 00126 entropy_t const & entropy = create_all_entroy_vector(); 00127 return bit_filter<size_t> (size, entropy.begin(), entropy.begin() + std::min(entry_cnt, entropy.size()), true); 00128 } 00129 } 00130 00131 BOOST_FIXTURE_TEST_CASE( test_bit_filter_scalar_find, Fixture ) 00132 { 00133 bit_filter<size_t> bf = create_bit_filter(); 00134 entropy_t const & entropy = create_entroy_vector(); 00135 entropy_t const & alt_entropy = create_alt_entroy_vector(); 00136 00137 foreach(size_t item, entropy) 00138 { 00139 BOOST_CHECK(bf.find(item)); 00140 } 00141 00142 foreach(size_t item, alt_entropy) 00143 { 00144 BOOST_CHECK(!bf.find(item)); 00145 } 00146 00147 } 00148 00149 BOOST_FIXTURE_TEST_CASE( test_bit_filter_vector_find_only, Fixture ) 00150 { 00151 bit_filter<size_t> bf = create_bit_filter(); 00152 entropy_t const & entropy = create_entroy_vector(); 00153 entropy_t const & alt_entropy = create_alt_entroy_vector(); 00154 00155 BOOST_CHECK(entropy.size() == bf.find(entropy.begin(), entropy.end())); 00156 BOOST_CHECK(0 == bf.find(alt_entropy.begin(), alt_entropy.end())); 00157 } 00158 00159 BOOST_FIXTURE_TEST_CASE( test_bit_filter_vector_find_what, Fixture ) 00160 { 00161 bit_filter<size_t> bf = create_bit_filter(); 00162 entropy_t const & entropy = create_entroy_vector(); 00163 entropy_t const & alt_entropy = create_alt_entroy_vector(); 00164 00165 entropy_t result1; 00166 BOOST_CHECK(entropy.size() == bf.find(entropy.begin(), entropy.end(), std::back_inserter(result1))); 00167 BOOST_CHECK(entropy == result1); 00168 00169 entropy_t result2; 00170 BOOST_CHECK(0 == bf.find(alt_entropy.begin(), alt_entropy.end(), std::back_inserter(result2))); 00171 BOOST_CHECK(alt_entropy != result2); 00172 } 00173 00174 BOOST_FIXTURE_TEST_CASE( test_bit_filter_vector_find_any, Fixture ) 00175 { 00176 bit_filter<size_t> bf = create_bit_filter(); 00177 bit_filter<size_t> alt_bf = create_alt_bit_filter(); 00178 bit_filter<size_t> all_bf = create_all_bit_filter(); 00179 00180 BOOST_CHECK(all_bf.find(all_bf)); 00181 BOOST_CHECK(all_bf.find(alt_bf)); 00182 BOOST_CHECK(all_bf.find(bf)); 00183 00184 BOOST_CHECK(alt_bf.find(all_bf)); 00185 BOOST_CHECK(alt_bf.find(alt_bf)); 00186 BOOST_CHECK(!alt_bf.find(bf)); 00187 00188 BOOST_CHECK(bf.find(all_bf)); 00189 BOOST_CHECK(!bf.find(alt_bf)); 00190 BOOST_CHECK(bf.find(bf)); 00191 } 00192 00193 BOOST_FIXTURE_TEST_CASE( test_bit_filter_count_and_size, Fixture ) 00194 { 00195 bit_filter<size_t> bf = create_bit_filter(); 00196 bit_filter<size_t> alt_bf = create_alt_bit_filter(); 00197 bit_filter<size_t> all_bf = create_all_bit_filter(); 00198 00199 BOOST_CHECK(bf.size() == 0xFFFF); 00200 BOOST_CHECK(alt_bf.size() == 0xFFFF); 00201 BOOST_CHECK(all_bf.size() == 0xFFFF); 00202 } 00203 00204 BOOST_FIXTURE_TEST_CASE( test_bit_filter_count_serialize, Fixture ) 00205 { 00206 bit_filter<size_t> bf = create_bit_filter(); 00207 bit_filter<size_t> alt_bf = create_alt_bit_filter(); 00208 bit_filter<size_t> all_bf = create_all_bit_filter(); 00209 00210 bit_filter_types::serial_buffer_t serial_buffer; 00211 bit_filter_types::serial_buffer_t alt_serial_buffer; 00212 bit_filter_types::serial_buffer_t all_serial_buffer; 00213 00214 bf >> serial_buffer; 00215 alt_bf >> alt_serial_buffer; 00216 all_bf >> all_serial_buffer; 00217 00218 bit_filter<size_t> bf_result = create_bit_filter(); 00219 bit_filter<size_t> alt_bf_result = create_alt_bit_filter(); 00220 bit_filter<size_t> all_bf_result = create_all_bit_filter(); 00221 00222 bf_result << serial_buffer; 00223 alt_bf_result << alt_serial_buffer; 00224 all_bf_result << all_serial_buffer; 00225 00226 BOOST_CHECK(bf == bf_result); 00227 BOOST_CHECK(alt_bf == alt_bf_result); 00228 BOOST_CHECK(all_bf == all_bf_result); 00229 } 00230 00231 BOOST_AUTO_TEST_SUITE_END()