package jalview.workers; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertFalse; import static org.testng.AssertJUnit.assertTrue; import jalview.api.AlignCalcManagerI; import jalview.api.AlignCalcWorkerI; import jalview.api.FeatureRenderer; import jalview.datamodel.Alignment; import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.AlignmentI; import jalview.datamodel.Annotation; import jalview.datamodel.Sequence; import jalview.datamodel.SequenceI; import jalview.gui.AlignFrame; import java.util.Collections; import java.util.List; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; public class AlignCalcManagerTest { private AlignFrame alignFrame; /** * Test the method that removes a worker associated with an annotation, * provided the worker is marked as 'deletable' (some workers should continue * to run even when their results are no longer displayed) */ @Test(groups = "Functional") public void testRemoveWorkerForAnnotation() { AlignCalcManagerI acm = alignFrame.getViewport().getCalcManager(); final AlignmentAnnotation ann1 = new AlignmentAnnotation("Ann1", "desc", new Annotation[] {}); final AlignmentAnnotation ann2 = new AlignmentAnnotation("Ann2", "desc", new Annotation[] {}); /* * make two workers for ann1, one deletable, one not * and no worker for ann2 */ AlignCalcWorkerI worker1 = makeWorker(ann1, true); AlignCalcWorkerI worker2 = makeWorker(ann1, false); /* * The new workers will get run each in their own thread. * We can't tell here whether they have finished, or not yet started. * They have to finish to be 'seen' by getRegisteredWorkersOfClass() * registerWorker adds to the 'restartable' list but * getRegisteredWorkers reads from the 'canUpdate' list * (which is only updated after a worker has run) - why? * So just give workers time to start and finish */ synchronized (this) { try { wait(100); } catch (InterruptedException e) { // } } List workers = acm .getRegisteredWorkersOfClass(worker1.getClass()); assertEquals(2, workers.size()); assertTrue(workers.contains(worker1)); assertTrue(workers.contains(worker2)); assertFalse(acm.isDisabled(worker1)); assertFalse(acm.isDisabled(worker2)); /* * remove workers for ann2 (there aren't any) */ acm.removeWorkerForAnnotation(ann2); assertTrue(acm.getRegisteredWorkersOfClass(worker1.getClass()) .contains(worker1)); assertTrue(acm.getRegisteredWorkersOfClass(worker1.getClass()) .contains(worker2)); assertFalse(acm.isDisabled(worker1)); assertFalse(acm.isDisabled(worker2)); /* * remove worker2 for ann1 * - should delete worker1 but not worker2 */ acm.removeWorkerForAnnotation(ann1); assertEquals(1, acm.getRegisteredWorkersOfClass(worker1.getClass()) .size()); assertTrue(acm.getRegisteredWorkersOfClass(worker1.getClass()) .contains(worker2)); assertFalse(acm.isDisabled(worker1)); assertFalse(acm.isDisabled(worker2)); } /** * Make a worker linked to the given annotation * * @param ann * @param deletable * @return */ AnnotationWorker makeWorker(final AlignmentAnnotation ann, final boolean deletable) { AnnotationProviderI annotationProvider = new AnnotationProviderI() { @Override public List calculateAnnotation(AlignmentI al, FeatureRenderer fr) { return Collections.singletonList(ann); } }; return new AnnotationWorker(alignFrame.getViewport(), alignFrame.alignPanel, annotationProvider) { @Override public boolean isDeletable() { return deletable; } @Override public boolean involves(AlignmentAnnotation ann1) { return ann == ann1; } }; } @BeforeMethod(alwaysRun = true) public void setUp() { AlignmentI al = new Alignment(new SequenceI[] { new Sequence("Seq1", "ABC") }); al.setDataset(null); alignFrame = new AlignFrame(al, 3, 1); } }