/* * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) * Copyright (C) $$Year-Rel$$ The Jalview Authors * * This file is part of Jalview. * * Jalview is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation, either version 3 * of the License, or (at your option) any later version. * * Jalview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Jalview. If not, see . * The Jalview Authors are detailed in the 'AUTHORS' file. */ 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 jalview.gui.JvOptionPane; import java.util.Collections; import java.util.List; import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; public class AlignCalcManagerTest { @BeforeClass(alwaysRun = true) public void setUpJvOptionPane() { JvOptionPane.setInteractiveMode(false); JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION); } 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); } }