/* * Jalview - A Sequence Alignment Editor and Viewer (Version 2.9) * Copyright (C) 2015 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.gui; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertFalse; import static org.testng.AssertJUnit.assertNotNull; import static org.testng.AssertJUnit.assertSame; import static org.testng.AssertJUnit.assertTrue; import jalview.datamodel.AlignedCodonFrame; import jalview.datamodel.Alignment; import jalview.datamodel.AlignmentI; import jalview.datamodel.PDBEntry; import jalview.datamodel.PDBEntry.Type; import jalview.datamodel.Sequence; import jalview.datamodel.SequenceI; import jalview.io.FileLoader; import jalview.io.FormatAdapter; import jalview.structure.StructureSelectionManager; 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 AlignViewportTest { AlignmentI al; AlignViewport testee; @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() { SequenceI seq1 = new Sequence("Seq1", "ABC"); SequenceI seq2 = new Sequence("Seq2", "ABC"); SequenceI seq3 = new Sequence("Seq3", "ABC"); SequenceI[] seqs = new SequenceI[] { seq1, seq2, seq3 }; al = new Alignment(seqs); al.setDataset(null); testee = new AlignViewport(al); } @Test(groups = { "Functional" }) public void testCollateForPdb() { /* * Set up sequence pdb ids */ PDBEntry pdb1 = new PDBEntry("1ABC", "A", Type.PDB, "1ABC.pdb"); PDBEntry pdb2 = new PDBEntry("2ABC", "A", Type.PDB, "2ABC.pdb"); PDBEntry pdb3 = new PDBEntry("3ABC", "A", Type.PDB, "3ABC.pdb"); /* * seq1 and seq3 refer to 1ABC, seq2 to 2ABC, none to 3ABC */ al.getSequenceAt(0).getDatasetSequence() .addPDBId(new PDBEntry("1ABC", "B", Type.PDB, "1ABC.pdb")); al.getSequenceAt(2).getDatasetSequence() .addPDBId(new PDBEntry("1ABC", "B", Type.PDB, "1ABC.pdb")); al.getSequenceAt(1).getDatasetSequence() .addPDBId(new PDBEntry("2ABC", "C", Type.PDB, "2ABC.pdb")); /* * Add a second chain PDB xref to Seq2 - should not result in a duplicate in * the results */ al.getSequenceAt(1).getDatasetSequence() .addPDBId(new PDBEntry("2ABC", "D", Type.PDB, "2ABC.pdb")); /* * Seq3 refers to 3abc - this does not match 3ABC (as the code stands) */ al.getSequenceAt(2).getDatasetSequence() .addPDBId(new PDBEntry("3abc", "D", Type.PDB, "3ABC.pdb")); /* * run method under test */ SequenceI[][] seqs = testee.collateForPDB(new PDBEntry[] { pdb1, pdb2, pdb3 }); // seq1 and seq3 refer to PDBEntry[0] assertEquals(2, seqs[0].length); assertSame(al.getSequenceAt(0), seqs[0][0]); assertSame(al.getSequenceAt(2), seqs[0][1]); // seq2 refers to PDBEntry[1] assertEquals(1, seqs[1].length); assertSame(al.getSequenceAt(1), seqs[1][0]); // no sequence refers to PDBEntry[2] assertEquals(0, seqs[2].length); } /** * 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 */ StructureSelectionManager 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)); } /** * 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); StructureSelectionManager ssm = StructureSelectionManager .getStructureSelectionManager(Desktop.instance); ssm.resetAll(); AlignFrame af1 = new FileLoader().LoadFileWaitTillLoaded( ">Seq1\nRSVQ\n", FormatAdapter.PASTE); AlignFrame af2 = new FileLoader().LoadFileWaitTillLoaded( ">Seq2\nDGEL\n", FormatAdapter.PASTE); AlignedCodonFrame acf1 = new AlignedCodonFrame(); AlignedCodonFrame acf2 = new AlignedCodonFrame(); AlignedCodonFrame acf3 = new AlignedCodonFrame(); Set mappings1 = new LinkedHashSet(); mappings1.add(acf1); af1.getViewport().getAlignment().setCodonFrames(mappings1); Set mappings2 = new LinkedHashSet(); mappings2.add(acf2); mappings2.add(acf3); af2.getViewport().getAlignment().setCodonFrames(mappings2); /* * AlignFrame1 has mapping acf1, AlignFrame2 has acf2 and acf3 */ Set ssmMappings = ssm.seqmappings; assertEquals(0, ssmMappings.size()); ssm.registerMapping(acf1); assertEquals(1, ssmMappings.size()); ssm.registerMapping(acf2); assertEquals(2, ssmMappings.size()); ssm.registerMapping(acf3); assertEquals(3, ssmMappings.size()); /* * Closing AlignFrame2 should remove its mappings from * StructureSelectionManager, since AlignFrame1 has no reference to them */ af2.closeMenuItem_actionPerformed(true); assertEquals(1, ssmMappings.size()); assertTrue(ssmMappings.contains(acf1)); } /** * Test that a mapping is not deregistered if another alignment holds a * reference to it */ @Test(groups = { "Functional" }) public void testDeregisterMapping_withReference() { Desktop d = Desktop.instance; assertNotNull(d); StructureSelectionManager ssm = StructureSelectionManager .getStructureSelectionManager(Desktop.instance); ssm.resetAll(); AlignFrame af1 = new FileLoader().LoadFileWaitTillLoaded( ">Seq1\nRSVQ\n", FormatAdapter.PASTE); AlignFrame af2 = new FileLoader().LoadFileWaitTillLoaded( ">Seq2\nDGEL\n", FormatAdapter.PASTE); AlignedCodonFrame acf1 = new AlignedCodonFrame(); AlignedCodonFrame acf2 = new AlignedCodonFrame(); AlignedCodonFrame acf3 = new AlignedCodonFrame(); Set mappings1 = new LinkedHashSet(); mappings1.add(acf1); mappings1.add(acf2); af1.getViewport().getAlignment().setCodonFrames(mappings1); Set mappings2 = new LinkedHashSet(); mappings2.add(acf2); mappings2.add(acf3); af2.getViewport().getAlignment().setCodonFrames(mappings2); /* * AlignFrame1 has mappings acf1 and acf2, AlignFrame2 has acf2 and acf3 */ Set ssmMappings = ssm.seqmappings; assertEquals(0, ssmMappings.size()); ssm.registerMapping(acf1); assertEquals(1, ssmMappings.size()); ssm.registerMapping(acf2); assertEquals(2, ssmMappings.size()); ssm.registerMapping(acf3); assertEquals(3, ssmMappings.size()); /* * Closing AlignFrame2 should remove mapping acf3 from * StructureSelectionManager, but not acf2, since AlignFrame1 still has a * reference to it */ af2.closeMenuItem_actionPerformed(true); assertEquals(2, ssmMappings.size()); assertTrue(ssmMappings.contains(acf1)); assertTrue(ssmMappings.contains(acf2)); assertFalse(ssmMappings.contains(acf3)); } }