Clover icon

Coverage Report

  1. Project Clover database Tue Mar 10 2026 14:58:44 GMT
  2. Package jalview.ext.ensembl

File EnsemblGeneTest.java

 

Code metrics

0
143
10
1
336
223
10
0.07
14.3
10
1

Classes

Class Line # Actions
EnsemblGeneTest 47 143 10
0.00%
 

Contributing tests

No tests hitting this source file were found.

Source view

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 java.util.Locale;
24   
25    import static org.testng.AssertJUnit.assertEquals;
26    import static org.testng.AssertJUnit.assertFalse;
27    import static org.testng.AssertJUnit.assertTrue;
28   
29    import jalview.api.FeatureSettingsModelI;
30    import jalview.bin.Cache;
31    import jalview.datamodel.Sequence;
32    import jalview.datamodel.SequenceDummy;
33    import jalview.datamodel.SequenceFeature;
34    import jalview.datamodel.SequenceI;
35    import jalview.gui.JvOptionPane;
36    import jalview.io.gff.SequenceOntologyFactory;
37    import jalview.io.gff.SequenceOntologyLite;
38    import jalview.util.MapList;
39   
40    import java.awt.Color;
41    import java.util.List;
42   
43    import org.testng.annotations.AfterClass;
44    import org.testng.annotations.BeforeClass;
45    import org.testng.annotations.Test;
46   
 
