X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=test%2Fjalview%2Fviewmodel%2FOverviewDimensionsTest.java;h=1ea07ea0f8f0f6b89d46008e15036946789e3c17;hb=7f4da0a2b0c10f158a03dbfce8878e67e90c4a68;hp=d01eaa3cb614f68370af030809ee41e4f3339d79;hpb=41f78bdf2b0650fa7fde4959a7b9d58fd5c77c71;p=jalview.git diff --git a/test/jalview/viewmodel/OverviewDimensionsTest.java b/test/jalview/viewmodel/OverviewDimensionsTest.java index d01eaa3..1ea07ea 100644 --- a/test/jalview/viewmodel/OverviewDimensionsTest.java +++ b/test/jalview/viewmodel/OverviewDimensionsTest.java @@ -21,162 +21,94 @@ package jalview.viewmodel; import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertTrue; -import jalview.bin.Cache; -import jalview.bin.Jalview; +import jalview.analysis.AlignmentGenerator; import jalview.datamodel.Alignment; +import jalview.datamodel.AlignmentI; +import jalview.datamodel.ColumnSelection; import jalview.datamodel.Sequence; +import jalview.datamodel.SequenceCollectionI; +import jalview.datamodel.SequenceGroup; import jalview.datamodel.SequenceI; -import jalview.gui.AlignFrame; -import jalview.gui.AlignViewport; -import jalview.io.DataSourceType; -import jalview.io.FileLoader; + +import java.util.Hashtable; import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; -public class OverviewDimensionsTest { - - boolean showConservationSetting; - - 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"); - - 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"); - - SequenceI seq16 = new Sequence( - "Seq16", - "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC"); - - SequenceI seq17 = new Sequence( - "Seq17", - "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC"); - - SequenceI seq18 = new Sequence( - "Seq18", - "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC"); - - SequenceI seq19 = new Sequence( - "Seq19", - "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC"); +@Test(singleThreaded = true) +public class OverviewDimensionsTest +{ + AlignmentI al; + OverviewDimensions od; - SequenceI seq20 = new Sequence( - "Seq20", - "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC"); + // cached widths and heights + int boxWidth; + int boxHeight; + int viewHeight; + int viewWidth; + int alheight; + int alwidth; - SequenceI seq21 = new Sequence( - "Seq21", - "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC"); + ViewportPositionProps posProps; - SequenceI seq22 = new Sequence( - "Seq22", - "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC" - + "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC" - + "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC" - + "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC" - + "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC"); + Hashtable hiddenRepSequences = new Hashtable(); - SequenceI seq23 = new Sequence( - "Seq23", - "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC"); + ColumnSelection hiddenCols = new ColumnSelection(); - AlignFrame af; + @BeforeClass(alwaysRun = true) + public void setUpJvOptionPane() + { + // create random alignment + AlignmentGenerator gen = new AlignmentGenerator(false); + al = gen.generate(157, 525, 123, 5, 5); + } @BeforeMethod(alwaysRun = true) public void setUp() { - Jalview.main(new String[] { "-nonews", "-props", - "test/jalview/testProps.jvprops" }); - - Cache.applicationProperties.setProperty("SHOW_IDENTITY", - Boolean.TRUE.toString()); - af = new FileLoader().LoadFileWaitTillLoaded( - "examples/testdata/bigal.fa", - DataSourceType.FILE); - - /* - * wait for Consensus thread to complete - */ - synchronized (this) + if (!hiddenRepSequences.isEmpty()) { - while (af.getViewport().getConsensusSeq() == null) - { - try - { - wait(50); - } catch (InterruptedException e) - { - } - } + al.getHiddenSequences().showAll(hiddenRepSequences); } - // get cached setting for showConservation - // reset it in AfterClass! - showConservationSetting = Cache.getDefault("SHOW_CONSERVATION", true); - } + hiddenCols.revealAllHiddenColumns(); + + posProps = new ViewportPositionProps(al); + posProps.setStartRes(0); + posProps.setEndRes(62); + posProps.setStartSeq(0); + posProps.setEndSeq(17); + viewHeight = posProps.getEndSeq() - posProps.getStartSeq() + 1; + viewWidth = posProps.getEndRes() - posProps.getStartRes() + 1; + + ColumnSelection hiddenCols = new ColumnSelection(); + + od = new OverviewDimensions(posProps, true); + // Initial box sizing - default path through code + od.setBoxPosition(al.getHiddenSequences(), hiddenCols, posProps); + + mouseClick(od, 0, 0); + moveViewport(0, 0); + + // calculate before hidden columns so we get absolute values + alheight = posProps.getAbsoluteAlignmentHeight(); + alwidth = posProps.getAbsoluteAlignmentWidth(); + + boxWidth = Math.round((float) (posProps.getEndRes() + - posProps.getStartRes() + 1) + * od.getWidth() / alwidth); + boxHeight = Math.round((float) (posProps.getEndSeq() + - posProps.getStartSeq() + 1) + * od.getSequencesHeight() / alheight); + } @AfterClass(alwaysRun = true) - public void tearDown() + public void cleanUp() { - Cache.applicationProperties.setProperty("SHOW_CONSERVATION", - Boolean.toString(showConservationSetting)); + al = null; } /** @@ -199,17 +131,13 @@ public class OverviewDimensionsTest { int maxSeqHeight = 300; int minSeqHeight = 40; - Cache.applicationProperties.setProperty("SHOW_CONSERVATION", - Boolean.toString(true)); - // test for alignment with width > height SequenceI[] seqs1 = new SequenceI[] { seqa, seqb }; Alignment al1 = new Alignment(seqs1); - al1.setDataset(null); - AlignViewport av1 = new AlignViewport(al1); + ViewportPositionProps props = new ViewportPositionProps(al1); - OverviewDimensions od = new OverviewDimensions(av1); - int scaledHeight = 266; + OverviewDimensions od = new OverviewDimensions(props, true); + int scaledHeight = 267; assertEquals(od.getGraphHeight(), defaultGraphHeight); assertEquals(od.getSequencesHeight(), scaledHeight); assertEquals(od.getWidth(), maxWidth); @@ -218,10 +146,9 @@ public class OverviewDimensionsTest { // test for alignment with width < height SequenceI[] seqs2 = new SequenceI[] { seqa, seqb, seqc, seqd }; Alignment al2 = new Alignment(seqs2); - al2.setDataset(null); - AlignViewport av2 = new AlignViewport(al2); + props = new ViewportPositionProps(al2); - od = new OverviewDimensions(av2); + od = new OverviewDimensions(props, true); int scaledWidth = 300; assertEquals(od.getGraphHeight(), defaultGraphHeight); assertEquals(od.getSequencesHeight(), maxSeqHeight); @@ -232,10 +159,9 @@ public class OverviewDimensionsTest { // min value SequenceI[] seqs3 = new SequenceI[] { seqe }; Alignment al3 = new Alignment(seqs3); - al3.setDataset(null); - AlignViewport av3 = new AlignViewport(al3); + props = new ViewportPositionProps(al3); - od = new OverviewDimensions(av3); + od = new OverviewDimensions(props, true); assertEquals(od.getGraphHeight(), defaultGraphHeight); assertEquals(od.getSequencesHeight(), minSeqHeight); assertEquals(od.getWidth(), maxWidth); @@ -245,24 +171,18 @@ public class OverviewDimensionsTest { SequenceI[] seqs4 = new SequenceI[] { seqa, seqb, seqc, seqd, seqa, seqb, seqc, seqd, seqa, seqb, seqc, seqd, seqa, seqb, seqc, seqd }; Alignment al4 = new Alignment(seqs4); - al4.setDataset(null); - AlignViewport av4 = new AlignViewport(al4); + props = new ViewportPositionProps(al4); - od = new OverviewDimensions(av4); + od = new OverviewDimensions(props, true); assertEquals(od.getGraphHeight(), defaultGraphHeight); assertEquals(od.getSequencesHeight(), maxSeqHeight); assertEquals(od.getWidth(), minWidth); assertEquals(od.getHeight(), maxSeqHeight + defaultGraphHeight); - // test for alignment where no conservation annotation is shown - Cache.applicationProperties.setProperty("SHOW_CONSERVATION", - Boolean.toString(false)); - Alignment al5 = new Alignment(seqs4); - al5.setDataset(null); - AlignViewport av5 = new AlignViewport(al5); + props = new ViewportPositionProps(al5); - od = new OverviewDimensions(av5); + od = new OverviewDimensions(props, false); assertEquals(od.getGraphHeight(), 0); assertEquals(od.getSequencesHeight(), maxSeqHeight); assertEquals(od.getWidth(), minWidth); @@ -273,30 +193,12 @@ public class OverviewDimensionsTest { * Test that validation after mouse adjustments to boxX and boxY sets box * dimensions and scroll values correctly, when there are no hidden rows or * columns. - * - * The current implementation uses multiple transformations between coordinate - * systems which often involve casting to int, which causes values to be - * truncated. As a result we can lose accuracy. The tests below use - * approximate test values where appropriate. */ @Test(groups = { "Functional" }) public void testSetBoxFromMouseClick() { - AlignViewport av = af.getViewport(); - OverviewDimensions od = new OverviewDimensions(av); - - // Initial box sizing - default path through code - od.setBoxPosition(); - float scalew = (float) od.getWidth() - / (av.getAlignment().getWidth() * av.getCharWidth()); - float scaleh = (float) od.getSequencesHeight() - / (av.getAlignment().getHeight() * av.getCharHeight()); - int boxWidth = (int) ((av.getEndRes() - av.getStartRes() + 1) - * av.getCharWidth() * scalew); - int boxHeight = (int) ((av.getEndSeq() - av.getStartSeq()) - * av.getCharHeight() * scaleh); - - od.checkValid(); + od.updateViewportFromMouse(0, 0, al.getHiddenSequences(), hiddenCols, + posProps); assertEquals(od.getBoxX(), 0); assertEquals(od.getBoxY(), 0); assertEquals(od.getBoxWidth(), boxWidth); @@ -309,7 +211,7 @@ public class OverviewDimensionsTest { assertEquals(od.getBoxWidth(), boxWidth); assertEquals(od.getBoxHeight(), boxHeight); assertEquals(od.getScrollRow(), - (int) (10 / scaleh / av.getCharHeight())); + Math.round((float) 10 * alheight / od.getSequencesHeight())); assertEquals(od.getScrollCol(), 0); // negative boxY value reset to 0 @@ -317,57 +219,65 @@ public class OverviewDimensionsTest { assertEquals(od.getBoxY(), 0); assertEquals(od.getBoxWidth(), boxWidth); assertEquals(od.getBoxHeight(), boxHeight); - assertEquals(od.getScrollCol(), (int) (6 / scalew / av.getCharWidth())); + assertEquals(od.getScrollCol(), + Math.round((float) 6 * alwidth / od.getWidth())); assertEquals(od.getScrollRow(), 0); // overly large boxX value reset to width-boxWidth mouseClick(od, 100, 6); - assertEquals(od.getBoxX(), od.getWidth() - od.getBoxWidth(), 1.5); - assertEquals(od.getBoxY(), 6, 1.5); + assertEquals(od.getBoxX(), od.getWidth() - od.getBoxWidth()); + assertEquals(od.getBoxY(), 6); assertEquals(od.getBoxWidth(), boxWidth); assertEquals(od.getBoxHeight(), boxHeight); assertEquals(od.getScrollCol(), - (od.getBoxX() / scalew / av.getCharWidth()), 1.5); + Math.round((float) od.getBoxX() * alwidth / od.getWidth())); assertEquals(od.getScrollRow(), - (od.getBoxY() / scaleh / av.getCharHeight()), 1.5); + Math.round((float) od.getBoxY() * alheight + / od.getSequencesHeight())); // overly large boxY value reset to sequenceHeight - boxHeight mouseClick(od, 10, 520); - assertEquals(od.getBoxX(), 10, 1.5); - assertEquals(od.getBoxY(), od.getSequencesHeight() - od.getBoxHeight(), - 1.5); + assertEquals(od.getBoxX(), 10); + assertEquals(od.getBoxY(), od.getSequencesHeight() - od.getBoxHeight()); assertEquals(od.getBoxWidth(), boxWidth); - assertEquals(od.getBoxHeight(), boxHeight, 1.5); + assertEquals(od.getBoxHeight(), boxHeight); assertEquals(od.getScrollCol(), - (od.getBoxX() / scalew / av.getCharWidth()), 1.5); + Math.round((float) od.getBoxX() * alwidth / od.getWidth())); + + // here (float) od.getBoxY() * alheight / od.getSequencesHeight() = 507.5 + // and round rounds to 508; however we get 507 working with row values + // hence the subtraction of 1 assertEquals(od.getScrollRow(), - (od.getBoxY() / scaleh / av.getCharHeight()), 1.5); + Math.round((float) od.getBoxY() * alheight + / od.getSequencesHeight()) - 1); // click past end of alignment, as above mouseClick(od, 3000, 5); - assertEquals(od.getBoxX(), od.getWidth() - od.getBoxWidth(), 1.5); + assertEquals(od.getBoxX(), od.getWidth() - od.getBoxWidth()); assertEquals(od.getBoxWidth(), boxWidth); - assertEquals(od.getBoxHeight(), boxHeight, 1.5); + assertEquals(od.getBoxHeight(), boxHeight); assertEquals(od.getScrollCol(), - (od.getBoxX() / scalew / av.getCharWidth()), 1.5); + Math.round((float) od.getBoxX() * alwidth / od.getWidth())); assertEquals(od.getScrollRow(), - (od.getBoxY() / scaleh / av.getCharHeight()), 1.5); + Math.round((float) od.getBoxY() * alheight + / od.getSequencesHeight())); // move viewport so startRes non-zero and then mouseclick - moveViewportH(av, od, 50); + moveViewportH(50); // click at viewport position int oldboxx = od.getBoxX(); int oldboxy = od.getBoxY(); mouseClick(od, od.getBoxX() + 5, od.getBoxY() + 2); - assertEquals(od.getBoxX(), oldboxx + 5, 1.5); + assertEquals(od.getBoxX(), oldboxx + 5); assertEquals(od.getBoxWidth(), boxWidth); - assertEquals(od.getBoxHeight(), boxHeight, 1.5); + assertEquals(od.getBoxHeight(), boxHeight); assertEquals(od.getScrollCol(), - (od.getBoxX() / scalew / av.getCharWidth()), 1.5); - assertEquals(od.getBoxY(), oldboxy + 2, 1.5); + Math.round((float) od.getBoxX() * alwidth / od.getWidth())); + assertEquals(od.getBoxY(), oldboxy + 2); assertEquals(od.getScrollRow(), - (od.getBoxY() / scaleh / av.getCharHeight()), 1.5); + Math.round((float) od.getBoxY() * alheight + / od.getSequencesHeight())); // click at top corner mouseClick(od, 0, 0); @@ -376,7 +286,7 @@ public class OverviewDimensionsTest { assertEquals(od.getBoxY(), 0); assertEquals(od.getScrollRow(), 0); assertEquals(od.getBoxWidth(), boxWidth); - assertEquals(od.getBoxHeight(), boxHeight, 1.5); + assertEquals(od.getBoxHeight(), boxHeight); } /** @@ -386,21 +296,8 @@ public class OverviewDimensionsTest { @Test(groups = { "Functional" }) public void testFromMouseWithHiddenColsAtStart() { - AlignViewport av = af.getViewport(); - OverviewDimensions od = new OverviewDimensions(av); - - // Initial box sizing - default path through code - od.setBoxPosition(); - float scalew = (float) od.getWidth() - / (av.getAlignment().getWidth() * av.getCharWidth()); - float scaleh = (float) od.getSequencesHeight() - / (av.getAlignment().getHeight() * av.getCharHeight()); - int boxWidth = (int) ((av.getEndRes() - av.getStartRes() + 1) - * av.getCharWidth() * scalew); - int boxHeight = (int) ((av.getEndSeq() - av.getStartSeq()) - * av.getCharHeight() * scaleh); - - od.checkValid(); + od.updateViewportFromMouse(0, 0, al.getHiddenSequences(), hiddenCols, + posProps); assertEquals(od.getBoxX(), 0); assertEquals(od.getBoxY(), 0); assertEquals(od.getBoxWidth(), boxWidth); @@ -410,36 +307,34 @@ public class OverviewDimensionsTest { // hide cols at start and check updated box position is correct // changes boxX but not boxwidth int lastHiddenCol = 30; - av.hideColumns(0, lastHiddenCol); - od.setBoxPosition(); + hiddenCols.hideColumns(0, lastHiddenCol); + + od.setBoxPosition(al.getHiddenSequences(), hiddenCols, posProps); assertEquals(od.getBoxX(), - (int) ((lastHiddenCol + 1) * scalew * av.getCharWidth())); + Math.round((float) (lastHiddenCol + 1) * od.getWidth() + / alwidth)); assertEquals(od.getBoxWidth(), boxWidth); assertEquals(od.getBoxHeight(), boxHeight); // try to click in hidden cols, check box does not move int xpos = 10; mouseClick(od, xpos, 0); - assertEquals(od.getBoxX(), - (int) ((lastHiddenCol + 1) * scalew * av.getCharWidth())); + assertEquals( + od.getBoxX(), + Math.round((float) (lastHiddenCol + 1) * od.getWidth() + / alwidth)); assertEquals(od.getBoxY(), 0); assertEquals(od.getBoxWidth(), boxWidth); assertEquals(od.getBoxHeight(), boxHeight); assertEquals(od.getScrollRow(), 0); - assertEquals(od.getScrollCol(), - (int) (xpos / scalew / av.getCharWidth())); + assertEquals(od.getScrollCol(), 0); // click to right of hidden columns, box moves to click point - xpos = 40; - mouseClick(od, xpos, 0); - assertEquals(od.getBoxX(), - (int) ((xpos - lastHiddenCol) * scalew * av.getCharWidth())); - assertEquals(od.getBoxY(), 0); - assertEquals(od.getBoxWidth(), boxWidth); - assertEquals(od.getBoxHeight(), boxHeight); + testBoxIsAtClickPoint(40, 0); assertEquals(od.getScrollRow(), 0); assertEquals(od.getScrollCol(), - (int) (xpos / scalew / av.getCharWidth())); + Math.round((float) 40 * alwidth / od.getWidth()) + - (lastHiddenCol + 1)); // click to right of hidden columns such that box runs over right hand side // of alignment @@ -447,67 +342,192 @@ public class OverviewDimensionsTest { // overly large boxX value reset to width-boxWidth xpos = 100; mouseClick(od, xpos, 5); - assertEquals(od.getBoxX(), od.getWidth() - od.getBoxWidth() - - ((int) (lastHiddenCol * scalew * av.getCharWidth()))); + assertEquals(od.getBoxX(), od.getWidth() - od.getBoxWidth()); assertEquals(od.getBoxY(), 5); assertEquals(od.getBoxWidth(), boxWidth); assertEquals(od.getBoxHeight(), boxHeight); assertEquals(od.getScrollCol(), - (int) (xpos / scalew / av.getCharWidth())); + Math.round((float) od.getBoxX() * alwidth / od.getWidth()) + - (lastHiddenCol + 1)); assertEquals(od.getScrollRow(), - (int) (od.getBoxY() / scaleh / av.getCharHeight())); - + Math.round((float) od.getBoxY() * alheight + / od.getSequencesHeight())); } + /** + * Test setting of the box position, when there are hidden cols in the middle + * of the alignment + */ @Test(groups = { "Functional" }) - public void testSetBoxPosWithHiddenColsAtEnd() + public void testFromMouseWithHiddenColsInMiddle() { + od.updateViewportFromMouse(0, 0, al.getHiddenSequences(), hiddenCols, + posProps); + assertEquals(od.getBoxX(), 0); + assertEquals(od.getBoxY(), 0); + assertEquals(od.getBoxWidth(), boxWidth); + assertEquals(od.getScrollCol(), 0); + assertEquals(od.getScrollRow(), 0); + + // hide columns 63-73, no change to box position or dimensions + int firstHidden = 63; + int lastHidden = 73; + hiddenCols.hideColumns(firstHidden, lastHidden); - } + od.setBoxPosition(al.getHiddenSequences(), hiddenCols, posProps); + assertEquals(od.getBoxX(), 0); + assertEquals(od.getBoxY(), 0); + assertEquals(od.getBoxWidth(), boxWidth); + assertEquals(od.getScrollCol(), 0); + assertEquals(od.getScrollRow(), 0); + + // move box so that it overlaps with hidden cols on one side + // box width changes, boxX and scrollCol as for unhidden case + int xpos = 55 - boxWidth; // 55 is position in overview approx halfway + // between cols 60 and 70 + mouseClick(od, xpos, 0); + assertEquals(od.getBoxX(), xpos); + assertEquals(od.getBoxY(), 0); + assertEquals( + od.getBoxWidth(), + Math.round(boxWidth + (float) (lastHidden - firstHidden + 1) + * od.getWidth() / alwidth)); + assertEquals(od.getBoxHeight(), boxHeight); + assertEquals(od.getScrollCol(), + Math.round(xpos * alwidth / od.getWidth())); + assertEquals(od.getScrollRow(), 0); + + // move box so that it completely covers hidden cols + // box width changes, boxX and scrollCol as for hidden case + xpos = 33; + mouseClick(od, xpos, 0); + assertEquals(od.getBoxX(), xpos); + assertEquals(od.getBoxY(), 0); + assertEquals( + od.getBoxWidth(), + Math.round(boxWidth + (float) (lastHidden - firstHidden + 1) + * od.getWidth() / alwidth)); + assertEquals(od.getBoxHeight(), boxHeight); + assertEquals(od.getScrollCol(), + Math.round((float) xpos * alwidth / od.getWidth())); + assertEquals(od.getScrollRow(), 0); + + // move box so boxX is in hidden cols, box overhangs at right + // boxX and scrollCol at left of hidden area, box width extends across + // hidden region + xpos = 50; + mouseClick(od, xpos, 0); + assertEquals(od.getBoxX(), + Math.round((float) (firstHidden - 1) * od.getWidth() / alwidth)); + assertEquals(od.getBoxY(), 0); + assertEquals( + od.getBoxWidth(), + boxWidth + + Math.round((float) (lastHidden - firstHidden + 1) + * od.getWidth() / alwidth)); + assertEquals(od.getBoxHeight(), boxHeight); + assertEquals(od.getScrollCol(), firstHidden - 1); + assertEquals(od.getScrollRow(), 0); + + // move box so boxX is to right of hidden cols, but does not go beyond full + // width of alignment + // box width, boxX and scrollCol all as for non-hidden case + xpos = 75; + testBoxIsAtClickPoint(xpos, 0); + assertEquals(od.getScrollRow(), 0); + assertEquals(od.getScrollCol(), + Math.round(xpos * alwidth / od.getWidth()) + - (lastHidden - firstHidden + 1)); + + // move box so it goes beyond full width of alignment + // boxX, scrollCol adjusted back, box width normal + xpos = 3000; + mouseClick(od, xpos, 5); + assertEquals(od.getBoxX(), od.getWidth() - od.getBoxWidth()); + assertEquals(od.getBoxY(), 5); + assertEquals(od.getBoxWidth(), boxWidth); + assertEquals(od.getBoxHeight(), boxHeight); + assertEquals(od.getScrollCol(), + Math.round(((float) od.getBoxX() * alwidth / od.getWidth()) + - (lastHidden - firstHidden + 1))); + assertEquals(od.getScrollRow(), + Math.round((float) od.getBoxY() * alheight + / od.getSequencesHeight())); - @Test(groups = { "Functional" }) - public void testSetBoxPosWithHiddenColsMiddle() - { - AlignViewport av = af.getViewport(); - OverviewDimensions od = new OverviewDimensions(av); - av.setStartRes(50); - - // hiding columns before current position: changes boxX but not boxwidth - od.setBoxPosition(); - int prevBoxX = od.getBoxX(); - int prevWidth = od.getBoxWidth(); - - av.hideColumns(10, 20); - od.setBoxPosition(); - assertEquals(od.getBoxX(), 75); - assertTrue(prevBoxX < od.getBoxX()); - assertEquals(od.getBoxWidth(), prevWidth); - - // hiding columns after current position: changes end position but not start - // so scrollCol and boxX do not change but boxWidth does - prevWidth = od.getBoxWidth(); - - av.hideColumns(108, 110); - od.setBoxPosition(); - assertEquals(od.getBoxX(), prevBoxX); - assertEquals(od.getScrollCol(), 49); - // assertEquals(od2.getBoxWidth(), prevWidth + ((int) 2 * av.getCharWidth() - // / scalew)); } + /** + * Test setting of the box position, when there are hidden cols at the end of + * the alignment + */ @Test(groups = { "Functional" }) - public void testSetBoxPosWithHiddenRowsAtStart() + public void testFromMouseWithHiddenColsAtEnd() { - AlignViewport av = af.getViewport(); - OverviewDimensions od = new OverviewDimensions(av); - av.setStartRes(50); + od.updateViewportFromMouse(0, 0, al.getHiddenSequences(), hiddenCols, + posProps); + assertEquals(od.getBoxX(), 0); + assertEquals(od.getBoxY(), 0); + assertEquals(od.getBoxWidth(), boxWidth); + assertEquals(od.getScrollCol(), 0); + assertEquals(od.getScrollRow(), 0); + + // hide columns 140-164, no change to box position or dimensions + int firstHidden = 140; + int lastHidden = 164; + hiddenCols.hideColumns(firstHidden, lastHidden); + od.setBoxPosition(al.getHiddenSequences(), hiddenCols, posProps); + assertEquals(od.getBoxX(), 0); + assertEquals(od.getBoxY(), 0); + assertEquals(od.getBoxWidth(), boxWidth); + assertEquals(od.getScrollCol(), 0); + assertEquals(od.getScrollRow(), 0); + + // click to left of hidden cols, without overlapping + // boxX, scrollCol and width as normal + int xpos = 5; + testBoxIsAtClickPoint(xpos, 0); + assertEquals(od.getScrollRow(), 0); + assertEquals(od.getScrollCol(), + Math.round((float) xpos * alwidth / od.getWidth())); + + // click to left of hidden cols, with overlap + // boxX and scrollCol adjusted for hidden cols, width normal + xpos = Math.round((float) 145 * od.getWidth() / alwidth) - boxWidth; + mouseClick(od, xpos, 0); + assertEquals(od.getBoxX(), + Math.round((float) (firstHidden - 1) * od.getWidth() / alwidth) + - boxWidth + 1); + assertEquals(od.getBoxY(), 0); + assertEquals(od.getBoxWidth(), boxWidth); + assertEquals(od.getBoxHeight(), boxHeight); + assertEquals(od.getScrollCol(), + Math.round((float) od.getBoxX() * alwidth / od.getWidth())); + assertEquals(od.getScrollRow(), 0); + + // click in hidden cols + // boxX and scrollCol adjusted for hidden cols, width normal + xpos = 115; + assertEquals(od.getBoxX(), + Math.round((float) (firstHidden - 1) * od.getWidth() / alwidth) + - boxWidth + 1); + assertEquals(od.getBoxY(), 0); + assertEquals(od.getBoxWidth(), boxWidth); + assertEquals(od.getBoxHeight(), boxHeight); + assertEquals(od.getScrollCol(), + Math.round((float) od.getBoxX() * alwidth / od.getWidth())); + assertEquals(od.getScrollRow(), 0); - // account for hidden rows - SequenceI[] hidden = { seq2, seq3, seq4, seq5, seq6, seq7 }; - av.showAllHiddenColumns(); - av.hideSequence(hidden); - od.checkValid(); + // click off end of alignment + // boxX and scrollCol adjusted for hidden cols, width normal + xpos = 3000; + assertEquals(od.getBoxX(), + Math.round((float) (firstHidden - 1) * od.getWidth() / alwidth) + - boxWidth + 1); assertEquals(od.getBoxY(), 0); + assertEquals(od.getBoxWidth(), boxWidth); + assertEquals(od.getBoxHeight(), boxHeight); + assertEquals(od.getScrollCol(), + Math.round((float) od.getBoxX() * alwidth / od.getWidth())); assertEquals(od.getScrollRow(), 0); } @@ -518,44 +538,416 @@ public class OverviewDimensionsTest { @Test(groups = { "Functional" }) public void testSetBoxFromViewport() { - AlignViewport av = af.getViewport(); - OverviewDimensions od = new OverviewDimensions(av); - od.setBoxPosition(); - - float scalew = (float) od.getWidth() - / (av.getAlignment().getWidth() * av.getCharWidth()); - float scaleh = (float) od.getSequencesHeight() - / (av.getAlignment().getHeight() * av.getCharHeight()); - int boxWidth = (int) ((av.getEndRes() - av.getStartRes() + 1) - * av.getCharWidth() * scalew); - int boxHeight = (int) ((av.getEndSeq() - av.getStartSeq()) - * av.getCharHeight() * scaleh); - // move viewport to start of alignment - moveViewport(av, od, 0, 0); + moveViewport(0, 0); assertEquals(od.getBoxX(), 0); assertEquals(od.getBoxY(), 0); assertEquals(od.getBoxWidth(), boxWidth); assertEquals(od.getBoxHeight(), boxHeight); // move viewport to right - moveViewportH(av, od, 70); - assertEquals(od.getBoxX(), (int) (70 * scalew * av.getCharWidth())); + moveViewportH(70); + assertEquals(od.getBoxX(), + Math.round((float) 70 * od.getWidth() / alwidth)); assertEquals(od.getBoxY(), 0); assertEquals(od.getBoxWidth(), boxWidth); assertEquals(od.getBoxHeight(), boxHeight); // move viewport down - moveViewportV(av, od, 100); - assertEquals(od.getBoxX(), (int) (70 * scalew * av.getCharWidth())); - assertEquals(od.getBoxY(), (int) (100 * scaleh * av.getCharHeight())); + moveViewportV(100); + assertEquals(od.getBoxX(), + Math.round((float) 70 * od.getWidth() / alwidth)); + assertEquals(od.getBoxY(), + Math.round(100 * od.getSequencesHeight() / alheight)); assertEquals(od.getBoxWidth(), boxWidth); assertEquals(od.getBoxHeight(), boxHeight); // move viewport to bottom right - moveViewport(av, od, 98, 508); - assertEquals(od.getBoxX(), (int) (98 * scalew * av.getCharWidth())); - assertEquals(od.getBoxY(), (int) (508 * scaleh * av.getCharHeight())); + moveViewport(98, 508); + assertEquals(od.getBoxX(), + Math.round((float) 98 * od.getWidth() / alwidth)); + assertEquals(od.getBoxY(), + Math.round((float) 508 * od.getSequencesHeight() / alheight)); + assertEquals(od.getBoxWidth(), boxWidth); + assertEquals(od.getBoxHeight(), boxHeight); + } + + /** + * Test that the box position is set correctly when there are hidden columns + * at the start + */ + @Test(groups = { "Functional" }) + public void testSetBoxFromViewportHiddenColsAtStart() + { + int firstHidden = 0; + int lastHidden = 20; + hiddenCols.hideColumns(firstHidden, lastHidden); + + // move viewport to start of alignment + moveViewport(0, 0); + assertEquals(od.getBoxX(), + Math.round((float) (lastHidden + 1) * od.getWidth() / alwidth)); + assertEquals(od.getBoxY(), 0); + assertEquals(od.getBoxWidth(), boxWidth); + assertEquals(od.getBoxHeight(), boxHeight); + + // move viewport to end of alignment - need to make startRes by removing + // hidden cols because of how viewport/overview are implemented + moveViewport(98 - lastHidden - 1, 0); + assertEquals(od.getBoxX(), + Math.round((float) 98 * od.getWidth() / alwidth)); + assertEquals(od.getBoxY(), 0); + assertEquals(od.getBoxWidth(), boxWidth); + assertEquals(od.getBoxHeight(), boxHeight); + } + + /** + * Test that the box position is set correctly when there are hidden columns + * in the middle + */ + @Test(groups = { "Functional" }) + public void testSetBoxFromViewportHiddenColsInMiddle() + { + int firstHidden = 68; + int lastHidden = 78; + hiddenCols.hideColumns(firstHidden, lastHidden); + + // move viewport before hidden columns + moveViewport(3, 0); + + assertEquals(od.getBoxX(), + Math.round((float) 3 * od.getWidth() / alwidth)); + assertEquals(od.getBoxY(), 0); + System.out.println(od.getBoxWidth()); + assertEquals(od.getBoxWidth(), boxWidth); + System.out.println(od.getBoxWidth()); + assertEquals(od.getBoxHeight(), boxHeight); + + // move viewport to left of hidden columns with overlap + moveViewport(10, 0); + assertEquals(od.getBoxX(), + Math.round((float) 10 * od.getWidth() / alwidth)); + assertEquals(od.getBoxY(), 0); + assertEquals( + od.getBoxWidth(), + boxWidth + + Math.round((float) (lastHidden - firstHidden + 1) + * od.getWidth() / alwidth)); + assertEquals(od.getBoxHeight(), boxHeight); + + // move viewport to straddle hidden columns + moveViewport(63, 0); + assertEquals(od.getBoxX(), + Math.round((float) 63 * od.getWidth() / alwidth)); + assertEquals(od.getBoxY(), 0); + assertEquals( + od.getBoxWidth(), + boxWidth + + Math.round((lastHidden - firstHidden + 1) + * od.getWidth() / alwidth)); + assertEquals(od.getBoxHeight(), boxHeight); + + // move viewport to right of hidden columns, no overlap + moveViewport(80 - (lastHidden - firstHidden + 1), 0); + assertEquals(od.getBoxX(), + Math.round((float) 80 * od.getWidth() / alwidth)); + assertEquals(od.getBoxY(), 0); + assertEquals(od.getBoxWidth(), boxWidth); + assertEquals(od.getBoxHeight(), boxHeight); + + } + + /** + * Test that the box position is set correctly when there are hidden columns + * at the end + */ + @Test(groups = { "Functional" }) + public void testSetBoxFromViewportHiddenColsAtEnd() + { + int firstHidden = 152; + int lastHidden = 164; + hiddenCols.hideColumns(firstHidden, lastHidden); + + // move viewport before hidden columns + moveViewport(3, 0); + assertEquals(od.getBoxX(), + Math.round((float) 3 * od.getWidth() / alwidth)); + assertEquals(od.getBoxY(), 0); + assertEquals(od.getBoxWidth(), boxWidth); + assertEquals(od.getBoxHeight(), boxHeight); + + // move viewport to hidden columns + moveViewport(102, 0); + assertEquals(od.getBoxX(), + Math.round((float) 102 * od.getWidth() / alwidth)); + assertEquals(od.getBoxY(), 0); + assertEquals(od.getBoxWidth(), boxWidth + + Math.round((float) (lastHidden - firstHidden + 1) + * od.getWidth() / alwidth)); + assertEquals(od.getBoxHeight(), boxHeight); + } + + /** + * Test that the box position is set correctly when there are hidden rows at + * the start + */ + @Test(groups = { "Functional" }) + public void testSetBoxFromViewportHiddenRowsAtStart() + { + int firstHidden = 0; + int lastHidden = 20; + hideSequences(firstHidden, lastHidden); + + // move viewport to start of alignment: + // box moves to below hidden rows, height remains same + moveViewport(0, 0); + assertEquals(od.getBoxX(), 0); + assertEquals(od.getBoxY(), + Math.round((float) (lastHidden + 1) * od.getSequencesHeight() + / alheight)); + assertEquals(od.getBoxWidth(), boxWidth); + assertEquals(od.getBoxHeight(), boxHeight); + + // move viewport to end of alignment + moveViewport(0, 525 - viewHeight - lastHidden - 1); + assertEquals(od.getBoxX(), 0); + assertEquals( + od.getBoxY(), + Math.round((float) (525 - viewHeight) * od.getSequencesHeight() + / alheight)); + assertEquals(od.getBoxWidth(), boxWidth); + assertEquals(od.getBoxHeight(), boxHeight); + } + + /** + * Test that the box position is set correctly when there are hidden rows in + * the middle + */ + @Test(groups = { "Functional" }) + public void testSetBoxFromViewportHiddenRowsInMiddle() + { + int firstHidden = 200; + int lastHidden = 210; + hideSequences(firstHidden, lastHidden); + + // move viewport to start of alignment: + // box, height etc as in non-hidden case + moveViewport(0, 0); + assertEquals(od.getBoxX(), 0); + assertEquals(od.getBoxY(), 0); + assertEquals(od.getBoxWidth(), boxWidth); + assertEquals(od.getBoxHeight(), boxHeight); + + // move viewport to straddle hidden rows + moveViewport(0, 198); + assertEquals(od.getBoxX(), 0); + assertEquals(od.getBoxY(), Math.round ((float)198 * od.getSequencesHeight() + / alheight)); + assertEquals(od.getBoxWidth(), boxWidth); + assertEquals( + od.getBoxHeight(), + Math.round((float) (viewHeight + lastHidden - firstHidden + 1) + * od.getSequencesHeight() / alheight)); + } + + /** + * Test that the box position is set correctly when there are hidden rows at + * the bottom + */ + @Test(groups = { "Functional" }) + public void testSetBoxFromViewportHiddenRowsAtEnd() + { + int firstHidden = 500; + int lastHidden = 524; + hideSequences(firstHidden, lastHidden); + + // move viewport to start of alignment: + // box, height etc as in non-hidden case + moveViewport(0, 0); + assertEquals(od.getBoxX(), 0); + assertEquals(od.getBoxY(), 0); + assertEquals(od.getBoxWidth(), boxWidth); + assertEquals(od.getBoxHeight(), boxHeight); + + // move viewport to end of alignment + // viewport sits above hidden rows and does not include them + moveViewport(0, firstHidden - viewHeight - 1); + assertEquals(od.getBoxX(), 0); + assertEquals( + od.getBoxY(), + Math.round((float) (firstHidden - viewHeight - 1) + * od.getSequencesHeight() / alheight)); + assertEquals(od.getBoxWidth(), boxWidth); + assertEquals(od.getBoxHeight(), boxHeight); + + } + + /** + * Test setting of the box position, when there are hidden rows at the start + * of the alignment + */ + @Test(groups = { "Functional" }) + public void testFromMouseWithHiddenRowsAtStart() + { + od.updateViewportFromMouse(0, 0, al.getHiddenSequences(), hiddenCols, + posProps); + assertEquals(od.getBoxX(), 0); + assertEquals(od.getBoxY(), 0); + assertEquals(od.getBoxHeight(), boxHeight); + assertEquals(od.getBoxWidth(), boxWidth); + assertEquals(od.getScrollCol(), 0); + assertEquals(od.getScrollRow(), 0); + + // hide rows at start and check updated box position is correct + // changes boxY but not boxheight + int lastHiddenRow = 30; + hideSequences(0, lastHiddenRow); + + od.setBoxPosition(al.getHiddenSequences(), hiddenCols, posProps); + assertEquals(od.getBoxX(), 0); + assertEquals(od.getBoxY(), + Math.round((float) (lastHiddenRow + 1) + * od.getSequencesHeight() / alheight)); + assertEquals(od.getBoxWidth(), boxWidth); + assertEquals(od.getBoxHeight(), boxHeight); + + // click in hidden rows - same result + mouseClick(od, 0, 0); + assertEquals(od.getBoxX(), 0); + assertEquals( + od.getBoxY(), + Math.round((float) (lastHiddenRow + 1) + * od.getSequencesHeight() / alheight)); + assertEquals(od.getBoxWidth(), boxWidth); + assertEquals(od.getBoxHeight(), boxHeight); + + // click below hidden rows + mouseClick(od, 0, 150); + assertEquals(od.getBoxX(), 0); + assertEquals(od.getBoxY(), 150); + assertEquals(od.getBoxWidth(), boxWidth); + assertEquals(od.getBoxHeight(), boxHeight); + } + + /** + * Test setting of the box position, when there are hidden rows at the middle + * of the alignment + */ + @Test(groups = { "Functional" }) + public void testFromMouseWithHiddenRowsInMiddle() + { + od.updateViewportFromMouse(0, 0, al.getHiddenSequences(), hiddenCols, + posProps); + + assertEquals(od.getBoxX(), 0); + assertEquals(od.getBoxY(), 0); + assertEquals(od.getBoxWidth(), boxWidth); + assertEquals(od.getBoxHeight(), boxHeight); + assertEquals(od.getScrollCol(), 0); + assertEquals(od.getScrollRow(), 0); + + // hide rows in middle and check updated box position is correct + // no changes + int firstHiddenRow = 50; + int lastHiddenRow = 54; + hideSequences(firstHiddenRow, lastHiddenRow); + + od.setBoxPosition(al.getHiddenSequences(), hiddenCols, posProps); + + assertEquals(od.getBoxX(), 0); + assertEquals(od.getBoxY(), 0); + assertEquals(od.getBoxWidth(), boxWidth); + assertEquals(od.getBoxHeight(), boxHeight); + + // click above hidden rows, so that box overlaps + int ypos = 35; // column value in residues + mouseClick(od, 0, + Math.round((float) ypos * od.getSequencesHeight() / alheight)); + assertEquals(od.getBoxX(), 0); + assertEquals(od.getBoxY(), + Math.round((float) ypos * od.getSequencesHeight() / alheight)); + assertEquals(od.getBoxWidth(), boxWidth); + assertEquals( + od.getBoxHeight(), + boxHeight + + Math.round((float) (lastHiddenRow - firstHiddenRow + 1) + * od.getSequencesHeight() / alheight)); + + // click so that box straddles hidden rows + ypos = 44; // column value in residues + mouseClick(od, 0, + Math.round((float) ypos * od.getSequencesHeight() / alheight)); + assertEquals(od.getBoxX(), 0); + assertEquals(od.getBoxY(), + Math.round((float) ypos * od.getSequencesHeight() / alheight)); + assertEquals(od.getBoxWidth(), boxWidth); + assertEquals( + od.getBoxHeight(), + boxHeight + + Math.round((float) (lastHiddenRow - firstHiddenRow + 1) + * od.getSequencesHeight() / alheight)); + } + + /** + * Test setting of the box position, when there are hidden rows at the end of + * the alignment + */ + @Test(groups = { "Functional" }) + public void testFromMouseWithHiddenRowsAtEnd() + { + od.updateViewportFromMouse(0, 0, al.getHiddenSequences(), hiddenCols, + posProps); + assertEquals(od.getBoxX(), 0); + assertEquals(od.getBoxY(), 0); + assertEquals(od.getBoxWidth(), boxWidth); + assertEquals(od.getBoxHeight(), boxHeight); + assertEquals(od.getScrollCol(), 0); + assertEquals(od.getScrollRow(), 0); + + // hide rows at end and check updated box position is correct + // no changes + int firstHidden = 500; + int lastHidden = 524; + hideSequences(firstHidden, lastHidden); + + od.setBoxPosition(al.getHiddenSequences(), hiddenCols, posProps); + assertEquals(od.getBoxX(), 0); + assertEquals(od.getBoxY(), 0); + assertEquals(od.getBoxWidth(), boxWidth); + assertEquals(od.getBoxHeight(), boxHeight); + + // click above hidden rows + int ypos = 40; // row 40 + mouseClick(od, 0, + Math.round((float) ypos * od.getSequencesHeight() / alheight)); + assertEquals(od.getBoxX(), 0); + assertEquals(od.getBoxY(), + Math.round((float) ypos * od.getSequencesHeight() / alheight)); + assertEquals(od.getBoxWidth(), boxWidth); + assertEquals(od.getBoxHeight(), boxHeight); + + // click above hidden rows so box overlaps + // boxY moved upwards, boxHeight remains same + ypos = 497; // row 497 + mouseClick(od, 0, + Math.round((float) ypos * od.getSequencesHeight() / alheight)); + assertEquals(od.getBoxX(), 0); + assertEquals( + od.getBoxY(), + Math.round((float) (firstHidden - viewHeight) + * od.getSequencesHeight() / alheight)); + assertEquals(od.getBoxWidth(), boxWidth); + assertEquals(od.getBoxHeight(), boxHeight); + + // click within hidden rows + ypos = 505; + mouseClick(od, 0, + Math.round((float) ypos * od.getSequencesHeight() / alheight)); + assertEquals(od.getBoxX(), 0); + assertEquals( + od.getBoxY(), + Math.round((firstHidden - viewHeight) * od.getSequencesHeight() + / alheight)); assertEquals(od.getBoxWidth(), boxWidth); assertEquals(od.getBoxHeight(), boxHeight); } @@ -563,40 +955,33 @@ public class OverviewDimensionsTest { /* * Move viewport horizontally: startRes + previous width gives new horizontal extent. Vertical extent stays the same. */ - private void moveViewportH(AlignViewport av, OverviewDimensions od, - int startRes) + private void moveViewportH(int startRes) { - int width = av.getEndRes() - av.getStartRes(); - av.setStartRes(startRes); - av.setEndRes(startRes + width); - od.setBoxPosition(); + posProps.setStartRes(startRes); + posProps.setEndRes(startRes + viewWidth - 1); + od.setBoxPosition(al.getHiddenSequences(), hiddenCols, posProps); } /* * Move viewport vertically: startSeq and endSeq give new vertical extent. Horizontal extent stays the same. */ - private void moveViewportV(AlignViewport av, OverviewDimensions od, - int startSeq) + private void moveViewportV(int startSeq) { - int height = av.getEndSeq() - av.getStartSeq(); - av.setStartSeq(startSeq); - av.setEndSeq(startSeq + height); - od.setBoxPosition(); + posProps.setStartSeq(startSeq); + posProps.setEndSeq(startSeq + viewHeight - 1); + od.setBoxPosition(al.getHiddenSequences(), hiddenCols, posProps); } /* * Move viewport horizontally and vertically. */ - private void moveViewport(AlignViewport av, OverviewDimensions od, - int startRes, int startSeq) + private void moveViewport(int startRes, int startSeq) { - int width = av.getEndRes() - av.getStartRes(); - int height = av.getEndSeq() - av.getStartSeq(); - av.setStartRes(startRes); - av.setEndRes(startRes + width); - av.setStartSeq(startSeq); - av.setEndSeq(startSeq + height); - od.setBoxPosition(); + posProps.setStartRes(startRes); + posProps.setEndRes(startRes + viewWidth - 1); + posProps.setStartSeq(startSeq); + posProps.setEndSeq(startSeq + viewHeight - 1); + od.setBoxPosition(al.getHiddenSequences(), hiddenCols, posProps); } /* @@ -604,19 +989,48 @@ public class OverviewDimensionsTest { */ private void mouseClick(OverviewDimensions od, int x, int y) { - od.setBoxX(x); - od.setBoxY(y); - od.checkValid(); + od.updateViewportFromMouse(x, y, al.getHiddenSequences(), hiddenCols, + posProps); + // updates require an OverviewPanel to exist which it doesn't here // so call setBoxPosition() as it would be called by the AlignmentPanel // normally - AlignViewport av = af.getViewport(); - int width = av.getEndRes() - av.getStartRes(); - int height = av.getEndSeq() - av.getStartSeq(); - av.setStartRes(od.getScrollCol()); - av.setEndRes(od.getScrollCol() + width); - av.setStartSeq(od.getScrollRow()); - av.setEndSeq(od.getScrollRow() + height); - od.setBoxPosition(); + + posProps.setStartRes(od.getScrollCol()); + posProps.setEndRes(od.getScrollCol() + viewWidth - 1); + posProps.setStartSeq(od.getScrollRow()); + posProps.setEndSeq(od.getScrollRow() + viewHeight - 1); + od.setBoxPosition(al.getHiddenSequences(), hiddenCols, posProps); + } + + /* + * Test that the box is positioned with the top left corner at xpos, ypos + * and with the original width and height + */ + private void testBoxIsAtClickPoint(int xpos, int ypos) + { + mouseClick(od, xpos, ypos); + assertEquals(od.getBoxX(), xpos); + assertEquals(od.getBoxY(), ypos); + assertEquals(od.getBoxWidth(), boxWidth); + assertEquals(od.getBoxHeight(), boxHeight); + + } + + /* + * Hide sequences between start and end + */ + private void hideSequences(int start, int end) + { + SequenceI[] allseqs = al.getSequencesArray(); + SequenceGroup theseSeqs = new SequenceGroup(); + + for (int i = start; i <= end; i++) + { + theseSeqs.addSequence(allseqs[i], false); + al.getHiddenSequences().hideSequence(allseqs[i]); + } + + hiddenRepSequences.put(allseqs[start], theseSeqs); } }