Clover icon

Coverage Report

  1. Project Clover database Thu Dec 4 2025 16:11:35 GMT
  2. Package jalview.workers

File AlignCaclManager2Test.java

 

Code metrics

8
159
31
2
377
325
38
0.24
5.13
15.5
1.23

Classes

Class Line # Actions
AlignCaclManager2Test 27 142 21
1.0100%
AlignCalcWorkerMock 300 17 17
0.8285714482.9%
 

Contributing tests

This file is covered by 17 tests. .

Source view

1    package jalview.workers;
2   
3    import static org.testng.Assert.*;
4   
5    import java.util.ArrayList;
6    import java.util.concurrent.CancellationException;
7    import java.util.concurrent.CompletableFuture;
8    import java.util.concurrent.ExecutionException;
9    import java.util.concurrent.Future;
10    import org.testng.annotations.AfterMethod;
11    import org.testng.annotations.BeforeClass;
12    import org.testng.annotations.BeforeMethod;
13    import org.testng.annotations.Test;
14   
15    import jalview.api.AlignCalcManagerI2;
16    import jalview.api.AlignCalcWorkerI;
17    import jalview.datamodel.Alignment;
18    import jalview.datamodel.AlignmentAnnotation;
19    import jalview.datamodel.AlignmentI;
20    import jalview.datamodel.Annotation;
21    import jalview.datamodel.Sequence;
22    import jalview.datamodel.SequenceI;
23    import jalview.gui.AlignFrame;
24    import jalview.gui.JvOptionPane;
25   
26    @Test(singleThreaded = true)
 
