JAL-4241 Fix non-standard residues replacement.
[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_NonStandardRemain()
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("ACACAOACACAC"),
184             matchesSequenceString("ABAVAVAVABAV")
185     ));
186   }
187
188   @Test(groups = { "Functional"} )
189   public void testCreate_ContainsNonStandardAndFilterNonStandard_NonStandardToGap()
190   {
191     var alignment = new Alignment(new Sequence[] {
192         new Sequence("test1", "ACACAOACACAC"),
193         new Sequence("test2", "ABAVAVAVABAV")
194     });
195     var annotJob = AnnotationJob.create(alignment, true, true, true, true, 0);
196     assertThat(annotJob.getInputSequences(), contains(
197             matchesSequenceString("ACACA-ACACAC"),
198             matchesSequenceString("A-AVAVAVA-AV")
199     ));
200   }
201
202   @DataProvider
203   public Object[] alignmentWithNonStandardInColumns()
204   {
205     return new Object[] {
206         new Alignment(new Sequence[] {
207             new Sequence("test1", "A-AAAOAAAAAAAA"),
208             new Sequence("test2", "ABAAA-AAAAAAAA")
209         }),
210         new Alignment(new Sequence[] {
211             new Sequence("test1", "ABAAAOAAAAAAAA"),
212             new Sequence("test2", "ABAAABAAAAAAAA")
213         }),
214         new Alignment(new Sequence[] {
215             new Sequence("test1", "A-AAAOAAAAAAAA"),
216             new Sequence("test2", "A-AAA-AAAAAAAA")
217         })
218     };
219   }
220
221   @Test(groups = { "Functional" }, dataProvider = "alignmentWithNonStandardInColumns")
222   public void testCreate_NonStandardInColumnsAndFilterNonStandard_ColumnsExtruded(Alignment aln)
223   {
224     var annotJob = AnnotationJob.create(aln, true, true, true, true, 0);
225     assertThat(annotJob.getInputSequences(), contains(
226             matchesSequenceString("AAAAAAAAAAAA"),
227             matchesSequenceString("AAAAAAAAAAAA")
228     ));
229   }
230
231   @Test(groups = { "Functional" })
232   public void testCreate_SequenceGroup_RegionSubmitted()
233   {
234     var group = new SequenceGroup(List.of(
235        new Sequence("test1", "CCCCAAATAAATAAATCCC"),
236        new Sequence("test2", "----AAATAAATAAAT---")
237     ));
238     group.setStartRes(4);
239     group.setEndRes(15);
240     var annotJob = AnnotationJob.create(group, true, false, false, false, 0);
241     assertThat(annotJob.getInputSequences(), contains(
242             matchesSequenceString("AAATAAATAAAT"),
243             matchesSequenceString("AAATAAATAAAT")
244     ));
245   }
246
247   @Test(groups = { "Functional" })
248   public void testCreate_RegionIncludingGaps_RegionSubmittedWithoutGaps()
249   {
250     var group = new SequenceGroup(List.of(
251        new Sequence("test1", "CCCC-AAATAAATAAAT--CCC"),
252        new Sequence("test2", "-----AAATAAATAAAT-----")
253     ));
254     group.setStartRes(4);
255     group.setEndRes(18);
256     var annotJob = AnnotationJob.create(group, true, false, false, false, 0);
257     assertThat(annotJob.getInputSequences(), contains(
258             matchesSequenceString("AAATAAATAAAT"),
259             matchesSequenceString("AAATAAATAAAT")
260     ));
261   }
262
263   @Test(groups = { "Functional" })
264   public void testCreate_RegionIncludingGapsAndSubmitGaps_RegionSubmittedGapsExtruded()
265   {
266     var group = new SequenceGroup(List.of(
267        new Sequence("test1", "CCCC-AAATAAATAAAT--CCC"),
268        new Sequence("test2", "-----AAATAAATAAAT-----")
269     ));
270     group.setStartRes(4);
271     group.setEndRes(18);
272     var annotJob = AnnotationJob.create(group, true, true, false, false, 0);
273     assertThat(annotJob.getInputSequences(), contains(
274             matchesSequenceString("AAATAAATAAAT"),
275             matchesSequenceString("AAATAAATAAAT")
276     ));
277   }
278 }