47    public class EnsemblGeneTest
48    {
49   
 
50  0 toggle @BeforeClass(alwaysRun = true)
51    public void setUpJvOptionPane()
52    {
53  0 JvOptionPane.setInteractiveMode(false);
54  0 JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
55    }
56   
 
57  0 toggle @BeforeClass(alwaysRun = true)
58    public void setUp()
59    {
60  0 Cache.loadProperties("test/jalview/io/testProps.jvprops");
61  0 SequenceOntologyFactory.setSequenceOntology(new SequenceOntologyLite());
62    }
63   
 
64  0 toggle @AfterClass(alwaysRun = true)
65    public void tearDown()
66    {
67  0 SequenceOntologyFactory.setSequenceOntology(null);
68    }
69   
70    /**
71    * Test that the gene part of genomic sequence is uniquely identified by a
72    * 'gene' features (or subtype) with the correct gene ID
73    */
 
74  0 toggle @Test(groups = "Functional")
75    public void testGetGenomicRangesFromFeatures()
76    {
77  0 EnsemblGene testee = new EnsemblGene();
78  0 SequenceI genomic = new SequenceDummy("chr7");
79  0 genomic.setStart(10000);
80  0 genomic.setEnd(50000);
81  0 String geneId = "ABC123";
82   
83    // gene at (start + 10500) length 101
84  0 SequenceFeature sf = new SequenceFeature("gene", "", 10500, 10600, 0f,
85    null);
86  0 sf.setValue("id", geneId);
87  0 sf.setStrand("+");
88  0 genomic.addSequenceFeature(sf);
89   
90  0 MapList ranges = testee.getGenomicRangesFromFeatures(genomic, geneId,
91    23);
92  0 List<int[]> fromRanges = ranges.getFromRanges();
93  0 assertEquals(1, fromRanges.size());
94  0 assertEquals(10500, fromRanges.get(0)[0]);
95  0 assertEquals(10600, fromRanges.get(0)[1]);
96    // to range should start from given start numbering
97  0 List<int[]> toRanges = ranges.getToRanges();
98  0 assertEquals(1, toRanges.size());
99  0 assertEquals(23, toRanges.get(0)[0]);
100  0 assertEquals(123, toRanges.get(0)[1]);
101    }
102   
103    /**
104    * Test variant using a sub-type of gene from the Sequence Ontology
105    */
 
106  0 toggle @Test(groups = "Functional")
107    public void testGetGenomicRangesFromFeatures_ncRNA_gene_reverseStrand()
108    {
109  0 EnsemblGene testee = new EnsemblGene();
110  0 SequenceI genomic = new SequenceDummy("chr7");
111  0 genomic.setStart(10000);
112  0 genomic.setEnd(50000);
113  0 String geneId = "ABC123";
114   
115    // gene at (start + 10500) length 101
116  0 SequenceFeature sf = new SequenceFeature("gene", "", 10500, 10600, 0f,
117    null);
118  0 sf.setValue("id", geneId);
119  0 sf.setStrand("+");
120  0 genomic.addSequenceFeature(sf);
121   
122  0 MapList ranges = testee.getGenomicRangesFromFeatures(genomic, geneId,
123    23);
124  0 List<int[]> fromRanges = ranges.getFromRanges();
125  0 assertEquals(1, fromRanges.size());
126    // from range on reverse strand:
127  0 assertEquals(10500, fromRanges.get(0)[0]);
128  0 assertEquals(10600, fromRanges.get(0)[1]);
129    // to range should start from given start numbering
130  0 List<int[]> toRanges = ranges.getToRanges();
131  0 assertEquals(1, toRanges.size());
132  0 assertEquals(23, toRanges.get(0)[0]);
133  0 assertEquals(123, toRanges.get(0)[1]);
134    }
135   
136    /**
137    * Test the method that extracts transcript (or subtype) features with a
138    * specified gene as parent
139    */
 
140  0 toggle @Test(groups = "Functional")
141    public void testGetTranscriptFeatures()
142    {
143  0 SequenceI genomic = new SequenceDummy("chr7");
144  0 genomic.setStart(10000);
145  0 genomic.setEnd(50000);
146  0 String geneId = "ABC123";
147   
148    // transcript feature
149  0 SequenceFeature sf1 = new SequenceFeature("transcript", "", 20000,
150    20500, 0f, null);
151  0 sf1.setValue("Parent", geneId);
152  0 sf1.setValue("id", "transcript1");
153  0 genomic.addSequenceFeature(sf1);
154   
155    // transcript sub-type feature
156  0 SequenceFeature sf2 = new SequenceFeature("snRNA", "", 21000, 21500, 0f,
157    null);
158  0 sf2.setValue("Parent", geneId);
159  0 sf2.setValue("id", "transcript2");
160  0 genomic.addSequenceFeature(sf2);
161   
162    // NMD_transcript_variant treated like transcript in Ensembl
163  0 SequenceFeature sf3 = new SequenceFeature("NMD_transcript_variant", "",
164    22000, 22500, 0f, null);
165    // id matching should not be case-sensitive
166  0 sf3.setValue("Parent", geneId.toLowerCase(Locale.ROOT));
167  0 sf3.setValue("id", "transcript3");
168  0 genomic.addSequenceFeature(sf3);
169   
170    // transcript for a different gene - ignored
171  0 SequenceFeature sf4 = new SequenceFeature("snRNA", "", 23000, 23500, 0f,
172    null);
173  0 sf4.setValue("Parent", "XYZ");
174  0 sf4.setValue("id", "transcript4");
175  0 genomic.addSequenceFeature(sf4);
176   
177  0 EnsemblGene testee = new EnsemblGene();
178   
179    /*
180    * with no filter
181    */
182  0 List<SequenceFeature> features = testee.getTranscriptFeatures(geneId,
183    genomic);
184  0 assertEquals(3, features.size());
185  0 assertTrue(features.contains(sf1));
186  0 assertTrue(features.contains(sf2));
187  0 assertTrue(features.contains(sf3));
188    }
189   
190    /**
191    * Test the method that retains features except for 'gene', or 'transcript'
192    * with parent other than the given id
193    */
 
194  0 toggle @Test(groups = "Functional")
195    public void testRetainFeature()
196    {
197  0 String geneId = "ABC123";
198  0 EnsemblGene testee = new EnsemblGene();
199  0 SequenceFeature sf = new SequenceFeature("gene", "", 20000, 20500, 0f,
200    null);
201  0 sf.setValue("id", geneId);
202  0 assertFalse(testee.retainFeature(sf, geneId));
203   
204  0 sf = new SequenceFeature("transcript", "", 20000, 20500, 0f, null);
205  0 sf.setValue("Parent", geneId);
206  0 assertTrue(testee.retainFeature(sf, geneId));
207   
208  0 sf = new SequenceFeature("mature_transcript", "", 20000, 20500, 0f,
209    null);
210  0 sf.setValue("Parent", geneId);
211  0 assertTrue(testee.retainFeature(sf, geneId));
212   
213  0 sf = new SequenceFeature("NMD_transcript_variant", "", 20000, 20500, 0f,
214    null);
215  0 sf.setValue("Parent", geneId);
216  0 assertTrue(testee.retainFeature(sf, geneId));
217   
218  0 sf.setValue("Parent", "ßXYZ");
219  0 assertFalse(testee.retainFeature(sf, geneId));
220   
221  0 sf = new SequenceFeature("anything", "", 20000, 20500, 0f, null);
222  0 assertTrue(testee.retainFeature(sf, geneId));
223    }
224   
225    /**
226    * Test the method that picks out 'gene' (or subtype) features with the
227    * accession id as ID
228    */
 
229  0 toggle @Test(groups = "Functional")
230    public void testGetIdentifyingFeatures()
231    {
232  0 String accId = "ABC123";
233  0 SequenceI seq = new Sequence(accId, "HIBEES");
234   
235    // gene with no ID not valid
236  0 SequenceFeature sf1 = new SequenceFeature("gene", "", 1, 2, 0f, null);
237  0 seq.addSequenceFeature(sf1);
238   
239    // gene with wrong ID not valid
240  0 SequenceFeature sf2 = new SequenceFeature("gene", "a", 1, 2, 0f, null);
241  0 sf2.setValue("id", "XYZ");
242  0 seq.addSequenceFeature(sf2);
243   
244    // gene with right ID is valid
245  0 SequenceFeature sf3 = new SequenceFeature("gene", "b", 1, 2, 0f, null);
246  0 sf3.setValue("id", accId);
247  0 seq.addSequenceFeature(sf3);
248   
249    // gene sub-type with right ID is valid
250  0 SequenceFeature sf4 = new SequenceFeature("snRNA_gene", "", 1, 2, 0f,
251    null);
252  0 sf4.setValue("id", accId);
253  0 seq.addSequenceFeature(sf4);
254   
255    // transcript not valid:
256  0 SequenceFeature sf5 = new SequenceFeature("transcript", "", 1, 2, 0f,
257    null);
258  0 sf5.setValue("id", accId);
259  0 seq.addSequenceFeature(sf5);
260   
261    // exon not valid:
262  0 SequenceFeature sf6 = new SequenceFeature("exon", "", 1, 2, 0f, null);
263  0 sf6.setValue("id", accId);
264  0 seq.addSequenceFeature(sf6);
265   
266  0 List<SequenceFeature> sfs = new EnsemblGene()
267    .getIdentifyingFeatures(seq, accId);
268  0 assertFalse(sfs.contains(sf1));
269  0 assertFalse(sfs.contains(sf2));
270  0 assertTrue(sfs.contains(sf3));
271  0 assertTrue(sfs.contains(sf4));
272  0 assertFalse(sfs.contains(sf5));
273  0 assertFalse(sfs.contains(sf6));
274    }
275   
276    /**
277    * Check behaviour of feature colour scheme for EnsemblGene sequences.
278    * Currently coded to hide all except exon and sequence_variant (or sub-types)
279    * only, with sequence_variant in red above exon coloured by label.
280    */
 
281  0 toggle @Test(groups = "Functional")
282    public void testGetFeatureColourScheme()
283    {
284  0 FeatureSettingsModelI fc = new EnsemblGene().getFeatureColourScheme();
285  0 assertFalse(fc.isFeatureDisplayed("exon"));
286  0 assertFalse(fc.isFeatureHidden("exon"));
287  0 assertFalse(fc.isFeatureDisplayed("coding_exon")); // subtype of exon
288  0 assertFalse(fc.isFeatureHidden("coding_exon")); // subtype of exon
289  0 assertFalse(fc.isFeatureDisplayed("sequence_variant"));
290  0 assertFalse(fc.isFeatureHidden("sequence_variant"));
291  0 assertFalse(fc.isFeatureDisplayed("feature_variant")); // subtype
292  0 assertFalse(fc.isFeatureHidden("feature_variant")); // subtype
293  0 assertTrue(fc.isFeatureHidden("transcript"));
294  0 assertTrue(fc.isFeatureHidden("CDS"));
295   
296  0 assertEquals(Color.RED,
297    fc.getFeatureColour("sequence_variant").getColour());
298  0 assertEquals(Color.RED,
299    fc.getFeatureColour("feature_variant").getColour());
300  0 assertTrue(fc.getFeatureColour("exon").isColourByLabel());
301  0 assertTrue(fc.getFeatureColour("coding_exon").isColourByLabel());
302  0 assertEquals(1, fc.compare("sequence_variant", "exon"));
303  0 assertEquals(-1, fc.compare("exon", "sequence_variant"));
304  0 assertEquals(1, fc.compare("feature_variant", "coding_exon"));
305  0 assertEquals(-1, fc.compare("coding_exon", "feature_variant"));
306  0 assertEquals(1f, fc.getTransparency());
307    }
308   
 
309  0 toggle @Test(groups = "Network")
310    public void testGetGeneIds()
311    {
312    /*
313    * ENSG00000158828 gene id PINK1 human
314    * ENST00000321556 transcript for the same gene - should not be duplicated
315    * P30419 Uniprot identifier for ENSG00000136448
316    * ENST00000592782 transcript for Uniprot gene - should not be duplicated
317    * BRAF - gene name resolvabe (at time of writing) for 6 model species
318    */
319  0 String ids = "ENSG00000158828 ENST00000321556 P30419 ENST00000592782 BRAF";
320  0 EnsemblGene testee = new EnsemblGene();
321  0 List<String> geneIds = testee.getGeneIds(ids);
322  0 assertTrue(geneIds.contains("ENSG00000158828"));
323  0 assertTrue(geneIds.contains("ENSG00000136448"));
324  0 assertTrue(geneIds.contains("ENSG00000157764")); // BRAF human
325  0 assertTrue(geneIds.contains("ENSMUSG00000002413")); // mouse
326  0 assertTrue(geneIds.contains("ENSRNOG00000010957")); // rat
327  0 assertTrue(geneIds.contains("ENSXETG00000004845")); // xenopus
328  0 assertTrue(geneIds.contains("ENSDARG00000017661")); // zebrafish
329    // was ENSGALG00000012865 - which is still the canonical uniprot BRAF cross
330    // reference via GRCg6a
331  0 assertTrue(geneIds.contains("ENSGALG00010013466")); // chicken BRAF
332    // bGalGal1.mat.broiler.GRCg7b
333  0 assertEquals(8, geneIds.size());
334   
335    }
336    }