27    public class AlignCaclManager2Test
28    {
29    AlignFrame alignFrame;
30   
31    AlignCalcManagerI2 calcManager;
32   
 
33  1 toggle @BeforeClass(alwaysRun = true)
34    public void setUpClass()
35    {
36  1 JvOptionPane.setInteractiveMode(false);
37  1 JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
38    }
39   
 
40  17 toggle @BeforeMethod(alwaysRun = true)
41    public void setUp()
42    {
43  17 AlignmentI al = new Alignment(
44    new SequenceI[] { new Sequence("Seq1", "ABC") });
45  17 al.setDataset(null);
46  17 alignFrame = new AlignFrame(al, 3, 1);
47  17 calcManager = alignFrame.getViewport().getCalcManager();
48    }
49   
 
50  17 toggle @AfterMethod(alwaysRun = true)
51    public void tearDown()
52    {
53  17 calcManager.shutdown();
54    }
55   
56    // Running workers
57   
 
58  1 toggle @Test(groups = "Functional")
59    public void testStartRegisteredWorker() throws InterruptedException
60    {
61  1 var sentinel = new Object();
62  1 var job = CompletableFuture.completedFuture(sentinel);
63  1 var worker = new AlignCalcWorkerMock(job);
64  1 calcManager.registerWorker(worker);
65  1 Thread.sleep(10);
66  1 assertSame(worker.getLastResult(), sentinel);
67    }
68   
 
69  1 toggle @Test(groups = "Functional")
70    public void testIsWorking() throws InterruptedException
71    {
72  1 var job = new CompletableFuture<Object>();
73  1 var worker = new AlignCalcWorkerMock(job);
74  1 calcManager.registerWorker(worker);
75  1 assertTrue(calcManager.isWorking(worker));
76  1 assertTrue(calcManager.isWorking());
77  1 job.complete(null);
78  1 Thread.sleep(10);
79  1 assertFalse(calcManager.isWorking(worker));
80  1 assertFalse(calcManager.isWorking());
81    }
82   
 
83  1 toggle @Test(groups = "Functional")
84    public void testIsWorkingWithAnnotation() throws InterruptedException
85    {
86  1 var job = new CompletableFuture<Void>();
87  1 var worker1 = new AlignCalcWorkerMock(job);
88  1 var annot = worker1.annotation = newAlignmentAnnotation();
89  1 var otherAnnot = newAlignmentAnnotation();
90  1 calcManager.registerWorker(worker1);
91  1 assertTrue(calcManager.isWorkingWithAnnotation(annot));
92  1 assertFalse(calcManager.isWorkingWithAnnotation(otherAnnot));
93  1 job.complete(null);
94  1 Thread.sleep(10);
95  1 assertFalse(calcManager.isWorkingWithAnnotation(annot));
96    }
97   
 
98  1 toggle @Test(groups = "Functional")
99    public void testRestartCompletedWorkers() throws Throwable
100    {
101  1 var sentinel1 = new Object();
102  1 var sentinel2 = new Object();
103  1 var job = CompletableFuture.completedFuture(sentinel1);
104  1 var worker = new AlignCalcWorkerMock(job);
105  1 calcManager.registerWorker(worker);
106  1 Thread.sleep(10);
107  1 assertSame(worker.getLastResult(), sentinel1);
108  1 job.obtrudeValue(sentinel2);
109  1 calcManager.restartWorkers();
110  1 Thread.sleep(10);
111  1 assertSame(worker.getLastResult(), sentinel2);
112    }
113   
 
114  1 toggle @Test(groups = "Functional")
115    public void testRestartCancelsWorkers() throws Throwable
116    {
117  1 var job = new CompletableFuture<Object>();
118  1 var worker = new AlignCalcWorkerMock(job);
119  1 var sentinel = new Object();
120  1 calcManager.registerWorker(worker);
121  1 Thread.sleep(10);
122  1 calcManager.restartWorkers();
123  1 Thread.sleep(10);
124  1 assertTrue(worker.wasCancelled());
125  1 job.obtrudeValue(sentinel);
126  1 Thread.sleep(10);
127  1 assertSame(worker.getLastResult(), sentinel);
128    }
129   
130    // Disabling workers
131   
 
132  1 toggle @Test(groups = "Functional")
133    public void testDisableWorker()
134    {
135  1 var worker = new AlignCalcWorkerMock(null);
136  1 calcManager.registerWorker(worker);
137  1 calcManager.disableWorker(worker);
138  1 assertTrue(calcManager.isDisabled(worker));
139  1 calcManager.enableWorker(worker);
140  1 assertFalse(calcManager.isDisabled(worker));
141    }
142   
 
143  1 toggle @Test(groups = "Functional")
144    public void testRestartDisabledWorker() throws InterruptedException
145    {
146  1 var worker = new AlignCalcWorkerMock(null);
147  1 calcManager.registerWorker(worker);
148  1 Thread.sleep(10);
149  1 assertEquals(worker.getCallCount(), 1);
150  1 calcManager.disableWorker(worker);
151  1 calcManager.restartWorkers();
152  1 Thread.sleep(10);
153  1 assertEquals(worker.getCallCount(), 1);
154  1 calcManager.enableWorker(worker);
155  1 calcManager.restartWorkers();
156  1 Thread.sleep(10);
157  1 assertEquals(worker.getCallCount(), 2);
158    }
159   
160    // Canceling workers
161   
 
162  1 toggle @Test(groups = "Functional")
163    public void testCancelWorker() throws InterruptedException
164    {
165  1 var worker = new AlignCalcWorkerMock(new CompletableFuture<>());
166  1 calcManager.registerWorker(worker);
167  1 Thread.sleep(10);
168  1 calcManager.cancelWorker(worker);
169  1 Thread.sleep(10);
170  1 assertTrue(worker.wasCancelled());
171    }
172   
173    // One-shot workers
174   
 
175  1 toggle @Test(groups = "Functional")
176    public void testStartOneShotWorker() throws InterruptedException
177    {
178  1 var job = CompletableFuture.completedFuture("result");
179  1 var worker = new AlignCalcWorkerMock(job);
180  1 calcManager.startWorker(worker);
181  1 Thread.sleep(10);
182  1 assertEquals(worker.getLastResult(), "result");
183    }
184   
 
185  1 toggle @Test(groups = "Functional")
186    public void testCancelOneShotWorker() throws InterruptedException
187    {
188  1 var worker = new AlignCalcWorkerMock(new CompletableFuture<>());
189  1 calcManager.startWorker(worker);
190  1 Thread.sleep(10);
191  1 calcManager.cancelWorker(worker);
192  1 Thread.sleep(10);
193  1 assertTrue(worker.wasCancelled());
194    }
195   
 
196  1 toggle @Test(groups = "Functional")
197    public void restartOneShotWorker() throws InterruptedException
198    {
199  1 var job = CompletableFuture.completedFuture("result1");
200  1 var worker = new AlignCalcWorkerMock(job);
201  1 calcManager.startWorker(worker);
202  1 Thread.sleep(10);
203  1 job.obtrudeValue("result2");
204  1 calcManager.restartWorkers();
205  1 Thread.sleep(10);
206   
207    }
208   
209   
210    // Retrieving workers
211   
 
212  1 toggle @Test(groups = "Functional")
213    public void testGetWorkersOfClass() throws InterruptedException
214    {
215  1 var worker1 = new AlignCalcWorkerMock(null);
216  1 var worker2 = new AlignCalcWorkerMock(null);
217  1 var worker3 = new AlignCalcWorkerMock(null) {};
218  1 calcManager.registerWorker(worker1);
219  1 calcManager.registerWorker(worker2);
220  1 calcManager.registerWorker(worker3);
221  1 final var workers = calcManager
222    .getWorkersOfClass(AlignCalcWorkerMock.class);
223  1 assertTrue(workers.contains(worker1) && workers.contains(worker2));
224  1 assertFalse(workers.contains(worker3));
225    }
226   
227    // Removing workers
228   
 
229  1 toggle @Test(groups = "Functional")
230    public void testRemoveWorker()
231    {
232  1 var worker = new AlignCalcWorkerMock(null);
233  1 calcManager.registerWorker(worker);
234  1 calcManager.removeWorker(worker);
235  1 assertFalse(calcManager.getWorkers().contains(worker));
236    }
237   
 
238  1 toggle @Test(groups = "Functional")
239    public void testRemoveWorkersOfClass()
240    {
241  1 var worker1 = new AlignCalcWorkerMock(null);
242  1 var worker2 = new AlignCalcWorkerMock(null);
243  1 var worker3 = new AlignCalcWorkerMock(null) {};
244  1 calcManager.registerWorker(worker1);
245  1 calcManager.registerWorker(worker2);
246  1 calcManager.registerWorker(worker3);
247  1 calcManager.removeWorkersOfClass(worker1.getClass());
248  1 assertFalse(calcManager.getWorkers().contains(worker1)
249    || calcManager.getWorkers().contains(worker2));
250  1 assertTrue(calcManager.getWorkers().contains(worker3));
251    }
252   
 
253  1 toggle @Test(groups = "Functional")
254    public void testRemoveWorkersForAnnotation()
255    {
256  1 var worker1 = new AlignCalcWorkerMock(null);
257  1 var worker2 = new AlignCalcWorkerMock(null);
258  1 var annot = worker1.annotation = newAlignmentAnnotation();
259  1 calcManager.registerWorker(worker1);
260  1 calcManager.registerWorker(worker2);
261  1 calcManager.removeWorkerForAnnotation(annot);
262  1 var workers = calcManager.getWorkers();
263  1 assertFalse(workers.contains(worker1));
264  1 assertTrue(workers.contains(worker2));
265    }
266   
 
267  1 toggle @Test(groups = "Functional")
268    public void testRemoveNonRemovableWorker()
269    {
270  1 var worker = new AlignCalcWorkerMock(null);
271  1 worker.deletable = false;
272  1 calcManager.registerWorker(worker);
273  1 calcManager.removeWorker(worker);
274  1 assertTrue(calcManager.getWorkers().contains(worker));
275    }
276   
 
277  1 toggle @Test(groups = "Functional")
278    public void testRemoveNonRemovableWorkersOfClass()
279    {
280  1 var worker1 = new AlignCalcWorkerMock(null);
281  1 var worker2 = new AlignCalcWorkerMock(null);
282  1 worker2.deletable = false;
283  1 calcManager.registerWorker(worker1);
284  1 calcManager.registerWorker(worker2);
285  1 calcManager.removeWorkersOfClass(worker1.getClass());
286  1 var workers = calcManager.getWorkers();
287  1 assertFalse(workers.contains(worker1));
288  1 assertTrue(workers.contains(worker2));
289    }
290   
291    private int annotationCount = 0;
292   
 
293  3 toggle private AlignmentAnnotation newAlignmentAnnotation()
294    {
295  3 return new AlignmentAnnotation("Ann" + annotationCount++, "description",
296    new Annotation[] {});
297    }
298    }
299   
 
