JAL-1601 Expand secondary structure prediction tests
[jalview.git] / test / jalview / ws2 / actions / secstructpred / SecStructPredMsaTaskTest.java
1 package jalview.ws2.actions.secstructpred;
2
3 import jalview.datamodel.Alignment;
4 import jalview.datamodel.AlignmentAnnotation;
5 import jalview.datamodel.AlignmentI;
6 import jalview.datamodel.HiddenColumns;
7 import jalview.datamodel.Sequence;
8 import jalview.datamodel.SequenceI;
9 import jalview.gui.AlignViewport;
10 import jalview.io.DataSourceType;
11 import jalview.io.FastaFile;
12 import jalview.io.JPredFile;
13 import jalview.ws2.api.Credentials;
14 import jalview.ws2.api.JobStatus;
15 import jalview.ws2.api.WebServiceJobHandle;
16 import jalview.ws2.client.api.SecStructPredWebServiceClientI;
17 import org.hamcrest.Matcher;
18 import org.hamcrest.Matchers;
19 import org.testng.annotations.BeforeMethod;
20 import org.testng.annotations.DataProvider;
21 import org.testng.annotations.Test;
22
23 import java.io.IOException;
24 import java.util.ArrayList;
25 import java.util.List;
26
27 import static jalview.testutils.Matchers.matchesAnnotations;
28 import static jalview.testutils.Matchers.matchesSequenceString;
29 import static jalview.testutils.ScopeFunctions.apply;
30 import static java.lang.String.format;
31 import static org.hamcrest.MatcherAssert.assertThat;
32 import static org.hamcrest.Matchers.allOf;
33 import static org.hamcrest.Matchers.containsInAnyOrder;
34 import static org.hamcrest.Matchers.equalTo;
35 import static org.hamcrest.Matchers.hasProperty;
36 import static org.mockito.ArgumentMatchers.any;
37 import static org.mockito.Mockito.mock;
38 import static org.mockito.Mockito.when;
39
40 public class SecStructPredMsaTaskTest
41 {
42   protected SecStructPredWebServiceClientI mockClient;
43
44   @BeforeMethod(alwaysRun = true)
45   public void setupMockClient() throws IOException
46   {
47     mockClient = mock(SecStructPredWebServiceClientI.class);
48     when(mockClient.getUrl()).thenReturn("http://example.org");
49     when(mockClient.getClientName()).thenReturn("mock");
50     when(mockClient.submit(any(), any(), any()))
51             .thenReturn(new WebServiceJobHandle("mock", "mock",
52                     "http://example.org", "0"));
53     when(mockClient.getLog(any())).thenReturn("");
54     when(mockClient.getErrorLog(any())).thenReturn("");
55     when(mockClient.getStatus(any())).thenReturn(JobStatus.COMPLETED);
56   }
57
58   @DataProvider
59   public Object[][] alignmentWithExpectedInput()
60   {
61     return new Object[][] { {
62         new AlignViewport(createAlignment("AAAAAAAAAAAA", "AAAAAAAAAAAA",
63                 "AAAAAAAAAAAA")),
64         List.of("AAAAAAAAAAAA", "AAAAAAAAAAAA", "AAAAAAAAAAAA") },
65         { new AlignViewport(createAlignment("AAAA--NNNNAAAA",
66                 "AA--AANNNNAAAA", "AA--AARRRRAAAA")),
67             List.of("AAAA--NNNNAAAA", "AA--AANNNNAAAA", "AA--AARRRRAAAA") },
68         { new AlignViewport(createAlignment("AAAANNNNAAAA--",
69                 "AAAARRRRAAAA--", "AAAARRRRAAAA--")),
70             List.of("AAAANNNNAAAA--", "AAAARRRRAAAA--", "AAAARRRRAAAA--") },
71         { new AlignViewport(createAlignment("AAAA--NNNNAAAA",
72                 "AAAA--NNNNAAAA", "AAAA--NNNNAAAA")),
73             List.of("AAAA--NNNNAAAA", "AAAA--NNNNAAAA", "AAAA--NNNNAAAA") },
74         { new AlignViewport(createAlignment("AAAACCCCNNNN", "------------",
75                 "AAAADDDDNNNN")),
76             List.of("AAAACCCCNNNN", "AAAADDDDNNNN") },
77         { new AlignViewport(createAlignment("AAAACC--NNNN", "AAAACCDDNNNN"),
78                 apply(new HiddenColumns(), it -> it.hideColumns(6, 7))),
79             List.of("AAAACCNNNN", "AAAACCNNNN") },
80         { new AlignViewport(
81                 createAlignment("CCAAAACC--MMMM", "--AAAAGGGGMMMM"),
82                 apply(new HiddenColumns(), it -> {
83                   it.hideColumns(0, 1);
84                   it.hideColumns(8, 9);
85                 })),
86             List.of("AAAACCMMMM", "AAAAGGMMMM") },
87         { new AlignViewport(
88                 createAlignment("CCAAAACC--MMMM", "CCAAAACC--MMMM"),
89                 apply(new HiddenColumns(), it -> it.hideColumns(2, 5))),
90             List.of("CCCC--MMMM", "CCCC--MMMM") } };
91   }
92
93   public static AlignmentI createAlignment(String... sequences)
94   {
95     var seqArray = new Sequence[sequences.length];
96     for (int i = 0; i < sequences.length; i++)
97       seqArray[i] = new Sequence(format("Seq%d", i), sequences[i]);
98     return new Alignment(seqArray);
99   }
100
101   @Test(
102     groups =
103     { "Functional" },
104     dataProvider = "alignmentWithExpectedInput")
105   public void testPrepareJobs_checkInputSequences(AlignViewport viewport,
106           List<String> expectedInput) throws Exception
107   {
108     var task = new SecStructPredMsaTask(mockClient, List.of(),
109             Credentials.empty(), viewport);
110     var jobs = task.prepareJobs();
111     List<Matcher<? super SequenceI>> seqMatchers = new ArrayList<>(
112             expectedInput.size());
113     for (var seqStr : expectedInput)
114       seqMatchers.add(matchesSequenceString(seqStr));
115     assertThat(jobs.get(0).getInputSequences(),
116             Matchers.<SequenceI> contains(seqMatchers));
117   }
118
119   @DataProvider
120   public Object[][] viewportWithServiceOutput() throws IOException
121   {
122
123     return new Object[][] {
124       { 
125           new AlignViewport(new Alignment(new FastaFile(
126                   "examples/testdata/secstrpred/alignment0_aln.fa",
127                   DataSourceType.FILE).getSeqsAsArray())),
128           "examples/testdata/secstrpred/alignment0.fa",
129           "examples/testdata/secstrpred/alignment0.concise"
130       },
131       {
132         new AlignViewport(new Alignment(new FastaFile(
133                 "examples/testdata/secstrpred/alignment0a_aln.fa",
134                 DataSourceType.FILE).getSeqsAsArray()),
135                 apply(new HiddenColumns(), it -> it.hideColumns(3, 7))),
136         "examples/testdata/secstrpred/alignment0.fa",
137         "examples/testdata/secstrpred/alignment0.concise"
138       }
139     };
140   }
141   
142   @Test(groups = "Functional", dataProvider = "viewportWithServiceOutput")
143   public void testCollectResults(AlignViewport viewport, String alnFileName, String predFileName) throws Exception
144   {
145     var alnFile = new FastaFile(alnFileName, DataSourceType.FILE);
146     var predFile = new JPredFile(predFileName, DataSourceType.FILE);
147     when(mockClient.getPredictionFile(any())).thenReturn(predFile);
148     when(mockClient.getAlignmentFile(any())).thenReturn(alnFile);
149     
150     var task = new SecStructPredMsaTask(mockClient, List.of(),
151             Credentials.empty(), viewport);
152     task.init();
153     task.poll();
154     task.complete();
155     var resultAlignment = task.getResult();
156     var sequences = resultAlignment.getSequences();
157     
158     // Test output alignment matches original
159     {
160       List<Matcher<? super SequenceI>> matchers = new ArrayList<>();
161       for (var seq : viewport.getAlignment().getSequences())
162         matchers.add(matchesSequenceString(seq));
163       assertThat(sequences, Matchers.contains(matchers));
164     }
165     // Test output sequence names match original
166     {
167       List<Matcher<? super SequenceI>> matchers = new ArrayList<>();
168       for (var seq : viewport.getAlignment().getSequences())
169         matchers.add(hasProperty("name", equalTo(seq.getName())));
170       assertThat(sequences, Matchers.contains(matchers));
171     }
172     // Test hidden columns
173     {
174       var originalHidden = viewport.getAlignment().getHiddenColumns();
175       var resultHidden = resultAlignment.getHiddenColumns();
176       assertThat(resultHidden, equalTo(originalHidden));
177     }
178     // Test annotations present on the alignment
179     {
180       var hiddenColumns = viewport.getAlignment().getHiddenColumns();
181       List<Matcher<? super AlignmentAnnotation>> matchers = new ArrayList<>();
182       for (var annot : predFile.getAnnotations())
183         matchers.add(allOf(
184                 hasProperty("label", equalTo(annot.label)),
185                 hasProperty("annotations", matchesAnnotations(annot.annotations))
186         ));
187       List<AlignmentAnnotation> annotations = new ArrayList<>();
188       for (var annot : resultAlignment.getAlignmentAnnotation())
189         annotations.add(new AlignmentAnnotation(annot, hiddenColumns));
190       assertThat(annotations, containsInAnyOrder(matchers));
191     }
192     
193   }
194 }