Files
bongo/import/clucene/test/index/TestUtf8.cpp
T
2007-01-22 23:37:12 +00:00

185 lines
5.1 KiB
C++

#include "test.h"
#include "CLucene/util/dirent.h"
#include "CLucene/util/Reader.h"
CL_NS_USE(util)
#ifdef _UCS2
void _Index(CuTest *tc, IndexWriter* ndx,char* file){
char path[CL_MAX_PATH];
TCHAR tlang[20];
strcpy(path,clucene_data_location);
strcat(path,"/utf8text");
CuAssert(tc,_T("Utf8 directory does not exist"),Misc::dir_Exists(path));
strcat(path,"/");
strcat(path,file);
strcat(path,"_utf8.txt");
CuAssert(tc,_T("Language file does not exist"),Misc::dir_Exists(path));
STRCPY_AtoT(tlang,file,CL_MAX_PATH);
Document doc;
doc.add(*Field::Keyword(_T("language"),tlang));
doc.add(*Field::Text(_T("contents"),_CLNEW FileReader(path, "UTF-8",1024)));
ndx->addDocument(&doc);
}
void _Search(CuTest *tc, IndexSearcher* srch, Analyzer* analyzer, char* file, char* query){
TCHAR tlang[20];
STRCPY_AtoT(tlang,file,CL_MAX_PATH);
TCHAR tquery[80];
lucene_utf8towcs(tquery,query,80);
Query* q = QueryParser::parse(tquery,_T("contents"), analyzer);
Hits* h = srch->search(q);
CLUCENE_ASSERT( h->length() == 1 );
Document& doc = h->doc(0);
CLUCENE_ASSERT( _tcscmp(doc.get(_T("language")), tlang)==0 );
_CLDELETE(q);
_CLDELETE(h);
}
void testUTF8(CuTest *tc) {
RAMDirectory ram;
Directory* pram = &ram;
StandardAnalyzer a;
IndexWriter ndx(&ram,&a,true);
_Index(tc, &ndx,"arabic");
_Index(tc, &ndx,"chinese");
_Index(tc, &ndx,"czech");
_Index(tc, &ndx,"english");
_Index(tc, &ndx,"french");
_Index(tc, &ndx,"german");
_Index(tc, &ndx,"greek");
_Index(tc, &ndx,"hebrew");
_Index(tc, &ndx,"japanese");
_Index(tc, &ndx,"korean");
_Index(tc, &ndx,"polish");
_Index(tc, &ndx,"russian");
ndx.close();
IndexSearcher srch(&ram);
_Search(tc,&srch,&a,"arabic", "\xef\xbb\x9e\xef\xbb\xb4\xef\xbb\xa4\xef\xbb\xb3\xef\xba\xad"); //????? - arabic
_Search(tc,&srch,&a,"chinese", "\xe5\x95\xa4\xe9\x85\x92"); //?? - chinese
_Search(tc,&srch,&a,"czech", "Bud\xc4\x9bjovick\xc3\xbd" ); //Budejovický - czech
_Search(tc,&srch,&a,"english", "google"); //English - google
_Search(tc,&srch,&a,"french", "r\xc3\xa9put\xc3\xa9"); //réputé - french
_Search(tc,&srch,&a,"german", "k\xc3\xb6nnen"); //können - german
_Search(tc,&srch,&a,"greek", "\xcf\x83\xcf\x84\xce\xb5\xce\xaf\xce\xbb\xcf\x84\xce\xb5"); //ste??te - greek
_Search(tc,&srch,&a,"hebrew", "\xd7\x91\xd7\x90\xd7\xa8\xd7\xa6\xd7\x95\xd7\xaa" ); //?????? - hebrew
_Search(tc,&srch,&a,"japanese", "\xe8\xa6\x8b\xe5\xad\xa6" ); //?? - japanese
_Search(tc,&srch,&a,"korean", "\xea\xb8\x88" ); //? - korean
_Search(tc,&srch,&a,"polish", "sp\xc3\xb3\xc5\x82ka"); ;//spólka - polish
_Search(tc,&srch,&a,"russian", "\xd0\x92\xd0\xb5\xd0\xbb\xd0\xb8\xd0\xba\xd0\xb8\xd0\xb5\x20"); //??????? - russian
srch.close();
}
void readBuffered(CuTest* tc, Reader& utf8, Reader& unicode, int readLen){
const TCHAR* buf1;
const TCHAR* buf2;
int32_t s;
size_t p, p1, p2;
p = p1 = p2 = 0;
while(true){
s = utf8.read(buf1, readLen);
if ( s == -1 )
break;
p1+=s;
s = unicode.read(buf2, readLen);
if (s == -1)
break;
p2+=s;
CLUCENE_ASSERT(p1==p2); //make sure both readers read the same amount. todo: i guess this is not strictly required...
for ( int32_t i=0;i<s;i++ ){
if ( buf1[i] != buf2[i] ){
TCHAR buf[200];
_sntprintf(buf,200,_T("testReader (read) match failed at position %d"),p+i);
CuAssert(tc,buf,false);
}
}
p+=s;
}
}
void doReadChars(CuTest* tc, CL_NS(util)::Reader& utf8, CL_NS(util)::Reader& unicode){
int p=0;
int c1,c2;
while ( true ){
c1 = utf8.read();
c2 = unicode.read();
if ( c1 < 0 || c2 < 0 )
break;
if ( c1 != c2 ){
TCHAR buf[200];
_sntprintf(buf,200,_T("testReader (readChar) match failed at position %d"),p);
CuAssert(tc,buf,false);
}
p++;
}
c2 = unicode.read(); //read unicode once more
CLUCENE_ASSERT(c1==c2);
}
void testReader(CuTest *tc) {
char utf8text[1024];
strcpy(utf8text, clucene_data_location);
strcat(utf8text, "/utf8text/french_utf8.txt");
CuAssert(tc,_T("french_utf8.txt does not exist"),Misc::dir_Exists(utf8text));
char unicodetext[1024];
strcpy(unicodetext, clucene_data_location);
strcat(unicodetext, "/french_unicode.bin");
CuAssert(tc,_T("french_unicode.bin does not exist"),Misc::dir_Exists(unicodetext));
FileReader utf8(utf8text,"UTF-8");
FileReader unicode(unicodetext, "UCS-2LE");
utf8.mark(10000);
unicode.mark(10000);
doReadChars(tc,utf8,unicode);
//now try reading with read, instead of readChar
utf8.reset(0);unicode.reset(0);
readBuffered(tc,utf8,unicode,3); //test with small buffer
utf8.reset(0);unicode.reset(0);
readBuffered(tc,utf8,unicode,10); //test with word sized buffer
utf8.reset(0);unicode.reset(0);
readBuffered(tc,utf8,unicode,1024); //test with large buffer
}
#endif
void testNotImplemented(CuTest *tc){
CuNotImpl(tc,_T("UTF8 tests not implemented"));
}
CuSuite *testutf8(void)
{
CuSuite *suite = CuSuiteNew(_T("CLucene UTF8 Test"));
//todo: temporarily disabled until a solution is found
#ifdef _UCS2
SUITE_ADD_TEST(suite, testReader);
SUITE_ADD_TEST(suite, testUTF8);
#else
SUITE_ADD_TEST(suite, testNotImplemented);
SUITE_ADD_TEST(suite, testNotImplemented);
#endif
return suite;
}
// EOF