package htsjdk.samtools.util;
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import java.util.Arrays;
public class SolexaQualityConverterTest {
//declared as a staic variable because we reuse it in IlluminaUtilTest
public static Object[][] SOLEXA_QUALS_TO_PHRED_SCORE = new Object[][] {
new Object[]{new byte[]{}, new byte[]{}},
new Object[]{iToB(new int[]{120}), iToB(new int[]{56})},
new Object[]{iToB(new int[]{64, 65, 120, 121}), iToB(new int[]{3, 4, 56, 57})},
new Object[]{iToB(new int[]{0, 1, 63}), iToB(new int[]{0, 0, 0})}
};
public static Object[][] SOLEXA_QUALS_TO_PHRED_SCORE_1_3 = new Object[][] {
new Object[]{new byte[]{}, new byte[]{}},
new Object[]{iToB(new int[]{120}), iToB(new int[]{56})},
new Object[]{iToB(new int[]{64, 65, 120, 121, 156, 157}), iToB(new int[]{0, 1, 56, 57, 92, 93})},
new Object[]{iToB(new int[]{0, 1, 63}), iToB(new int[]{-64, -63, -1})}
};
public static Object[][] INVALID_SOLEXA_QUALS = new Object[][] {
new Object[]{iToB(new int[]{-1}), iToB(new int[]{-65})},
new Object[]{iToB(new int[]{-1, -2}), iToB(new int[]{-65, -66})}
};
private static final byte [] iToB(int [] intVals) {
byte [] byteVals = new byte[intVals.length];
for(int i = 0; i < byteVals.length; i++) {
byteVals[i] = (byte) intVals[i];
}
return byteVals;
}
@DataProvider(name="solexaQualsToPhredScore")
public Object[][] solexaQualsToPhredScore() {return SOLEXA_QUALS_TO_PHRED_SCORE;}
@DataProvider(name="solexaQualsToPhredScore_1_3")
public Object[][] solexaQualsToPhredScore_1_3() {return SOLEXA_QUALS_TO_PHRED_SCORE_1_3;}
@DataProvider(name="invalidSolexaQuals")
public Object[][] invalidSolexaQuals() {return INVALID_SOLEXA_QUALS;}
@Test(dataProvider="solexaQualsToPhredScore")
public void solexaQualsToPhredScoreTestArray(byte [] solexaQuals, byte [] phredScores) {
byte [] qualsToPhred = Arrays.copyOf(solexaQuals, solexaQuals.length);
SolexaQualityConverter.getSingleton().convertSolexaQualityCharsToPhredBinary(qualsToPhred);
Assert.assertEquals(phredScores, qualsToPhred);
}
@Test(dataProvider="solexaQualsToPhredScore_1_3")
public void solexaQualsToPhredScoreTestArray_1_3(byte [] solexaQuals, byte [] phredScores) {
byte [] qualsToPhred = Arrays.copyOf(solexaQuals, solexaQuals.length);
SolexaQualityConverter.getSingleton().convertSolexa_1_3_QualityCharsToPhredBinary(qualsToPhred);
Assert.assertEquals(phredScores, qualsToPhred);
}
@Test(dataProvider="invalidSolexaQuals")
public void invalidSolexaQualsTestArray(byte [] solexaQuals, byte [] phredScores) {
byte [] qualsToPhred = Arrays.copyOf(solexaQuals, solexaQuals.length);
SolexaQualityConverter.getSingleton().convertSolexa_1_3_QualityCharsToPhredBinary(qualsToPhred);
Assert.assertEquals(phredScores, qualsToPhred);
}
@Test(dataProvider="solexaQualsToPhredScore")
public void solexaCharToPhredBinaryTest(final byte [] solexaQuals, byte [] phredScores) {
final SolexaQualityConverter solexaConverter = SolexaQualityConverter.getSingleton();
for(int i = 0; i < solexaQuals.length; i++) {
Assert.assertEquals(phredScores[i], solexaConverter.solexaCharToPhredBinary(solexaQuals[i]));
}
}
@Test(dataProvider="invalidSolexaQuals", expectedExceptions = IndexOutOfBoundsException.class)
public void invalidSolexaCharToPhredBinaryTest(final byte [] solexaQuals, byte [] phredScores) {
final SolexaQualityConverter solexaConverter = SolexaQualityConverter.getSingleton();
for(int i = 0; i < solexaQuals.length; i++) {
solexaConverter.solexaCharToPhredBinary(solexaQuals[i]);
}
}
}