JAL-2114 more helpful reporting of parse failures
[jalview.git] / test / jalview / util / DnaUtilsTest.java
index bb3cc5b..fbc95ad 100644 (file)
@@ -4,6 +4,7 @@ import static org.testng.AssertJUnit.assertEquals;
 import static org.testng.AssertJUnit.assertNull;
 import static org.testng.AssertJUnit.fail;
 
+import java.text.ParseException;
 import java.util.List;
 
 import org.testng.annotations.Test;
@@ -13,10 +14,12 @@ public class DnaUtilsTest
   /**
    * Tests for parsing an ENA/GenBank location specifier
    * 
+   * @throws ParseException
+   * 
    * @see http://www.insdc.org/files/feature_table.html#3.4
    */
   @Test(groups = { "Functional" })
-  public void testParseLocation()
+  public void testParseLocation() throws ParseException
   {
     /*
      * single locus
@@ -89,33 +92,23 @@ public class DnaUtilsTest
     assertEquals(87064, ranges.get(1)[1]);
 
     /*
-     * beyond 5' or 3' locus
-     */
-    ranges = DnaUtils.parseLocation("<34..126");
-    assertEquals(1, ranges.size());
-    assertEquals(34, ranges.get(0)[0]);
-    assertEquals(126, ranges.get(0)[1]);
-    ranges = DnaUtils.parseLocation("35..>127");
-    assertEquals(1, ranges.size());
-    assertEquals(35, ranges.get(0)[0]);
-    assertEquals(127, ranges.get(0)[1]);
-
-    /*
      * valid things we don't yet handle
      */
-    assertNull(DnaUtils.parseLocation("34.126"));
-    assertNull(DnaUtils.parseLocation("34^126"));
-    assertNull(DnaUtils.parseLocation("order(34..126,130..180)"));
+    checkForParseException("<34..126");
+    checkForParseException("35..>126");
+    checkForParseException("34.126");
+    checkForParseException("34^126");
+    checkForParseException("order(34..126,130..180)");
 
     /*
      * invalid things
      */
-    assertNull(DnaUtils.parseLocation(""));
-    assertNull(DnaUtils.parseLocation("JOIN(1..2)"));
-    assertNull(DnaUtils.parseLocation("join(1..2"));
-    assertNull(DnaUtils.parseLocation("join(1..2("));
-    assertNull(DnaUtils.parseLocation("complement(1..2"));
-    assertNull(DnaUtils.parseLocation("complement(1..2("));
+    checkForParseException("");
+    checkForParseException("JOIN(1..2)");
+    checkForParseException("join(1..2");
+    checkForParseException("join(1..2(");
+    checkForParseException("complement(1..2");
+    checkForParseException("complement(1..2(");
     try
     {
       assertNull(DnaUtils.parseLocation(null));
@@ -124,6 +117,34 @@ public class DnaUtilsTest
     {
       // expected
     }
+
+    /*
+     * nested joins are not allowed; just as well since this fails to parse
+     * (splitting tokens by comma fragments the inner join expression)
+     */
+    checkForParseException("join(1..2,join(4..5,10..12),18..22)");
+    /*
+     * complement may not enclose multiple ranges 
+     * parsing fails for the same reason
+     */
+    checkForParseException("join(complement(36618..36700,4000..4200),86988..87064)");
+  }
+
+  /**
+   * Verifies that a ParseException is thrown when the given location is parsed
+   * 
+   * @param location
+   */
+  void checkForParseException(String location)
+  {
+    try
+    {
+      DnaUtils.parseLocation(location);
+      fail("Expected exception");
+    } catch (ParseException e)
+    {
+      // expected;
+    }
   }
 
 }