1 package jalview.ext.ensembl;
3 import static org.testng.AssertJUnit.assertEquals;
4 import static org.testng.AssertJUnit.assertFalse;
5 import static org.testng.AssertJUnit.assertSame;
6 import static org.testng.AssertJUnit.assertTrue;
8 import jalview.datamodel.SequenceDummy;
9 import jalview.datamodel.SequenceFeature;
10 import jalview.datamodel.SequenceI;
11 import jalview.io.gff.SequenceOntologyFactory;
12 import jalview.io.gff.SequenceOntologyLite;
13 import jalview.util.MapList;
15 import java.util.List;
17 import org.testng.annotations.AfterClass;
18 import org.testng.annotations.BeforeClass;
19 import org.testng.annotations.Test;
21 public class EnsemblGeneTest
26 SequenceOntologyFactory.setInstance(new SequenceOntologyLite());
30 public void tearDown()
32 SequenceOntologyFactory.setInstance(null);
36 * Test that the gene part of genomic sequence is uniquely identified by a
37 * 'gene' features (or subtype) with the correct gene ID
39 @Test(groups = "Functional")
40 public void testGetGenomicRangesFromFeatures()
42 EnsemblGene testee = new EnsemblGene();
43 SequenceI genomic = new SequenceDummy("chr7");
44 genomic.setStart(10000);
45 genomic.setEnd(50000);
46 String geneId = "ABC123";
48 // gene at (start+10000) length 501
49 SequenceFeature sf = new SequenceFeature("gene", "", 20000, 20500, 0f,
51 sf.setValue("ID", "gene:" + geneId);
53 genomic.addSequenceFeature(sf);
55 // gene at (start + 10500) length 101
56 // should be ignored - the first 'gene' found defines the whole range
57 sf = new SequenceFeature("gene", "", 10500, 10600, 0f, null);
58 sf.setValue("ID", "gene:" + geneId);
60 genomic.addSequenceFeature(sf);
62 MapList ranges = testee.getGenomicRangesFromFeatures(genomic, geneId,
64 List<int[]> fromRanges = ranges.getFromRanges();
65 assertEquals(1, fromRanges.size());
66 assertEquals(20000, fromRanges.get(0)[0]);
67 assertEquals(20500, fromRanges.get(0)[1]);
68 // to range should start from given start numbering
69 List<int[]> toRanges = ranges.getToRanges();
70 assertEquals(1, toRanges.size());
71 assertEquals(23, toRanges.get(0)[0]);
72 assertEquals(523, toRanges.get(0)[1]);
76 * Test variant using a sub-type of gene from the Sequence Ontology
78 @Test(groups = "Functional")
79 public void testGetGenomicRangesFromFeatures_ncRNA_gene_reverseStrand()
81 EnsemblGene testee = new EnsemblGene();
82 SequenceI genomic = new SequenceDummy("chr7");
83 genomic.setStart(10000);
84 genomic.setEnd(50000);
85 String geneId = "ABC123";
87 // gene at (start+10000) length 501
88 SequenceFeature sf = new SequenceFeature("ncRNA_gene", "", 20000,
90 sf.setValue("ID", "gene:" + geneId);
92 genomic.addSequenceFeature(sf);
94 // gene at (start + 10500) length 101
95 // should be ignored - the first 'gene' found defines the whole range
96 // (real data would only have one such feature)
97 sf = new SequenceFeature("gene", "", 10500, 10600, 0f, null);
98 sf.setValue("ID", "gene:" + geneId);
100 genomic.addSequenceFeature(sf);
102 MapList ranges = testee.getGenomicRangesFromFeatures(genomic, geneId,
104 List<int[]> fromRanges = ranges.getFromRanges();
105 assertEquals(1, fromRanges.size());
106 // from range on reverse strand:
107 assertEquals(20500, fromRanges.get(0)[0]);
108 assertEquals(20000, fromRanges.get(0)[1]);
109 // to range should start from given start numbering
110 List<int[]> toRanges = ranges.getToRanges();
111 assertEquals(1, toRanges.size());
112 assertEquals(23, toRanges.get(0)[0]);
113 assertEquals(523, toRanges.get(0)[1]);
117 * Test the method that extracts transcript (or subtype) features with a
118 * specified gene as parent
120 @Test(groups = "Functional")
121 public void testGetTranscriptFeatures()
123 SequenceI genomic = new SequenceDummy("chr7");
124 genomic.setStart(10000);
125 genomic.setEnd(50000);
126 String geneId = "ABC123";
128 // transcript feature
129 SequenceFeature sf1 = new SequenceFeature("transcript", "", 20000,
131 sf1.setValue("Parent", "gene:" + geneId);
132 sf1.setValue("transcript_id", "transcript1");
133 genomic.addSequenceFeature(sf1);
135 // transcript sub-type feature
136 SequenceFeature sf2 = new SequenceFeature("snRNA", "", 20000,
138 sf2.setValue("Parent", "gene:" + geneId);
139 sf2.setValue("transcript_id", "transcript2");
140 genomic.addSequenceFeature(sf2);
142 // NMD_transcript_variant treated like transcript in Ensembl
143 SequenceFeature sf3 = new SequenceFeature("NMD_transcript_variant", "",
144 20000, 20500, 0f, null);
145 sf3.setValue("Parent", "gene:" + geneId);
146 sf3.setValue("transcript_id", "transcript3");
147 genomic.addSequenceFeature(sf3);
149 // transcript for a different gene - ignored
150 SequenceFeature sf4 = new SequenceFeature("snRNA", "", 20000, 20500,
152 sf4.setValue("Parent", "gene:XYZ");
153 sf4.setValue("transcript_id", "transcript4");
154 genomic.addSequenceFeature(sf4);
156 EnsemblGene testee = new EnsemblGene();
161 List<SequenceFeature> features = testee.getTranscriptFeatures(geneId,
163 assertEquals(3, features.size());
164 assertSame(sf1, features.get(0));
165 assertSame(sf2, features.get(1));
166 assertSame(sf3, features.get(2));
170 * Test the method that retains features except for 'gene', or 'transcript'
171 * with parent other than the given id
173 @Test(groups = "Functional")
174 public void testRetainFeature()
176 String geneId = "ABC123";
177 EnsemblGene testee = new EnsemblGene();
178 SequenceFeature sf = new SequenceFeature("gene", "", 20000,
180 sf.setValue("ID", "gene:" + geneId);
181 assertFalse(testee.retainFeature(sf, geneId));
183 sf.setType("transcript");
184 sf.setValue("Parent", "gene:" + geneId);
185 assertTrue(testee.retainFeature(sf, geneId));
187 sf.setType("mature_transcript");
188 sf.setValue("Parent", "gene:" + geneId);
189 assertTrue(testee.retainFeature(sf, geneId));
191 sf.setType("NMD_transcript_variant");
192 sf.setValue("Parent", "gene:" + geneId);
193 assertTrue(testee.retainFeature(sf, geneId));
195 sf.setValue("Parent", "gene:XYZ");
196 assertFalse(testee.retainFeature(sf, geneId));
198 sf.setType("anything");
199 assertTrue(testee.retainFeature(sf, geneId));
203 * Test the method that picks out 'gene' (or subtype) features with the
206 @Test(groups = "Functional")
207 public void testIdentifiesSequence()
209 String accId = "ABC123";
210 EnsemblGene testee = new EnsemblGene();
212 // gene with no ID not valid
213 SequenceFeature sf = new SequenceFeature("gene", "", 1, 2, 0f, null);
214 assertFalse(testee.identifiesSequence(sf, accId));
216 // gene with wrong ID not valid
217 sf.setValue("ID", "gene:XYZ");
218 assertFalse(testee.identifiesSequence(sf, accId));
220 // gene with right ID is valid
221 sf.setValue("ID", "gene:" + accId);
222 assertTrue(testee.identifiesSequence(sf, accId));
224 // gene sub-type with right ID is valid
225 sf.setType("snRNA_gene");
226 assertTrue(testee.identifiesSequence(sf, accId));
228 // transcript not valid:
229 sf.setType("transcript");
230 assertFalse(testee.identifiesSequence(sf, accId));
234 assertFalse(testee.identifiesSequence(sf, accId));