Merge branch 'mmw/bug/JAL-4241-annotation-alignment-fix-slivka' into development...
[jalview.git] / test / jalview / ws2 / actions / annotation / AnnotationJobTest.java
1 package jalview.ws2.actions.annotation;
2
3 import static jalview.testutils.Matchers.matchesSequenceString;
4 import static org.hamcrest.MatcherAssert.assertThat;
5 import static org.hamcrest.Matchers.contains;
6 import static org.hamcrest.Matchers.hasSize;
7
8 import java.util.List;
9
10 import org.testng.annotations.DataProvider;
11 import org.testng.annotations.Test;
12
13 import jalview.datamodel.Alignment;
14 import jalview.datamodel.Sequence;
15 import jalview.datamodel.SequenceGroup;
16
17 public class AnnotationJobTest
18 {
19   @Test(groups = { "Functional" })
20   public void testCreate_EqualLengthNoGapsSubmitGaps()
21   {
22     var alignment = new Alignment(new Sequence[] {
23        new Sequence("test1", "ACACACACACA"),
24        new Sequence("test2", "AVAVAVAVAVA"),
25        new Sequence("test3", "AVWVAVWVAVW")
26     });
27     var annotJob = AnnotationJob.create(alignment, true, false, false, false, 0);
28     assertThat(annotJob.getInputSequences(), contains(
29             matchesSequenceString("ACACACACACA"),
30             matchesSequenceString("AVAVAVAVAVA"),
31             matchesSequenceString("AVWVAVWVAVW")
32     ));
33   }
34
35   @Test(groups = { "Functional" })
36   public void testCreate_EqualLengthNoGapsNoSubmitGaps()
37   {
38     var alignment = new Alignment(new Sequence[] {
39         new Sequence("test1", "ACACACACACA"),
40         new Sequence("test2", "AVAVAVAVAVA"),
41         new Sequence("test3", "AVWVAVWVAVW")
42     });
43     var annotJob = AnnotationJob.create(alignment, true, true, false, false, 0);
44     assertThat(annotJob.getInputSequences(), contains(
45             matchesSequenceString("ACACACACACA"),
46             matchesSequenceString("AVAVAVAVAVA"),
47             matchesSequenceString("AVWVAVWVAVW")
48     ));
49   }
50
51   @Test(groups = { "Functional" })
52   public void testCreate_UnequalLengthNoGapsNoSubmitGaps()
53   {
54     var alignment = new Alignment(new Sequence[] {
55        new Sequence("test1", "ACACACACACA"),
56        new Sequence("test2", "AVAVAVAVAVAVA"),
57        new Sequence("test3", "AVWVAVWVAVWV")
58     });
59     var annotJob = AnnotationJob.create(alignment, true, false, false, false, 0);
60     assertThat(annotJob.getInputSequences(), contains(
61             matchesSequenceString("ACACACACACA"),
62             matchesSequenceString("AVAVAVAVAVAVA"),
63             matchesSequenceString("AVWVAVWVAVWV")
64     ));
65   }
66
67   @Test(groups = { "Functional" })
68   public void testCreate_UnequalLengthNoGapsSubmitGaps()
69   {
70     var alignment = new Alignment(new Sequence[] {
71         new Sequence("test1", "ACACACACACA"),
72         new Sequence("test2", "AVAVAVAVAVAVA"),
73         new Sequence("test3", "AVWVAVWVAVWV")
74      });
75      var annotJob = AnnotationJob.create(alignment, true, true, false, false, 0);
76      assertThat(annotJob.getInputSequences(), contains(
77              matchesSequenceString("ACACACACACA"),
78              matchesSequenceString("AVAVAVAVAVAVA"),
79              matchesSequenceString("AVWVAVWVAVWV")
80      ));
81   }
82
83   @Test(groups = { "Functional" })
84   public void testCreate_UnequalLengthNoGapsSubmitGapsRequireAligned()
85   {
86     var alignment = new Alignment(new Sequence[] {
87         new Sequence("test1", "ACACACACACA"),
88         new Sequence("test2", "AVAVAVAVAVAVA"),
89         new Sequence("test3", "AVWVAVWVAVWV")
90      });
91      var annotJob = AnnotationJob.create(alignment, true, true, true, false, 0);
92      assertThat(annotJob.getInputSequences(), contains(
93              matchesSequenceString("ACACACACACA--"),
94              matchesSequenceString("AVAVAVAVAVAVA"),
95              matchesSequenceString("AVWVAVWVAVWV-")
96      ));
97   }
98
99   @DataProvider
100   public Object[] alignmentWithShortSequences()
101   {
102     return new Object[] {
103         new Alignment(new Sequence[] {
104             new Sequence("test1", "AAAAA"),
105             new Sequence("test2", "ACAACAAACAAC"),
106             new Sequence("test3", "ACA")
107         }),
108         new Alignment(new Sequence[] {
109             new Sequence("test1", "----AAAAA---"),
110             new Sequence("test2", "ACAACAAACAAC"),
111             new Sequence("test3", "-----ACA----")
112         }),
113         new Alignment(new Sequence[] {
114             new Sequence("test1", "--AAA---AA--"),
115             new Sequence("test2", "ACAACAAACAAC"),
116             new Sequence("test3", "-------ACA--")
117         }),
118     };
119   }
120
121   @Test(groups = { "Functional" }, dataProvider = "alignmentWithShortSequences")
122   public void testCreate_TooShortSequence_ShortSequenceRemoved(Alignment aln)
123   {
124     var annotJob = AnnotationJob.create(aln, true, false, false, false, 0);
125     assertThat(annotJob.getInputSequences(), hasSize(1));
126   }
127
128   @Test(groups = { "Functional" }, dataProvider = "alignmentWithShortSequences")
129   public void testCreate_TooShortSequenceAndSubmitGaps_ShortSeqRemoved(Alignment aln)
130   {
131     var annotJob = AnnotationJob.create(aln, true, true, false, false, 0);
132     assertThat(annotJob.getInputSequences(), hasSize(1));
133   }
134
135   @Test(groups = { "Functional" }, dataProvider = "alignmentWithShortSequences")
136   public void testCreate_TooShortSequenceAndRequireAligned_ShortSeqRemoved(Alignment aln)
137   {
138     var annotJob = AnnotationJob.create(aln, true, true, true, false, 0);
139     assertThat(annotJob.getInputSequences(), hasSize(1));
140   }
141
142   @Test(groups = { "Functional" })
143   public void testCreate_EmptyColumnAndSubmitGaps_ColumnExtruded()
144   {
145     var alignment = new Alignment(new Sequence[] {
146         new Sequence("test1", "ACA-ACAA--CACA"),
147         new Sequence("test2", "AVA-AVAA-AVAVA"),
148         new Sequence("test3", "AVAWAVAA-AVWVA")
149     });
150     var annotJob = AnnotationJob.create(alignment, true, true, false, false, 0);
151     assertThat(annotJob.getInputSequences(), contains(
152             matchesSequenceString("ACA-ACAA-CACA"),
153             matchesSequenceString("AVA-AVAAAVAVA"),
154             matchesSequenceString("AVAWAVAAAVWVA")
155     ));
156   }
157
158   @Test(groups = { "Functional" })
159   public void testCreate_EmptyColumnAndRequireAligned_ColumnExtruded()
160   {
161     var alignment = new Alignment(new Sequence[] {
162         new Sequence("test1", "ACA-ACAA--CACA"),
163         new Sequence("test2", "AVA-AVAA-AVAVA"),
164         new Sequence("test3", "AVAWAVAA-AVWVA")
165     });
166     var annotJob = AnnotationJob.create(alignment, true, true, true, false, 0);
167     assertThat(annotJob.getInputSequences(), contains(
168             matchesSequenceString("ACA-ACAA-CACA"),
169             matchesSequenceString("AVA-AVAAAVAVA"),
170             matchesSequenceString("AVAWAVAAAVWVA")
171     ));
172   }
173
174   @Test(groups = { "Functional"} )
175   public void testCreate_ContainsNonStandardAndNoFilterNonStandard_NonStandardToGap()
176   {
177     var alignment = new Alignment(new Sequence[] {
178         new Sequence("test1", "ACACAOACACAC"),
179         new Sequence("test2", "ABAVAVAVABAV")
180     });
181     var annotJob = AnnotationJob.create(alignment, true, true, true, false, 0);
182     assertThat(annotJob.getInputSequences(), contains(
183             matchesSequenceString("ACACA-ACACAC"),
184             matchesSequenceString("A-AVAVAVA-AV")
185     ));
186   }
187
188   @DataProvider
189   public Object[] alignmentWithNonStandardInColumns()
190   {
191     return new Object[] {
192         new Alignment(new Sequence[] {
193             new Sequence("test1", "A-AAAOAAAAAAAA"),
194             new Sequence("test2", "ABAAA-AAAAAAAA")
195         }),
196         new Alignment(new Sequence[] {
197             new Sequence("test1", "ABAAAOAAAAAAAA"),
198             new Sequence("test2", "ABAAABAAAAAAAA")
199         }),
200         new Alignment(new Sequence[] {
201             new Sequence("test1", "A-AAAOAAAAAAAA"),
202             new Sequence("test2", "A-AAA-AAAAAAAA")
203         })
204     };
205   }
206
207   @Test(groups = { "Functional" }, dataProvider = "alignmentWithNonStandardInColumns")
208   public void testCreate_NonStandardInColumnsAndFilterNonStandard_ColumnsExtruded(Alignment aln)
209   {
210     var annotJob = AnnotationJob.create(aln, true, true, true, true, 0);
211     assertThat(annotJob.getInputSequences(), contains(
212             matchesSequenceString("AAAAAAAAAAAA"),
213             matchesSequenceString("AAAAAAAAAAAA")
214     ));
215   }
216
217   @Test(groups = { "Functional" })
218   public void testCreate_SequenceGroup_RegionSubmitted()
219   {
220     var group = new SequenceGroup(List.of(
221        new Sequence("test1", "CCCCAAATAAATAAATCCC"),
222        new Sequence("test2", "----AAATAAATAAAT---")
223     ));
224     group.setStartRes(4);
225     group.setEndRes(15);
226     var annotJob = AnnotationJob.create(group, true, false, false, false, 0);
227     assertThat(annotJob.getInputSequences(), contains(
228             matchesSequenceString("AAATAAATAAAT"),
229             matchesSequenceString("AAATAAATAAAT")
230     ));
231   }
232
233   @Test(groups = { "Functional" })
234   public void testCreate_RegionIncludingGaps_RegionSubmittedWithoutGaps()
235   {
236     var group = new SequenceGroup(List.of(
237        new Sequence("test1", "CCCC-AAATAAATAAAT--CCC"),
238        new Sequence("test2", "-----AAATAAATAAAT-----")
239     ));
240     group.setStartRes(4);
241     group.setEndRes(18);
242     var annotJob = AnnotationJob.create(group, true, false, false, false, 0);
243     assertThat(annotJob.getInputSequences(), contains(
244             matchesSequenceString("AAATAAATAAAT"),
245             matchesSequenceString("AAATAAATAAAT")
246     ));
247   }
248
249   @Test(groups = { "Functional" })
250   public void testCreate_RegionIncludingGapsAndSubmitGaps_RegionSubmittedGapsExtruded()
251   {
252     var group = new SequenceGroup(List.of(
253        new Sequence("test1", "CCCC-AAATAAATAAAT--CCC"),
254        new Sequence("test2", "-----AAATAAATAAAT-----")
255     ));
256     group.setStartRes(4);
257     group.setEndRes(18);
258     var annotJob = AnnotationJob.create(group, true, true, false, false, 0);
259     assertThat(annotJob.getInputSequences(), contains(
260             matchesSequenceString("AAATAAATAAAT"),
261             matchesSequenceString("AAATAAATAAAT")
262     ));
263   }
264 }