libmoost
/home/mhx/git/github/libmoost/test/container/lru.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 "../../include/moost/container/lru.hpp"
00032 
00033 using namespace moost::container;
00034 
00035 BOOST_AUTO_TEST_SUITE( lru_test )
00036 
00037 struct Fixture
00038 {
00039    typedef lru<int, int> lru_t;
00040    lru_t lru_;
00041    int ret_val_;
00042 
00043    Fixture()
00044    : lru_(3)
00045    {
00046      lru_.set_deleted_key(-1);
00047    }
00048 };
00049 
00050 BOOST_FIXTURE_TEST_CASE( test_empty, Fixture )
00051 {
00052   BOOST_CHECK_EQUAL(lru_.get(3, ret_val_), false);
00053 }
00054 
00055 // find nothing!
00056 BOOST_FIXTURE_TEST_CASE( test_nothing, Fixture )
00057 {
00058   lru_.put(2, 4);
00059   BOOST_CHECK_EQUAL(lru_.get(3, ret_val_), false);
00060 }
00061 
00062 // find something!
00063 BOOST_FIXTURE_TEST_CASE( test_something, Fixture )
00064 {
00065   lru_.put(3, 4);
00066   BOOST_REQUIRE_EQUAL(lru_.get(3, ret_val_), true);
00067   BOOST_CHECK_EQUAL(ret_val_, 4);
00068 }
00069 
00070 // evict!
00071 BOOST_FIXTURE_TEST_CASE( test_evict, Fixture )
00072 {
00073   lru_.put(3, 4);
00074   lru_.put(4, 5);
00075   lru_.put(5, 6);
00076   lru_.put(7, 8);
00077   BOOST_REQUIRE_EQUAL(lru_.get(7, ret_val_), true);
00078   BOOST_CHECK_EQUAL(ret_val_, 8);
00079   BOOST_CHECK_EQUAL(lru_.get(3, ret_val_), false);
00080 }
00081 
00082 // don't evict!
00083 BOOST_FIXTURE_TEST_CASE( test_dont_evict, Fixture )
00084 {
00085   lru_.put(3, 4);
00086   lru_.put(4, 5);
00087   lru_.put(5, 6);
00088   lru_.put(3, 8);
00089   BOOST_REQUIRE_EQUAL(lru_.get(5, ret_val_), true);
00090   BOOST_CHECK_EQUAL(ret_val_, 6);
00091   BOOST_REQUIRE_EQUAL(lru_.get(3, ret_val_), true);
00092   BOOST_CHECK_EQUAL(ret_val_, 8);
00093 }
00094 
00095 // push back twice!
00096 BOOST_FIXTURE_TEST_CASE( test_double_pushback, Fixture )
00097 {
00098   lru_.put(3, 4);
00099   lru_.put(3, 5);
00100   BOOST_REQUIRE_EQUAL(lru_.get(3, ret_val_), true);
00101   BOOST_CHECK_EQUAL(ret_val_, 5);
00102 }
00103 
00104 // test bump
00105 BOOST_FIXTURE_TEST_CASE( test_bump, Fixture )
00106 {
00107   lru_.put(1, 5);
00108   lru_.put(2, 6);
00109   lru_.put(3, 7);
00110 
00111   BOOST_CHECK(lru_.front() == *lru_.find(1));
00112   BOOST_CHECK(lru_.back() == *lru_.find(3));
00113 
00114   lru_.bump(1);
00115 
00116   BOOST_CHECK(lru_.front() == *lru_.find(2));
00117   BOOST_CHECK(lru_.back() == *lru_.find(1));
00118 
00119   lru_t::mapped_type get_val = 0;
00120   lru_.get(3, get_val);
00121 
00122   BOOST_CHECK_EQUAL(get_val, lru_.find(3)->second);
00123   BOOST_CHECK(lru_.front() == *lru_.find(2));
00124   BOOST_CHECK(lru_.back() == *lru_.find(3));
00125 
00126   lru_t::mapped_type peek_val = 0;
00127   lru_.peek(1, peek_val);
00128 
00129   BOOST_CHECK_EQUAL(peek_val, lru_.find(1)->second);
00130   BOOST_CHECK(lru_.front() == *lru_.find(2));
00131   BOOST_CHECK(lru_.back() == *lru_.find(3));
00132 }
00133 
00134 // test indexer
00135 BOOST_FIXTURE_TEST_CASE( test_indexer, Fixture )
00136 {
00137   lru_.put(5,2);
00138   lru_.put(6,3);
00139   lru_.put(7,4);
00140 
00141   BOOST_CHECK_EQUAL(lru_[5], 2);
00142   BOOST_CHECK_EQUAL(lru_[6], 3);
00143   BOOST_CHECK_EQUAL(lru_[7], 4);
00144 
00145   BOOST_CHECK_THROW(lru_[0], std::runtime_error)
00146   BOOST_CHECK_THROW(lru_[9], std::runtime_error)
00147 }
00148 
00149 // test exists
00150 BOOST_FIXTURE_TEST_CASE( test_exists, Fixture )
00151 {
00152   lru_.put(5,2);
00153   lru_.put(6,3);
00154   lru_.put(7,4);
00155 
00156   BOOST_CHECK_EQUAL(lru_.exists(0), false);
00157   BOOST_CHECK_EQUAL(lru_.exists(1), false);
00158   BOOST_CHECK_EQUAL(lru_.exists(2), false);
00159   BOOST_CHECK_EQUAL(lru_.exists(3), false);
00160   BOOST_CHECK_EQUAL(lru_.exists(4), false);
00161 
00162   BOOST_CHECK_EQUAL(lru_.exists(5), true);
00163   BOOST_CHECK_EQUAL(lru_.exists(6), true);
00164   BOOST_CHECK_EQUAL(lru_.exists(7), true);
00165 
00166   BOOST_CHECK_EQUAL(lru_.exists(8), false);
00167   BOOST_CHECK_EQUAL(lru_.exists(9), false);
00168 
00169   lru_.erase(5);
00170   lru_.erase(6);
00171   lru_.erase(7);
00172 
00173   BOOST_CHECK_EQUAL(lru_.exists(5), false);
00174   BOOST_CHECK_EQUAL(lru_.exists(6), false);
00175   BOOST_CHECK_EQUAL(lru_.exists(7), false);
00176 }
00177 
00178 BOOST_AUTO_TEST_SUITE_END()