libmoost
/home/mhx/git/github/libmoost/test/container/readers.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 #include <boost/cstdint.hpp>
00031 
00032 #include <vector>
00033 #include <fstream>
00034 #include <iostream>
00035 
00036 #include "../../include/moost/container/policies/readers.hpp"
00037 
00038 using namespace moost::container::policies;
00039 using namespace std;
00040 
00041 BOOST_AUTO_TEST_SUITE( readers_test )
00042 
00043 struct Fixture_sparsevec
00044 {
00045    typedef vector<pair<int, float> > sparsevec_t;
00046 
00047    Fixture_sparsevec() : m_testbase("reader_test.txt"),
00048       m_tsv_testfile("tsv_" + m_testbase),
00049       m_python_testfile("python_" + m_testbase),
00050       m_cf_testfile("cf_" + m_testbase)
00051    {
00052       ofstream out;
00053       out.open(m_tsv_testfile.c_str());
00054       out << "1\t10\t10.1\t100\t100.1\t1000\t1000.1\n";
00055       out << "2\t20\t20.2\t200\t200.2\t2000\t2000.2\t20000\t20000.2\n";
00056       out.close();
00057       out.open(m_python_testfile.c_str());
00058       out << "1\t(10, 10.1)\t(100, 100.1)\t(1000, 1000.1)\n";
00059       out << "2\t(20, 20.2)\t(200, 200.2)\t(2000, 2000.2)\t(20000, 20000.2)\n";
00060       out.close();
00061       out.open(m_cf_testfile.c_str());
00062       out << "1\t10\t10.1\n";
00063       out << "1\t100\t100.1\n";
00064       out << "1\t1000\t1000.1\n";
00065       out << "2\t20\t20.2\n";
00066       out << "2\t200\t200.2\n";
00067       out << "2\t2000\t2000.2\n";
00068       out << "2\t20000\t20000.2\n";
00069       out.close();
00070 
00071       sparsevec_t v;
00072 
00073       m_keys.push_back(1);
00074       v.push_back(std::make_pair(10, 10.1f));
00075       v.push_back(std::make_pair(100, 100.1f));
00076       v.push_back(std::make_pair(1000, 1000.1f));
00077       m_vecs.push_back(v);
00078 
00079       m_keys.push_back(2);
00080       v.clear();
00081       v.push_back(std::make_pair(20, 20.2f));
00082       v.push_back(std::make_pair(200, 200.2f));
00083       v.push_back(std::make_pair(2000, 2000.2f));
00084       v.push_back(std::make_pair(20000, 20000.2f));
00085       m_vecs.push_back(v);
00086    }
00087 
00088    virtual ~Fixture_sparsevec()
00089    {
00090       remove(m_tsv_testfile.c_str());
00091       remove(m_python_testfile.c_str());
00092       remove(m_cf_testfile.c_str());
00093    }
00094 
00095    void check_sparsevec(const sparsevec_t& vec, const sparsevec_t& expected)
00096    {
00097       BOOST_CHECK_MESSAGE(vec.size() == expected.size(), "wrong vec size " << vec.size());
00098       for (size_t i = 0; i < vec.size(); ++i)
00099       {
00100          BOOST_CHECK(vec[i] == expected[i]);
00101       }
00102    }
00103 
00104    template<typename Reader>
00105    void check_reader(const string& datafile)
00106    {
00107       ifstream ifs(datafile.c_str());
00108       BOOST_CHECK_MESSAGE(ifs.is_open(), "couldn't open test data file " << datafile);
00109 
00110       Reader reader(ifs);
00111 
00112       int key;
00113       sparsevec_t val;
00114 
00115       bool sort_by_value = false;
00116 
00117       size_t i = 0;
00118       while (reader.read(key, val, sort_by_value))
00119       {
00120          BOOST_CHECK(key == m_keys[i]);
00121          check_sparsevec(val, m_vecs[i]);
00122          ++i;
00123       }
00124 
00125       BOOST_CHECK_MESSAGE(i == m_vecs.size(), "read too many records from " << datafile);
00126    }
00127 
00128    string m_testbase, m_tsv_testfile, m_python_testfile, m_cf_testfile;
00129    vector<int> m_keys;
00130    vector<sparsevec_t> m_vecs;
00131 };
00132 
00133 struct Fixture_vec
00134 {
00135    typedef vector<int> vec_t;
00136 
00137    Fixture_vec() : m_testbase("reader_test.txt"),
00138       m_tsv_testfile("tsv_" + m_testbase),
00139       m_python_testfile("python_" + m_testbase),
00140       m_cf_testfile("cf_" + m_testbase)
00141    {
00142       ofstream out;
00143       out.open(m_tsv_testfile.c_str());
00144       out << "95069315566190\t10\t100\t1000\n";
00145       out << "95069315566191\t20\t200\t2000\t20000\n";
00146       out.close();
00147       out.open(m_python_testfile.c_str());
00148       out << "95069315566190\t[10, 100, 1000]\n";
00149       out << "95069315566191\t[20, 200, 2000, 20000]\n";
00150       out.close();
00151 
00152       vec_t v;
00153 
00154       m_keys.push_back(95069315566190);
00155       v.push_back(10);
00156       v.push_back(100);
00157       v.push_back(1000);
00158       m_vecs.push_back(v);
00159 
00160       m_keys.push_back(95069315566191);
00161       v.clear();
00162       v.push_back(20);
00163       v.push_back(200);
00164       v.push_back(2000);
00165       v.push_back(20000);
00166       m_vecs.push_back(v);
00167    }
00168 
00169    virtual ~Fixture_vec()
00170    {
00171       remove(m_tsv_testfile.c_str());
00172       remove(m_python_testfile.c_str());
00173       remove(m_cf_testfile.c_str());
00174    }
00175 
00176    void check_vec(const vec_t& vec, const vec_t& expected)
00177    {
00178       BOOST_CHECK_MESSAGE(vec.size() == expected.size(), "wrong vec size " << vec.size());
00179       for (size_t i = 0; i < vec.size(); ++i)
00180       {
00181          BOOST_CHECK(vec[i] == expected[i]);
00182       }
00183    }
00184 
00185    template<typename Reader>
00186    void check_reader(const string& datafile)
00187    {
00188       ifstream ifs(datafile.c_str());
00189       BOOST_CHECK_MESSAGE(ifs.is_open(), "couldn't open test data file " << datafile);
00190 
00191       Reader reader(ifs);
00192 
00193       boost::intmax_t key;
00194       vec_t val;
00195 
00196       bool sort_by_value = false;
00197 
00198       size_t i = 0;
00199       while (reader.read(key, val, sort_by_value))
00200       {
00201          BOOST_CHECK(key == m_keys[i]);
00202          check_vec(val, m_vecs[i]);
00203          ++i;
00204       }
00205 
00206       BOOST_CHECK_MESSAGE(i == m_vecs.size(), "read too many records from " << datafile);
00207    }
00208 
00209    string m_testbase, m_tsv_testfile, m_python_testfile, m_cf_testfile;
00210    vector<boost::intmax_t> m_keys;
00211    vector<vec_t> m_vecs;
00212 };
00213 
00214 BOOST_FIXTURE_TEST_CASE( test_sparsevec_readers, Fixture_sparsevec )
00215 {
00216    check_reader<tsv_sparsevec_reader<int, float> >(m_tsv_testfile);
00217    check_reader<cf_sparsevec_reader<int, float> >(m_cf_testfile);
00218    check_reader<python_sparsevec_reader<int, float> >(m_python_testfile);
00219 }
00220 
00221 BOOST_FIXTURE_TEST_CASE( test_vec_readers, Fixture_vec )
00222 {
00223    check_reader<tsv_vec_reader<boost::intmax_t, int> >(m_tsv_testfile);
00224    check_reader<python_vec_reader<boost::intmax_t, int> >(m_python_testfile);
00225 }
00226 
00227 BOOST_AUTO_TEST_SUITE_END()