package nl.siegmann.epublib.search;
import java.io.IOException;
import java.io.StringReader;
import java.util.List;
import junit.framework.TestCase;
import nl.siegmann.epublib.domain.Book;
import nl.siegmann.epublib.domain.Resource;
import nl.siegmann.epublib.service.MediatypeService;
public class SearchIndexTest extends TestCase {
public void testDoSearch1() {
try {
Book testBook = new Book();
testBook.addSection("chapter1", new Resource(new StringReader("a"), "chapter1.html"));
testBook.addSection("chapter2", new Resource(new StringReader("<title>ab</title>"), "chapter2.html"));
testBook.addSection("chapter3", new Resource(new StringReader("ba"), "chapter3.html"));
testBook.addSection("chapter4", new Resource(new StringReader("aa"), "chapter4.html"));
SearchIndex searchIndex = new SearchIndex(testBook);
SearchResults searchResults = searchIndex.doSearch("a");
assertFalse(searchResults.isEmpty());
assertEquals(5, searchResults.size());
assertEquals(0, searchResults.getHits().get(0).getPagePos());
assertEquals(0, searchResults.getHits().get(1).getPagePos());
assertEquals(1, searchResults.getHits().get(2).getPagePos());
assertEquals(0, searchResults.getHits().get(3).getPagePos());
assertEquals(1, searchResults.getHits().get(4).getPagePos());
} catch (IOException e) {
assertTrue(e.getMessage(), false);
}
}
public void testUnicodeTrim() {
String[] testData = new String[] {
"", "",
" ", "",
"a", "a",
"a ", "a",
" a", "a",
" a ", "a",
"\ta", "a",
"\u00a0a", "a"
};
for (int i = 0; i < testData.length; i+= 2) {
String actualText = SearchIndex.unicodeTrim(testData[i]);
assertEquals((i / 2) + ": ", testData[i + 1], actualText);
}
}
public void testInContent() {
Object[] testData = new Object[] {
"a", "a", new Integer[] {0},
"a", "aa", new Integer[] {0,1},
"a", "a \n\t\t\ta", new Integer[] {0,2},
"a", "\u00c3\u00a4", new Integer[] {0}, // ä
"a", "A", new Integer[] {0},
// ä
"a", "\u00a0\u00c4", new Integer[] {0},
"u", "ü", new Integer[] {0},
"a", "b", new Integer[] {},
"XXX", "<html><title>my title1</title><body><h1>wrong title</h1></body></html>", new Integer[] {},
"title", "<html><title>my title1</title><body><h1>wrong title</h1></body></html>", new Integer[] {3, 15}
};
for (int i = 0; i < testData.length; i+= 3) {
Resource resource = new Resource(((String) testData[i + 1]).getBytes(), MediatypeService.XHTML);
String content = SearchIndex.getSearchContent(new StringReader((String) testData[i + 1]));
String searchTerm = (String) testData[i];
Integer[] expectedResult = (Integer[]) testData[i + 2];
List<SearchResult> actualResult = SearchIndex.doSearch(searchTerm, content, resource);
assertEquals("test " + ((i / 3) + 1), expectedResult.length, actualResult.size());
for (int j = 0; j < expectedResult.length; j++) {
SearchResult searchResult = actualResult.get(j);
assertEquals("test " + (i / 3) + ", match " + j, expectedResult[j].intValue(), searchResult.getPagePos());
}
}
}
public void testCleanText() {
String[] testData = new String[] {
"", "",
" ", "",
"a", "a",
"A", "a",
"a b", "a b",
"a b", "a b",
"a\tb", "a b",
"a\nb", "a b",
"a\n\t\r \n\tb", "a b",
// "ä", "a",
"\u00c4\u00a0", "a",
"", ""
};
for (int i = 0; i < testData.length; i+= 2) {
String actualText = SearchIndex.cleanText(testData[i]);
assertEquals((i / 2) + ": '" + testData[i] + "' => '" + actualText + "' does not match '" + testData[i + 1] + "\'", testData[i + 1], actualText);
}
}
}