JAL-1830 dropped reference counts for mappings, instead remove mapping
[jalview.git] / test / jalview / structure / StructureSelectionManagerTest.java
1 package jalview.structure;
2
3 import static org.testng.AssertJUnit.assertEquals;
4 import static org.testng.AssertJUnit.assertNotNull;
5 import static org.testng.AssertJUnit.assertTrue;
6
7 import jalview.datamodel.AlignedCodonFrame;
8 import jalview.gui.AlignFrame;
9 import jalview.gui.Desktop;
10 import jalview.io.FileLoader;
11 import jalview.io.FormatAdapter;
12
13 import java.util.HashSet;
14 import java.util.LinkedHashSet;
15 import java.util.Set;
16
17 import org.testng.annotations.BeforeClass;
18 import org.testng.annotations.BeforeMethod;
19 import org.testng.annotations.Test;
20
21 public class StructureSelectionManagerTest
22 {
23   private StructureSelectionManager ssm;
24
25   @BeforeClass(alwaysRun = true)
26   public static void setUpBeforeClass() throws Exception
27   {
28     jalview.bin.Jalview.main(new String[] { "-props",
29         "test/jalview/testProps.jvprops" });
30   }
31
32  @BeforeMethod(alwaysRun = true)
33   public void setUp()
34   {
35     ssm = new StructureSelectionManager();
36   }
37
38   @Test(groups ={ "Functional" })
39   public void testRegisterMapping()
40   {
41     AlignedCodonFrame acf1 = new AlignedCodonFrame();
42     AlignedCodonFrame acf2 = new AlignedCodonFrame();
43
44     ssm.registerMapping(acf1);
45     assertEquals(1, ssm.seqmappings.size());
46     assertTrue(ssm.seqmappings.contains(acf1));
47
48     ssm.registerMapping(acf2);
49     assertEquals(2, ssm.seqmappings.size());
50     assertTrue(ssm.seqmappings.contains(acf1));
51     assertTrue(ssm.seqmappings.contains(acf2));
52
53     /*
54      * Re-adding the first mapping does nothing
55      */
56     ssm.registerMapping(acf1);
57     assertEquals(2, ssm.seqmappings.size());
58     assertTrue(ssm.seqmappings.contains(acf1));
59     assertTrue(ssm.seqmappings.contains(acf2));
60   }
61
62   @Test(groups ={ "Functional" })
63   public void testRegisterMappings()
64   {
65     AlignedCodonFrame acf1 = new AlignedCodonFrame();
66     AlignedCodonFrame acf2 = new AlignedCodonFrame();
67     AlignedCodonFrame acf3 = new AlignedCodonFrame();
68
69     Set<AlignedCodonFrame> set1 = new HashSet<AlignedCodonFrame>();
70     set1.add(acf1);
71     set1.add(acf2);
72     Set<AlignedCodonFrame> set2 = new HashSet<AlignedCodonFrame>();
73     set2.add(acf2);
74     set2.add(acf3);
75
76     /*
77      * Add both sets twice; each mapping should be added once only
78      */
79     ssm.registerMappings(set1);
80     ssm.registerMappings(set1);
81     ssm.registerMappings(set2);
82     ssm.registerMappings(set2);
83
84     assertEquals(3, ssm.seqmappings.size());
85     assertTrue(ssm.seqmappings.contains(acf1));
86     assertTrue(ssm.seqmappings.contains(acf2));
87     assertTrue(ssm.seqmappings.contains(acf3));
88   }
89
90   /**
91    * Test that a mapping is not deregistered if an alignment holds a reference
92    * to it
93    */
94   @Test(groups ={ "Functional" })
95   public void testDeregisterMapping_withAlignmentReference()
96   {
97     Desktop d = Desktop.instance;
98     assertNotNull(d);
99
100     /*
101      * alignment with reference to mappings
102      */
103     AlignFrame af1 = new FileLoader().LoadFileWaitTillLoaded(
104             ">Seq1\nCAGT\n", FormatAdapter.PASTE);
105
106     AlignedCodonFrame acf1 = new AlignedCodonFrame();
107     AlignedCodonFrame acf2 = new AlignedCodonFrame();
108
109     Set<AlignedCodonFrame> mappings = new LinkedHashSet<AlignedCodonFrame>();
110     mappings.add(acf1);
111     mappings.add(acf2);
112     af1.getViewport().getAlignment().setCodonFrames(mappings);
113
114     /*
115      * Add one and remove it.
116      */
117     ssm.registerMapping(acf1);
118     ssm.deregisterMapping(acf1);
119     assertEquals(1, ssm.seqmappings.size());
120     assertTrue(ssm.seqmappings.contains(acf1));
121   }
122
123   /**
124    * Test that a mapping is deregistered if no alignment holds a reference to it
125    */
126   @Test(groups ={ "Functional" })
127   public void testDeregisterMapping_withNoReference()
128   {
129     Desktop d = Desktop.instance;
130     assertNotNull(d);
131   
132     /*
133      * alignment with reference to mappings
134      */
135     AlignFrame af1 = new FileLoader().LoadFileWaitTillLoaded(
136             ">Seq1\nCAGT\n", FormatAdapter.PASTE);
137   
138     AlignedCodonFrame acf1 = new AlignedCodonFrame();
139     AlignedCodonFrame acf2 = new AlignedCodonFrame();
140   
141     Set<AlignedCodonFrame> mappings = new LinkedHashSet<AlignedCodonFrame>();
142     mappings.add(acf2);
143     af1.getViewport().getAlignment().setCodonFrames(mappings);
144   
145     /*
146      * Add one and remove it.
147      */
148     ssm.registerMapping(acf1);
149     assertEquals(1, ssm.seqmappings.size());
150     assertTrue(ssm.seqmappings.contains(acf1));
151     ssm.deregisterMapping(acf1);
152     assertEquals(0, ssm.seqmappings.size());
153   }
154
155   /**
156    * Test that a mapping is not deregistered when a second view is closed but
157    * the first still holds a reference to the mapping
158    */
159   @Test(groups ={ "Functional" })
160   public void testDeregisterMapping_onCloseView()
161   {
162     /*
163      * alignment with reference to mappings
164      */
165     AlignFrame af1 = new FileLoader().LoadFileWaitTillLoaded(
166             ">Seq1\nCAGT\n", FormatAdapter.PASTE);
167   
168     AlignedCodonFrame acf1 = new AlignedCodonFrame();
169     AlignedCodonFrame acf2 = new AlignedCodonFrame();
170   
171     Set<AlignedCodonFrame> mappings = new LinkedHashSet<AlignedCodonFrame>();
172     mappings.add(acf1);
173     mappings.add(acf2);
174     af1.getViewport().getAlignment().setCodonFrames(mappings);
175     af1.newView_actionPerformed(null);
176
177     /*
178      * Verify that creating the alignment for the new View has registered the
179      * mappings
180      */
181     ssm = StructureSelectionManager
182             .getStructureSelectionManager(Desktop.instance);
183     assertEquals(2, ssm.seqmappings.size());
184     assertTrue(ssm.seqmappings.contains(acf1));
185     assertTrue(ssm.seqmappings.contains(acf2));
186
187     /*
188      * Close the second view. Verify that mappings are not removed as the first
189      * view still holds a reference to them.
190      */
191     af1.closeMenuItem_actionPerformed(false);
192     assertEquals(2, ssm.seqmappings.size());
193     assertTrue(ssm.seqmappings.contains(acf1));
194     assertTrue(ssm.seqmappings.contains(acf2));
195   }
196 }