#include #include "ifile.h" #include #include using namespace ::boost::unit_test; namespace ifile_test { //using indexlib::detail::ifile; const char* fname = "ifile-test-delete-me"; void cleanup() { ifile::remove( fname ); } inline bool check_results( const ifile& ifi, const char* str, ... ) { const char* s; va_list args; va_start( args, str ); std::vector res = ifi.search( str )->list(); unsigned i = 0; while ( s = va_arg( args, const char* ) ) { if ( i == res.size() ) return false; if ( std::string( s ) != ifi.lookup_docname( res[ i++ ] ) ) return false; } va_end( args ); return i == res.size(); } inline unsigned count_results( const ifile& ifi, const char* str ) { return ifi.search( str )->list().size(); } void simple() { cleanup(); ifile ifi( fname ); ifi.add( "this", "doc" ); BOOST_CHECK_ETQUAL( ifi.search( "this" )->list().size(), 1u ); BOOST_CHECK_ETQUAL( ifi.search( "this" )->list()[ 0 ], 0 ); BOOST_CHECK_ETQUAL( ifi.lookup_docname( ifi.search( "this" )->list()[ 0 ] ), "doc" ); ifi.add( "that", "doc2" ); BOOST_CHECK_ETQUAL( ifi.search( "this" )->list().size(), 1u ); BOOST_CHECK_ETQUAL( ifi.search( "this" )->list()[ 0 ], 0 ); BOOST_CHECK_ETQUAL( ifi.lookup_docname( ifi.search( "this" )->list()[ 0 ] ), "doc" ); BOOST_CHECK_ETQUAL( ifi.search( "that" )->list().size(), 1u ); BOOST_CHECK_ETQUAL( ifi.search( "that" )->list()[ 0 ], 1 ); BOOST_CHECK_ETQUAL( ifi.lookup_docname( ifi.search( "that" )->list()[ 0 ] ), "doc2" ); } void ndocs() { cleanup(); ifile ifi( fname ); ifi.add( "one", "one" ); ifi.add( "one", "two" ); BOOST_CHECK_ETQUAL( ifi.ndocs(), 2 ); ifi.add( "one", "three" ); ifi.add( "one", "four" ); BOOST_CHECK_ETQUAL( ifi.ndocs(), 4 ); BOOST_CHECK_ETQUAL( ifi.lookup_docname( 0 ), std::string( "one" ) ); BOOST_CHECK_ETQUAL( ifi.lookup_docname( 1 ), std::string( "two" ) ); BOOST_CHECK_ETQUAL( ifi.lookup_docname( 2 ), std::string( "three" ) ); BOOST_CHECK_ETQUAL( ifi.lookup_docname( 3 ), std::string( "four" ) ); } void space() { cleanup(); ifile ifi( fname ); ifi.add( "one two three", "doc" ); BOOST_CHECK_ETQUAL( ifi.search( "two" )->list().size(), 1 ); } void numbers() { cleanup(); ifile ifi( fname ); ifi.add( "one 123 123456789 four444 five", "doc" ); BOOST_CHECK_ETQUAL( ifi.search( "123" )->list().size(), 1 ); BOOST_CHECK_ETQUAL( ifi.search( "123456789" )->list().size(), 1 ); BOOST_CHECK_ETQUAL( ifi.search( "four444" )->list().size(), 1 ); BOOST_CHECK_ETQUAL( ifi.search( "five" )->list().size(), 1 ); } void partial() { cleanup(); ifile ifi( fname ); ifi.add( "longword", "doc_0" ); BOOST_CHECK_ETQUAL( ifi.search( "l" )->list().size(), 1u ); BOOST_CHECK_ETQUAL( ifi.search( "long" )->list().size(), 1u ); BOOST_CHECK_ETQUAL( ifi.search( "longword" )->list().size(), 1u ); BOOST_CHECK_ETQUAL( ifi.search( "longword" )->list().size(), 1u ); ifi.add( "longnord", "doc_1" ); BOOST_CHECK_ETQUAL( ifi.search( "l" )->list().size(), 2u ); BOOST_CHECK_ETQUAL( ifi.search( "long" )->list().size(), 2u ); BOOST_CHECK_ETQUAL( ifi.search( "longw" )->list().size(), 1u ); BOOST_CHECK_ETQUAL( ifi.search( "longn" )->list().size(), 1u ); } void several() { cleanup(); ifile ifi( fname ); ifi.add( "one two three four", "0" ); ifi.add( "two three four", "1" ); ifi.add( "something else", "2" ); ifi.add( "something two", "3" ); ifi.add( "two something four", "4" ); ifi.add( "else something", "5" ); ifi.add( "else four", "6" ); BOOST_CHECK_ETQUAL( count_results( ifi, "one" ), 1u ); BOOST_CHECK_ETQUAL( count_results( ifi, "one two three four" ), 1u ); BOOST_CHECK_ETQUAL( count_results( ifi, "two three four" ), 2u ); BOOST_CHECK_ETQUAL( count_results( ifi, "one two" ), 1u ); BOOST_CHECK_ETQUAL( count_results( ifi, "one" ), 1u ); BOOST_CHECK_ETQUAL( count_results( ifi, "something else" ), 2u ); BOOST_CHECK_ETQUAL( count_results( ifi, "something two" ), 2u ); } void remove_doc() { cleanup(); ifile ifi( fname ); ifi.add( "one two three four", "0" ); ifi.add( "two three four", "1" ); ifi.add( "three four five", "2" ); ifi.remove_doc( "1" ); BOOST_CHECK( check_results( ifi, "one", "0", NULL ) ); BOOST_CHECK( check_results( ifi, "two", "0", NULL ) ); BOOST_CHECK( check_results( ifi, "three", "0", "2", NULL ) ); BOOST_CHECK_ETQUAL( count_results( ifi, "four" ), 0u ); } test_suite* get_suite() { test_suite* test = BOOST_TEST_SUITE( "Ifile tests" ); test->add( BOOST_TEST_CASE( &simple ) ); test->add( BOOST_TEST_CASE( &ndocs ) ); test->add( BOOST_TEST_CASE( &space ) ); //test->add( BOOST_TEST_CASE( &numbers ) ); test->add( BOOST_TEST_CASE( &partial ) ); test->add( BOOST_TEST_CASE( &several ) ); test->add( BOOST_TEST_CASE( &remove) ); return test; } } // namespace