1 package org.broadinstitute.hellbender.tools; 2 3 import htsjdk.samtools.SAMFileHeader; 4 import htsjdk.samtools.SAMRecord; 5 import htsjdk.samtools.SamReader; 6 import htsjdk.samtools.SamReaderFactory; 7 import org.apache.commons.io.FileUtils; 8 import org.broadinstitute.hellbender.CommandLineProgramTest; 9 import org.broadinstitute.hellbender.GATKBaseTest; 10 import org.broadinstitute.hellbender.cmdline.ReadFilterArgumentDefinitions; 11 import org.broadinstitute.hellbender.cmdline.StandardArgumentDefinitions; 12 import org.broadinstitute.hellbender.engine.ReadsDataSource; 13 import org.broadinstitute.hellbender.engine.ReadsPathDataSource; 14 import org.broadinstitute.hellbender.engine.filters.ReadLengthReadFilter; 15 import org.broadinstitute.hellbender.engine.filters.ReadNameReadFilter; 16 import org.broadinstitute.hellbender.exceptions.UserException; 17 import org.broadinstitute.hellbender.testutils.ArgumentsBuilder; 18 import org.broadinstitute.hellbender.testutils.IntegrationTestSpec; 19 import org.broadinstitute.hellbender.testutils.SamAssertionUtils; 20 import org.broadinstitute.hellbender.utils.Utils; 21 import org.broadinstitute.hellbender.utils.gcs.BucketUtils; 22 import org.broadinstitute.hellbender.utils.read.GATKRead; 23 import org.testng.Assert; 24 import org.testng.annotations.DataProvider; 25 import org.testng.annotations.Test; 26 27 import java.io.File; 28 import java.io.IOException; 29 import java.nio.charset.StandardCharsets; 30 import java.util.*; 31 32 public abstract class AbstractPrintReadsIntegrationTest extends CommandLineProgramTest { 33 34 protected static final File TEST_DATA_DIR = getTestDataDir(); 35 doFileToFile(String fileIn, String extOut, String reference, boolean testMD5)36 public void doFileToFile(String fileIn, String extOut, String reference, boolean testMD5) throws Exception { 37 String samFile = fileIn; 38 final File outFile = GATKBaseTest.createTempFile(samFile + ".", extOut); 39 final File ORIG_BAM = new File(TEST_DATA_DIR, samFile); 40 final File refFile; 41 42 final ArrayList<String> args = new ArrayList<>(); 43 args.add("--input"); args.add(ORIG_BAM.getAbsolutePath()); 44 args.add("--output"); args.add(outFile.getAbsolutePath()); 45 if (reference != null) { 46 refFile = new File(TEST_DATA_DIR, reference); 47 args.add("-R"); args.add(refFile.getAbsolutePath()); 48 } 49 else { 50 refFile = null; 51 } 52 if (testMD5) { 53 args.add("--" + StandardArgumentDefinitions.CREATE_OUTPUT_BAM_MD5_LONG_NAME); 54 args.add("true"); 55 } 56 runCommandLine(args); 57 58 SamAssertionUtils.assertSamsEqual(outFile, ORIG_BAM, refFile); 59 60 if (testMD5) { 61 checkMD5asExpected(outFile); 62 } 63 } 64 checkMD5asExpected(final File outFile)65 private void checkMD5asExpected(final File outFile) throws IOException { 66 final File md5File = new File(outFile.getAbsolutePath() + ".md5"); 67 if (md5File.exists()) { 68 md5File.deleteOnExit(); 69 } 70 Assert.assertTrue(md5File.exists(), md5File + " does not exist"); 71 final String expectedMD5 = Utils.calculateFileMD5(outFile); 72 final String actualMD5 = FileUtils.readFileToString(md5File, StandardCharsets.UTF_8); 73 Assert.assertEquals(actualMD5, expectedMD5); 74 } 75 76 @Test(dataProvider="testingData") testFileToFile(String fileIn, String extOut, String reference)77 public void testFileToFile(String fileIn, String extOut, String reference) throws Exception { 78 doFileToFile(fileIn, extOut, reference, false); 79 } 80 81 @DataProvider(name="testingData") testingData()82 public Object[][] testingData() { 83 return new String[][]{ 84 {"print_reads.sam", ".sam", null}, 85 {"print_reads.sam", ".bam", null}, 86 {"print_reads.sam", ".cram", "print_reads.fasta"}, 87 {"print_reads.bam", ".sam", null}, 88 {"print_reads.bam", ".bam", null}, 89 {"print_reads.bam", ".cram", "print_reads.fasta"}, 90 {"print_reads.cram", ".sam", "print_reads.fasta"}, 91 {"print_reads.cram", ".bam", "print_reads.fasta"}, 92 {"print_reads.cram", ".cram", "print_reads.fasta"}, 93 94 {"print_reads.sorted.sam", ".sam", null}, 95 {"print_reads.sorted.sam", ".bam", null}, 96 {"print_reads.sorted.sam", ".cram", "print_reads.fasta"}, 97 {"print_reads.sorted.bam", ".sam", null}, 98 {"print_reads.sorted.bam", ".bam", null}, 99 {"print_reads.sorted.bam", ".cram", "print_reads.fasta"}, 100 {"print_reads.sorted.cram", ".sam", "print_reads.fasta"}, 101 {"print_reads.sorted.cram", ".bam", "print_reads.fasta"}, 102 {"print_reads.sorted.cram", ".cram", "print_reads.fasta"}, 103 104 {"print_reads.sorted.queryname.sam", ".sam", null}, 105 {"print_reads.sorted.queryname.sam", ".bam", null}, 106 {"print_reads.sorted.queryname.sam", ".cram", "print_reads.fasta"}, 107 {"print_reads.sorted.queryname.bam", ".sam", null}, 108 {"print_reads.sorted.queryname.bam", ".bam", null}, 109 {"print_reads.sorted.queryname.bam", ".cram", "print_reads.fasta"}, 110 {"print_reads.sorted.queryname.cram", ".sam", "print_reads.fasta"}, 111 {"print_reads.sorted.queryname.cram", ".bam", "print_reads.fasta"}, 112 {"print_reads.sorted.queryname.cram", ".cram", "print_reads.fasta"}, 113 114 //test queryname-sorted crams with multiref containers in GATK: 115 //print_reads.sorted.queryname_htsjdk_2.1.0.cram was generated from print_reads.sam 116 //using gatk4 PrintReads/htsjdk.2.1.0, which includes changes to support 117 //multireference containers 118 {"print_reads.sorted.queryname.htsjdk-2.1.0.cram", ".cram", "print_reads.fasta"}, 119 {"print_reads.sorted.queryname.htsjdk-2.1.0.cram", ".sam", "print_reads.fasta"} 120 }; 121 } 122 123 @Test testReadThatConsumesNoReferenceBases()124 public void testReadThatConsumesNoReferenceBases() throws IOException { 125 final File zeroRefBasesReadBam = new File(TEST_DATA_DIR, "read_consumes_zero_ref_bases.bam"); 126 final File outFile = GATKBaseTest.createTempFile("testReadThatConsumesNoReferenceBases", ".bam"); 127 final String[] args = new String[] { 128 "--input" , zeroRefBasesReadBam.getAbsolutePath(), 129 "--output", outFile.getAbsolutePath() 130 }; 131 // Make sure no exception is thrown given an input containing a read that consumes no reference bases 132 runCommandLine(args); 133 134 //Make sure we print the read, ie not lose it. 135 SamAssertionUtils.assertSamsEqual(outFile, zeroRefBasesReadBam); 136 } 137 138 @DataProvider(name = "UnmappedReadInclusionTestData") unmappedReadInclusionTestData()139 public Object[][] unmappedReadInclusionTestData() { 140 // This bam has mapped reads from various contigs, plus a few unmapped reads with no mapped mate 141 final File unmappedBam = new File(publicTestDir + "org/broadinstitute/hellbender/engine/reads_data_source_test1_with_unmapped.bam"); 142 143 // This is a snippet of the CEUTrio.HiSeq.WGS.b37.NA12878 bam from large, with mapped reads 144 // from chromosome 20 (with one mapped read having an unmapped mate), plus several unmapped 145 // reads with no mapped mate. 146 final File ceuSnippet = new File(publicTestDir + "org/broadinstitute/hellbender/engine/CEUTrio.HiSeq.WGS.b37.NA12878.snippet_with_unmapped.bam"); 147 final File ceuSnippetCram = new File(publicTestDir + "org/broadinstitute/hellbender/engine/CEUTrio.HiSeq.WGS.b37.NA12878.snippet_with_unmapped.cram"); 148 149 return new Object[][] { 150 { unmappedBam, null, Arrays.asList("unmapped"), Arrays.asList("u1", "u2", "u3", "u4", "u5") }, 151 // The same interval as above in an intervals file 152 { unmappedBam, null, Arrays.asList(publicTestDir + "org/broadinstitute/hellbender/engine/reads_data_source_test1_unmapped.intervals"), Arrays.asList("u1", "u2", "u3", "u4", "u5") }, 153 { unmappedBam, null, Arrays.asList("1:200-300", "unmapped"), Arrays.asList("a", "b", "c", "u1", "u2", "u3", "u4", "u5") }, 154 { unmappedBam, null, Arrays.asList("1:200-300", "4:700-701", "unmapped"), Arrays.asList("a", "b", "c", "k", "u1", "u2", "u3", "u4", "u5") }, 155 // The same intervals as above in an intervals file 156 { unmappedBam, null, Arrays.asList(publicTestDir + "org/broadinstitute/hellbender/engine/reads_data_source_test1_unmapped2.intervals"), Arrays.asList("a", "b", "c", "k", "u1", "u2", "u3", "u4", "u5") }, 157 { ceuSnippet, null, Arrays.asList("unmapped"), Arrays.asList("g", "h", "h", "i", "i") }, 158 { ceuSnippet, null, Arrays.asList("20:10000009-10000011"), Arrays.asList("a", "b", "c", "d", "e") }, 159 { ceuSnippet, null, Arrays.asList("20:10000009-10000011", "unmapped"), Arrays.asList("a", "b", "c", "d", "e", "g", "h", "h", "i", "i") }, 160 { ceuSnippet, null, Arrays.asList("20:10000009-10000013", "unmapped"), Arrays.asList("a", "b", "c", "d", "e", "f", "f", "g", "h", "h", "i", "i") }, 161 { ceuSnippetCram, b37_reference_20_21, Arrays.asList("unmapped"), Arrays.asList("g", "h", "h", "i", "i") }, 162 { ceuSnippetCram, b37_reference_20_21, Arrays.asList("20:10000009-10000011", "unmapped"), Arrays.asList("a", "b", "c", "d", "e", "g", "h", "h", "i", "i") }, 163 { ceuSnippetCram, b37_reference_20_21, Arrays.asList("20:10000009-10000013", "unmapped"), Arrays.asList("a", "b", "c", "d", "e", "f", "f", "g", "h", "h", "i", "i") } 164 }; 165 } 166 167 @Test(dataProvider = "UnmappedReadInclusionTestData") testUnmappedReadInclusion( final File input, final String reference, final List<String> intervalStrings, final List<String> expectedReadNames )168 public void testUnmappedReadInclusion( final File input, final String reference, final List<String> intervalStrings, final List<String> expectedReadNames ) { 169 final File outFile = createTempFile("testUnmappedReadInclusion", ".bam"); 170 171 final ArgumentsBuilder args = new ArgumentsBuilder(); 172 args.addRaw("-I"); args.addRaw(input.getAbsolutePath()); 173 args.addRaw("-O"); args.addRaw(outFile.getAbsolutePath()); 174 for ( final String intervalString : intervalStrings ) { 175 args.addRaw("-L"); args.addRaw(intervalString); 176 } 177 if ( reference != null ) { 178 args.addRaw("-R"); args.addRaw(reference); 179 } 180 181 runCommandLine(args); 182 183 try ( final ReadsDataSource outputReadsSource = new ReadsPathDataSource(outFile.toPath()) ) { 184 final List<GATKRead> actualReads = new ArrayList<>(); 185 for ( final GATKRead read : outputReadsSource ) { 186 actualReads.add(read); 187 } 188 189 Assert.assertEquals(actualReads.size(), expectedReadNames.size(), "Wrong number of reads output"); 190 191 for ( int readNumber = 0; readNumber < actualReads.size(); ++readNumber ) { 192 Assert.assertEquals(actualReads.get(readNumber).getName(), expectedReadNames.get(readNumber), "Unexpected read name"); 193 } 194 } 195 } 196 197 @DataProvider(name="readFilterTestData") testReadFilterData()198 public static Object[][] testReadFilterData() { 199 return new Object[][]{ 200 {"print_reads_one_malformed_read.sam", null, ".sam", Collections.emptyList(), 7}, 201 {"print_reads_one_malformed_read.sam", null, ".sam", Arrays.asList("--" + ReadFilterArgumentDefinitions.DISABLE_TOOL_DEFAULT_READ_FILTERS), 8}, 202 {"print_reads_one_malformed_read.sam", null, ".sam", 203 Arrays.asList("--" + ReadFilterArgumentDefinitions.DISABLE_READ_FILTER_LONG_NAME, "WellformedReadFilter"), 8}, 204 {"print_reads.sorted.sam", null, ".sam", Arrays.asList("--" + ReadFilterArgumentDefinitions.DISABLE_TOOL_DEFAULT_READ_FILTERS), 8}, 205 {"print_reads.sorted.sam", null, ".sam", 206 Arrays.asList( 207 "--" + ReadFilterArgumentDefinitions.READ_FILTER_LONG_NAME, ReadNameReadFilter.class.getSimpleName(), 208 "--" + ReadFilterArgumentDefinitions.READ_NAME_LONG_NAME, "both_reads_align_clip_adapter"), 209 2}, 210 {"print_reads.sorted.sam", null, ".sam", 211 Arrays.asList( 212 "--" + ReadFilterArgumentDefinitions.READ_FILTER_LONG_NAME, ReadLengthReadFilter.class.getSimpleName(), 213 "--" + ReadFilterArgumentDefinitions.MIN_READ_LENGTH_ARG_NAME, "100", 214 "--" + ReadFilterArgumentDefinitions.MAX_READ_LENGTH_ARG_NAME, "200"), 215 8}, 216 {"print_reads.sorted.sam", null, ".sam", 217 Arrays.asList( 218 "--" + ReadFilterArgumentDefinitions.READ_FILTER_LONG_NAME, ReadLengthReadFilter.class.getSimpleName(), 219 "--" + ReadFilterArgumentDefinitions.MIN_READ_LENGTH_ARG_NAME, "1", 220 "--" + ReadFilterArgumentDefinitions.MAX_READ_LENGTH_ARG_NAME, "10"), 221 0}, 222 {"print_reads.sorted.sam", null, ".sam", 223 Arrays.asList( 224 "--" + ReadFilterArgumentDefinitions.READ_FILTER_LONG_NAME, ReadNameReadFilter.class.getSimpleName(), 225 "--" + ReadFilterArgumentDefinitions.READ_NAME_LONG_NAME, "both_reads_align_clip_adapter", 226 "--" + ReadFilterArgumentDefinitions.READ_FILTER_LONG_NAME, ReadLengthReadFilter.class.getSimpleName(), 227 "--" + ReadFilterArgumentDefinitions.MIN_READ_LENGTH_ARG_NAME, "100", 228 "--" + ReadFilterArgumentDefinitions.MAX_READ_LENGTH_ARG_NAME, "101"), 229 2}, 230 {"print_reads.sorted.bam", null, ".sam", Arrays.asList("--" + ReadFilterArgumentDefinitions.DISABLE_TOOL_DEFAULT_READ_FILTERS), 8}, 231 {"print_reads.sorted.bam", null, ".sam", 232 Arrays.asList( 233 "--" + ReadFilterArgumentDefinitions.READ_FILTER_LONG_NAME, ReadNameReadFilter.class.getSimpleName(), 234 "--" + ReadFilterArgumentDefinitions.READ_NAME_LONG_NAME, "both_reads_align_clip_adapter"), 235 2}, 236 {"print_reads.sorted.bam", null, ".sam", 237 Arrays.asList( 238 "--" + ReadFilterArgumentDefinitions.READ_FILTER_LONG_NAME, ReadLengthReadFilter.class.getSimpleName(), 239 "--" + ReadFilterArgumentDefinitions.MIN_READ_LENGTH_ARG_NAME, "100", 240 "--" + ReadFilterArgumentDefinitions.MAX_READ_LENGTH_ARG_NAME, "101"), 241 8}, 242 {"print_reads.sorted.bam", null, ".sam", 243 Arrays.asList( 244 "--" + ReadFilterArgumentDefinitions.READ_FILTER_LONG_NAME, ReadNameReadFilter.class.getSimpleName(), 245 "--" + ReadFilterArgumentDefinitions.READ_NAME_LONG_NAME, "both_reads_align_clip_adapter", 246 "--" + ReadFilterArgumentDefinitions.READ_FILTER_LONG_NAME, ReadLengthReadFilter.class.getSimpleName(), 247 "--" + ReadFilterArgumentDefinitions.MIN_READ_LENGTH_ARG_NAME, "100", 248 "--" + ReadFilterArgumentDefinitions.MAX_READ_LENGTH_ARG_NAME, "101"), 249 2}, 250 {"print_reads.sorted.cram", "print_reads.fasta", ".sam", 251 Arrays.asList( 252 "--" + ReadFilterArgumentDefinitions.READ_FILTER_LONG_NAME, ReadNameReadFilter.class.getSimpleName(), 253 "--" + ReadFilterArgumentDefinitions.READ_NAME_LONG_NAME, "both_reads_align_clip_adapter", 254 "--" + ReadFilterArgumentDefinitions.READ_FILTER_LONG_NAME, ReadLengthReadFilter.class.getSimpleName(), 255 "--" + ReadFilterArgumentDefinitions.MIN_READ_LENGTH_ARG_NAME, "100", 256 "--" + ReadFilterArgumentDefinitions.MAX_READ_LENGTH_ARG_NAME, "101"), 257 2}, 258 }; 259 } 260 261 @Test(dataProvider = "readFilterTestData") testReadFilters( final String input, final String reference, final String extOut, final List<String> inputArgs, final int expectedCount)262 public void testReadFilters( 263 final String input, 264 final String reference, 265 final String extOut, 266 final List<String> inputArgs, 267 final int expectedCount) throws IOException 268 { 269 final File outFile = createTempFile("testReadFilter", extOut); 270 271 final ArgumentsBuilder args = new ArgumentsBuilder(); 272 args.addRaw("-I"); args.addRaw(new File(TEST_DATA_DIR, input).getAbsolutePath()); 273 args.addRaw("-O"); args.addRaw(outFile.getAbsolutePath()); 274 if ( reference != null ) { 275 args.addRaw("-R"); args.addRaw(new File(TEST_DATA_DIR, reference).getAbsolutePath()); 276 } 277 for (final String filter : inputArgs) { 278 args.addRaw(filter); 279 } 280 281 runCommandLine(args); 282 283 284 SamReaderFactory factory = SamReaderFactory.makeDefault(); 285 if (reference != null) { 286 factory = factory.referenceSequence(new File(TEST_DATA_DIR, reference)); 287 } 288 int count = 0; 289 try (final SamReader reader = factory.open(outFile)) { 290 Iterator<SAMRecord> it = reader.iterator(); 291 while (it.hasNext()) { 292 SAMRecord rec = it.next(); 293 count++; 294 } 295 } 296 Assert.assertEquals(count, expectedCount); 297 } 298 299 @Test(expectedExceptions = UserException.MissingReference.class) testNonExistentReference()300 public void testNonExistentReference() throws Exception { 301 final File inCram = new File(TEST_DATA_DIR, "print_reads.sorted.cram"); 302 final File outCram = GATKBaseTest.createTempFile("print_reads_bad_reference", ".cram"); 303 304 ArgumentsBuilder args = new ArgumentsBuilder(); 305 args.addRaw("--" + StandardArgumentDefinitions.INPUT_LONG_NAME); 306 args.addRaw(inCram.getCanonicalPath()); 307 args.addRaw("--" + StandardArgumentDefinitions.OUTPUT_LONG_NAME); 308 args.addRaw(outCram.getCanonicalPath()); 309 args.addRaw("-R"); 310 args.addRaw(GATKBaseTest.getSafeNonExistentFile("Nonexistent.fasta").getCanonicalPath()); 311 312 runCommandLine(args.getArgsArray()); 313 } 314 315 @DataProvider gcsTestingData()316 public Object[][] gcsTestingData() { 317 return new Object[][]{ 318 {"org/broadinstitute/hellbender/engine/CEUTrio.HiSeq.WGS.b37.NA12878.20.21.10000000-10000020.with.unmapped.bam", 319 ".bam", false, null}, 320 {"org/broadinstitute/hellbender/engine/CEUTrio.HiSeq.WGS.b37.NA12878.20.21.10000000-10000020.with.unmapped.bam", 321 ".bam", true, null}, 322 }; 323 } 324 325 /** 326 * Test GCS access. 327 * 328 * For this to work, the settings in src/main/resources/core-site.xml must be correct, 329 * and the project name and credential file it points to must be present. 330 */ 331 @Test(dataProvider = "gcsTestingData", groups = "bucket") testGCSInputsAndOutputs(final String gcsInput, final String outputExtension, final boolean outputToGCS, final File expectedOutput)332 public void testGCSInputsAndOutputs(final String gcsInput, final String outputExtension, 333 final boolean outputToGCS, final File expectedOutput) { 334 final String gcsInputPath = getGCPTestInputPath() + gcsInput; 335 final String outputPrefix = outputToGCS ? getGCPTestStaging() : "testGCSInputsAndOutputs"; 336 final String outputPath = BucketUtils.getTempFilePath(outputPrefix, outputExtension); 337 338 final ArgumentsBuilder argBuilder = new ArgumentsBuilder(); 339 argBuilder.add("input", gcsInputPath) 340 .add("output", outputPath); 341 runCommandLine(argBuilder); 342 } 343 344 @Test() testCoordinateSortedInRegion()345 public void testCoordinateSortedInRegion() throws Exception { 346 final File inBam = new File(getTestDataDir(), "print_reads.sorted.bam"); 347 final File expectedBam = new File(getTestDataDir(), "print_reads.sorted.chr1_1.bam"); 348 final File outBam = GATKBaseTest.createTempFile("print_reads", ".bam"); 349 ArgumentsBuilder args = new ArgumentsBuilder(); 350 args.addRaw("--" + StandardArgumentDefinitions.INPUT_LONG_NAME); 351 args.addRaw(inBam.getCanonicalPath()); 352 args.addRaw("--" + StandardArgumentDefinitions.OUTPUT_LONG_NAME); 353 args.addRaw(outBam.getCanonicalPath()); 354 args.addRaw("-L chr7:1-100 -XL chr7:2-100"); 355 356 this.runCommandLine(args.getArgsArray()); 357 358 SamAssertionUtils.assertSamsEqual(outBam, expectedBam); 359 } 360 361 @Test(expectedExceptions = UserException.IncompatibleSequenceDictionaries.class) testSequenceDictionaryValidation()362 public void testSequenceDictionaryValidation() throws Exception { 363 final File inCram = new File(getTestDataDir(), "print_reads.sorted.cram"); 364 final File inRef = new File(getTestDataDir(), "print_reads.chr1only.fasta"); 365 final File outBam = GATKBaseTest.createTempFile("print_reads", ".bam"); 366 ArgumentsBuilder args = new ArgumentsBuilder(); 367 args.addRaw("--" + StandardArgumentDefinitions.INPUT_LONG_NAME); 368 args.addRaw(inCram.getCanonicalPath()); 369 args.addRaw("-R"); 370 args.addRaw(inRef.getCanonicalPath()); 371 args.addRaw("--" + StandardArgumentDefinitions.OUTPUT_LONG_NAME); 372 args.addRaw(outBam.getCanonicalPath()); 373 374 this.runCommandLine(args.getArgsArray()); 375 } 376 377 @Test() testUnSorted()378 public void testUnSorted() throws Exception { 379 final File inBam = new File(getTestDataDir(), "print_reads.unsorted.bam"); 380 try (ReadsDataSource ds = new ReadsPathDataSource(inBam.toPath())){ 381 Assert.assertEquals(ds.getHeader().getSortOrder(), SAMFileHeader.SortOrder.unsorted); 382 } 383 final File outBam = GATKBaseTest.createTempFile("print_reads", ".bam"); 384 ArgumentsBuilder args = new ArgumentsBuilder(); 385 args.addRaw("--" + StandardArgumentDefinitions.INPUT_LONG_NAME); 386 args.addRaw(inBam.getCanonicalPath()); 387 args.addRaw("--" + StandardArgumentDefinitions.OUTPUT_LONG_NAME); 388 args.addRaw(outBam.getCanonicalPath()); 389 390 this.runCommandLine(args.getArgsArray()); 391 392 SamAssertionUtils.assertSamsEqual(outBam, inBam); 393 } 394 395 @Test() testReadFiltering()396 public void testReadFiltering() throws IOException { 397 final File samWithOneMalformedRead = new File(getTestDataDir(), "print_reads_one_malformed_read.sam"); 398 final File outBam = GATKBaseTest.createTempFile("print_reads_testReadFiltering", ".bam"); 399 400 ArgumentsBuilder args = new ArgumentsBuilder(); 401 args.addRaw("--" + StandardArgumentDefinitions.INPUT_LONG_NAME); 402 args.addRaw(samWithOneMalformedRead.getCanonicalPath()); 403 args.addRaw("--" + StandardArgumentDefinitions.OUTPUT_LONG_NAME); 404 args.addRaw(outBam.getCanonicalPath()); 405 406 runCommandLine(args.getArgsArray()); 407 SamAssertionUtils.assertSamsEqual(outBam, new File(getTestDataDir(), "expected.print_reads_one_malformed_read.bam")); 408 } 409 410 @Test() testReadFiltering_asIntegrationTestSpec()411 public void testReadFiltering_asIntegrationTestSpec() throws IOException { 412 final File samWithOneMalformedRead = new File(getTestDataDir(), "print_reads_one_malformed_read.sam"); 413 414 final IntegrationTestSpec spec = new IntegrationTestSpec( 415 " --" + StandardArgumentDefinitions.INPUT_LONG_NAME + " " + samWithOneMalformedRead.getCanonicalPath() + 416 " --" + StandardArgumentDefinitions.OUTPUT_LONG_NAME + " " + "%s", 417 Arrays.asList(new File(getTestDataDir(), "expected.print_reads_one_malformed_read.bam").getCanonicalPath()) 418 ); 419 spec.executeTest("testReadFiltering_asIntegrationTestSpec", this); 420 } 421 }