X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=test%2Fjalview%2Fviewmodel%2FOverviewDimensionsTest.java;h=d01eaa3cb614f68370af030809ee41e4f3339d79;hb=41f78bdf2b0650fa7fde4959a7b9d58fd5c77c71;hp=39506fcdb5c7f2e08d3cbf1ae3494d3af9c8e288;hpb=29933a3d76e0a2517ac59307adb40a73204ceacf;p=jalview.git diff --git a/test/jalview/viewmodel/OverviewDimensionsTest.java b/test/jalview/viewmodel/OverviewDimensionsTest.java index 39506fc..d01eaa3 100644 --- a/test/jalview/viewmodel/OverviewDimensionsTest.java +++ b/test/jalview/viewmodel/OverviewDimensionsTest.java @@ -21,17 +21,20 @@ 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.datamodel.Alignment; import jalview.datamodel.Sequence; import jalview.datamodel.SequenceI; +import jalview.gui.AlignFrame; import jalview.gui.AlignViewport; -import jalview.gui.JvOptionPane; +import jalview.io.DataSourceType; +import jalview.io.FileLoader; import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; public class OverviewDimensionsTest { @@ -126,27 +129,49 @@ public class OverviewDimensionsTest { "Seq22", "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC" + "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC" + + "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC" + + "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC" + "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC"); SequenceI seq23 = new Sequence( "Seq23", "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC"); + AlignFrame af; - @BeforeClass(alwaysRun = true) + @BeforeMethod(alwaysRun = true) public void setUp() { - JvOptionPane.setInteractiveMode(false); - JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION); - 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) + { + while (af.getViewport().getConsensusSeq() == null) + { + try + { + wait(50); + } catch (InterruptedException e) + { + } + } + } // get cached setting for showConservation // reset it in AfterClass! showConservationSetting = Cache.getDefault("SHOW_CONSERVATION", true); } + @AfterClass(alwaysRun = true) public void tearDown() { @@ -159,131 +184,199 @@ public class OverviewDimensionsTest { * correctly */ @Test(groups = { "Functional" }) - public void testConstructor() - { - SequenceI seqa = new Sequence("Seq1", "ABC"); - SequenceI seqb = new Sequence("Seq2", "ABC"); - SequenceI seqc = new Sequence("Seq3", "ABC"); - SequenceI seqd = new Sequence("Seq4", "ABC"); - SequenceI seqe = new Sequence("Seq5", - "ABCABCABCABCABCABCABCABCBACBACBACBAC"); - - 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); - - OverviewDimensions od = new OverviewDimensions(av1); - assertEquals(od.getGraphHeight(), 20); - assertEquals(od.getSequencesHeight(), 266); - assertEquals(od.getWidth(), 400); - assertEquals(od.getHeight(), 286); - - // 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); - - od = new OverviewDimensions(av2); - assertEquals(od.getGraphHeight(), 20); - assertEquals(od.getSequencesHeight(), 300); - assertEquals(od.getWidth(), 300); - assertEquals(od.getHeight(), 320); - - // test for alignment with width > height and sequence height scaled below - // min value - SequenceI[] seqs3 = new SequenceI[] { seqe }; - Alignment al3 = new Alignment(seqs3); - al3.setDataset(null); - AlignViewport av3 = new AlignViewport(al3); - - od = new OverviewDimensions(av3); - assertEquals(od.getGraphHeight(), 20); - assertEquals(od.getSequencesHeight(), 40); - assertEquals(od.getWidth(), 400); - assertEquals(od.getHeight(), 60); - - // test for alignment with width < height and width scaled below min value - 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); - - od = new OverviewDimensions(av4); - assertEquals(od.getGraphHeight(), 20); - assertEquals(od.getSequencesHeight(), 300); - assertEquals(od.getWidth(), 120); - assertEquals(od.getHeight(), 320); - - // 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); - - od = new OverviewDimensions(av5); - assertEquals(od.getGraphHeight(), 0); - assertEquals(od.getSequencesHeight(), 300); - assertEquals(od.getWidth(), 120); - assertEquals(od.getHeight(), 300); - } + public void testConstructor() + { + SequenceI seqa = new Sequence("Seq1", "ABC"); + SequenceI seqb = new Sequence("Seq2", "ABC"); + SequenceI seqc = new Sequence("Seq3", "ABC"); + SequenceI seqd = new Sequence("Seq4", "ABC"); + SequenceI seqe = new Sequence("Seq5", + "ABCABCABCABCABCABCABCABCBACBACBACBAC"); + + int defaultGraphHeight = 20; + int maxWidth = 400; + int minWidth = 120; + 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); + + OverviewDimensions od = new OverviewDimensions(av1); + int scaledHeight = 266; + assertEquals(od.getGraphHeight(), defaultGraphHeight); + assertEquals(od.getSequencesHeight(), scaledHeight); + assertEquals(od.getWidth(), maxWidth); + assertEquals(od.getHeight(), scaledHeight + defaultGraphHeight); + + // 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); + + od = new OverviewDimensions(av2); + int scaledWidth = 300; + assertEquals(od.getGraphHeight(), defaultGraphHeight); + assertEquals(od.getSequencesHeight(), maxSeqHeight); + assertEquals(od.getWidth(), scaledWidth); + assertEquals(od.getHeight(), scaledWidth + defaultGraphHeight); + + // test for alignment with width > height and sequence height scaled below + // min value + SequenceI[] seqs3 = new SequenceI[] { seqe }; + Alignment al3 = new Alignment(seqs3); + al3.setDataset(null); + AlignViewport av3 = new AlignViewport(al3); + + od = new OverviewDimensions(av3); + assertEquals(od.getGraphHeight(), defaultGraphHeight); + assertEquals(od.getSequencesHeight(), minSeqHeight); + assertEquals(od.getWidth(), maxWidth); + assertEquals(od.getHeight(), minSeqHeight + defaultGraphHeight); + + // test for alignment with width < height and width scaled below min value + 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); + + od = new OverviewDimensions(av4); + 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); + + od = new OverviewDimensions(av5); + assertEquals(od.getGraphHeight(), 0); + assertEquals(od.getSequencesHeight(), maxSeqHeight); + assertEquals(od.getWidth(), minWidth); + assertEquals(od.getHeight(), maxSeqHeight); + } /** * 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 + * 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 checkValidNoHidden() + public void testSetBoxFromMouseClick() { - seq23.setStart(386); - 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); + AlignViewport av = af.getViewport(); + OverviewDimensions od = new OverviewDimensions(av); // Initial box sizing - default path through code - 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); + od.checkValid(); assertEquals(od.getBoxX(), 0); assertEquals(od.getBoxY(), 0); - assertEquals(od.getBoxWidth(), 399); + assertEquals(od.getBoxWidth(), boxWidth); assertEquals(od.getScrollCol(), 0); assertEquals(od.getScrollRow(), 0); // negative boxX value reset to 0 - od.setBoxX(-5); - od.checkValid(); + mouseClick(od, -5, 10); assertEquals(od.getBoxX(), 0); + assertEquals(od.getBoxWidth(), boxWidth); + assertEquals(od.getBoxHeight(), boxHeight); + assertEquals(od.getScrollRow(), + (int) (10 / scaleh / av.getCharHeight())); + assertEquals(od.getScrollCol(), 0); // negative boxY value reset to 0 - od.setBoxY(-2); - od.checkValid(); + mouseClick(od, 6, -2); assertEquals(od.getBoxY(), 0); + assertEquals(od.getBoxWidth(), boxWidth); + assertEquals(od.getBoxHeight(), boxHeight); + assertEquals(od.getScrollCol(), (int) (6 / scalew / av.getCharWidth())); + assertEquals(od.getScrollRow(), 0); // overly large boxX value reset to width-boxWidth - od.setBoxX(100); - od.checkValid(); - assertEquals(od.getBoxX(), od.getWidth() - od.getBoxWidth()); - - // startRes non-zero - av.setStartRes(50); - OverviewDimensions od2 = new OverviewDimensions(av); - od2.setBoxPosition(); - od2.checkValid(); - assertEquals(od2.getBoxX(), 61); - assertEquals(od2.getScrollCol(), 49); + mouseClick(od, 100, 6); + assertEquals(od.getBoxX(), od.getWidth() - od.getBoxWidth(), 1.5); + assertEquals(od.getBoxY(), 6, 1.5); + assertEquals(od.getBoxWidth(), boxWidth); + assertEquals(od.getBoxHeight(), boxHeight); + assertEquals(od.getScrollCol(), + (od.getBoxX() / scalew / av.getCharWidth()), 1.5); + assertEquals(od.getScrollRow(), + (od.getBoxY() / scaleh / av.getCharHeight()), 1.5); + + // 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.getBoxWidth(), boxWidth); + assertEquals(od.getBoxHeight(), boxHeight, 1.5); + assertEquals(od.getScrollCol(), + (od.getBoxX() / scalew / av.getCharWidth()), 1.5); + assertEquals(od.getScrollRow(), + (od.getBoxY() / scaleh / av.getCharHeight()), 1.5); + + // click past end of alignment, as above + mouseClick(od, 3000, 5); + assertEquals(od.getBoxX(), od.getWidth() - od.getBoxWidth(), 1.5); + assertEquals(od.getBoxWidth(), boxWidth); + assertEquals(od.getBoxHeight(), boxHeight, 1.5); + assertEquals(od.getScrollCol(), + (od.getBoxX() / scalew / av.getCharWidth()), 1.5); + assertEquals(od.getScrollRow(), + (od.getBoxY() / scaleh / av.getCharHeight()), 1.5); + + // move viewport so startRes non-zero and then mouseclick + moveViewportH(av, od, 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.getBoxWidth(), boxWidth); + assertEquals(od.getBoxHeight(), boxHeight, 1.5); + assertEquals(od.getScrollCol(), + (od.getBoxX() / scalew / av.getCharWidth()), 1.5); + assertEquals(od.getBoxY(), oldboxy + 2, 1.5); + assertEquals(od.getScrollRow(), + (od.getBoxY() / scaleh / av.getCharHeight()), 1.5); + + // click at top corner + mouseClick(od, 0, 0); + assertEquals(od.getBoxX(), 0); + assertEquals(od.getScrollCol(), 0); + assertEquals(od.getBoxY(), 0); + assertEquals(od.getScrollRow(), 0); + assertEquals(od.getBoxWidth(), boxWidth); + assertEquals(od.getBoxHeight(), boxHeight, 1.5); } /** @@ -291,41 +384,79 @@ public class OverviewDimensionsTest { * of the alignment */ @Test(groups = { "Functional" }) - public void testSetBoxPosWithHiddenColsAtStart() + public void testFromMouseWithHiddenColsAtStart() { - seq23.setStart(386); - 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); - - av.setStartRes(50); + AlignViewport av = af.getViewport(); OverviewDimensions od = new OverviewDimensions(av); - // hiding columns before current position: changes boxX but not scrollCol or - // boxwidth - - // do a reset - av.showAllHiddenColumns(); + // 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(); - int prevWidth = od.getBoxWidth(); + assertEquals(od.getBoxX(), 0); + assertEquals(od.getBoxY(), 0); + assertEquals(od.getBoxWidth(), boxWidth); + assertEquals(od.getScrollCol(), 0); + assertEquals(od.getScrollRow(), 0); // hide cols at start and check updated box position is correct - // changes boxX but not scrollCol or boxwidth - int lastHiddenCol = 50; - av.hideColumns(0, 50); + // changes boxX but not boxwidth + int lastHiddenCol = 30; + av.hideColumns(0, lastHiddenCol); od.setBoxPosition(); - assertEquals(od.getBoxX(), 124); - assertEquals(od.getScrollCol(), lastHiddenCol - 1); - assertEquals(od.getBoxWidth(), prevWidth); + assertEquals(od.getBoxX(), + (int) ((lastHiddenCol + 1) * scalew * av.getCharWidth())); + 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.getBoxY(), 0); + assertEquals(od.getBoxWidth(), boxWidth); + assertEquals(od.getBoxHeight(), boxHeight); + assertEquals(od.getScrollRow(), 0); + assertEquals(od.getScrollCol(), + (int) (xpos / scalew / av.getCharWidth())); + + // 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); + assertEquals(od.getScrollRow(), 0); + assertEquals(od.getScrollCol(), + (int) (xpos / scalew / av.getCharWidth())); - // set the box position by moving viewport & check it goes to the right - // place + // click to right of hidden columns such that box runs over right hand side + // of alignment + // box position is adjusted away from the edge + // 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.getBoxY(), 5); + assertEquals(od.getBoxWidth(), boxWidth); + assertEquals(od.getBoxHeight(), boxHeight); + assertEquals(od.getScrollCol(), + (int) (xpos / scalew / av.getCharWidth())); + assertEquals(od.getScrollRow(), + (int) (od.getBoxY() / scaleh / av.getCharHeight())); - // update the box position via mouse and check it goes to the right place } @Test(groups = { "Functional" }) @@ -337,25 +468,28 @@ public class OverviewDimensionsTest { @Test(groups = { "Functional" }) public void testSetBoxPosWithHiddenColsMiddle() { - seq23.setStart(386); - 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); - - av.setStartRes(50); + 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 - float scalew = od.getWidth() / al.getWidth(); - int prevWidth = od.getBoxWidth(); - int prevX = od.getBoxX(); + prevWidth = od.getBoxWidth(); + av.hideColumns(108, 110); od.setBoxPosition(); - assertEquals(od.getBoxX(), prevX); + assertEquals(od.getBoxX(), prevBoxX); assertEquals(od.getScrollCol(), 49); // assertEquals(od2.getBoxWidth(), prevWidth + ((int) 2 * av.getCharWidth() // / scalew)); @@ -364,16 +498,9 @@ public class OverviewDimensionsTest { @Test(groups = { "Functional" }) public void testSetBoxPosWithHiddenRowsAtStart() { - seq23.setStart(386); - 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); - - av.setStartRes(50); + AlignViewport av = af.getViewport(); OverviewDimensions od = new OverviewDimensions(av); + av.setStartRes(50); // account for hidden rows SequenceI[] hidden = { seq2, seq3, seq4, seq5, seq6, seq7 }; @@ -384,62 +511,112 @@ public class OverviewDimensionsTest { assertEquals(od.getScrollRow(), 0); } - /** - * Test that the box position is set correctly - */ + /** + * Test that the box position is set correctly when set from the viewport, + * with no hidden rows or columns + */ @Test(groups = { "Functional" }) - public void setBoxPosition() - { - - 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); - - // Test box is in expected location when there are no hidden rows or columns - - OverviewDimensions od = new OverviewDimensions(av); - od.setBoxPosition(); - - assertEquals(od.getBoxHeight(), 81); - assertEquals(od.getBoxWidth(), 400); - assertEquals(od.getBoxX(), 0); - assertEquals(od.getBoxY(), 0); - - // Account for hidden rows - SequenceI[] hidden = { seq2, seq3, seq4 }; - av.hideSequence(hidden); - - OverviewDimensions od1 = new OverviewDimensions(av); - od1.setBoxPosition(); + public void testSetBoxFromViewport() + { + AlignViewport av = af.getViewport(); + OverviewDimensions od = new OverviewDimensions(av); + od.setBoxPosition(); - assertEquals(od1.getBoxHeight(), 80); - assertEquals(od1.getBoxWidth(), 400); - assertEquals(od1.getBoxX(), 0); - assertEquals(od1.getBoxY(), 0); + 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); + assertEquals(od.getBoxX(), 0); + assertEquals(od.getBoxY(), 0); + assertEquals(od.getBoxWidth(), boxWidth); + assertEquals(od.getBoxHeight(), boxHeight); - // Account for hidden columns - av.hideColumns(10, 15); - av.showAllHiddenSeqs(); + // move viewport to right + moveViewportH(av, od, 70); + assertEquals(od.getBoxX(), (int) (70 * scalew * av.getCharWidth())); + 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())); + 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())); + assertEquals(od.getBoxWidth(), boxWidth); + assertEquals(od.getBoxHeight(), boxHeight); + } - OverviewDimensions od2 = new OverviewDimensions(av); - od2.setBoxPosition(); + /* + * Move viewport horizontally: startRes + previous width gives new horizontal extent. Vertical extent stays the same. + */ + private void moveViewportH(AlignViewport av, OverviewDimensions od, + int startRes) + { + int width = av.getEndRes() - av.getStartRes(); + av.setStartRes(startRes); + av.setEndRes(startRes + width); + od.setBoxPosition(); + } - assertEquals(od2.getBoxHeight(), 81); - assertEquals(od2.getBoxWidth(), 422); - assertEquals(od2.getBoxX(), 0); - assertEquals(od2.getBoxY(), 0); + /* + * Move viewport vertically: startSeq and endSeq give new vertical extent. Horizontal extent stays the same. + */ + private void moveViewportV(AlignViewport av, OverviewDimensions od, + int startSeq) + { + int height = av.getEndSeq() - av.getStartSeq(); + av.setStartSeq(startSeq); + av.setEndSeq(startSeq + height); + od.setBoxPosition(); + } - // Account for hidden rows and cols - av.hideSequence(hidden); - OverviewDimensions od3 = new OverviewDimensions(av); - od3.setBoxPosition(); + /* + * Move viewport horizontally and vertically. + */ + private void moveViewport(AlignViewport av, OverviewDimensions od, + 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(); + } - assertEquals(od3.getBoxHeight(), 80); - assertEquals(od3.getBoxWidth(), 422); - assertEquals(od3.getBoxX(), 0); - assertEquals(od3.getBoxY(), 0); + /* + * Mouse click as position x,y in overview window + */ + private void mouseClick(OverviewDimensions od, int x, int y) + { + od.setBoxX(x); + od.setBoxY(y); + od.checkValid(); + // 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(); } }