1 package jalview.datamodel.xdb.embl;
3 import static org.testng.AssertJUnit.assertEquals;
4 import static org.testng.AssertJUnit.assertSame;
6 import jalview.util.MappingUtils;
8 import java.util.Arrays;
9 import java.util.Vector;
11 import org.testng.annotations.Test;
13 public class EmblEntryTest
15 @Test(groups = "Functional")
16 public void testGetCdsRanges()
18 EmblEntry testee = new EmblEntry();
21 * Make a (CDS) Feature with 4 locations
23 EmblFeature cds = new EmblFeature();
24 Vector<EmblFeatureLocations> locs = new Vector<EmblFeatureLocations>();
25 cds.setLocations(locs);
28 * single range [10-20]
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();
37 BasePosition b2 = new BasePosition();
39 locElement.setBasePositions(new BasePosition[] { b1, b2 });
40 elements.add(locElement);
41 loc.setLocElements(elements);
45 * complement range [30-40]
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();
54 b2 = new BasePosition();
56 locElement.setBasePositions(new BasePosition[] { b1, b2 });
57 elements.add(locElement);
58 loc.setLocElements(elements);
62 * join range [50-60], [70-80]
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();
71 b2 = new BasePosition();
73 locElement.setBasePositions(new BasePosition[] { b1, b2 });
74 elements.add(locElement);
75 locElement = new EmblFeatureLocElement();
76 b1 = new BasePosition();
78 b2 = new BasePosition();
80 locElement.setBasePositions(new BasePosition[] { b1, b2 });
81 elements.add(locElement);
82 loc.setLocElements(elements);
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"
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();
97 b2 = new BasePosition();
99 locElement.setBasePositions(new BasePosition[] { b1, b2 });
100 elements.add(locElement);
101 locElement = new EmblFeatureLocElement();
102 b1 = new BasePosition();
104 b2 = new BasePosition();
106 locElement.setBasePositions(new BasePosition[] { b1, b2 });
107 elements.add(locElement);
108 loc.setLocElements(elements);
111 int[] exons = testee.getCdsRanges(cds);
112 assertEquals("[10, 20, 40, 30, 50, 60, 70, 80, 120, 110, 100, 90]",
113 Arrays.toString(exons));
116 @Test(groups = "Functional")
117 public void testGetCdsRanges_badData()
119 EmblEntry testee = new EmblEntry();
122 * Make a (CDS) Feature with 4 locations
124 EmblFeature cds = new EmblFeature();
125 Vector<EmblFeatureLocations> locs = new Vector<EmblFeatureLocations>();
126 cds.setLocations(locs);
129 * single range [10-20]
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();
138 BasePosition b2 = new BasePosition();
140 locElement.setBasePositions(new BasePosition[] { b1, b2 });
141 elements.add(locElement);
142 loc.setLocElements(elements);
146 * single range with missing end position - should be skipped
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();
155 locElement.setBasePositions(new BasePosition[] { b1 });
156 elements.add(locElement);
157 loc.setLocElements(elements);
161 * single range with extra base position - should be skipped
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();
170 locElement.setBasePositions(new BasePosition[] { b1, b1, b1 });
171 elements.add(locElement);
172 loc.setLocElements(elements);
176 * single valid range [50-60] to finish
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();
185 b2 = new BasePosition();
187 locElement.setBasePositions(new BasePosition[] { b1, b2 });
188 elements.add(locElement);
189 loc.setLocElements(elements);
192 int[] exons = testee.getCdsRanges(cds);
193 assertEquals("[10, 20, 50, 60]", Arrays.toString(exons));
197 * Test retrieval of exon locations matching an accession id
199 @Test(groups = "Functional")
200 public void testGetCdsRanges_forAccession()
202 EmblEntry testee = new EmblEntry();
203 String accession = "A1234";
204 testee.setAccession(accession);
206 * Make a (CDS) Feature with 4 locations
208 EmblFeature cds = new EmblFeature();
209 Vector<EmblFeatureLocations> locs = new Vector<EmblFeatureLocations>();
210 cds.setLocations(locs);
213 * single range [10-20] for 'this' accession
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();
223 BasePosition b2 = new BasePosition();
225 locElement.setBasePositions(new BasePosition[] { b1, b2 });
226 elements.add(locElement);
227 loc.setLocElements(elements);
231 * complement range [30-40] - no accession
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();
240 b2 = new BasePosition();
242 locElement.setBasePositions(new BasePosition[] { b1, b2 });
243 elements.add(locElement);
244 loc.setLocElements(elements);
248 * join range [50-60] this accession, [70-80] another
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();
258 b2 = new BasePosition();
260 locElement.setBasePositions(new BasePosition[] { b1, b2 });
261 elements.add(locElement);
262 locElement = new EmblFeatureLocElement();
263 locElement.setAccession("notme");
264 b1 = new BasePosition();
266 b2 = new BasePosition();
268 locElement.setBasePositions(new BasePosition[] { b1, b2 });
269 elements.add(locElement);
270 loc.setLocElements(elements);
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"
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();
286 b2 = new BasePosition();
288 locElement.setBasePositions(new BasePosition[] { b1, b2 });
289 elements.add(locElement);
290 locElement = new EmblFeatureLocElement();
291 locElement.setAccession(accession);
292 b1 = new BasePosition();
294 b2 = new BasePosition();
296 locElement.setBasePositions(new BasePosition[] { b1, b2 });
297 elements.add(locElement);
298 loc.setLocElements(elements);
302 * verify we pick out only ranges for A1234
304 int[] exons = testee.getCdsRanges(cds);
305 assertEquals("[10, 20, 50, 60, 120, 110]",
306 Arrays.toString(exons));