d7a76b9ab2f10dae94af794e1f766a0997ee7c79
[jalview.git] / test / jalview / util / DnaUtilsTest.java
1 package jalview.util;
2
3 import static org.testng.AssertJUnit.assertEquals;
4 import static org.testng.AssertJUnit.assertNull;
5 import static org.testng.AssertJUnit.fail;
6
7 import java.util.List;
8
9 import org.testng.annotations.Test;
10
11 public class DnaUtilsTest
12 {
13   /**
14    * Tests for parsing an ENA/GenBank location specifier
15    * 
16    * @see http://www.insdc.org/files/feature_table.html#3.4
17    */
18   @Test(groups = { "Functional" })
19   public void testParseLocation()
20   {
21     /*
22      * single locus
23      */
24     List<int[]> ranges = DnaUtils.parseLocation("467");
25     assertEquals(1, ranges.size());
26     assertEquals(467, ranges.get(0)[0]);
27     assertEquals(467, ranges.get(0)[1]);
28
29     /*
30      * simple range
31      */
32     ranges = DnaUtils.parseLocation("12..78");
33     assertEquals(1, ranges.size());
34     assertEquals(12, ranges.get(0)[0]);
35     assertEquals(78, ranges.get(0)[1]);
36
37     /*
38      * join of simple ranges
39      */
40     ranges = DnaUtils.parseLocation("join(12..78,134..202,322..345)");
41     assertEquals(3, ranges.size());
42     assertEquals(12, ranges.get(0)[0]);
43     assertEquals(78, ranges.get(0)[1]);
44     assertEquals(134, ranges.get(1)[0]);
45     assertEquals(202, ranges.get(1)[1]);
46     assertEquals(322, ranges.get(2)[0]);
47     assertEquals(345, ranges.get(2)[1]);
48
49     /*
50      * complement of a simple range
51      */
52     ranges = DnaUtils.parseLocation("complement(34..126)");
53     assertEquals(1, ranges.size());
54     assertEquals(126, ranges.get(0)[0]);
55     assertEquals(34, ranges.get(0)[1]);
56
57     /*
58      * complement of a join
59      */
60     ranges = DnaUtils
61             .parseLocation("complement(join(2691..4571,4918..5163))");
62     assertEquals(2, ranges.size());
63     assertEquals(5163, ranges.get(0)[0]);
64     assertEquals(4918, ranges.get(0)[1]);
65     assertEquals(4571, ranges.get(1)[0]);
66     assertEquals(2691, ranges.get(1)[1]);
67
68     /*
69      * join of two complements
70      */
71     ranges = DnaUtils
72             .parseLocation("join(complement(4918..5163),complement(2691..4571))");
73     assertEquals(2, ranges.size());
74     assertEquals(5163, ranges.get(0)[0]);
75     assertEquals(4918, ranges.get(0)[1]);
76     assertEquals(4571, ranges.get(1)[0]);
77     assertEquals(2691, ranges.get(1)[1]);
78
79     /*
80      * join complement to non-complement
81      * @see http://www.ncbi.nlm.nih.gov/genbank/genomesubmit_annotation/ Transpliced Genes
82      */
83     ranges = DnaUtils
84             .parseLocation("join(complement(36618..36700),86988..87064)");
85     assertEquals(2, ranges.size());
86     assertEquals(36700, ranges.get(0)[0]);
87     assertEquals(36618, ranges.get(0)[1]);
88     assertEquals(86988, ranges.get(1)[0]);
89     assertEquals(87064, ranges.get(1)[1]);
90
91     /*
92      * valid things we don't yet handle
93      */
94     assertNull(DnaUtils.parseLocation("<34..126"));
95     assertNull(DnaUtils.parseLocation("35..>126"));
96     assertNull(DnaUtils.parseLocation("34.126"));
97     assertNull(DnaUtils.parseLocation("34^126"));
98     assertNull(DnaUtils.parseLocation("order(34..126,130..180)"));
99
100     /*
101      * invalid things
102      */
103     assertNull(DnaUtils.parseLocation(""));
104     assertNull(DnaUtils.parseLocation("JOIN(1..2)"));
105     assertNull(DnaUtils.parseLocation("join(1..2"));
106     assertNull(DnaUtils.parseLocation("join(1..2("));
107     assertNull(DnaUtils.parseLocation("complement(1..2"));
108     assertNull(DnaUtils.parseLocation("complement(1..2("));
109     try
110     {
111       assertNull(DnaUtils.parseLocation(null));
112       fail("Expected exception");
113     } catch (NullPointerException e)
114     {
115       // expected
116     }
117
118     /*
119      * nested joins are not allowed; just as well since this fails to parse
120      * (splitting tokens by comma fragments the inner join expression)
121      */
122     assertNull(DnaUtils
123             .parseLocation("join(1..2,join(4..5,10..12),18..22)"));
124     /*
125      * complement may not enclose multiple ranges 
126      * parsing fails for the same reason
127      */
128     assertNull(DnaUtils
129             .parseLocation("join(complement(36618..36700,4000..4200),86988..87064)"));
130   }
131
132 }