package picard.illumina.parser.readers;
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import picard.PicardException;
import java.io.File;
public class AbstractIlluminaPositionFileReaderTest {
//Pos values should never be negative
private static final float [] X_COORDS = new float[] {
0.00f, 0.012f, 0.09f, 1.44f, 23.45f, 155.893f, 588.921f, 801f, 1201.182f, 101.25f,
13201.01f, 0.59f, 0.3540f, 9999999.99f, 7989.88999f, 9298.134f, 12.3f, 109.09f, 54.3f, 17.15f
};
private static final int [] X_QSEQ_COORDS = new int [] {
1000, 1000, 1001, 1014, 1235, 2559, 6889, 9010, 13012, 2013,
133010, 1006, 1004, 100001000, 80899, 93981, 1123, 2091, 1543, 1172
};
private static final float [] Y_COORDS = new float[] {
//A note on index 2 -> this number causes truncation of the float, presumably that's fine as
//Illumina describes the value as a floating point number
679.99f, 32.0145f, 1878854.89f, 0.00f, 23.45f, 9875.64f, 42.42f, 64.01530f, 103.25f, 102.75f,
13201.01f, 0.59f, 0.3540f, 0.02f, 9875.66f, 9298.134f, 12.3f, 67.012f, 0.1254f, 19.54f
};
private static final int [] Y_QSEQ_COORDS = new int [] {
7800, 1320, 18789548, 1000, 1235, 99756, 1424, 1640, 2033, 2028,
133010, 1006, 1004, 1000, 99757, 93981, 1123, 1670, 1001, 1195
};
private static class MockPositionFileReader extends AbstractIlluminaPositionFileReader {
private final float [] xCoords;
private final float [] yCoords;
private int currentCluster;
public MockPositionFileReader(final String fileName, final int lane, final int tile, final float [] xCoords, final float [] yCoords) {
super(new File(fileName));
this.xCoords = xCoords;
this.yCoords = yCoords;
currentCluster = 0;
}
public MockPositionFileReader(final int lane, final int tile, final float [] xCoords, final float [] yCoords) {
super(new File("s_" + lane + "_" + tile + "_pos.txt.gz"));
this.xCoords = xCoords;
this.yCoords = yCoords;
currentCluster = 0;
}
@Override
protected PositionInfo unsafeNextInfo() {
PositionInfo pi = new PositionInfo(xCoords[currentCluster], yCoords[currentCluster], getLane(), getTile());
++currentCluster;
return pi;
}
@Override
protected String makeExceptionMsg() {
return "Abstract IlluminaPositionFileReaderTest currentCluster=" + currentCluster;
}
@Override
public boolean hasNext() {
return currentCluster < xCoords.length;
}
@Override
public void close() {
}
}
@Test
public void validReaderTest() {
final int lane = 2;
final int tile = 8;
final AbstractIlluminaPositionFileReader reader = new MockPositionFileReader(lane, tile, X_COORDS, Y_COORDS);
int index = 0;
while(reader.hasNext()) {
AbstractIlluminaPositionFileReader.PositionInfo pi = reader.next();
Assert.assertEquals(pi.lane, lane);
Assert.assertEquals(pi.tile, tile);
Assert.assertEquals(pi.xPos, X_COORDS[index]);
Assert.assertEquals(pi.yPos, Y_COORDS[index]);
Assert.assertEquals(pi.xQseqCoord, X_QSEQ_COORDS[index]);
Assert.assertEquals(pi.yQseqCoord, Y_QSEQ_COORDS[index]);
++index;
}
if(index < X_COORDS.length) {
throw new RuntimeException("Elements still remaining in test data!");
}
}
@DataProvider(name="invalidPositions")
public Object [][] invalidPositions() {
return new Object[][] {
{new float[]{0f, 5f, -11f}, new float[]{1f, 12f, 13f}},
{new float[]{-15.05f}, new float[]{19801f}},
{new float[]{10.05f, 3f, 8f}, new float[]{-120899.723f, 4f, 9f}},
{new float[]{9.0f, 2.3f, AbstractIlluminaPositionFileReader.MAX_POS + 1}, new float[]{3.2f, 8.1f, 99.1f}},
{new float[]{0.01f}, new float[]{AbstractIlluminaPositionFileReader.MAX_POS + 1000}}
};
}
@Test(expectedExceptions = IllegalArgumentException.class, dataProvider = "invalidPositions")
public void invalidReaderTest(float [] xCoords, float [] yCoords){
final int lane = 3;
final int tile = 4;
final AbstractIlluminaPositionFileReader reader = new MockPositionFileReader(lane, tile, xCoords, yCoords);
int index = 0;
while(reader.hasNext()) {
AbstractIlluminaPositionFileReader.PositionInfo pi = reader.next();
Assert.assertEquals(pi.lane, lane);
Assert.assertEquals(pi.tile, tile);
Assert.assertEquals(pi.xPos, xCoords[index]);
Assert.assertEquals(pi.yPos, yCoords[index]);
++index;
}
}
@DataProvider(name = "invalidFileNames")
public Object [][] invalidFileNames() {
return new Object[][]{
{"whatever.locs"},
{"whatever.clocs"},
{"whatever.pos"},
{"s_1.clocs"},
{"s__2.clocs"},
{"s_1_4.Notclocs"},
{"a_1_4.pos"},
{"a_1_4.pos.txt"}
};
}
@Test(expectedExceptions = PicardException.class, dataProvider = "invalidFileNames")
public void invalidFileNamesTest(final String fileName){
final int lane = 3;
final int tile = 4;
final AbstractIlluminaPositionFileReader reader = new MockPositionFileReader(fileName, 0, 0, null, null);
}
@Test(expectedExceptions = UnsupportedOperationException.class)
public void iteratorRemoveTest() {
final AbstractIlluminaPositionFileReader reader = new MockPositionFileReader("s_1_1_pos.txt", 0, 0, null, null);
reader.remove();
}
}