JAL-3438 spotless for 2.11.2.0
[jalview.git] / test / jalview / ext / ensembl / EnsemblCdsTest.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
7  * Jalview is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License 
9  * as published by the Free Software Foundation, either version 3
10  * of the License, or (at your option) any later version.
11  *  
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  */
21 package jalview.ext.ensembl;
22
23 import static org.testng.AssertJUnit.assertEquals;
24 import static org.testng.AssertJUnit.assertFalse;
25 import static org.testng.AssertJUnit.assertTrue;
26
27 import jalview.datamodel.Sequence;
28 import jalview.datamodel.SequenceDummy;
29 import jalview.datamodel.SequenceFeature;
30 import jalview.datamodel.SequenceI;
31 import jalview.gui.JvOptionPane;
32 import jalview.io.gff.SequenceOntologyFactory;
33 import jalview.io.gff.SequenceOntologyLite;
34 import jalview.util.MapList;
35
36 import java.util.List;
37
38 import org.testng.Assert;
39 import org.testng.annotations.AfterClass;
40 import org.testng.annotations.BeforeClass;
41 import org.testng.annotations.Test;
42
43 public class EnsemblCdsTest
44 {
45
46   @BeforeClass(alwaysRun = true)
47   public void setUpJvOptionPane()
48   {
49     JvOptionPane.setInteractiveMode(false);
50     JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
51   }
52
53   @BeforeClass(alwaysRun = true)
54   public void setUp()
55   {
56     SequenceOntologyFactory.setInstance(new SequenceOntologyLite());
57   }
58
59   @AfterClass(alwaysRun = true)
60   public void tearDown()
61   {
62     SequenceOntologyFactory.setInstance(null);
63   }
64
65   /**
66    * Test that the cdna part of genomic sequence is correctly identified by
67    * 'CDS' features (or subtypes) with the desired transcript as parent
68    */
69   @Test(groups = "Functional")
70   public void testGetGenomicRangesFromFeatures()
71   {
72     EnsemblCds testee = new EnsemblCds();
73     SequenceI genomic = new SequenceDummy("chr7");
74     genomic.setStart(10000);
75     genomic.setEnd(50000);
76     String transcriptId = "ABC123";
77
78     // CDS at (start+10000) length 501
79     SequenceFeature sf = new SequenceFeature("CDS", "", 20000, 20500, 0f,
80             null);
81     sf.setValue("Parent", transcriptId);
82     sf.setStrand("+");
83     genomic.addSequenceFeature(sf);
84
85     // CDS (sub-type) at (start + 10500) length 101
86     sf = new SequenceFeature("CDS_predicted", "", 10500, 10600, 0f, null);
87     sf.setValue("Parent", transcriptId);
88     sf.setStrand("+");
89     genomic.addSequenceFeature(sf);
90
91     // CDS belonging to a different transcript doesn't count
92     sf = new SequenceFeature("CDS", "", 11500, 12600, 0f, null);
93     sf.setValue("Parent", "anotherOne");
94     genomic.addSequenceFeature(sf);
95
96     // exon feature doesn't count
97     sf = new SequenceFeature("exon", "", 10000, 50000, 0f, null);
98     genomic.addSequenceFeature(sf);
99
100     // mRNA_region feature doesn't count (parent of CDS)
101     sf = new SequenceFeature("mRNA_region", "", 10000, 50000, 0f, null);
102     genomic.addSequenceFeature(sf);
103
104     MapList ranges = testee.getGenomicRangesFromFeatures(genomic,
105             transcriptId, 23);
106     List<int[]> fromRanges = ranges.getFromRanges();
107     assertEquals(2, fromRanges.size());
108     // from ranges should be sorted by start order
109     assertEquals(10500, fromRanges.get(0)[0]);
110     assertEquals(10600, fromRanges.get(0)[1]);
111     assertEquals(20000, fromRanges.get(1)[0]);
112     assertEquals(20500, fromRanges.get(1)[1]);
113     // to range should start from given start numbering
114     List<int[]> toRanges = ranges.getToRanges();
115     assertEquals(1, toRanges.size());
116     assertEquals(23, toRanges.get(0)[0]);
117     assertEquals(624, toRanges.get(0)[1]);
118   }
119
120   /**
121    * Test the method that retains features except for 'CDS' (or subtypes), or
122    * features with parent other than the given id
123    */
124   @Test(groups = "Functional")
125   public void testRetainFeature()
126   {
127     String accId = "ABC123";
128     EnsemblCds testee = new EnsemblCds();
129
130     SequenceFeature sf = new SequenceFeature("CDS", "", 20000, 20500, 0f,
131             null);
132     assertFalse(testee.retainFeature(sf, accId));
133
134     sf = new SequenceFeature("CDS_predicted", "", 20000, 20500, 0f, null);
135     assertFalse(testee.retainFeature(sf, accId));
136
137     // other feature with no parent is retained
138     sf = new SequenceFeature("anotherType", "", 20000, 20500, 0f, null);
139     assertTrue(testee.retainFeature(sf, accId));
140
141     // other feature with desired parent is retained
142     sf.setValue("Parent", accId);
143     assertTrue(testee.retainFeature(sf, accId));
144
145     // feature with wrong parent is not retained
146     sf.setValue("Parent", "XYZ");
147     assertFalse(testee.retainFeature(sf, accId));
148   }
149
150   /**
151    * Test the method that picks out 'CDS' (or subtype) features with the
152    * accession id as parent
153    */
154   @Test(groups = "Functional")
155   public void testGetIdentifyingFeatures()
156   {
157     String accId = "ABC123";
158     SequenceI seq = new Sequence(accId, "MKDONS");
159
160     // cds with no parent not valid
161     SequenceFeature sf1 = new SequenceFeature("CDS", "", 1, 2, 0f, null);
162     seq.addSequenceFeature(sf1);
163
164     // cds with wrong parent not valid
165     SequenceFeature sf2 = new SequenceFeature("CDS", "", 1, 2, 0f, null);
166     sf2.setValue("Parent", "XYZ");
167     seq.addSequenceFeature(sf2);
168
169     // cds with right parent is valid
170     SequenceFeature sf3 = new SequenceFeature("CDS", "", 1, 2, 0f, null);
171     sf3.setValue("Parent", accId);
172     seq.addSequenceFeature(sf3);
173
174     // cds sub-type with right parent is valid
175     SequenceFeature sf4 = new SequenceFeature("CDS_predicted", "", 1, 2, 0f,
176             null);
177     sf4.setValue("Parent", accId);
178     seq.addSequenceFeature(sf4);
179
180     // transcript not valid:
181     SequenceFeature sf5 = new SequenceFeature("transcript", "", 1, 2, 0f,
182             null);
183     sf5.setValue("Parent", accId);
184     seq.addSequenceFeature(sf5);
185
186     // exon not valid:
187     SequenceFeature sf6 = new SequenceFeature("exon", "", 1, 2, 0f, null);
188     sf6.setValue("Parent", accId);
189     seq.addSequenceFeature(sf6);
190
191     List<SequenceFeature> sfs = new EnsemblCds().getIdentifyingFeatures(seq,
192             accId);
193     assertFalse(sfs.contains(sf1));
194     assertFalse(sfs.contains(sf2));
195     assertTrue(sfs.contains(sf3));
196     assertTrue(sfs.contains(sf4));
197     assertFalse(sfs.contains(sf5));
198     assertFalse(sfs.contains(sf6));
199   }
200
201   @Test(groups = "Functional")
202   public void testIsValidReference() throws Exception
203   {
204     EnsemblSequenceFetcher esq = new EnsemblCds();
205     Assert.assertTrue(esq.isValidReference("CCDS5863.1"));
206     Assert.assertTrue(esq.isValidReference("ENST00000288602"));
207     Assert.assertTrue(esq.isValidReference("ENSG00000288602"));
208     Assert.assertTrue(esq.isValidReference("ENSP00000288602"));
209     Assert.assertFalse(esq.isValidReference("ENST0000288602"));
210     // non-human species have a 3 character identifier included:
211     Assert.assertTrue(esq.isValidReference("ENSMUSG00000099398"));
212   }
213
214 }