diff --git a/src/main/java/htsjdk/samtools/SamFileValidator.java b/src/main/java/htsjdk/samtools/SamFileValidator.java index 5f82bd194..d0b745e7f 100644 --- a/src/main/java/htsjdk/samtools/SamFileValidator.java +++ b/src/main/java/htsjdk/samtools/SamFileValidator.java @@ -96,6 +96,8 @@ private boolean bisulfiteSequenced; private IndexValidationStringency indexValidationStringency; private boolean sequenceDictionaryEmptyAndNoWarningEmitted; + private int numWarnings; + private int numErrors; private final int maxTempFiles; @@ -111,6 +113,8 @@ public SamFileValidator(final PrintWriter out, final int maxTempFiles) { this.ignoreWarnings = false; this.bisulfiteSequenced = false; this.sequenceDictionaryEmptyAndNoWarningEmitted = false; + this.numWarnings = 0; + this.numErrors = 0; } Histogram getErrorsByType() { @@ -566,11 +570,41 @@ private void validateHeader(final SAMFileHeader fileHeader) { } } + /** + * Number of warnings during SAM file validation + * + * @return number of warnings + */ + public int getNumWarnings() { + return this.numWarnings; + } + + /** + * Number of errors during SAM file validation + * + * @return number of errors + */ + public int getNumErrors() { + return this.numErrors; + } + private void addError(final SAMValidationError error) { // Just ignore an error if it's of a type we're not interested in if (this.errorsToIgnore.contains(error.getType())) return; - if (this.ignoreWarnings && error.getType().severity == SAMValidationError.Severity.WARNING) return; + switch (error.getType().severity) { + case WARNING: + if ( this.ignoreWarnings ) { + return; + } + this.numWarnings++; + break; + case ERROR: + this.numErrors++; + break; + default: + throw new SAMException("Unknown SAM validation error severity: " + error.getType().severity); + } this.errorsByType.increment(error.getType()); if (verbose) { diff --git a/src/test/java/htsjdk/samtools/ValidateSamFileTest.java b/src/test/java/htsjdk/samtools/ValidateSamFileTest.java index f227332d2..16bd6e1ce 100644 --- a/src/test/java/htsjdk/samtools/ValidateSamFileTest.java +++ b/src/test/java/htsjdk/samtools/ValidateSamFileTest.java @@ -119,7 +119,9 @@ public void testVerbose() throws IOException { validator.validateSamFileVerbose(samBuilder.getSamReader(), null); final int lineCount = results.toString().split("\n").length; - Assert.assertEquals(lineCount, 11); + Assert.assertEquals(lineCount, 11); // 1 extra message added to indicate maximum number of errors + Assert.assertEquals(validator.getNumErrors(), 6); + Assert.assertEquals(validator.getNumWarnings(), 4); } @Test @@ -522,16 +524,18 @@ public void tagCorrectlyProcessTest(byte[] bytesFromFile, @DataProvider(name = "validateBamFileTerminationData") public Object[][] validateBamFileTerminationData() throws IOException { return new Object[][]{ - {getBrokenFile(TERMINATION_GZIP_BLOCK_SIZE), SAMValidationError.Type.BAM_FILE_MISSING_TERMINATOR_BLOCK}, - {getBrokenFile(RANDOM_NUMBER_TRUNC_BYTE), SAMValidationError.Type.TRUNCATED_FILE} + {getBrokenFile(TERMINATION_GZIP_BLOCK_SIZE), SAMValidationError.Type.BAM_FILE_MISSING_TERMINATOR_BLOCK, 1, 0}, + {getBrokenFile(RANDOM_NUMBER_TRUNC_BYTE), SAMValidationError.Type.TRUNCATED_FILE, 0, 1} }; } @Test(dataProvider = "validateBamFileTerminationData") - public void validateBamFileTerminationTest(File file, SAMValidationError.Type errorType) throws IOException { + public void validateBamFileTerminationTest(final File file, final SAMValidationError.Type errorType, final int numWarnings, final int numErrors) throws IOException { final SamFileValidator samFileValidator = new SamFileValidator(new PrintWriter(System.out), 8000); samFileValidator.validateBamFileTermination(file); Assert.assertEquals(samFileValidator.getErrorsByType().get(errorType).getValue(), 1.0); + Assert.assertEquals(samFileValidator.getNumWarnings(), numWarnings); + Assert.assertEquals(samFileValidator.getNumErrors(), numErrors); } private Histogram executeValidation(final SamReader samReader, final ReferenceSequenceFile reference,