Clover icon

Coverage Report

  1. Project Clover database Tue Mar 10 2026 14:58:44 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
0.00%
AlignCalcWorkerMock 300 17 17
0.00%
 

Contributing tests

No tests hitting this source file were found.

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