package picard.illumina.parser; import org.testng.Assert; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import static htsjdk.samtools.util.CollectionUtil.makeList; public class PosParserTest { public static final File TEST_DIR = new File("testdata/picard/illumina/parserTests/posParser"); public static final File S_1_1_POS = new File(TEST_DIR, "s_1_1_pos.txt"); public static final File S_1_2_POS = new File(TEST_DIR, "s_1_2_pos.txt"); public static final File S_1_3_POS = new File(TEST_DIR, "s_1_3_pos.txt"); public static final File S_9_3201_POS = new File(TEST_DIR, "s_9_3201_pos.txt"); public static final File S_9_3202_POS = new File(TEST_DIR, "s_9_3202_pos.txt"); static class TestResult { public final int lane; public final int tile; public final float xPos; public final float yPos; public final int xQSeqCoord; public final int yQSeqCoord; public TestResult(final int lane, final int tile, final float xPos, final float yPos, final int xQseqCoord, final int yQSeqCoord) { this.lane = lane; this.tile = tile; this.xPos = xPos; this.yPos = yPos; this.xQSeqCoord = xQseqCoord; this.yQSeqCoord = yQSeqCoord; } } public static List<TestResult> makeTestResults(final int lane, final int tile, final float [] xyPos, final int [] xyQseq) { final ArrayList<TestResult> results = new ArrayList<TestResult>(); for(int i = 0; i < xyPos.length; i+=2) { results.add(new TestResult(lane, tile, xyPos[i], xyPos[i+1], xyQseq[i], xyQseq[i+1])); } return results; } public static Map<String, List<TestResult>> TEST_DATA = new HashMap<String, List<TestResult>>(); static { float[] pos = { 101.35f, 207.8f, 102.88f, 209.22f, 0.35f, 211.99f, 10.11f, 2540.55f, 11011.81f, 211 }; int[] qseq = { 2014, 3078, 2029, 3092, 1004, 3120, 1101, 26406, 111118, 3110 }; TEST_DATA.put(S_1_1_POS.getName(), makeTestResults(1,1, pos, qseq)); pos = new float[] { 2101.35f, 207.82f, 202.88f, 209.222f, 2.35f, 211.992f, 2.11f, 2540.552f, 21011.81f, 2112f }; qseq = new int[]{ 22014, 3078, 3029, 3092, 1024, 3120, 1021, 26406, 211118, 22120 }; TEST_DATA.put(S_1_2_POS.getName(), makeTestResults(1,2, pos, qseq)); pos = new float[] { 301.35f, 207.83f, 302.88f, 209.23f, 0.35f, 911.993f, 30.11f, 2540.553f }; qseq = new int[]{ 4014, 3078, 4029, 3092, 1004, 10120, 1301, 26406 }; TEST_DATA.put(S_1_3_POS.getName(), makeTestResults(1,3, pos, qseq)); pos = new float[] { 901.00f, 8011.00f, 9.05f, 32.00f, 3201.11f, 32001.00f }; qseq = new int[]{ 10010, 81110, 1091, 1320, 33011, 321010 }; TEST_DATA.put(S_9_3201_POS.getName(), makeTestResults(9,3201, pos, qseq)); pos = new float[] { 3252f, 7785f, 97.350f, 0.01f, 88.00f, 942.01f, 87.85f, 70.01f, 32022.000f, 32000.0f }; qseq = new int[]{ 33520, 78850, 1974, 1000, 1880, 10420, 1879, 1700, 321220, 321000 }; TEST_DATA.put(S_9_3202_POS.getName(), makeTestResults(9,3202, pos, qseq)); } public static void compareResults(final TestResult tr, final PositionalData pd, final int index) { Assert.assertEquals(tr.xQSeqCoord, pd.getXCoordinate(), " At index " + index); Assert.assertEquals(tr.yQSeqCoord, pd.getYCoordinate(), " At index " + index); } @DataProvider(name = "singleTileData") public Object [][] singleTileData() { return new Object[][]{ {1, 1, S_1_1_POS}, {1, null, S_1_1_POS}, {3202, 3202, S_9_3202_POS}, {3202, null, S_9_3202_POS} }; } @Test(dataProvider = "singleTileData") public void singleTileDataTest(final int tile, final Integer startingTile, final File file) { final IlluminaFileMap fm = new IlluminaFileMap(); fm.put(tile, file); final PosParser parser = (startingTile == null) ? new PosParser(fm, IlluminaFileUtil.SupportedIlluminaFormat.Pos) : new PosParser(fm, startingTile, IlluminaFileUtil.SupportedIlluminaFormat.Pos); final Iterator<TestResult> expected = TEST_DATA.get(file.getName()).iterator(); int index = 0; while(expected.hasNext()) { Assert.assertTrue(parser.hasNext()); compareResults(expected.next(), parser.next(), index); ++index; } Assert.assertFalse(parser.hasNext()); parser.close(); } @DataProvider(name = "multiTileData") public Object [][] multiTileData() { return new Object[][]{ {makeList(1,2,3), null, makeList(S_1_1_POS, S_1_2_POS, S_1_3_POS)}, {makeList(1,2,3), 1, makeList(S_1_1_POS, S_1_2_POS, S_1_3_POS)}, {makeList(1,3), 0, makeList(S_1_1_POS, S_1_3_POS)}, {makeList(3201,3202), null, makeList(S_9_3201_POS, S_9_3202_POS)}, {makeList(3201,3202), 1, makeList(S_9_3201_POS, S_9_3202_POS)}, }; } @Test(dataProvider = "multiTileData") public void multiTileDataTest(final List<Integer> tiles, final Integer startingTileIndex, final List<File> files) { final IlluminaFileMap fm = new IlluminaFileMap(); for(int i = 0; i < tiles.size(); i++) { fm.put(tiles.get(i), files.get(i)); } final PosParser parser = (startingTileIndex == null) ? new PosParser(fm, IlluminaFileUtil.SupportedIlluminaFormat.Pos) : new PosParser(fm, tiles.get(startingTileIndex), IlluminaFileUtil.SupportedIlluminaFormat.Pos); final List<TestResult> expectedResultsList = new ArrayList<TestResult>(); final int t1 = (startingTileIndex != null) ? startingTileIndex : 0; for(int i = t1; i < tiles.size(); i++) { expectedResultsList.addAll(TEST_DATA.get(files.get(i).getName())); } final Iterator<TestResult> expected = expectedResultsList.iterator(); int index = 0; while(expected.hasNext()) { Assert.assertTrue(parser.hasNext()); compareResults(expected.next(), parser.next(), index); ++index; } Assert.assertFalse(parser.hasNext()); parser.close(); } }