+package jalview.gui;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+import jalview.datamodel.Alignment;
+import jalview.datamodel.Sequence;
+import jalview.datamodel.SequenceI;
+
+import java.awt.Component;
+import java.util.List;
+import java.util.Map;
+
+import javax.swing.JPanel;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class PaintRefresherTest
+{
+ // TODO would prefer PaintRefresher to be a single rather than static
+ @Before
+ public void setUp()
+ {
+ PaintRefresher.components.clear();
+ }
+
+ @After
+ public void tearDown()
+ {
+ PaintRefresher.components.clear();
+ }
+
+ @Test
+ public void testRegister()
+ {
+ JPanel jp = new JPanel();
+ JPanel jp2 = new JPanel();
+ JPanel jp3 = new JPanel();
+ JPanel jp4 = new JPanel();
+ PaintRefresher.Register(jp, "22");
+ PaintRefresher.Register(jp, "22");
+ PaintRefresher.Register(jp2, "22");
+ PaintRefresher.Register(jp3, "33");
+ PaintRefresher.Register(jp3, "44");
+ PaintRefresher.Register(jp4, "44");
+
+ Map<String, List<Component>> registered = PaintRefresher.components;
+ assertEquals(3, registered.size());
+ assertEquals(2, registered.get("22").size());
+ assertEquals(1, registered.get("33").size());
+ assertEquals(2, registered.get("44").size());
+ assertTrue(registered.get("22").contains(jp));
+ assertTrue(registered.get("22").contains(jp2));
+ assertTrue(registered.get("33").contains(jp3));
+ assertTrue(registered.get("44").contains(jp3));
+ assertTrue(registered.get("44").contains(jp4));
+ }
+
+ @Test
+ public void testRemoveComponent()
+ {
+ Map<String, List<Component>> registered = PaintRefresher.components;
+
+ // no error with an empty PaintRefresher
+ JPanel jp = new JPanel();
+ JPanel jp2 = new JPanel();
+ PaintRefresher.RemoveComponent(jp);
+ assertTrue(registered.isEmpty());
+
+ /*
+ * Add then remove one item
+ */
+ PaintRefresher.Register(jp, "11");
+ PaintRefresher.RemoveComponent(jp);
+ assertTrue(registered.isEmpty());
+
+ /*
+ * Add one item under two ids, then remove it. It is removed from both ids,
+ * and the now empty id is removed.
+ */
+ PaintRefresher.Register(jp, "11");
+ PaintRefresher.Register(jp, "22");
+ PaintRefresher.Register(jp2, "22");
+ PaintRefresher.RemoveComponent(jp);
+ // "11" is removed as now empty, only 22/jp2 left
+ assertEquals(1, registered.size());
+ assertEquals(1, registered.get("22").size());
+ assertTrue(registered.get("22").contains(jp2));
+ }
+
+ @Test
+ public void testGetAssociatedPanels()
+ {
+ SequenceI [] seqs = new SequenceI[]{new Sequence("", "ABC")};
+ Alignment al = new Alignment(seqs);
+
+ /*
+ * AlignFrame constructor has side-effects: AlignmentPanel is constructed,
+ * and SeqCanvas, IdPanel, AlignmentPanel are all registered under the
+ * sequence set id of the viewport.
+ */
+ AlignViewport av = new AlignViewport(al);
+ AlignFrame af = new AlignFrame(al, 4, 1);
+ AlignmentPanel ap1 = af.alignPanel;
+ AlignmentPanel[] panels = PaintRefresher.getAssociatedPanels(av
+ .getSequenceSetId());
+ assertEquals(1, panels.length);
+ assertSame(ap1, panels[0]);
+
+ panels = PaintRefresher.getAssociatedPanels(av.getSequenceSetId() + 1);
+ assertEquals(0, panels.length);
+ }
+}