package edu.berkeley.cs.succinct; import edu.berkeley.cs.succinct.util.Source; import junit.framework.TestCase; import java.util.Iterator; import java.util.Random; import static edu.berkeley.cs.succinct.TestUtils.stringRecordCount; abstract public class SuccinctIndexedFileTest extends TestCase { protected SuccinctIndexedFile sIFile; protected int[] offsets; protected Source fileData; abstract public String getQueryString(int i); abstract public int numQueryStrings(); abstract public String getData(); /** * Test method: int getRecordOffset(int recordId) * * @throws Exception */ public void testGetRecordOffset() throws Exception { for (int i = 0; i < offsets.length; i++) { assertEquals(offsets[i], sIFile.getRecordOffset(i)); } } /** * Test method: byte[] getRecordBytes(int recordId) * * @throws Exception */ public void testGetRecord() throws Exception { for (int i = 0; i < offsets.length; i++) { String rec = sIFile.getRecord(i); for (int j = 0; j < rec.length(); j++) { assertEquals(fileData.get(offsets[i] + j), rec.charAt(j)); } } } /** * Test method: byte[] getAccess(int recordId, int offset, int length) * * @throws Exception */ public void testExtractRecord() throws Exception { for (int i = 0; i < offsets.length - 1; i++) { int recordOffset = offsets[i]; int recordLength = offsets[i + 1] - offsets[i]; if (recordLength > 0) { int offset = (new Random()).nextInt(recordLength); int length = (new Random()).nextInt(recordLength - offset); String recordData = sIFile.extractRecord(i, offset, length); assertEquals(length, recordData.length()); for (int j = 0; j < recordData.length(); j++) { assertEquals(fileData.get(recordOffset + offset + j), recordData.charAt(j)); } } } } /** * Test method: Integer[] recordSearchIds(byte[] query) * * @throws Exception */ public void testRecordSearchIds() throws Exception { for (int i = 0; i < numQueryStrings(); i++) { String query = getQueryString(i); Integer[] recordSearchIds = sIFile.recordSearchIds(query.toCharArray()); assertEquals(stringRecordCount(getData(), offsets, query), recordSearchIds.length); for (Integer recordId : recordSearchIds) { String buf = sIFile.getRecord(recordId); assertTrue(buf.contains(query)); } } } /** * Test method: Iterator<Integer> recordSearchIdIterator(byte[] query) * * @throws Exception */ public void testRecordSearchIdIterator() throws Exception { for (int i = 0; i < numQueryStrings(); i++) { String query = getQueryString(i); Iterator<Integer> recordSearchIds = sIFile.recordSearchIdIterator(query.toCharArray()); int count = 0; while (recordSearchIds.hasNext()) { Integer recordId = recordSearchIds.next(); String buf = sIFile.getRecord(recordId); assertTrue(buf.contains(query)); count++; } assertEquals(stringRecordCount(getData(), offsets, query), count); } } /** * Test method: Integer[] recordSearchRegexIds(byte[] query) * * @throws Exception */ public void testRegexSearchIds() throws Exception { // TODO: Add more tests Integer[] recordsIds = sIFile.recordSearchRegexIds("int"); for (Integer recordId : recordsIds) { assertTrue(new String(sIFile.getRecordBytes(recordId)).contains("int")); } } }