6623c137c23e854540e4d801764e9a0fd976ba8c
[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      * beyond 5' or 3' locus
93      */
94     ranges = DnaUtils.parseLocation("<34..126");
95     assertEquals(1, ranges.size());
96     assertEquals(34, ranges.get(0)[0]);
97     assertEquals(126, ranges.get(0)[1]);
98     ranges = DnaUtils.parseLocation("35..>127");
99     assertEquals(1, ranges.size());
100     assertEquals(35, ranges.get(0)[0]);
101     assertEquals(127, ranges.get(0)[1]);
102
103     /*
104      * valid things we don't yet handle
105      */
106     assertNull(DnaUtils.parseLocation("34.126"));
107     assertNull(DnaUtils.parseLocation("34^126"));
108     assertNull(DnaUtils.parseLocation("order(34..126,130..180)"));
109
110     /*
111      * invalid things
112      */
113     assertNull(DnaUtils.parseLocation(""));
114     assertNull(DnaUtils.parseLocation("JOIN(1..2)"));
115     assertNull(DnaUtils.parseLocation("join(1..2"));
116     assertNull(DnaUtils.parseLocation("join(1..2("));
117     assertNull(DnaUtils.parseLocation("complement(1..2"));
118     assertNull(DnaUtils.parseLocation("complement(1..2("));
119     try
120     {
121       assertNull(DnaUtils.parseLocation(null));
122       fail("Expected exception");
123     } catch (NullPointerException e)
124     {
125       // expected
126     }
127
128     /*
129      * nested joins are not allowed; just as well since this fails to parse
130      * (splitting tokens by comma fragments the inner join expression)
131      */
132     assertNull(DnaUtils
133             .parseLocation("join(1..2,join(4..5,10..12),18..22)"));
134     /*
135      * complement may not enclose multiple ranges 
136      * parsing fails for the same reason
137      */
138     assertNull(DnaUtils
139             .parseLocation("join(complement(36618..36700,4000..4200),86988..87064)"));
140   }
141
142 }