package picard.illumina.parser;
import htsjdk.samtools.util.CloseableIterator;
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import picard.PicardException;
import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static htsjdk.samtools.util.CollectionUtil.makeList;
public class PerTileParserTest {
private static final Map<String, List<Integer>> FILE_TO_VALUE = new HashMap<String, List<Integer>>();
private static final IlluminaFileMap FILE_MAP = new IlluminaFileMap();
static {
FILE_MAP.put(1, new File("s_1_1"));
FILE_MAP.put(2, new File("s_1_2"));
FILE_MAP.put(3, new File("s_1_3"));
FILE_MAP.put(4, new File("s_1_4"));
FILE_MAP.put(5, new File("s_1_5"));
FILE_TO_VALUE.put("s_1_1", makeList(1, 2, 3, 4, 5));
FILE_TO_VALUE.put("s_1_2", makeList(6, 7, 8, 9, 10));
FILE_TO_VALUE.put("s_1_3", makeList(11, 12, 13, 14, 15));
FILE_TO_VALUE.put("s_1_4", makeList(16, 17, 18, 19, 20));
FILE_TO_VALUE.put("s_1_5", makeList(21, 22, 23, 24, 25));
}
class DummyDt implements IlluminaData {
public DummyDt(final Integer value) {
this.value = value;
}
public final Integer value;
}
class MockPerTileParser extends PerTileParser<DummyDt> {
public MockPerTileParser(final IlluminaFileMap tilesToFiles) {
super(tilesToFiles);
}
@Override
protected CloseableIterator<DummyDt> makeTileIterator(final File file) {
return new CloseableIterator<DummyDt>() {
private final Iterator<Integer> values = FILE_TO_VALUE.get(file.getName()).iterator();
@Override
public void close() {
}
@Override
public boolean hasNext() {
return values.hasNext();
}
@Override
public DummyDt next() {
return new DummyDt(values.next());
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
};
}
@Override
public Set<IlluminaDataType> supportedTypes() {
return null; //To change body of implemented methods use File | Settings | File Templates.
}
}
@Test
public void basicIterationTest() {
final IlluminaFileMap fm = new IlluminaFileMap();
fm.put(1, new File("s_1_1"));
fm.put(2, new File("s_1_2"));
fm.put(3, new File("s_1_3"));
fm.put(4, new File("s_1_4"));
fm.put(5, new File("s_1_5"));
final PerTileParser<DummyDt> ddts = new MockPerTileParser(fm);
for(int i = 0; i < 25; i++) {
Assert.assertTrue(ddts.hasNext());
Assert.assertEquals(ddts.next().value, new Integer(i+1));
}
Assert.assertFalse(ddts.hasNext());
}
@DataProvider(name="seekingTests")
public Object[][] seekingTests() {
return new Object[][] {
{1, 4, null, null},
{15, 1, null, null},
{25, 3, null, null},
{24, 5, null, null},
{1, 3, 10, 1},
{1, 3, 15, 2},
{12, 2, 15, 4},
{6, 3, 12, 5},
{14, 5, 25, 2}
};
}
@Test(dataProvider = "seekingTests")
public void seekToTileTest(Integer firstSeekPos, Integer firstTile, Integer secondSeekPos, Integer secondTile) {
final PerTileParser<DummyDt> ddts = new MockPerTileParser(FILE_MAP);
for(int i = 1; i <= firstSeekPos; i++) {
Assert.assertTrue(ddts.hasNext());
Assert.assertEquals(ddts.next().value, new Integer(i));
}
ddts.seekToTile(firstTile);
int start = firstTile * 5 - 4;
if(secondSeekPos != null) {
for(int i = start; i <= secondSeekPos; i++) {
Assert.assertTrue(ddts.hasNext());
Assert.assertEquals(ddts.next().value, new Integer(i));
}
ddts.seekToTile(secondTile);
start = secondTile * 5 - 4;
}
for(int i = start; i <= 25; i++) {
Assert.assertTrue(ddts.hasNext());
Assert.assertEquals(ddts.next().value, new Integer(i));
}
Assert.assertFalse(ddts.hasNext());
}
@DataProvider(name="missingTiles")
public Object [][] missingTiles() {
return new Object [][] {
{-1}, {10}, {Integer.MAX_VALUE}, {Integer.MIN_VALUE}
};
}
@Test(expectedExceptions = PicardException.class, dataProvider="missingTiles")
public void missingTileTest(final Integer missingTile) {
final PerTileParser<DummyDt> ddts = new MockPerTileParser(FILE_MAP);
ddts.seekToTile(missingTile);
}
@Test(expectedExceptions = PicardException.class)
public void failVerifyTestTooManyTiles() {
final PerTileParser<DummyDt> ddts = new MockPerTileParser(FILE_MAP);
ddts.verifyData(makeList(1,2,3,4,5,6), null);
}
@Test(expectedExceptions = PicardException.class)
public void failVerifyTestMissingTile() {
final PerTileParser<DummyDt> ddts = new MockPerTileParser(FILE_MAP);
ddts.verifyData(makeList(1,2,4,5), null);
}
@Test
public void passVerifyTest() {
final PerTileParser<DummyDt> ddts = new MockPerTileParser(FILE_MAP);
ddts.verifyData(makeList(1,2,3,4,5), null);
}
}