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 #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()