libmoost
/home/mhx/git/github/libmoost/test/container/bit_filter.cpp
Go to the documentation of this file.
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()