package jalview.structure; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertNotNull; import static org.testng.AssertJUnit.assertTrue; import jalview.datamodel.AlignedCodonFrame; import jalview.gui.AlignFrame; import jalview.gui.Desktop; import jalview.io.FileLoader; import jalview.io.FormatAdapter; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.Set; import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; public class StructureSelectionManagerTest { private StructureSelectionManager ssm; @BeforeClass(alwaysRun = true) public static void setUpBeforeClass() throws Exception { jalview.bin.Jalview.main(new String[] { "-props", "test/jalview/testProps.jvprops" }); } @BeforeMethod(alwaysRun = true) public void setUp() { ssm = new StructureSelectionManager(); } @Test(groups ={ "Functional" }) public void testRegisterMapping() { AlignedCodonFrame acf1 = new AlignedCodonFrame(); AlignedCodonFrame acf2 = new AlignedCodonFrame(); ssm.registerMapping(acf1); assertEquals(1, ssm.seqmappings.size()); assertTrue(ssm.seqmappings.contains(acf1)); ssm.registerMapping(acf2); assertEquals(2, ssm.seqmappings.size()); assertTrue(ssm.seqmappings.contains(acf1)); assertTrue(ssm.seqmappings.contains(acf2)); /* * Re-adding the first mapping does nothing */ ssm.registerMapping(acf1); assertEquals(2, ssm.seqmappings.size()); assertTrue(ssm.seqmappings.contains(acf1)); assertTrue(ssm.seqmappings.contains(acf2)); } @Test(groups ={ "Functional" }) public void testRegisterMappings() { AlignedCodonFrame acf1 = new AlignedCodonFrame(); AlignedCodonFrame acf2 = new AlignedCodonFrame(); AlignedCodonFrame acf3 = new AlignedCodonFrame(); Set set1 = new HashSet(); set1.add(acf1); set1.add(acf2); Set set2 = new HashSet(); set2.add(acf2); set2.add(acf3); /* * Add both sets twice; each mapping should be added once only */ ssm.registerMappings(set1); ssm.registerMappings(set1); ssm.registerMappings(set2); ssm.registerMappings(set2); assertEquals(3, ssm.seqmappings.size()); assertTrue(ssm.seqmappings.contains(acf1)); assertTrue(ssm.seqmappings.contains(acf2)); assertTrue(ssm.seqmappings.contains(acf3)); } /** * Test that a mapping is not deregistered if an alignment holds a reference * to it */ @Test(groups ={ "Functional" }) public void testDeregisterMapping_withAlignmentReference() { Desktop d = Desktop.instance; assertNotNull(d); /* * alignment with reference to mappings */ AlignFrame af1 = new FileLoader().LoadFileWaitTillLoaded( ">Seq1\nCAGT\n", FormatAdapter.PASTE); AlignedCodonFrame acf1 = new AlignedCodonFrame(); AlignedCodonFrame acf2 = new AlignedCodonFrame(); Set mappings = new LinkedHashSet(); mappings.add(acf1); mappings.add(acf2); af1.getViewport().getAlignment().setCodonFrames(mappings); /* * Add one and remove it. */ ssm.registerMapping(acf1); ssm.deregisterMapping(acf1); assertEquals(1, ssm.seqmappings.size()); assertTrue(ssm.seqmappings.contains(acf1)); } /** * Test that a mapping is deregistered if no alignment holds a reference to it */ @Test(groups ={ "Functional" }) public void testDeregisterMapping_withNoReference() { Desktop d = Desktop.instance; assertNotNull(d); /* * alignment with reference to mappings */ AlignFrame af1 = new FileLoader().LoadFileWaitTillLoaded( ">Seq1\nCAGT\n", FormatAdapter.PASTE); AlignedCodonFrame acf1 = new AlignedCodonFrame(); AlignedCodonFrame acf2 = new AlignedCodonFrame(); Set mappings = new LinkedHashSet(); mappings.add(acf2); af1.getViewport().getAlignment().setCodonFrames(mappings); /* * Add one and remove it. */ ssm.registerMapping(acf1); assertEquals(1, ssm.seqmappings.size()); assertTrue(ssm.seqmappings.contains(acf1)); ssm.deregisterMapping(acf1); assertEquals(0, ssm.seqmappings.size()); } /** * Test that a mapping is not deregistered when a second view is closed but * the first still holds a reference to the mapping */ @Test(groups ={ "Functional" }) public void testDeregisterMapping_onCloseView() { /* * alignment with reference to mappings */ AlignFrame af1 = new FileLoader().LoadFileWaitTillLoaded( ">Seq1\nCAGT\n", FormatAdapter.PASTE); AlignedCodonFrame acf1 = new AlignedCodonFrame(); AlignedCodonFrame acf2 = new AlignedCodonFrame(); Set mappings = new LinkedHashSet(); mappings.add(acf1); mappings.add(acf2); af1.getViewport().getAlignment().setCodonFrames(mappings); af1.newView_actionPerformed(null); /* * Verify that creating the alignment for the new View has registered the * mappings */ ssm = StructureSelectionManager .getStructureSelectionManager(Desktop.instance); assertEquals(2, ssm.seqmappings.size()); assertTrue(ssm.seqmappings.contains(acf1)); assertTrue(ssm.seqmappings.contains(acf2)); /* * Close the second view. Verify that mappings are not removed as the first * view still holds a reference to them. */ af1.closeMenuItem_actionPerformed(false); assertEquals(2, ssm.seqmappings.size()); assertTrue(ssm.seqmappings.contains(acf1)); assertTrue(ssm.seqmappings.contains(acf2)); } }