JAL-2094 new classes ColorI, Colour added
[jalview.git] / test / jalview / datamodel / xdb / embl / EmblEntryTest.java
1 package jalview.datamodel.xdb.embl;
2
3 import static org.testng.AssertJUnit.assertEquals;
4 import static org.testng.AssertJUnit.assertSame;
5
6 import jalview.util.MappingUtils;
7
8 import java.util.Arrays;
9 import java.util.Vector;
10
11 import org.testng.annotations.Test;
12
13 public class EmblEntryTest
14 {
15   @Test(groups = "Functional")
16   public void testGetCdsRanges()
17   {
18     EmblEntry testee = new EmblEntry();
19
20     /*
21      * Make a (CDS) Feature with 4 locations
22      */
23     EmblFeature cds = new EmblFeature();
24     Vector<EmblFeatureLocations> locs = new Vector<EmblFeatureLocations>();
25     cds.setLocations(locs);
26
27     /*
28      * single range [10-20]
29      */
30     EmblFeatureLocations loc = new EmblFeatureLocations();
31     loc.setLocationType("single");
32     loc.setLocationComplement(false);
33     Vector<EmblFeatureLocElement> elements = new Vector<EmblFeatureLocElement>();
34     EmblFeatureLocElement locElement = new EmblFeatureLocElement();
35     BasePosition b1 = new BasePosition();
36     b1.setPos("10");
37     BasePosition b2 = new BasePosition();
38     b2.setPos("20");
39     locElement.setBasePositions(new BasePosition[] { b1, b2 });
40     elements.add(locElement);
41     loc.setLocElements(elements);
42     locs.add(loc);
43
44     /*
45      * complement range [30-40]
46      */
47     loc = new EmblFeatureLocations();
48     loc.setLocationType("single");
49     loc.setLocationComplement(true);
50     elements = new Vector<EmblFeatureLocElement>();
51     locElement = new EmblFeatureLocElement();
52     b1 = new BasePosition();
53     b1.setPos("30");
54     b2 = new BasePosition();
55     b2.setPos("40");
56     locElement.setBasePositions(new BasePosition[] { b1, b2 });
57     elements.add(locElement);
58     loc.setLocElements(elements);
59     locs.add(loc);
60
61     /*
62      * join range [50-60], [70-80]
63      */
64     loc = new EmblFeatureLocations();
65     loc.setLocationType("join");
66     loc.setLocationComplement(false);
67     elements = new Vector<EmblFeatureLocElement>();
68     locElement = new EmblFeatureLocElement();
69     b1 = new BasePosition();
70     b1.setPos("50");
71     b2 = new BasePosition();
72     b2.setPos("60");
73     locElement.setBasePositions(new BasePosition[] { b1, b2 });
74     elements.add(locElement);
75     locElement = new EmblFeatureLocElement();
76     b1 = new BasePosition();
77     b1.setPos("70");
78     b2 = new BasePosition();
79     b2.setPos("80");
80     locElement.setBasePositions(new BasePosition[] { b1, b2 });
81     elements.add(locElement);
82     loc.setLocElements(elements);
83     locs.add(loc);
84
85     /*
86      * complement range [90-100], [110-120]
87      * this should be the same as complement(join(90..100,110.120))
88      * which is "join 90-100 and 110-120, then complement"
89      */
90     loc = new EmblFeatureLocations();
91     loc.setLocationType("join");
92     loc.setLocationComplement(true);
93     elements = new Vector<EmblFeatureLocElement>();
94     locElement = new EmblFeatureLocElement();
95     b1 = new BasePosition();
96     b1.setPos("90");
97     b2 = new BasePosition();
98     b2.setPos("100");
99     locElement.setBasePositions(new BasePosition[] { b1, b2 });
100     elements.add(locElement);
101     locElement = new EmblFeatureLocElement();
102     b1 = new BasePosition();
103     b1.setPos("110");
104     b2 = new BasePosition();
105     b2.setPos("120");
106     locElement.setBasePositions(new BasePosition[] { b1, b2 });
107     elements.add(locElement);
108     loc.setLocElements(elements);
109     locs.add(loc);
110
111     int[] exons = testee.getCdsRanges(cds);
112     assertEquals("[10, 20, 40, 30, 50, 60, 70, 80, 120, 110, 100, 90]",
113             Arrays.toString(exons));
114   }
115
116   @Test(groups = "Functional")
117   public void testGetCdsRanges_badData()
118   {
119     EmblEntry testee = new EmblEntry();
120
121     /*
122      * Make a (CDS) Feature with 4 locations
123      */
124     EmblFeature cds = new EmblFeature();
125     Vector<EmblFeatureLocations> locs = new Vector<EmblFeatureLocations>();
126     cds.setLocations(locs);
127
128     /*
129      * single range [10-20]
130      */
131     EmblFeatureLocations loc = new EmblFeatureLocations();
132     loc.setLocationType("single");
133     loc.setLocationComplement(false);
134     Vector<EmblFeatureLocElement> elements = new Vector<EmblFeatureLocElement>();
135     EmblFeatureLocElement locElement = new EmblFeatureLocElement();
136     BasePosition b1 = new BasePosition();
137     b1.setPos("10");
138     BasePosition b2 = new BasePosition();
139     b2.setPos("20");
140     locElement.setBasePositions(new BasePosition[] { b1, b2 });
141     elements.add(locElement);
142     loc.setLocElements(elements);
143     locs.add(loc);
144
145     /*
146      * single range with missing end position - should be skipped
147      */
148     loc = new EmblFeatureLocations();
149     loc.setLocationType("single");
150     loc.setLocationComplement(false);
151     elements = new Vector<EmblFeatureLocElement>();
152     locElement = new EmblFeatureLocElement();
153     b1 = new BasePosition();
154     b1.setPos("30");
155     locElement.setBasePositions(new BasePosition[] { b1 });
156     elements.add(locElement);
157     loc.setLocElements(elements);
158     locs.add(loc);
159
160     /*
161      * single range with extra base position - should be skipped
162      */
163     loc = new EmblFeatureLocations();
164     loc.setLocationType("single");
165     loc.setLocationComplement(false);
166     elements = new Vector<EmblFeatureLocElement>();
167     locElement = new EmblFeatureLocElement();
168     b1 = new BasePosition();
169     b1.setPos("30");
170     locElement.setBasePositions(new BasePosition[] { b1, b1, b1 });
171     elements.add(locElement);
172     loc.setLocElements(elements);
173     locs.add(loc);
174
175     /*
176      * single valid range [50-60] to finish
177      */
178     loc = new EmblFeatureLocations();
179     loc.setLocationType("single");
180     loc.setLocationComplement(false);
181     elements = new Vector<EmblFeatureLocElement>();
182     locElement = new EmblFeatureLocElement();
183     b1 = new BasePosition();
184     b1.setPos("50");
185     b2 = new BasePosition();
186     b2.setPos("60");
187     locElement.setBasePositions(new BasePosition[] { b1, b2 });
188     elements.add(locElement);
189     loc.setLocElements(elements);
190     locs.add(loc);
191
192     int[] exons = testee.getCdsRanges(cds);
193     assertEquals("[10, 20, 50, 60]", Arrays.toString(exons));
194   }
195
196   /**
197    * Test retrieval of exon locations matching an accession id
198    */
199   @Test(groups = "Functional")
200   public void testGetCdsRanges_forAccession()
201   {
202     EmblEntry testee = new EmblEntry();
203     String accession = "A1234";
204     testee.setAccession(accession);
205     /*
206      * Make a (CDS) Feature with 4 locations
207      */
208     EmblFeature cds = new EmblFeature();
209     Vector<EmblFeatureLocations> locs = new Vector<EmblFeatureLocations>();
210     cds.setLocations(locs);
211   
212     /*
213      * single range [10-20] for 'this' accession
214      */
215     EmblFeatureLocations loc = new EmblFeatureLocations();
216     loc.setLocationType("single");
217     loc.setLocationComplement(false);
218     Vector<EmblFeatureLocElement> elements = new Vector<EmblFeatureLocElement>();
219     EmblFeatureLocElement locElement = new EmblFeatureLocElement();
220     locElement.setAccession(accession);
221     BasePosition b1 = new BasePosition();
222     b1.setPos("10");
223     BasePosition b2 = new BasePosition();
224     b2.setPos("20");
225     locElement.setBasePositions(new BasePosition[] { b1, b2 });
226     elements.add(locElement);
227     loc.setLocElements(elements);
228     locs.add(loc);
229   
230     /*
231      * complement range [30-40] - no accession
232      */
233     loc = new EmblFeatureLocations();
234     loc.setLocationType("single");
235     loc.setLocationComplement(true);
236     elements = new Vector<EmblFeatureLocElement>();
237     locElement = new EmblFeatureLocElement();
238     b1 = new BasePosition();
239     b1.setPos("30");
240     b2 = new BasePosition();
241     b2.setPos("40");
242     locElement.setBasePositions(new BasePosition[] { b1, b2 });
243     elements.add(locElement);
244     loc.setLocElements(elements);
245     locs.add(loc);
246   
247     /*
248      * join range [50-60] this accession, [70-80] another
249      */
250     loc = new EmblFeatureLocations();
251     loc.setLocationType("join");
252     loc.setLocationComplement(false);
253     elements = new Vector<EmblFeatureLocElement>();
254     locElement = new EmblFeatureLocElement();
255     locElement.setAccession(accession);
256     b1 = new BasePosition();
257     b1.setPos("50");
258     b2 = new BasePosition();
259     b2.setPos("60");
260     locElement.setBasePositions(new BasePosition[] { b1, b2 });
261     elements.add(locElement);
262     locElement = new EmblFeatureLocElement();
263     locElement.setAccession("notme");
264     b1 = new BasePosition();
265     b1.setPos("70");
266     b2 = new BasePosition();
267     b2.setPos("80");
268     locElement.setBasePositions(new BasePosition[] { b1, b2 });
269     elements.add(locElement);
270     loc.setLocElements(elements);
271     locs.add(loc);
272   
273     /*
274      * complement range [90-100] wrong accession, [110-120] good 
275      * this should be the same as complement(join(90..100,110.120))
276      * which is "join 90-100 and 110-120, then complement"
277      */
278     loc = new EmblFeatureLocations();
279     loc.setLocationType("join");
280     loc.setLocationComplement(true);
281     elements = new Vector<EmblFeatureLocElement>();
282     locElement = new EmblFeatureLocElement();
283     locElement.setAccession("wrong");
284     b1 = new BasePosition();
285     b1.setPos("90");
286     b2 = new BasePosition();
287     b2.setPos("100");
288     locElement.setBasePositions(new BasePosition[] { b1, b2 });
289     elements.add(locElement);
290     locElement = new EmblFeatureLocElement();
291     locElement.setAccession(accession);
292     b1 = new BasePosition();
293     b1.setPos("110");
294     b2 = new BasePosition();
295     b2.setPos("120");
296     locElement.setBasePositions(new BasePosition[] { b1, b2 });
297     elements.add(locElement);
298     loc.setLocElements(elements);
299     locs.add(loc);
300   
301     /*
302      * verify we pick out only ranges for A1234
303      */
304     int[] exons = testee.getCdsRanges(cds);
305     assertEquals("[10, 20, 50, 60, 120, 110]",
306             Arrays.toString(exons));
307   }
308 }