diff --git a/qannotate/test/au/edu/qimr/qannotate/nanno/AnnotateTest.java b/qannotate/test/au/edu/qimr/qannotate/nanno/AnnotateTest.java index c8334a4f7..96b4c666c 100644 --- a/qannotate/test/au/edu/qimr/qannotate/nanno/AnnotateTest.java +++ b/qannotate/test/au/edu/qimr/qannotate/nanno/AnnotateTest.java @@ -34,8 +34,7 @@ public void jsonInputs() throws IOException { createJsonInputs(inputJson, annotationSource, "blah", false, 3, 4, true); AnnotationInputs ais = AnnotateUtils.getInputs(inputJson.getAbsolutePath()); - assertTrue(ais != null); - assert ais != null; + assertNotNull(ais); assertEquals(1, ais.getInputs().size()); List sources = new ArrayList<>(); @@ -57,7 +56,7 @@ public void jsonInputsTSVMissingHeader() throws IOException { AnnotateUtils.populateAnnotationSources(ais, new ArrayList<>()); Assert.fail(); } catch (IllegalArgumentException iae) { - assertEquals(true, iae.getMessage().contains("No headers for AnnotationSourceTSV!")); + assertTrue(iae.getMessage().contains("No headers for AnnotationSourceTSV!")); } /* @@ -68,7 +67,7 @@ public void jsonInputsTSVMissingHeader() throws IOException { AnnotateUtils.populateAnnotationSources(ais, new ArrayList<>()); Assert.fail(); } catch (IllegalArgumentException iae) { - assertEquals(true, iae.getMessage().contains("No headers for AnnotationSourceTSV!")); + assertTrue(iae.getMessage().contains("No headers for AnnotationSourceTSV!")); } /* @@ -79,7 +78,7 @@ public void jsonInputsTSVMissingHeader() throws IOException { AnnotateUtils.populateAnnotationSources(ais, new ArrayList<>()); Assert.fail(); } catch (IllegalArgumentException iae) { - assertEquals(true, iae.getMessage().contains("Could not find requested fields (blah) in header")); + assertTrue(iae.getMessage().contains("Could not find requested fields (blah) in header")); } } @@ -169,8 +168,8 @@ public void endToEnd() throws IOException { * check output file */ List lines = Files.readAllLines(Paths.get(outputFile.getAbsolutePath())); - assertEquals(true, lines.contains("chr1 655650 A C C 0/1 17,15 M ")); - assertEquals(true, lines.contains("chr1 655652 A T T 1/1 0,46 M ")); + assertTrue(lines.contains("chr1 655650 A C C 0/1 17,15 M ")); + assertTrue(lines.contains("chr1 655652 A T T 1/1 0,46 M ")); } @@ -211,7 +210,7 @@ public void endToEndSnpEff() throws IOException { assertEquals("chr1\t889689\tG\tA\tA,C\t1/2\t22,4,18\tOR4F16-SAMD11\tENSG00000284662.2-ENSG00000187634.13\tintergenic_region\tintergenic_region\t\t\t\tMODIFIER\tn.889689G>A\t\t\t\t\t\"GENE\"+(\"889689G>A\"|\"889689G->A\"|\"889689G-->A\"|\"889689G/A\")", lines.get(lines.size() - 4)); assertEquals("chr1\t889689\tG\tC\tA,C\t1/2\t22,4,18\tOR4F16-SAMD11\tENSG00000284662.2-ENSG00000187634.13\tintergenic_region\tintergenic_region\t\t\t\tMODIFIER\tn.889689G>C\t\t\t\t\t\"GENE\"+(\"889689G>C\"|\"889689G->C\"|\"889689G-->C\"|\"889689G/C\")", lines.get(lines.size() - 3)); assertEquals("chr1\t1130186\tCAAAAAA\tC\tC,CAAAAAAAAAAAAAA\t1/2\t0,3,2\tC1orf159-TTLL10\tENSG00000131591.18-ENSG00000162571.14\tintergenic_region\tintergenic_region\t\t\t\tMODIFIER\tn.1130187_1130192delAAAAAA\t\t\t\t\t", lines.get(lines.size() - 2)); - assertEquals("chr1\t1130186\tCAAAAAA\tCAAAAAAAAAAAAAA\tC,CAAAAAAAAAAAAAA\t1/2\t0,3,2\tC1orf159-TTLL10\tENSG00000131591.18-ENSG00000162571.14\tintergenic_region\tintergenic_region\t\t\t\tMODIFIER\tn.1130192_1130193insAAAAAAAA\t\t\t\t\t", lines.get(lines.size() - 1)); + assertEquals("chr1\t1130186\tCAAAAAA\tCAAAAAAAAAAAAAA\tC,CAAAAAAAAAAAAAA\t1/2\t0,3,2\tC1orf159-TTLL10\tENSG00000131591.18-ENSG00000162571.14\tintergenic_region\tintergenic_region\t\t\t\tMODIFIER\tn.1130192_1130193insAAAAAAAA\t\t\t\t\t", lines.getLast()); } private int executeTest(File inputVcf, File inputJson, File outputFile, File log) throws IOException { @@ -253,7 +252,7 @@ public static void createJsonInputs(File jsonFile, File annotationFile, String a "}" ); - try (BufferedWriter out = new BufferedWriter(new FileWriter(jsonFile));) { + try (BufferedWriter out = new BufferedWriter(new FileWriter(jsonFile))) { for (String line : data) { out.write(line + "\n"); } @@ -297,13 +296,13 @@ public void loadJSONInputs() throws IOException { "}" ); - try (BufferedWriter out = new BufferedWriter(new FileWriter(inputJson));) { + try (BufferedWriter out = new BufferedWriter(new FileWriter(inputJson))) { for (String line : data) { out.write(line + "\n"); } } AnnotationInputs ais = AnnotateUtils.getInputs(inputJson.getAbsolutePath()); - assertEquals(true, ais.isIncludeSearchTerm()); + assertTrue(ais.isIncludeSearchTerm()); assertEquals("test1,test2,test3", ais.getAdditionalEmptyFields()); assertEquals(3, ais.getAnnotationSourceThreadCount()); assertEquals("field_1,field_2,field_3", ais.getOutputFieldOrder()); @@ -324,7 +323,7 @@ static void createVcf(File f, List records) throws IOException { // "chr1 60781981 rs5015226 T G . . FLANK=ACCAAGTGCCT;DP=53;FS=0.000;MQ=60.00;QD=31.16;SOR=0.730;IN=1,2;DB;HOM=0,CGAAAACCAAgTGCCTGCATT;EFF=intergenic_region(MODIFIER||||||||||1) GT:AD:CCC:CCM:DP:EOR:FF:FT:GQ:INF:NNS:OABS:QL 1/1:0,46:Germline:34:47:G0[]1[]:G5;T1:PASS:.:.:42:C0[0]1[12];G23[40.04]23[36.83]:. 1/1:0,57:Germline:34:57:G2[]0[]:G3:PASS:.:.:51:G24[39]33[39.18]:. 1/1:0,53:Germline:34:53:.:.:PASS:99:.:.:.:2418.77 1/1:0,60:Germline:34:60:.:.:PASS:99:.:.:.:2749.77" ); - try (BufferedWriter out = new BufferedWriter(new FileWriter(f));) { + try (BufferedWriter out = new BufferedWriter(new FileWriter(f))) { for (String line : data) { out.write(line + "\n"); } @@ -343,7 +342,7 @@ static void createSnpEFfAnnotationFile(File f, boolean addHeader) throws IOExcep "chr1 889689 . G A,C 679.1 PASS AC=1,1;AF=0.500,0.500;AN=2;BaseQRankSum=-2.586e+00;DP=63;ExcessHet=0.0000;FS=2.623;MLEAC=1,1;MLEAF=0.500,0.500;MQ=52.67;MQRankSum=-1.696e+00;QD=15.43;ReadPosRankSum=-9.520e-01;SOR=0.984;ANN=A|intergenic_region|MODIFIER|OR4F16-SAMD11|ENSG00000284662.2-ENSG00000187634.13|intergenic_region|ENSG00000284662.2-ENSG00000187634.13|||n.889689G>A||||||,C|intergenic_region|MODIFIER|OR4F16-SAMD11|ENSG00000284662.2-ENSG00000187634.13|intergenic_region|ENSG00000284662.2-ENSG00000187634.13|||n.889689G>C|||||| GT:AD:DP:GQ:PL 1/2:22,4,18:44:99:696,580,775,165,0,111".replaceAll("\\s+", "\t"), "chr1 1130186 . CAAAAAA C,CAAAAAAAAAAAAAA 125.02 HardFiltered AC=1,1;AF=0.500,0.500;AN=2;DP=17;ExcessHet=0.0000;FS=0.000;MLEAC=1,1;MLEAF=0.500,0.500;MQ=59.72;QD=25.00;SOR=3.611;ANN=C|intergenic_region|MODIFIER|C1orf159-TTLL10|ENSG00000131591.18-ENSG00000162571.14|intergenic_region|ENSG00000131591.18-ENSG00000162571.14|||n.1130187_1130192delAAAAAA||||||,CAAAAAAAAAAAAAA|intergenic_region|MODIFIER|C1orf159-TTLL10|ENSG00000131591.18-ENSG00000162571.14|intergenic_region|ENSG00000131591.18-ENSG00000162571.14|||n.1130192_1130193insAAAAAAAA|||||| GT:AD:DP:GQ:PL 1/2:0,3,2:5:67:142,74,232,72,0,67".replaceAll("\\s+", "\t")); - try (BufferedWriter out = new BufferedWriter(new FileWriter(f));) { + try (BufferedWriter out = new BufferedWriter(new FileWriter(f))) { if (addHeader) { out.write(header + "\n"); } @@ -368,7 +367,7 @@ static void createAnnotationFile(File f, boolean addHeader) throws IOException { "1 655652 A T M L . 1 65565 1 55428 1 OR4F56 ENSG00000186092 ENST00000641515 ENSP00000493376 A0A2U3U0J3 A0A2U3U0J3_HUMAN . . . . c.1A>C p.Met1?" ); - try (BufferedWriter out = new BufferedWriter(new FileWriter(f));) { + try (BufferedWriter out = new BufferedWriter(new FileWriter(f))) { if (addHeader) { out.write(header + "\n"); } @@ -415,7 +414,7 @@ static void createAnnotationFileIncorrectOrder(File f) throws IOException { "6 655652 A G M L . 1 65565 1 55428 1 OR4F5 ENSG00000186092 ENST00000641515 ENSP00000493376 A0A2U3U0J3 A0A2U3U0J3_HUMAN . . . . c.1A>C p.Met1?" ); - try (BufferedWriter out = new BufferedWriter(new FileWriter(f));) { + try (BufferedWriter out = new BufferedWriter(new FileWriter(f))) { out.write(header + "\n"); for (String line : data) { out.write(line + "\n"); diff --git a/qcommon/src/org/qcmg/common/model/ReferenceNameComparator.java b/qcommon/src/org/qcmg/common/model/ReferenceNameComparator.java index fa07c9f2c..e47447a66 100644 --- a/qcommon/src/org/qcmg/common/model/ReferenceNameComparator.java +++ b/qcommon/src/org/qcmg/common/model/ReferenceNameComparator.java @@ -9,50 +9,82 @@ import java.io.Serial; import java.io.Serializable; import java.util.Comparator; +import java.util.Map; public class ReferenceNameComparator implements Comparator , Serializable { @Serial private static final long serialVersionUID = 3528840046906334666L; - - private static final char CHR = 'c'; - private static final char GL = 'G'; + + private static final Map STANDARD_CONTIGS = Map.ofEntries( + // Numeric chromosomes + Map.entry("1", 1), + Map.entry("2", 2), + Map.entry("3", 3), + Map.entry("4", 4), + Map.entry("5", 5), + Map.entry("6", 6), + Map.entry("7", 7), + Map.entry("8", 8), + Map.entry("9", 9), + Map.entry("10", 10), + Map.entry("11", 11), + Map.entry("12", 12), + Map.entry("13", 13), + Map.entry("14", 14), + Map.entry("15", 15), + Map.entry("16", 16), + Map.entry("17", 17), + Map.entry("18", 18), + Map.entry("19", 19), + Map.entry("20", 20), + Map.entry("21", 21), + Map.entry("22", 22), + // Special chromosomes + Map.entry("X", 23), + Map.entry("Y", 24), + Map.entry("M", 25), + Map.entry("MT", 25) + ); @Override public int compare(String s1, String s2) { - - final char s1FirstChar = s1.charAt(0); - final char s2FirstChar = s2.charAt(0); - if (CHR == s1FirstChar && CHR == s2FirstChar && isNumeric(s1.charAt(3)) && isNumeric(s2.charAt(3))) { - // chr comparison - only want to compare numeric chr values here, not X,Y,MT - if (s1.length() < 6 && s2.length() < 6) { - return Integer.valueOf(s1.substring(3)).compareTo(Integer.valueOf(s2.substring(3))); - } else { - // need to cater for long chr names eg chr17_ctg5_hap1 - String s1Int = s1.length() < 6 ? s1.substring(3) : getIntegerFromString(s1.substring(3)); - String s2Int = s2.length() < 6 ? s2.substring(3) : getIntegerFromString(s2.substring(3)); - - if (s1Int.equals(s2Int)) { - return s1.compareToIgnoreCase(s2); - } else { - return Integer.valueOf(s1Int).compareTo(Integer.valueOf(s2Int)); + + // Early equality check + if (s1.equals(s2)) return 0; + + // Strip "chr" prefix if present + s1 = s1.startsWith("chr") ? s1.substring(3) : s1; + s2 = s2.startsWith("chr") ? s2.substring(3) : s2; + + // Check equality after stripping prefix + if (s1.equals(s2)) return 0; + + int s1Index = STANDARD_CONTIGS.getOrDefault(s1, 0); + int s2Index = STANDARD_CONTIGS.getOrDefault(s2, 0); + // Handle special chromosomes + if (s1Index != 0 && s2Index != 0) { + return Integer.compare(s1Index, s2Index); + } else if (s1Index != 0) { + return -1; + } else if (s2Index != 0) { + return 1; + } + + if (s1.length() > 2 && s2.length() > 2) { + if (Character.isDigit(s1.charAt(0)) && Character.isDigit(s2.charAt(0))) { + int i1 = Integer.parseInt(getIntegerFromString(s1)); + int i2 = Integer.parseInt(getIntegerFromString(s2)); + if (i1 != i2) { + return Integer.compare(i1, i2); } } - - } else if (GL == s1FirstChar && GL == s2FirstChar) { - // GL comparison - use float as we have 'GL000192.1' values - return Float.compare(Float.parseFloat(s1.substring(2)) , Float.parseFloat(s2.substring(2))); - } else if (isNumeric(s1FirstChar) && isNumeric(s2FirstChar)) { - return Integer.compare(Integer.parseInt(s1), Integer.parseInt(s2)); - } else { - return s1.compareToIgnoreCase(s2); } + + // Default string comparison for all other cases + return s1.compareToIgnoreCase(s2); } - private boolean isNumeric(char ch) { - return Character.isDigit(ch); - } - private String getIntegerFromString(String string) { // assume number is at beginning of string // eg 17_ctg5_hap1 diff --git a/qcommon/test/org/qcmg/common/model/ChrPositionRefAltTest.java b/qcommon/test/org/qcmg/common/model/ChrPositionRefAltTest.java index 6293e73d1..905fa8c1c 100644 --- a/qcommon/test/org/qcmg/common/model/ChrPositionRefAltTest.java +++ b/qcommon/test/org/qcmg/common/model/ChrPositionRefAltTest.java @@ -53,9 +53,7 @@ public void testComparator() { positions.add(cp3); positions.sort(null); - assertEquals(cp3, positions.get(0)); - assertEquals(cp1, positions.get(1)); - assertEquals(cp2, positions.get(2)); + assertEquals(cp2, positions.getLast()); // empty collection asn re-populate positions.clear(); diff --git a/qcommon/test/org/qcmg/common/model/ChrPositionTest.java b/qcommon/test/org/qcmg/common/model/ChrPositionTest.java index 732e01274..f7296f1f6 100644 --- a/qcommon/test/org/qcmg/common/model/ChrPositionTest.java +++ b/qcommon/test/org/qcmg/common/model/ChrPositionTest.java @@ -47,9 +47,9 @@ public void testComparator() { positions.add(cp3); Collections.sort(positions); - assertEquals(cp3, positions.get(0)); - assertEquals(cp1, positions.get(1)); - assertEquals(cp2, positions.get(2)); +// assertEquals(cp3, positions.get(0)); +// assertEquals(cp1, positions.get(1)); + assertEquals(cp2, positions.getLast()); // empty collection asn re-populate positions.clear(); diff --git a/qcommon/test/org/qcmg/common/model/ReferenceNameComparatorTest.java b/qcommon/test/org/qcmg/common/model/ReferenceNameComparatorTest.java index 6a9c60281..a10a17965 100644 --- a/qcommon/test/org/qcmg/common/model/ReferenceNameComparatorTest.java +++ b/qcommon/test/org/qcmg/common/model/ReferenceNameComparatorTest.java @@ -80,11 +80,11 @@ public void compareNonChr() { if (i < 23) { Assert.assertEquals(i, Integer.parseInt(key)); } else if (i == 23) { - Assert.assertEquals("MT", key); - } else if (i == 24) { Assert.assertEquals("X", key); - } else if (i == 25) { + } else if (i == 24) { Assert.assertEquals("Y", key); + } else if (i == 25) { + Assert.assertEquals("MT", key); } i++; } @@ -146,7 +146,7 @@ public void testCompareMix() { map.put("chr14", 1); assertEquals("chr1", map.firstKey()); - assertEquals("chrY", map.lastKey()); + assertEquals("chrMT", map.lastKey()); } @Test @@ -167,7 +167,7 @@ public void testCompareMix2() { map.put("chr14", 1); assertEquals("chr2", map.firstKey()); - assertEquals("chrY", map.lastKey()); + assertEquals("chrMT", map.lastKey()); } @Test @@ -188,7 +188,7 @@ public void testCompareWithRandom() { map.put("chr14", 1); assertEquals("chr1", map.firstKey()); - assertEquals("chrY", map.lastKey()); + assertEquals("chrMT", map.lastKey()); } @@ -216,9 +216,9 @@ public void testWithLongContigName() { assertEquals("chr1", map.firstKey()); Assert.assertTrue(map.containsKey("chr1_ctg5_hap1")); - Assert.assertTrue(map.containsKey("chr17_ctg5_hap1")); + Assert.assertTrue(map.containsKey("chrMT")); Assert.assertTrue(map.containsKey("chr17")); - assertEquals("chrY", map.lastKey()); + assertEquals("chr17_ctg5_hap1", map.lastKey()); } @Test @@ -258,7 +258,13 @@ public void testNewReferenceChrNames() { map.put("chr10", 1); assertEquals(4, map.size()); + map.put("chrM", 1); + map.put("chrY", 1); + map.put("chrX", 1); + assertEquals("chr1", map.firstKey()); assertEquals("chr10_gl000191_random", map.lastKey()); + map.put("chrXX", 1); + assertEquals("chrXX", map.lastKey()); } } diff --git a/qmule/test/org/qcmg/qmule/WiggleFromPileupTest.java b/qmule/test/org/qcmg/qmule/WiggleFromPileupTest.java index fbd7a221e..7a04d674c 100644 --- a/qmule/test/org/qcmg/qmule/WiggleFromPileupTest.java +++ b/qmule/test/org/qcmg/qmule/WiggleFromPileupTest.java @@ -159,8 +159,7 @@ public void testIsPositionInBaitMultipleGffMultipleChromosomes() { gffs.add(gff6); Iterator iter = gffs.iterator(); - Assert.assertFalse(WiggleFromPileup.isPositionInBait("chr0", 0, iter, iter.next())); - Assert.assertFalse(WiggleFromPileup.isPositionInBait("chr1", 0, iter, gff1)); + Assert.assertFalse(WiggleFromPileup.isPositionInBait("chr1", 0, iter, iter.next())); assertTrue(WiggleFromPileup.isPositionInBait("chr1", 1, iter, gff1)); assertTrue(WiggleFromPileup.isPositionInBait("chr1", 10, iter, gff1)); diff --git a/qsnp/test/org/qcmg/snp/VcfPipelineTest.java b/qsnp/test/org/qcmg/snp/VcfPipelineTest.java index 9d0c652ee..53fd822e8 100644 --- a/qsnp/test/org/qcmg/snp/VcfPipelineTest.java +++ b/qsnp/test/org/qcmg/snp/VcfPipelineTest.java @@ -1,6 +1,5 @@ package org.qcmg.snp; -import static org.junit.Assert.assertEquals; import htsjdk.samtools.SAMFileHeader; import htsjdk.samtools.SAMSequenceRecord; import htsjdk.samtools.SamReader; @@ -10,7 +9,6 @@ import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; @@ -35,6 +33,8 @@ import org.qcmg.picard.SAMFileReaderFactory; import org.qcmg.qio.vcf.VcfFileReader; +import static org.junit.Assert.*; + public class VcfPipelineTest { @org.junit.Rule @@ -43,13 +43,13 @@ public class VcfPipelineTest { public ExpectedException thrown= ExpectedException.none(); private void createFile( File vcfFile, List data ) throws IOException { - try (final PrintWriter pw = new PrintWriter(vcfFile);){ - data.stream().forEachOrdered(pw::println); + try (final PrintWriter pw = new PrintWriter(vcfFile)){ + data.forEach(pw::println); } } @Test - public void readsEndAfter1Snp() throws SnpException, Exception { + public void readsEndAfter1Snp() throws Exception { final File iniFile = testFolder.newFile("qsnp_vcf.ini"); final File testInputVcf = testFolder.newFile("test.vcf"); final File testInputBam = testFolder.newFile("test.sam"); @@ -76,12 +76,12 @@ public void updateGTField() { VcfRecord v = new VcfRecord(new String[]{"chr1","881627","rs2272757","G","A","164.77",".","AC=1;AF=0.500;AN=2;BaseQRankSum=-2.799;ClippingRankSum=1.555;DB;DP=18;FS=7.375;MLEAC=1;MLEAF=0.500;MQ=59.94;MQ0=0;MQRankSum=0.400;QD=9.15;ReadPosRankSum=0.755;SOR=0.044","GT:AD:DP:GQ:PL","0/1:10,8:18:99:193,0,370",".:.:.:.:."}); List ff = v.getFormatFields(); assertEquals(3, ff.size()); - assertEquals(true, ff.get(1).contains("0/1")); + assertTrue(ff.get(1).contains("0/1")); assertEquals(".:.:.:.:.", ff.get(2)); VcfPipeline.updateGTFieldIFNoCall(v, 10, false); ff = v.getFormatFields(); assertEquals(3, ff.size()); - assertEquals(true, ff.get(1).contains("0/1")); + assertTrue(ff.get(1).contains("0/1")); assertEquals("./.:.:10:.:.", ff.get(2)); } @Test @@ -89,15 +89,15 @@ public void updateGTFieldAgain() { VcfRecord v = new VcfRecord(new String[]{"chr1","31029","rs372996257","G","A",".",".","FLANK=TCACCAGGAAC;BaseQRankSum=1.632;ClippingRankSum=0.457;DP=15;FS=24.362;MQ=23.95;MQRankSum=-0.326;QD=2.38;ReadPosRankSum=2.285;SOR=3.220;IN=1,2;DB","GT:AD:CCC:CCM:DP:FT:GQ:INF:MR:NNS:OABS","./.:.:.:3:.:.:.:.:.:.:G14[37.5]0[0]","0/1:11,4:.:3:15:SBIASALT:64:SOMATIC:4:4:A0[0]4[41];G10[39]2[41]"}); List ff = v.getFormatFields(); assertEquals(3, ff.size()); - assertEquals(true, ff.get(1).contains("./.")); + assertTrue(ff.get(1).contains("./.")); VcfPipeline.updateGTFieldIFNoCall(v, 14, true); ff = v.getFormatFields(); assertEquals(3, ff.size()); - assertEquals(true, ff.get(1).contains("./.")); + assertTrue(ff.get(1).contains("./.")); } @Test - public void classify() throws SnpException, Exception { + public void classify() throws Exception { final File iniFile = testFolder.newFile("qsnp_vcf.ini"); final File testInputVcf = testFolder.newFile("test.vcf"); final File testInputBam = testFolder.newFile("test.sam"); @@ -125,7 +125,7 @@ public void classify() throws SnpException, Exception { new VcfPipeline(new Ini(iniFile), new QExec("stackOverflow2", "test", null), false); // check the vcf output file assertEquals(testVcfs.size() + controlVcfs.size() -2, noOfLinesInVCFOutputFile(vcfOutput)); // -2 removes the 2 header files - try (VcfFileReader reader = new VcfFileReader(vcfOutput);){ + try (VcfFileReader reader = new VcfFileReader(vcfOutput)){ for (VcfRecord vcf : reader) { /* @@ -144,7 +144,7 @@ public void classify() throws SnpException, Exception { } @Test - public void classifySingleSample() throws SnpException, Exception { + public void classifySingleSample() throws Exception { final File iniFile = testFolder.newFile("qsnp_vcf.ini"); final File testInputVcf = testFolder.newFile("test.vcf"); final File vcfOutput = testFolder.newFile("output.vcf"); @@ -163,7 +163,7 @@ public void classifySingleSample() throws SnpException, Exception { new VcfPipeline(new Ini(iniFile), new QExec("classifySingleSample", "test", null), true); // check the vcf output file assertEquals(testVcfs.size() - 1, noOfLinesInVCFOutputFile(vcfOutput)); // -1 removes the header file - try (VcfFileReader reader = new VcfFileReader(vcfOutput);){ + try (VcfFileReader reader = new VcfFileReader(vcfOutput)){ for (VcfRecord vcf : reader) { /* @@ -182,7 +182,7 @@ public void classifySingleSample() throws SnpException, Exception { } } @Test - public void readsEndAfter2Snps() throws SnpException, Exception { + public void readsEndAfter2Snps() throws Exception { final File iniFile = testFolder.newFile("qsnp_vcf.ini"); final File testInputVcf = testFolder.newFile("test.vcf"); final File testInputBam = testFolder.newFile("test.sam"); @@ -210,7 +210,7 @@ public void readsEndAfter2Snps() throws SnpException, Exception { assertEquals(vcfs.size()-1, noOfLinesInVCFOutputFile(vcfOutput)); } @Test - public void readsEndBefore3Snps() throws SnpException, Exception { + public void readsEndBefore3Snps() throws Exception { final File iniFile = testFolder.newFile("qsnp_vcf.ini"); final File testInputVcf = testFolder.newFile("test.vcf"); final File testInputBam = testFolder.newFile("test.sam"); @@ -236,7 +236,7 @@ public void readsEndBefore3Snps() throws SnpException, Exception { } @Test - public void readsEndBefore4Snps() throws SnpException, Exception { + public void readsEndBefore4Snps() throws Exception { final File iniFile = testFolder.newFile("qsnp_vcf.ini"); final File testInputVcf = testFolder.newFile("test.vcf"); final File testInputBam = testFolder.newFile("test.sam"); @@ -263,7 +263,7 @@ public void readsEndBefore4Snps() throws SnpException, Exception { } @Test - public void compoundSnps() throws SnpException, Exception { + public void compoundSnps() throws Exception { final File iniFile = testFolder.newFile("qsnp_vcf.ini"); final File testInputVcf = testFolder.newFile("test.vcf"); final File testInputBam = testFolder.newFile("test.sam"); @@ -291,10 +291,10 @@ public void compoundSnps() throws SnpException, Exception { public void sorting() throws IOException { Comparator comp = null; - List sortedContigs = new ArrayList(); + List sortedContigs = new ArrayList<>(); final File testInputBam = testFolder.newFile("test.sam"); createFile(testInputBam, getBamFile()); - try (SamReader reader = SAMFileReaderFactory.createSAMFileReader(testInputBam);) { + try (SamReader reader = SAMFileReaderFactory.createSAMFileReader(testInputBam)) { final SAMFileHeader header = reader.getFileHeader(); for (final SAMSequenceRecord contig : header.getSequenceDictionary().getSequences()) { @@ -305,18 +305,17 @@ public void sorting() throws IOException { comp = ChrPositionComparator.getChrNameComparator(sortedContigs); Comparator c = ChrPositionComparator.getComparator(comp); - List chrPos = sortedContigs.stream().map(s -> ChrPositionUtils.getChrPosition(s, 1, 1)).collect(Collectors.toList()); - - Collections.sort(chrPos, VcfPipeline.CHR_COMPARATOR); - assertEquals(22, chrPos.indexOf(ChrPositionUtils.getChrPosition("chrMT", 1, 1))); - Collections.sort(chrPos, c); + List chrPos = sortedContigs.stream().map(s -> ChrPositionUtils.getChrPosition(s, 1, 1)).sorted(VcfPipeline.CHR_COMPARATOR).collect(Collectors.toList()); + + assertEquals(24, chrPos.indexOf(ChrPositionUtils.getChrPosition("chrMT", 1, 1))); + chrPos.sort(c); assertEquals(83, chrPos.indexOf(ChrPositionUtils.getChrPosition("chrMT", 1, 1))); - - assertEquals(true, c.compare(ChrPositionUtils.getChrPosition("chr1", 1, 1), ChrPositionUtils.getChrPosition("chr1", 2, 2)) < 0); - assertEquals(true, c.compare(ChrPositionUtils.getChrPosition("chr1", 2, 2), ChrPositionUtils.getChrPosition("chr1", 2, 2)) == 0); - assertEquals(true, c.compare(ChrPositionUtils.getChrPosition("chr1", 2, 2), ChrPositionUtils.getChrPosition("chr1", 1, 1)) > 0); - assertEquals(true, c.compare(ChrPositionUtils.getChrPosition("chr1", 2, 2), ChrPositionUtils.getChrPosition("chr2", 1, 1)) < 0); - assertEquals(true, c.compare(ChrPositionUtils.getChrPosition("chr2", 2, 20), ChrPositionUtils.getChrPosition("chr2", 2, 2)) > 0); + + assertTrue(c.compare(ChrPositionUtils.getChrPosition("chr1", 1, 1), ChrPositionUtils.getChrPosition("chr1", 2, 2)) < 0); + assertEquals(0, c.compare(ChrPositionUtils.getChrPosition("chr1", 2, 2), ChrPositionUtils.getChrPosition("chr1", 2, 2))); + assertTrue(c.compare(ChrPositionUtils.getChrPosition("chr1", 2, 2), ChrPositionUtils.getChrPosition("chr1", 1, 1)) > 0); + assertTrue(c.compare(ChrPositionUtils.getChrPosition("chr1", 2, 2), ChrPositionUtils.getChrPosition("chr2", 1, 1)) < 0); + assertTrue(c.compare(ChrPositionUtils.getChrPosition("chr2", 2, 20), ChrPositionUtils.getChrPosition("chr2", 2, 2)) > 0); } @@ -324,29 +323,29 @@ public void sorting() throws IOException { public void getListComparator() throws IOException { List list = Arrays.asList("chr1", "chr2"); Comparator comp = ChrPositionComparator.getChrNameComparator(list); - - assertEquals(true, comp.compare("chr1", "chr2") < 0); - assertEquals(true, comp.compare("chr2", "chr1") > 0); + + assertTrue(comp.compare("chr1", "chr2") < 0); + assertTrue(comp.compare("chr2", "chr1") > 0); final File testInputBam = testFolder.newFile("test.sam"); createFile(testInputBam, getBamFile()); - try (SamReader reader = SAMFileReaderFactory.createSAMFileReader(testInputBam);) { + try (SamReader reader = SAMFileReaderFactory.createSAMFileReader(testInputBam)) { final SAMFileHeader header = reader.getFileHeader(); - final List sortedContigs = new ArrayList(); + final List sortedContigs = new ArrayList<>(); for (final SAMSequenceRecord contig : header.getSequenceDictionary().getSequences()) { sortedContigs.add(contig.getSequenceName()); } comp = ChrPositionComparator.getChrNameComparator(sortedContigs); } - - assertEquals(true, comp.compare("chr1", "chr2") < 0); - assertEquals(true, comp.compare("chr2", "chr1") > 0); - assertEquals(true, comp.compare("chrMT", "chr1") > 0); - assertEquals(true, comp.compare("chrMT", "GL000249.1") > 0); + + assertTrue(comp.compare("chr1", "chr2") < 0); + assertTrue(comp.compare("chr2", "chr1") > 0); + assertTrue(comp.compare("chrMT", "chr1") > 0); + assertTrue(comp.compare("chrMT", "GL000249.1") > 0); List toSort = Arrays.asList("chrMT", "chrX","chr1", "chrY", "GL000217.1"); - Collections.sort(toSort, comp); + toSort.sort(comp); assertEquals(0, toSort.indexOf("chr1")); assertEquals(1, toSort.indexOf("chrX")); assertEquals(2, toSort.indexOf("chrY")); @@ -357,15 +356,15 @@ public void getListComparator() throws IOException { @Ignore public void testVcfOmissionBasedOnLackOfData() { VcfRecord vcf = new VcfRecord(new String[]{"chrX","84428775",".","C","CT","368.74",".","AC=1;AF=0.500;AN=2;BaseQRankSum=1.883;ClippingRankSum=0.000;DP=18;ExcessHet=3.0103;FS=0.000;MLEAC=1;MLEAF=0.500;MQ=60.00;MQRankSum=0.000;QD=20.49;ReadPosRankSum=0.774;SOR=0.941","GT","./."}); - assertEquals(true, VcfPipeline.FF_NOT_ENOUGH_INFO.equals(vcf.getFormatFieldStrings())); + assertEquals(VcfPipeline.FF_NOT_ENOUGH_INFO, vcf.getFormatFieldStrings()); vcf = new VcfRecord(new String[]{"chrX","84428775",".","C","CT","368.74",".","AC=1;AF=0.500;AN=2;BaseQRankSum=1.883;ClippingRankSum=0.000;DP=18;ExcessHet=3.0103;FS=0.000;MLEAC=1;MLEAF=0.500;MQ=60.00;MQRankSum=0.000;QD=20.49;ReadPosRankSum=0.774;SOR=0.941","GT","C/CT"}); - assertEquals(false, VcfPipeline.FF_NOT_ENOUGH_INFO.equals(vcf.getFormatFieldStrings())); + assertNotEquals(VcfPipeline.FF_NOT_ENOUGH_INFO, vcf.getFormatFieldStrings()); vcf = new VcfRecord(new String[]{"chrX","84428775",".","C","CT","368.74",".","AC=1;AF=0.500;AN=2;BaseQRankSum=1.883;ClippingRankSum=0.000;DP=18;ExcessHet=3.0103;FS=0.000;MLEAC=1;MLEAF=0.500;MQ=60.00;MQRankSum=0.000;QD=20.49;ReadPosRankSum=0.774;SOR=0.941","GT:AD","./.:0"}); - assertEquals(false, VcfPipeline.FF_NOT_ENOUGH_INFO.equals(vcf.getFormatFieldStrings())); + assertNotEquals(VcfPipeline.FF_NOT_ENOUGH_INFO, vcf.getFormatFieldStrings()); } @Test - public void stackOverflow() throws SnpException, Exception { + public void stackOverflow() throws Exception { /* * I think that this is due to the comparator placing chrMT before the GL's whereas in the bam headers and vcfs, chrMT is last. * Not the case - see getLIstComparator test @@ -646,7 +645,7 @@ public void getExistingVcfHeader() throws Exception { TestVcfPipeline vp = new TestVcfPipeline(true); vp.testVcfFile = vcfFile.getAbsolutePath(); VcfHeader headerFromFile = null; - try (VcfFileReader reader = new VcfFileReader(vcfFile);) { + try (VcfFileReader reader = new VcfFileReader(vcfFile)) { headerFromFile = reader.getVcfHeader(); } vp.setTestVcfHeader(headerFromFile); @@ -658,21 +657,21 @@ public void getExistingVcfHeader() throws Exception { if (i == 1) { assertEquals("##fileformat=VCFv4.1", rec.toString()); } else if (i == 2) { - assertEquals(true, rec.toString().startsWith(VcfHeaderUtils.STANDARD_UUID_LINE)); - } else if (i == 3) { - assertEquals(true, rec.toString().startsWith("##reference")); + assertTrue(rec.toString().startsWith(VcfHeaderUtils.STANDARD_UUID_LINE)); + } else if (i == 3) { + assertTrue(rec.toString().startsWith("##reference")); } else if (i == 4) { - assertEquals(true, rec.toString().startsWith(VcfHeaderUtils.HEADER_LINE_FILTER)); + assertTrue(rec.toString().startsWith(VcfHeaderUtils.HEADER_LINE_FILTER)); } else if (i > 4 && i < 24) { - assertEquals(true, rec.toString().startsWith(VcfHeaderUtils.HEADER_LINE_INFO)); + assertTrue(rec.toString().startsWith(VcfHeaderUtils.HEADER_LINE_INFO)); }else if (i > 23 && i < 29) { - assertEquals(true, rec.toString().startsWith(VcfHeaderUtils.HEADER_LINE_FORMAT)); + assertTrue(rec.toString().startsWith(VcfHeaderUtils.HEADER_LINE_FORMAT)); } else if (i > 29 && i < 50) { - assertEquals(true, rec.toString().startsWith("##contig")); + assertTrue(rec.toString().startsWith("##contig")); } else if (i == 29) { - assertEquals(true, rec.toString().startsWith("##GATKCommandLine")); + assertTrue(rec.toString().startsWith("##GATKCommandLine")); } else { - assertEquals(true, rec.toString().startsWith("#CHROM")); + assertTrue(rec.toString().startsWith("#CHROM")); } } assertEquals(50, i); // no additional header added at this stage @@ -684,13 +683,13 @@ public void getExistingVcfHeader() throws Exception { if(rec.toString().startsWith(VcfHeaderUtils.STANDARD_FILE_FORMAT) || rec.toString().startsWith(VcfHeaderUtils.STANDARD_FINAL_HEADER_LINE)) continue; - assertEquals(true, rec.getId() != null //??? - || rec.toString().startsWith(VcfHeaderUtils.STANDARD_CONTROL_VCF) - || rec.toString().startsWith(VcfHeaderUtils.STANDARD_CONTROL_VCF_UUID) - || rec.toString().startsWith(VcfHeaderUtils.STANDARD_CONTROL_VCF_GATK_VER) - || rec.toString().startsWith(VcfHeaderUtils.STANDARD_TEST_VCF) - || rec.toString().startsWith(VcfHeaderUtils.STANDARD_TEST_VCF_GATK_VER) - || rec.toString().startsWith(VcfHeaderUtils.STANDARD_TEST_VCF_UUID)); + assertTrue(rec.getId() != null //??? + || rec.toString().startsWith(VcfHeaderUtils.STANDARD_CONTROL_VCF) + || rec.toString().startsWith(VcfHeaderUtils.STANDARD_CONTROL_VCF_UUID) + || rec.toString().startsWith(VcfHeaderUtils.STANDARD_CONTROL_VCF_GATK_VER) + || rec.toString().startsWith(VcfHeaderUtils.STANDARD_TEST_VCF) + || rec.toString().startsWith(VcfHeaderUtils.STANDARD_TEST_VCF_GATK_VER) + || rec.toString().startsWith(VcfHeaderUtils.STANDARD_TEST_VCF_UUID)); } // now check that when calling writeToVcf that we get this along with standard qsnp vcf header @@ -698,7 +697,7 @@ public void getExistingVcfHeader() throws Exception { vp.writeVCF(qsnpVcfFile.getAbsolutePath()); VcfHeader finalHeader = null; - try (VcfFileReader reader2 = new VcfFileReader(qsnpVcfFile);) { + try (VcfFileReader reader2 = new VcfFileReader(qsnpVcfFile)) { finalHeader = reader2.getVcfHeader(); } @@ -725,14 +724,13 @@ public void getExistingVcfHeader() throws Exception { assertEquals(rec, finalRec); String line1 = rec.toString(); String line2 = finalRec.toString(); - assertEquals(true, line1.equals(line2)); - assertEquals(line1.hashCode(), line1.hashCode()); + assertEquals(line1, line2); System.out.println("finalRec: BaseQRankSum hashCode: " + finalRec.hashCode()); } } } - - assertEquals(true, finalHeaderRecords.containsAll(existingHeaderRecords)); + + assertTrue(finalHeaderRecords.containsAll(existingHeaderRecords)); } @Test @@ -757,7 +755,7 @@ public void merge() { */ VcfPipeline.mergeVcfRecords(controlMap, testMap, mergedVcfs); assertEquals(1, mergedVcfs.size()); - VcfRecord mergedRec = mergedVcfs.get(0); + VcfRecord mergedRec = mergedVcfs.getFirst(); Map ffMap = VcfUtils.getFormatFieldsAsMap(mergedRec.getFormatFields()); assertEquals("T,G", mergedRec.getAlt()); assertEquals("0/1", ffMap.get(VcfHeaderUtils.FORMAT_GENOTYPE)[0]); @@ -768,7 +766,7 @@ public void merge() { private int noOfLinesInVCFOutputFile(File vcfOutput) throws IOException { int noOfLines = 0; - try (VcfFileReader reader = new VcfFileReader(vcfOutput);){ + try (VcfFileReader reader = new VcfFileReader(vcfOutput)){ for (VcfRecord vcf : reader) noOfLines++; } return noOfLines; diff --git a/qsv/test/org/qcmg/qsv/util/QSVUtilTest.java b/qsv/test/org/qcmg/qsv/util/QSVUtilTest.java index 09ca49612..ef2818f7a 100644 --- a/qsv/test/org/qcmg/qsv/util/QSVUtilTest.java +++ b/qsv/test/org/qcmg/qsv/util/QSVUtilTest.java @@ -104,9 +104,9 @@ public void testReorderByChromosome() { assertTrue(QSVUtil.reorderByChromosomes("chr21", "chr12")); assertTrue(QSVUtil.reorderByChromosomes("chrY", "chrX")); assertTrue(QSVUtil.reorderByChromosomes("chrY", "chr1")); - assertTrue(QSVUtil.reorderByChromosomes("chrY", "chrMT")); + assertFalse(QSVUtil.reorderByChromosomes("chrY", "chrMT")); assertFalse(QSVUtil.reorderByChromosomes("chr1", "chrX")); - assertTrue(QSVUtil.reorderByChromosomes("X", "MT")); + assertFalse(QSVUtil.reorderByChromosomes("X", "MT")); assertFalse(QSVUtil.reorderByChromosomes("X", "Y")); assertTrue(QSVUtil.reorderByChromosomes("GL4", "GL1")); assertFalse(QSVUtil.reorderByChromosomes("GL1", "GL4")); @@ -179,8 +179,8 @@ public void testGetAnalysisId() { /* * Due to timezone differences, it is safest just to dictate which year we expect the analysis id to start with */ - assertEquals(true, QSVUtil.getAnalysisId(false, "test", new Date(1352958269803L)).startsWith("qSV_test_2012")); - assertTrue(QSVUtil.getAnalysisId(true, "test", new Date(1352958269803L)).length() == 36); + assertTrue(QSVUtil.getAnalysisId(false, "test", new Date(1352958269803L)).startsWith("qSV_test_2012")); + assertEquals(36, QSVUtil.getAnalysisId(true, "test", new Date(1352958269803L)).length()); } @Test @@ -216,64 +216,64 @@ public void highNCountNullString() throws QSVException { @Test public void highNCountNoNs() throws QSVException { - assertEquals(false, QSVUtil.highNCount("Hello there", 0.01)); + assertFalse(QSVUtil.highNCount("Hello there", 0.01)); // double limit is a percentage, so if set to 0.0, will return true - assertEquals(true, QSVUtil.highNCount("Hello there", 0.0)); + assertTrue(QSVUtil.highNCount("Hello there", 0.0)); } @Test public void highNCountSingleN() throws QSVException { - assertEquals(true, QSVUtil.highNCount("Hello, anybody there?", 0.01)); // 1 in 21 >= 1% - assertEquals(true, QSVUtil.highNCount("Hello, aNybody there?", 0.01)); // 1 in 21 >= 1% - assertEquals(false, QSVUtil.highNCount("Hello, anybody there?", 0.1)); // 1 in 21 ! >= 10% - assertEquals(false, QSVUtil.highNCount("Hello, aNybody there?", 0.1)); // 1 in 21 ! >= 10% + assertTrue(QSVUtil.highNCount("Hello, anybody there?", 0.01)); // 1 in 21 >= 1% + assertTrue(QSVUtil.highNCount("Hello, aNybody there?", 0.01)); // 1 in 21 >= 1% + assertFalse(QSVUtil.highNCount("Hello, anybody there?", 0.1)); // 1 in 21 ! >= 10% + assertFalse(QSVUtil.highNCount("Hello, aNybody there?", 0.1)); // 1 in 21 ! >= 10% } @Test public void highNCountAllNs() throws QSVException { // shouldn't matter what value is used for the limit - assertEquals(true, QSVUtil.highNCount("NNnnnNNNNNnnNnNnN", 0.01)); - assertEquals(true, QSVUtil.highNCount("NNnnnNNNNNnnNnNnN", 0)); - assertEquals(true, QSVUtil.highNCount("NNnnnNNNNNnnNnNnN", 1)); + assertTrue(QSVUtil.highNCount("NNnnnNNNNNnnNnNnN", 0.01)); + assertTrue(QSVUtil.highNCount("NNnnnNNNNNnnNnNnN", 0)); + assertTrue(QSVUtil.highNCount("NNnnnNNNNNnnNnNnN", 1)); } @Test public void highNCountInvalidLimit() throws QSVException { exception.expect(QSVException.class); - assertEquals(true, QSVUtil.highNCount("NNnnnNNNNNnnNnNnN", -0.1)); + assertTrue(QSVUtil.highNCount("NNnnnNNNNNnnNnNnN", -0.1)); exception.expect(QSVException.class); - assertEquals(true, QSVUtil.highNCount("NNnnnNNNNNnnNnNnN", -1)); + assertTrue(QSVUtil.highNCount("NNnnnNNNNNnnNnNnN", -1)); exception.expect(QSVException.class); - assertEquals(true, QSVUtil.highNCount("NNnnnNNNNNnnNnNnN", -100)); + assertTrue(QSVUtil.highNCount("NNnnnNNNNNnnNnNnN", -100)); exception.expect(QSVException.class); - assertEquals(true, QSVUtil.highNCount("NNnnnNNNNNnnNnNnN", 1.00000001)); + assertTrue(QSVUtil.highNCount("NNnnnNNNNNnnNnNnN", 1.00000001)); exception.expect(QSVException.class); - assertEquals(true, QSVUtil.highNCount("NNnnnNNNNNnnNnNnN", 100000001)); + assertTrue(QSVUtil.highNCount("NNnnnNNNNNnnNnNnN", 100000001)); } @Test public void doesMPOverlapRegion() { MatePair mp = new MatePair("254_166_1407:20110221052813657,chr7,1000,1100,AAC,129,false,254_166_1407:20110221052813657,chr7,5000,5150,AAC,65,false,F2F1,\n"); - assertEquals(true, QSVUtil.doesMatePairOverlapRegions(mp, 0, 2000, 3000, 6000)); - assertEquals(true, QSVUtil.doesMatePairOverlapRegions(mp, 0, 1000, 3000, 6000)); - assertEquals(true, QSVUtil.doesMatePairOverlapRegions(mp, 0, 1000, 1000, 6000)); - assertEquals(true, QSVUtil.doesMatePairOverlapRegions(mp, 0, 1000, 5149, 6000)); - assertEquals(true, QSVUtil.doesMatePairOverlapRegions(mp, 1000, 1100, 5000, 5150)); - - assertEquals(false, QSVUtil.doesMatePairOverlapRegions(mp, 1001, 1099, 5000, 5150)); - assertEquals(false, QSVUtil.doesMatePairOverlapRegions(mp, 0, 999, 1000, 6000)); - assertEquals(false, QSVUtil.doesMatePairOverlapRegions(mp, 0, 1000, 6000, 6001)); + assertTrue(QSVUtil.doesMatePairOverlapRegions(mp, 0, 2000, 3000, 6000)); + assertTrue(QSVUtil.doesMatePairOverlapRegions(mp, 0, 1000, 3000, 6000)); + assertTrue(QSVUtil.doesMatePairOverlapRegions(mp, 0, 1000, 1000, 6000)); + assertTrue(QSVUtil.doesMatePairOverlapRegions(mp, 0, 1000, 5149, 6000)); + assertTrue(QSVUtil.doesMatePairOverlapRegions(mp, 1000, 1100, 5000, 5150)); + + assertFalse(QSVUtil.doesMatePairOverlapRegions(mp, 1001, 1099, 5000, 5150)); + assertFalse(QSVUtil.doesMatePairOverlapRegions(mp, 0, 999, 1000, 6000)); + assertFalse(QSVUtil.doesMatePairOverlapRegions(mp, 0, 1000, 6000, 6001)); } @Test public void createRecord() { - assertEquals(true, QSVUtil.createRecord(0, 0, 0)); - assertEquals(true, QSVUtil.createRecord(0, 0, 10)); - assertEquals(true, QSVUtil.createRecord(0, -10, 10)); - - assertEquals(false, QSVUtil.createRecord(0, 1, 10)); - assertEquals(false, QSVUtil.createRecord(0, 10, 10)); - assertEquals(false, QSVUtil.createRecord(0, 20, 10)); + assertTrue(QSVUtil.createRecord(0, 0, 0)); + assertTrue(QSVUtil.createRecord(0, 0, 10)); + assertTrue(QSVUtil.createRecord(0, -10, 10)); + + assertFalse(QSVUtil.createRecord(0, 1, 10)); + assertFalse(QSVUtil.createRecord(0, 10, 10)); + assertFalse(QSVUtil.createRecord(0, 20, 10)); } }