+package jalview.structure;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import jalview.datamodel.AlignedCodonFrame;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class StructureSelectionManagerTest
+{
+ private StructureSelectionManager ssm;
+
+ @Before
+ public void setUp()
+ {
+ ssm = new StructureSelectionManager();
+ }
+
+ @Test
+ public void testAddMapping()
+ {
+ AlignedCodonFrame acf1 = new AlignedCodonFrame();
+ AlignedCodonFrame acf2 = new AlignedCodonFrame();
+
+ /*
+ * One mapping only.
+ */
+ ssm.addMapping(acf1);
+ assertEquals(1, ssm.seqmappings.size());
+ assertTrue(ssm.seqmappings.contains(acf1));
+ assertEquals(1, ssm.seqMappingRefCounts.size());
+ assertEquals(1, ssm.seqMappingRefCounts.get(acf1).intValue());
+
+ /*
+ * A second mapping.
+ */
+ ssm.addMapping(acf2);
+ assertEquals(2, ssm.seqmappings.size());
+ assertTrue(ssm.seqmappings.contains(acf1));
+ assertTrue(ssm.seqmappings.contains(acf2));
+ assertEquals(2, ssm.seqMappingRefCounts.size());
+ assertEquals(1, ssm.seqMappingRefCounts.get(acf1).intValue());
+ assertEquals(1, ssm.seqMappingRefCounts.get(acf2).intValue());
+
+ /*
+ * A second reference to the first mapping.
+ */
+ ssm.addMapping(acf1);
+ assertEquals(2, ssm.seqmappings.size());
+ assertTrue(ssm.seqmappings.contains(acf1));
+ assertTrue(ssm.seqmappings.contains(acf2));
+ assertEquals(2, ssm.seqMappingRefCounts.size());
+ assertEquals(2, ssm.seqMappingRefCounts.get(acf1).intValue());
+ assertEquals(1, ssm.seqMappingRefCounts.get(acf2).intValue());
+ }
+
+ @Test
+ public void testAddMappings()
+ {
+ AlignedCodonFrame acf1 = new AlignedCodonFrame();
+ AlignedCodonFrame acf2 = new AlignedCodonFrame();
+ AlignedCodonFrame acf3 = new AlignedCodonFrame();
+
+ Set<AlignedCodonFrame> set1 = new HashSet<AlignedCodonFrame>();
+ set1.add(acf1);
+ set1.add(acf2);
+ Set<AlignedCodonFrame> set2 = new HashSet<AlignedCodonFrame>();
+ set2.add(acf2);
+ set2.add(acf3);
+
+ /*
+ * Adding both sets adds acf2 twice and acf1 and acf3 once each.
+ */
+ ssm.addMappings(set1);
+ ssm.addMappings(set2);
+
+ assertEquals(3, ssm.seqmappings.size());
+ assertTrue(ssm.seqmappings.contains(acf1));
+ assertTrue(ssm.seqmappings.contains(acf2));
+ assertTrue(ssm.seqmappings.contains(acf3));
+ assertEquals(3, ssm.seqMappingRefCounts.size());
+ assertEquals(1, ssm.seqMappingRefCounts.get(acf1).intValue());
+ assertEquals(2, ssm.seqMappingRefCounts.get(acf2).intValue());
+ assertEquals(1, ssm.seqMappingRefCounts.get(acf3).intValue());
+ }
+
+ @Test
+ public void testRemoveMapping()
+ {
+ AlignedCodonFrame acf1 = new AlignedCodonFrame();
+ AlignedCodonFrame acf2 = new AlignedCodonFrame();
+ ssm.addMapping(acf1);
+
+ /*
+ * Add one and remove it.
+ */
+ ssm.removeMapping(acf1);
+ ssm.removeMapping(acf2);
+ assertEquals(0, ssm.seqmappings.size());
+ assertEquals(0, ssm.seqMappingRefCounts.size());
+
+ /*
+ * Add one twice and remove it once.
+ */
+ ssm.addMapping(acf1);
+ ssm.addMapping(acf2);
+ ssm.addMapping(acf1);
+ ssm.removeMapping(acf1);
+ assertEquals(2, ssm.seqmappings.size());
+ assertTrue(ssm.seqmappings.contains(acf1));
+ assertTrue(ssm.seqmappings.contains(acf2));
+ assertEquals(2, ssm.seqMappingRefCounts.size());
+ assertEquals(1, ssm.seqMappingRefCounts.get(acf1).intValue());
+ assertEquals(1, ssm.seqMappingRefCounts.get(acf2).intValue());
+
+ /*
+ * Remove both once more to clear the set.
+ */
+ ssm.removeMapping(acf1);
+ ssm.removeMapping(acf2);
+ assertEquals(0, ssm.seqmappings.size());
+ assertEquals(0, ssm.seqMappingRefCounts.size());
+ }
+
+ @Test
+ public void testRemoveMappings()
+ {
+ AlignedCodonFrame acf1 = new AlignedCodonFrame();
+ AlignedCodonFrame acf2 = new AlignedCodonFrame();
+ AlignedCodonFrame acf3 = new AlignedCodonFrame();
+
+ /*
+ * Initial ref counts are 3/2/1:
+ */
+ ssm.addMapping(acf1);
+ ssm.addMapping(acf1);
+ ssm.addMapping(acf1);
+ ssm.addMapping(acf2);
+ ssm.addMapping(acf2);
+ ssm.addMapping(acf3);
+
+ Set<AlignedCodonFrame> set1 = new HashSet<AlignedCodonFrame>();
+ set1.add(acf1);
+ set1.add(acf2);
+ Set<AlignedCodonFrame> set2 = new HashSet<AlignedCodonFrame>();
+ set2.add(acf2);
+ set2.add(acf3);
+
+ /*
+ * Remove one ref each to acf1, acf2, counts are now 2/1/1:
+ */
+ ssm.removeMappings(set1);
+ assertEquals(3, ssm.seqmappings.size());
+ assertTrue(ssm.seqmappings.contains(acf1));
+ assertTrue(ssm.seqmappings.contains(acf2));
+ assertTrue(ssm.seqmappings.contains(acf3));
+ assertEquals(3, ssm.seqMappingRefCounts.size());
+ assertEquals(2, ssm.seqMappingRefCounts.get(acf1).intValue());
+ assertEquals(1, ssm.seqMappingRefCounts.get(acf2).intValue());
+ assertEquals(1, ssm.seqMappingRefCounts.get(acf3).intValue());
+
+ /*
+ * Remove one ref each to acf2, acf3 - they are removed
+ */
+ ssm.removeMappings(set2);
+ assertEquals(1, ssm.seqmappings.size());
+ assertTrue(ssm.seqmappings.contains(acf1));
+ assertEquals(1, ssm.seqMappingRefCounts.size());
+ assertEquals(2, ssm.seqMappingRefCounts.get(acf1).intValue());
+ }
+}