X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=test%2Fjalview%2Fgui%2FAlignmentPanelTest.java;h=a137ff6b95ba1fc320994ee748962375b6f362fc;hb=57738a1f3c19b1c3a00bd3ac5108f8cd0af32f99;hp=5c5890ed70c81e4ba42c508e2b6567e30f0fe8ce;hpb=c722265264903c67877587cc422bb2088a16166a;p=jalview.git diff --git a/test/jalview/gui/AlignmentPanelTest.java b/test/jalview/gui/AlignmentPanelTest.java index 5c5890e..a137ff6 100644 --- a/test/jalview/gui/AlignmentPanelTest.java +++ b/test/jalview/gui/AlignmentPanelTest.java @@ -21,158 +21,273 @@ package jalview.gui; import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotEquals; -import jalview.bin.Jalview; -import jalview.datamodel.Alignment; -import jalview.datamodel.Sequence; -import jalview.datamodel.SequenceI; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.FontMetrics; +import java.lang.reflect.InvocationTargetException; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeClass; +import javax.swing.SwingUtilities; + +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; +import jalview.api.AlignViewportI; +import jalview.bin.Cache; +import jalview.bin.Jalview; +import jalview.datamodel.AlignmentAnnotation; +import jalview.datamodel.SequenceI; +import jalview.io.DataSourceType; +import jalview.io.FileLoader; +import jalview.viewmodel.ViewportRanges; + public class AlignmentPanelTest { - SequenceI seq1 = new Sequence( - "Seq1", - "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC"); - - SequenceI seq2 = new Sequence( - "Seq2", - "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC"); - - SequenceI seq3 = new Sequence( - "Seq3", - "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC"); - - SequenceI seq4 = new Sequence( - "Seq4", - "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC"); - - SequenceI seq5 = new Sequence( - "Seq5", - "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC"); - - SequenceI seq6 = new Sequence( - "Seq6", - "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC"); - - SequenceI seq7 = new Sequence( - "Seq7", - "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC"); - - SequenceI seq8 = new Sequence( - "Seq8", - "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC"); + AlignFrame af; - SequenceI seq9 = new Sequence( - "Seq9", - "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC"); - - SequenceI seq10 = new Sequence( - "Seq10", - "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC"); - - SequenceI seq11 = new Sequence( - "Seq11", - "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC"); - - SequenceI seq12 = new Sequence( - "Seq12", - "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC"); - - SequenceI seq13 = new Sequence( - "Seq13", - "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC"); - - SequenceI seq14 = new Sequence( - "Seq14", - "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC"); - - SequenceI seq15 = new Sequence( - "Seq15", - "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC"); + @BeforeMethod(alwaysRun = true) + public void setUp() throws InvocationTargetException, InterruptedException + { + Jalview.main( + new String[] + { "-nonews", "-props", "test/jalview/testProps.jvprops" }); + + Cache.applicationProperties.setProperty("SHOW_IDENTITY", + Boolean.TRUE.toString()); + af = new FileLoader().LoadFileWaitTillLoaded("examples/uniref50.fa", + DataSourceType.FILE); + + /* + * ensure the panel has been repainted and so ViewportRanges set + */ + SwingUtilities.invokeAndWait(new Runnable() + { + @Override + public void run() + { + af.repaint(); + } + }); + + /* + * wait for Consensus thread to complete + */ + do + { + try + { + Thread.sleep(50); + } catch (InterruptedException x) + { + } + } while (af.getViewport().getCalcManager().isWorking()); + } - SequenceI seq16 = new Sequence( - "Seq16", - "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC"); + /** + * Test side effect that end residue is set correctly by setScrollValues, with + * or without hidden columns + */ + @Test(groups = "Functional") + public void testSetScrollValues() + { + ViewportRanges ranges = af.getViewport().getRanges(); + af.alignPanel.setScrollValues(0, 0); - SequenceI seq17 = new Sequence( - "Seq17", - "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC"); + int oldres = ranges.getEndRes(); + af.alignPanel.setScrollValues(-1, 5); - SequenceI seq18 = new Sequence( - "Seq18", - "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC"); + // setting -ve x value does not change residue + assertEquals(ranges.getEndRes(), oldres); - SequenceI seq19 = new Sequence( - "Seq19", - "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC"); + af.alignPanel.setScrollValues(0, 5); - SequenceI seq20 = new Sequence( - "Seq20", - "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC"); + // setting 0 as x value does not change residue + assertEquals(ranges.getEndRes(), oldres); + + af.alignPanel.setScrollValues(5, 5); + // setting x value to 5 extends endRes by 5 residues + assertEquals(ranges.getEndRes(), oldres + 5); + + // scroll to position after hidden columns sets endres to oldres (width) + + // position + int scrollpos = 60; + af.getViewport().hideColumns(30, 50); + af.alignPanel.setScrollValues(scrollpos, 5); + assertEquals(ranges.getEndRes(), oldres + scrollpos); + + // scroll to position within hidden columns, still sets endres to oldres + + // position + // not sure if this is actually correct behaviour but this is what Jalview + // currently does + scrollpos = 40; + af.getViewport().showAllHiddenColumns(); + af.getViewport().hideColumns(30, 50); + af.alignPanel.setScrollValues(scrollpos, 5); + assertEquals(ranges.getEndRes(), oldres + scrollpos); + + // scroll to position within distance of the end of the alignment + // endRes should be set to width of alignment - 1 + scrollpos = 130; + af.getViewport().showAllHiddenColumns(); + af.alignPanel.setScrollValues(scrollpos, 5); + assertEquals(ranges.getEndRes(), + af.getViewport().getAlignment().getWidth() - 1); + + // now hide some columns, and scroll to position within + // distance of the end of the alignment + // endRes should be set to width of alignment - 1 - the number of hidden + // columns + af.getViewport().hideColumns(30, 50); + af.alignPanel.setScrollValues(scrollpos, 5); + assertEquals(ranges.getEndRes(), + af.getViewport().getAlignment().getWidth() - 1 - 21); // 21 is the + // number of + // hidden + // columns + } - SequenceI seq21 = new Sequence( - "Seq21", - "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC"); + /** + * Test that update layout reverts to original (unwrapped) values for endRes + * when switching from wrapped back to unwrapped mode (JAL-2739) + */ + @Test(groups = "Functional") + public void testUpdateLayout_endRes() + { + // get details of original alignment dimensions + ViewportRanges ranges = af.getViewport().getRanges(); + int endres = ranges.getEndRes(); - SequenceI seq22 = new Sequence( - "Seq22", - "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC"); + // wrap + af.alignPanel.getAlignViewport().setWrapAlignment(true); + af.alignPanel.updateLayout(); - SequenceI seq23 = new Sequence( - "Seq23", - "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC"); + // endRes has changed + assertNotEquals(ranges.getEndRes(), endres); - @BeforeClass(alwaysRun = true) - public void setUp() - { - JvOptionPane.setInteractiveMode(false); - JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION); + // unwrap + af.alignPanel.getAlignViewport().setWrapAlignment(false); + af.alignPanel.updateLayout(); - Jalview.main(new String[] { "-nonews", "-props", - "test/jalview/testProps.jvprops" }); + // endRes back to original value + assertEquals(ranges.getEndRes(), endres); } - @AfterMethod(alwaysRun = true) - public void tearDown() + /** + * Test the variant of calculateIdWidth that only recomputes the width if it + * is not already saved in the viewport (initial value is -1) + */ + @Test(groups = "Functional") + public void testCalculateIdWidth_noArgs() { - Desktop.instance.closeAll_actionPerformed(null); + AlignViewportI av = af.alignPanel.getAlignViewport(); + av.setShowJVSuffix(true); + av.setFont(new Font("Courier", Font.PLAIN, 15), true); + + av.setIdWidth(0); + Dimension d = af.alignPanel.calculateIdWidth(); + assertEquals(d.width, 0); + assertEquals(d.height, 0); + + av.setIdWidth(99); + d = af.alignPanel.calculateIdWidth(); + assertEquals(d.width, 99); + assertEquals(d.height, 0); + + /* + * note 4 pixels padding are added to the longest sequence name width + */ + av.setIdWidth(-1); // force recalculation + d = af.alignPanel.calculateIdWidth(); + assertEquals(d.width, 166); // 4 + pixel width of "Q93Z60_ARATH/1-118" + assertEquals(d.height, 12); + assertEquals(d.width, av.getIdWidth()); } /** - * Test side effect that end residue is set correctly by setScrollValues, with - * or without hidden columns + * Test the variant of calculateIdWidth that computes the longest of any + * sequence name or annotation label width */ @Test(groups = "Functional") - public void TestSetScrollValues() + public void testCalculateIdWidth_withMaxWidth() { - SequenceI[] seqs = new SequenceI[] { seq1, seq2, seq3, seq4, seq5, - seq6, seq7, seq8, seq9, seq10, seq11, seq12, seq13, seq14, seq15, - seq16, seq17, seq18, seq19, seq20, seq21, seq22, seq23 }; - Alignment al = new Alignment(seqs); - al.setDataset(null); - AlignViewport av = new AlignViewport(al); - - AlignFrame alignFrame = new AlignFrame(al, 700, 500); - AlignmentPanel ap = new AlignmentPanel(alignFrame, av); - - int oldres = av.getEndRes(); - ap.setScrollValues(-1, 5); - - // setting -ve x value does not change residue - assertEquals(av.getEndRes(), oldres); - - ap.setScrollValues(0, 5); - - // setting 0 as x value does not change residue - assertEquals(av.getEndRes(), oldres); - - ap.setScrollValues(5, 5); - // setting x value to 20 extends endRes by 20px converted to residues - assertEquals(av.getEndRes(), oldres + 5); - + AlignViewportI av = af.alignPanel.getAlignViewport(); + av.setShowJVSuffix(true); + av.setFont(new Font("Courier", Font.PLAIN, 15), true); + av.setShowAnnotation(false); + av.setIdWidth(18); + + /* + * note 4 pixels 'padding' are added to the longest seq name/annotation label + */ + Dimension d = af.alignPanel.calculateIdWidth(2000); + assertEquals(d.width, 166); // 4 + pixel width of "Q93Z60_ARATH/1-118" + assertEquals(d.height, 12); // fixed value (not used?) + assertEquals(av.getIdWidth(), 18); // not changed by this method + + /* + * make the longest sequence name longer + */ + SequenceI seq = af.viewport.getAlignment() + .findSequenceMatch("Q93Z60_ARATH")[0]; + seq.setName(seq.getName() + "MMMMM"); + d = af.alignPanel.calculateIdWidth(2000); + assertEquals(d.width, 211); // 4 + pixel width of "Q93Z60_ARATHMMMMM/1-118" + assertEquals(d.height, 12); + assertEquals(av.getIdWidth(), 18); // unchanged + + /* + * make the longest annotation name even longer + * note this is checked even if annotations are not shown + */ + AlignmentAnnotation aa = av.getAlignment().getAlignmentAnnotation()[0]; + aa.label = "THIS IS A VERY LONG LABEL INDEED"; + FontMetrics fmfor = af.alignPanel + .getFontMetrics(af.alignPanel.getAlabels().getFont()); + // Assumption ID_WIDTH_PADDING == 4 + int expwidth = 4 + fmfor.stringWidth(aa.label); + d = af.alignPanel.calculateIdWidth(2000); + assertEquals(d.width, expwidth); // 228 == ID_WIDTH_PADDING + pixel width of + // "THIS IS A VERY LONG LABEL INDEED" + assertEquals(d.height, 12); + + /* + * override with maxwidth + * note the 4 pixels padding is added to this value + */ + d = af.alignPanel.calculateIdWidth(213); + assertEquals(d.width, 217); + assertEquals(d.height, 12); + } + @Test(groups = { "Functional", "Not-bamboo" }) + public void testGetVisibleWidth() + { + /* + * width for onscreen rendering is IDPanel width + */ + int w = af.alignPanel.getVisibleIdWidth(true); + assertEquals(w, af.alignPanel.getIdPanel().getWidth()); + assertEquals(w, 115); + + /* + * width for offscreen rendering is the same + * if no fixed id width is specified in preferences + */ + Cache.setProperty("FIGURE_AUTOIDWIDTH", Boolean.FALSE.toString()); + Cache.removeProperty("FIGURE_FIXEDIDWIDTH"); + assertEquals(w, af.alignPanel.getVisibleIdWidth(false)); + + /* + * preference for fixed id width - note 4 pixels padding is added + */ + Cache.setProperty("FIGURE_FIXEDIDWIDTH", "120"); + assertEquals(124, af.alignPanel.getVisibleIdWidth(false)); + + /* + * preference for auto id width overrides fixed width + */ + Cache.setProperty("FIGURE_AUTOIDWIDTH", Boolean.TRUE.toString()); + assertEquals(115, af.alignPanel.getVisibleIdWidth(false)); } }