300    class AlignCalcWorkerMock implements AlignCalcWorkerI
301    {
302    AlignmentAnnotation annotation = null;
303    Future<?> job;
304    ArrayList<Object> values = new ArrayList<>();
305    int callCount = 0;
306    boolean deletable = true;
307   
 
308  23 toggle AlignCalcWorkerMock(Future<?> job)
309    {
310  23 this.job = job;
311    }
312   
 
313  8 toggle public Object getLastResult()
314    {
315  8 return values.isEmpty() ? null : values.get(values.size() - 1);
316    }
317   
 
318  3 toggle public Throwable getException()
319    {
320  3 var result = getLastResult();
321  3 return (result instanceof Throwable) ? (Throwable) result : null;
322    }
323   
 
324  3 toggle public int getCallCount() {
325  3 return callCount;
326    }
327   
 
328  3 toggle public boolean wasCancelled()
329    {
330  3 return getException() instanceof InterruptedException;
331    }
332   
 
333  7 toggle @Override
334    public boolean involves(AlignmentAnnotation annot)
335    {
336  7 if (annotation == null)
337  1 return false;
338    else
339  6 return annot == annotation;
340    }
341   
 
342  0 toggle @Override
343    public void updateAnnotation()
344    {
345    }
346   
 
347  0 toggle @Override
348    public void removeAnnotation()
349    {
350    }
351   
 
352  16 toggle @Override
353    public void run() throws Throwable
354    {
355  16 callCount++;
356  16 if (job != null)
357    {
358  11 try
359    {
360  11 values.add(job.get());
361    }
362  3 catch (InterruptedException e) { values.add(e); }
363    catch (CancellationException e) {
364  0 values.add(new InterruptedException());
365    } catch (ExecutionException e)
366    {
367  0 values.add(e.getCause());
368    }
369    }
370    }
371   
 
372  7 toggle @Override
373    public boolean isDeletable()
374    {
375  7 return deletable;
376    }
377    }