JAL-1705 tests added
[jalview.git] / test / jalview / ext / ensembl / EnsemblCdnaTest.java
1 package jalview.ext.ensembl;
2
3 import static org.testng.AssertJUnit.assertEquals;
4 import static org.testng.AssertJUnit.assertNull;
5
6 import jalview.datamodel.SequenceDummy;
7 import jalview.datamodel.SequenceFeature;
8 import jalview.datamodel.SequenceI;
9 import jalview.io.gff.SequenceOntologyFactory;
10 import jalview.io.gff.SequenceOntologyLite;
11 import jalview.util.MapList;
12
13 import java.util.List;
14
15 import org.testng.annotations.Test;
16
17 public class EnsemblCdnaTest
18 {
19   /**
20    * Test that the cdna part of genomic sequence is correctly identified by
21    * 'exon' features (or subtypes) - reverse strand case.
22    */
23   @Test(groups = "Functional")
24   public void getGenomicRangesFromFeatures_reverseStrand()
25   {
26     EnsemblCdna testee = new EnsemblCdna();
27     SequenceI genomic = new SequenceDummy("chr7");
28     genomic.setStart(10000);
29     genomic.setEnd(50000);
30     String transcriptId = "ABC123";
31
32     // exon at (start+10000) length 501
33     SequenceFeature sf = new SequenceFeature("exon", "", 20000, 20500, 0f,
34             null);
35     sf.setValue("Parent", "transcript:" + transcriptId);
36     sf.setStrand("-");
37     genomic.addSequenceFeature(sf);
38
39     // exon (sub-type) at (start + exon_variant) length 101
40     sf = new SequenceFeature("coding_exon", "", 10500, 10600, 0f, null);
41     sf.setValue("Parent", "transcript:" + transcriptId);
42     sf.setStrand("-");
43     genomic.addSequenceFeature(sf);
44
45     // exon belonging to a different transcript doesn't count
46     sf = new SequenceFeature("exon", "", 11500, 12600, 0f, null);
47     sf.setValue("Parent", "transcript:anotherOne");
48     genomic.addSequenceFeature(sf);
49
50     // transcript feature doesn't count
51     sf = new SequenceFeature("transcript", "", 10000, 50000, 0f, null);
52     genomic.addSequenceFeature(sf);
53
54     SequenceOntologyFactory.setInstance(new SequenceOntologyLite());
55
56     MapList ranges = testee.getGenomicRangesFromFeatures(genomic,
57             transcriptId, 23);
58     List<int[]> fromRanges = ranges.getFromRanges();
59     assertEquals(2, fromRanges.size());
60
61     /*
62      * from ranges should be sorted by start order descending
63      * and hold mappings from reverse strand sense
64      */
65     assertEquals(20500, fromRanges.get(0)[0]);
66     assertEquals(20000, fromRanges.get(0)[1]);
67     assertEquals(10600, fromRanges.get(1)[0]);
68     assertEquals(10500, fromRanges.get(1)[1]);
69     // to range should start from given start numbering
70     List<int[]> toRanges = ranges.getToRanges();
71     assertEquals(1, toRanges.size());
72     assertEquals(23, toRanges.get(0)[0]);
73     assertEquals(624, toRanges.get(0)[1]);
74   }
75
76   /**
77    * Test that the cdna part of genomic sequence is correctly identified by
78    * 'exon' features (or subtypes).
79    */
80   @Test(groups = "Functional")
81   public void getGenomicRangesFromFeatures()
82   {
83     EnsemblCdna testee = new EnsemblCdna();
84     SequenceI genomic = new SequenceDummy("chr7");
85     genomic.setStart(10000);
86     genomic.setEnd(50000);
87     String transcriptId = "ABC123";
88   
89     // exon at (start+10000) length 501
90     SequenceFeature sf = new SequenceFeature("exon", "", 20000, 20500, 0f,
91             null);
92     sf.setValue("Parent", "transcript:" + transcriptId);
93     sf.setStrand("+");
94     genomic.addSequenceFeature(sf);
95   
96     // exon (sub-type) at (start + exon_variant) length 101
97     sf = new SequenceFeature("coding_exon", "", 10500, 10600, 0f, null);
98     sf.setValue("Parent", "transcript:" + transcriptId);
99     sf.setStrand("+");
100     genomic.addSequenceFeature(sf);
101   
102     // exon belonging to a different transcript doesn't count
103     sf = new SequenceFeature("exon", "", 11500, 12600, 0f, null);
104     sf.setValue("Parent", "transcript:anotherOne");
105     genomic.addSequenceFeature(sf);
106   
107     // transcript feature doesn't count
108     sf = new SequenceFeature("transcript", "", 10000, 50000, 0f, null);
109     sf.setStrand("-"); // weird but ignored
110     genomic.addSequenceFeature(sf);
111   
112     SequenceOntologyFactory.setInstance(new SequenceOntologyLite());
113   
114     MapList ranges = testee.getGenomicRangesFromFeatures(genomic,
115             transcriptId, 23);
116     List<int[]> fromRanges = ranges.getFromRanges();
117     assertEquals(2, fromRanges.size());
118     // from ranges should be sorted by start order
119     assertEquals(10500, fromRanges.get(0)[0]);
120     assertEquals(10600, fromRanges.get(0)[1]);
121     assertEquals(20000, fromRanges.get(1)[0]);
122     assertEquals(20500, fromRanges.get(1)[1]);
123     // to range should start from given start numbering
124     List<int[]> toRanges = ranges.getToRanges();
125     assertEquals(1, toRanges.size());
126     assertEquals(23, toRanges.get(0)[0]);
127     assertEquals(624, toRanges.get(0)[1]);
128   }
129
130   /**
131    * The method under test should give up and return null if both forward and
132    * reverse strands are present in the features of interest
133    */
134   @Test(groups = "Functional")
135   public void getGenomicRangesFromFeatures_mixedStrand()
136   {
137     EnsemblCdna testee = new EnsemblCdna();
138     SequenceI genomic = new SequenceDummy("chr7");
139     genomic.setStart(10000);
140     genomic.setEnd(50000);
141     String transcriptId = "ABC123";
142   
143     SequenceFeature sf = new SequenceFeature("exon", "", 20000, 20500, 0f,
144             null);
145     sf.setValue("Parent", "transcript:" + transcriptId);
146     sf.setStrand("-");
147     genomic.addSequenceFeature(sf);
148   
149     sf = new SequenceFeature("coding_exon", "", 10500, 10600, 0f, null);
150     sf.setValue("Parent", "transcript:" + transcriptId);
151     sf.setStrand("+");
152     genomic.addSequenceFeature(sf);
153   
154     SequenceOntologyFactory.setInstance(new SequenceOntologyLite());
155   
156     MapList ranges = testee.getGenomicRangesFromFeatures(genomic,
157             transcriptId, 23);
158     assertNull(ranges);
159   }
160 }