2f9cc3b78b45fc25573cb1fbea9a57655524800e
[jalview.git] / test / jalview / ws2 / actions / secstructpred / SecStructPredPDBSearchTaskTest.java
1 package jalview.ws2.actions.secstructpred;
2
3 import static org.hamcrest.MatcherAssert.assertThat;
4 import static org.hamcrest.Matchers.contains;
5
6 import java.io.IOException;
7 import java.util.List;
8
9 import static org.mockito.Mockito.mock;
10 import static org.mockito.Mockito.when;
11 import static org.mockito.ArgumentMatchers.any;
12 import static jalview.testutils.ScopeFunctions.apply;
13 import static jalview.testutils.Matchers.matchesSequenceString;
14
15 import jalview.io.DataSourceType;
16 import jalview.io.FastaFile;
17 import jalview.io.JPredFile;
18 import org.testng.annotations.BeforeMethod;
19 import org.testng.annotations.DataProvider;
20 import org.testng.annotations.Test;
21
22 import jalview.datamodel.Alignment;
23 import jalview.datamodel.AlignmentI;
24 import jalview.datamodel.HiddenColumns;
25 import jalview.datamodel.Sequence;
26 import jalview.gui.AlignViewport;
27 import jalview.ws2.actions.ServiceInputInvalidException;
28 import jalview.ws2.api.Credentials;
29 import jalview.ws2.client.api.SecStructPredWebServiceClientI;
30 import static java.lang.String.format;
31
32 public class SecStructPredPDBSearchTaskTest
33 {
34   protected SecStructPredWebServiceClientI mockClient;
35
36   @BeforeMethod(alwaysRun = true)
37   public void setupMockClient() throws IOException
38   {
39     mockClient = mock(SecStructPredWebServiceClientI.class);
40     when(mockClient.getUrl()).thenReturn("http://example.org");
41     when(mockClient.getClientName()).thenReturn("mock");
42     when(mockClient.getLog(any())).thenReturn("");
43     when(mockClient.getErrorLog(any())).thenReturn("");
44   }
45
46   @DataProvider
47   public Object[][] viewportAndExpectedInputSeq()
48   {
49     return new Object[][] {
50         { new AlignViewport(createAlignment("AAAAAAAAAAAAAAAAAAAA")),
51             "AAAAAAAAAAAAAAAAAAAA", },
52         { new AlignViewport(createAlignment("--AAGGAGAG-AGGA----MMMMMMMM")),
53             "AAGGAGAGAGGAMMMMMMMM" },
54         { new AlignViewport(createAlignment("AAAANNNCCCCCCCCCCAAAAAA"),
55                 apply(new HiddenColumns(), it -> it.hideColumns(4, 6))),
56             "AAAACCCCCCCCCCAAAAAA" },
57         { new AlignViewport(
58                 createAlignment("NNNNGGGGVVVVVAAAAAAACCMMMMMMMM"),
59                 apply(new HiddenColumns(), it -> {
60                   it.hideColumns(4, 7);
61                   it.hideColumns(20, 21);
62                 })),
63             "NNNNVVVVVAAAAAAAMMMMMMMM" } };
64   }
65
66   public static AlignmentI createAlignment(String... sequences)
67   {
68     var seqArray = new Sequence[sequences.length];
69     for (int i = 0; i < sequences.length; i++)
70       seqArray[i] = new Sequence(format("Seq%d", i), sequences[i]);
71     return new Alignment(seqArray);
72   }
73
74   @Test(
75     groups = { "Functional" },
76     dataProvider = "viewportAndExpectedInputSeq")
77   public void testPrepareJobs_checkInputSequences(AlignViewport viewport,
78           String expectedSeq) throws Exception
79   {
80     var task = new SecStructPredPDBSearchTask(mockClient, List.of(),
81             Credentials.empty(), viewport);
82     var jobs = task.prepareJobs();
83     assertThat(jobs.get(0).getInputSequences(),
84             contains(matchesSequenceString(expectedSeq)));
85   }
86
87   @DataProvider
88   public Object[][] viewportWithTooShortSequence()
89   {
90     return new Object[][] { { new AlignViewport(createAlignment("")) },
91         { new AlignViewport(createAlignment("A")) },
92         { new AlignViewport(createAlignment("AAAAAAAAAAAAAAAAAAA")) },
93         { new AlignViewport(createAlignment("AAAAACCCCCAAAAA-----CC")) },
94         { new AlignViewport(createAlignment("-------------------------")) },
95         { new AlignViewport(createAlignment("AAAAAAAAAAAAAAAAAAAAAAAAA"),
96                 apply(new HiddenColumns(), it -> it.hideColumns(0, 24))) },
97         { new AlignViewport(createAlignment("AAAAACCCCCAAAAACCCCCAAAAA"),
98                 apply(new HiddenColumns(), it -> it.hideColumns(0, 10))) } };
99   }
100
101   @Test(
102     groups = { "Functional" },
103     dataProvider = "viewportWithTooShortSequence",
104     expectedExceptions = ServiceInputInvalidException.class)
105   public void testPrepareJobs_SequenceTooShort_InputInvalidException(
106           AlignViewport viewport) throws ServiceInputInvalidException
107   {
108     var task = new SecStructPredPDBSearchTask(mockClient, List.of(),
109             Credentials.empty(), viewport);
110     task.prepareJobs();
111   }
112
113   @DataProvider
114   public Object[][] collectResultDataset() throws IOException
115   {
116     return new Object[][] {
117         {
118             new AlignViewport(new Alignment(new FastaFile(
119                 "examples/testdata/secstrpred/sequence0_input.fa",
120                 DataSourceType.FILE).getSeqsAsArray()
121             )),
122             "examples/testdata/secstrpred/sequence0.align",
123             "examples/testdata/secstrpred/sequence0.concise"
124         },
125     };
126   }
127
128   @Test(
129       groups = { "Functional" }
130   )
131   public void testCollectResult(AlignViewport viewport, String alnFileName, String predFileName) throws Exception
132   {
133     var alnFile = new FastaFile(alnFileName, DataSourceType.FILE);
134     var predFile = new JPredFile(predFileName, DataSourceType.FILE);
135   }
136 }