1 package jalview.ws2.actions.secstructpred;
3 import static org.hamcrest.MatcherAssert.assertThat;
4 import static org.hamcrest.Matchers.contains;
5 import static org.hamcrest.Matchers.equalTo;
7 import java.io.IOException;
8 import java.util.ArrayList;
11 import static org.mockito.Mockito.mock;
12 import static org.mockito.Mockito.when;
13 import static org.mockito.ArgumentMatchers.any;
14 import static jalview.testutils.ScopeFunctions.apply;
15 import static jalview.testutils.Matchers.matchesSequenceString;
17 import jalview.io.DataSourceType;
18 import jalview.io.FastaFile;
19 import jalview.io.JPredFile;
21 import org.hamcrest.Matcher;
22 import org.hamcrest.Matchers;
23 import org.testng.annotations.BeforeMethod;
24 import org.testng.annotations.DataProvider;
25 import org.testng.annotations.Test;
27 import jalview.datamodel.Alignment;
28 import jalview.datamodel.AlignmentI;
29 import jalview.datamodel.HiddenColumns;
30 import jalview.datamodel.Sequence;
31 import jalview.datamodel.SequenceI;
32 import jalview.gui.AlignViewport;
33 import jalview.ws2.actions.ServiceInputInvalidException;
34 import jalview.ws2.api.Credentials;
35 import jalview.ws2.api.JobStatus;
36 import jalview.ws2.api.WebServiceJobHandle;
37 import jalview.ws2.client.api.SecStructPredWebServiceClientI;
38 import static java.lang.String.format;
40 public class SecStructPredPDBSearchTaskTest
42 protected SecStructPredWebServiceClientI mockClient;
44 @BeforeMethod(alwaysRun = true)
45 public void setupMockClient() throws IOException
47 mockClient = mock(SecStructPredWebServiceClientI.class);
48 when(mockClient.getUrl()).thenReturn("http://example.org");
49 when(mockClient.getClientName()).thenReturn("mock");
50 when(mockClient.getLog(any())).thenReturn("");
51 when(mockClient.getErrorLog(any())).thenReturn("");
55 public Object[][] viewportAndExpectedInputSeq()
57 return new Object[][] {
58 { new AlignViewport(createAlignment("AAAAAAAAAAAAAAAAAAAA")),
59 "AAAAAAAAAAAAAAAAAAAA", },
60 { new AlignViewport(createAlignment("--AAGGAGAG-AGGA----MMMMMMMM")),
61 "AAGGAGAGAGGAMMMMMMMM" },
62 { new AlignViewport(createAlignment("AAAANNNCCCCCCCCCCAAAAAA"),
63 apply(new HiddenColumns(), it -> it.hideColumns(4, 6))),
64 "AAAACCCCCCCCCCAAAAAA" },
66 createAlignment("NNNNGGGGVVVVVAAAAAAACCMMMMMMMM"),
67 apply(new HiddenColumns(), it -> {
69 it.hideColumns(20, 21);
71 "NNNNVVVVVAAAAAAAMMMMMMMM" } };
74 public static AlignmentI createAlignment(String... sequences)
76 var seqArray = new Sequence[sequences.length];
77 for (int i = 0; i < sequences.length; i++)
78 seqArray[i] = new Sequence(format("Seq%d", i), sequences[i]);
79 return new Alignment(seqArray);
83 groups = { "Functional" },
84 dataProvider = "viewportAndExpectedInputSeq")
85 public void testPrepareJobs_checkInputSequences(AlignViewport viewport,
86 String expectedSeq) throws Exception
88 var task = new SecStructPredPDBSearchTask(mockClient, List.of(),
89 Credentials.empty(), viewport);
90 var jobs = task.prepareJobs();
91 assertThat(jobs.get(0).getInputSequences(),
92 contains(matchesSequenceString(expectedSeq)));
96 public Object[][] viewportWithTooShortSequence()
98 return new Object[][] {
99 { new AlignViewport(createAlignment("")) },
100 { new AlignViewport(createAlignment("A")) },
101 { new AlignViewport(createAlignment("AAAAAAAAAAAAAAAAAAA")) },
102 { new AlignViewport(createAlignment("AAAAACCCCCAAAAA-----CC")) },
103 { new AlignViewport(createAlignment("-------------------------")) },
104 { new AlignViewport(createAlignment("AAAAAAAAAAAAAAAAAAAAAAAAA"),
105 apply(new HiddenColumns(), it -> it.hideColumns(0, 24))) },
106 { new AlignViewport(createAlignment("AAAAACCCCCAAAAACCCCCAAAAA"),
107 apply(new HiddenColumns(), it -> it.hideColumns(0, 10))) } };
111 groups = { "Functional" },
112 dataProvider = "viewportWithTooShortSequence",
113 expectedExceptions = ServiceInputInvalidException.class)
114 public void testPrepareJobs_SequenceTooShort_InputInvalidException(
115 AlignViewport viewport) throws ServiceInputInvalidException
117 var task = new SecStructPredPDBSearchTask(mockClient, List.of(),
118 Credentials.empty(), viewport);
123 public Object[][] collectResultDataset() throws IOException
125 return new Object[][] {
127 new AlignViewport(new Alignment(new FastaFile(
128 "examples/testdata/secstrpred/sequence0_input.fa",
129 DataSourceType.FILE).getSeqsAsArray()
131 "examples/testdata/secstrpred/sequence0.align",
132 "examples/testdata/secstrpred/sequence0.concise"
137 @Test(groups = { "Functional" }, dataProvider = "collectResultDataset")
138 public void testCollectResult(AlignViewport viewport, String alnFileName,
139 String predFileName) throws Exception
141 var alnFile = new FastaFile(alnFileName, DataSourceType.FILE);
142 var predFile = new JPredFile(predFileName, DataSourceType.FILE);
143 when(mockClient.getPredictionFile(any())).thenReturn(predFile);
144 when(mockClient.getAlignmentFile(any())).thenReturn(alnFile);
145 when(mockClient.getStatus(any())).thenReturn(JobStatus.COMPLETED);
146 when(mockClient.submit(any(), any(), any()))
147 .thenReturn(new WebServiceJobHandle("mock", "mock",
148 "http://example.org", "0"));
150 var task = new SecStructPredPDBSearchTask(mockClient, List.of(),
151 Credentials.empty(), viewport);
155 var resultAlignment = task.getResult();
156 var sequences = resultAlignment.getSequences();
159 List<Matcher<? super SequenceI>> matchers = new ArrayList<>();
160 for (var seq : alnFile.getSeqs())
161 matchers.add(matchesSequenceString(seq));
162 assertThat(sequences, Matchers.contains(matchers));
166 var originalHidden = viewport.getAlignment().getHiddenColumns();
167 var resultHidden = resultAlignment.getHiddenColumns();
168 assertThat(resultHidden, equalTo(originalHidden));