/* * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) * Copyright (C) $$Year-Rel$$ The Jalview Authors * * This file is part of Jalview. * * Jalview is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation, either version 3 * of the License, or (at your option) any later version. * * Jalview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Jalview. If not, see . * The Jalview Authors are detailed in the 'AUTHORS' file. */ package jalview.gui; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertTrue; import jalview.api.AlignViewportI; import jalview.bin.Cache; import jalview.bin.Jalview; import jalview.datamodel.Alignment; import jalview.datamodel.AlignmentI; import jalview.datamodel.Sequence; import jalview.datamodel.SequenceI; import jalview.gui.SeqPanel.MousePos; import jalview.io.DataSourceType; import jalview.io.FileLoader; import java.awt.Event; import java.awt.event.MouseEvent; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; public class SeqPanelTest { AlignFrame af; @BeforeClass(alwaysRun = true) public void setUpJvOptionPane() { JvOptionPane.setInteractiveMode(false); JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION); } @Test(groups = "Functional") public void testSetStatusReturnsNearestResiduePosition() { SequenceI seq1 = new Sequence("Seq1", "AACDE"); SequenceI seq2 = new Sequence("Seq2", "AA--E"); AlignmentI al = new Alignment(new SequenceI[] { seq1, seq2 }); AlignFrame alignFrame = new AlignFrame(al, al.getWidth(), al.getHeight()); AlignmentI visAl = alignFrame.getViewport().getAlignment(); // Test either side of gap assertEquals( alignFrame.alignPanel.getSeqPanel().setStatusMessage( visAl.getSequenceAt(1), 1, 1), 2); assertEquals(alignFrame.statusBar.getText(), "Sequence 2 ID: Seq2 Residue: ALA (2)"); assertEquals( alignFrame.alignPanel.getSeqPanel().setStatusMessage( visAl.getSequenceAt(1), 4, 1), 3); assertEquals(alignFrame.statusBar.getText(), "Sequence 2 ID: Seq2 Residue: GLU (3)"); // no status message at a gap, returns next residue position to the right assertEquals( alignFrame.alignPanel.getSeqPanel().setStatusMessage( visAl.getSequenceAt(1), 2, 1), 3); assertEquals(alignFrame.statusBar.getText(), "Sequence 2 ID: Seq2"); assertEquals( alignFrame.alignPanel.getSeqPanel().setStatusMessage( visAl.getSequenceAt(1), 3, 1), 3); assertEquals(alignFrame.statusBar.getText(), "Sequence 2 ID: Seq2"); } @Test(groups = "Functional") public void testAmbiguousAminoAcidGetsStatusMessage() { SequenceI seq1 = new Sequence("Seq1", "ABCDE"); SequenceI seq2 = new Sequence("Seq2", "AB--E"); AlignmentI al = new Alignment(new SequenceI[] { seq1, seq2 }); AlignFrame alignFrame = new AlignFrame(al, al.getWidth(), al.getHeight()); AlignmentI visAl = alignFrame.getViewport().getAlignment(); assertEquals( alignFrame.alignPanel.getSeqPanel().setStatusMessage( visAl.getSequenceAt(1), 1, 1), 2); assertEquals(alignFrame.statusBar.getText(), "Sequence 2 ID: Seq2 Residue: B (2)"); } @Test(groups = "Functional") public void testFindMousePosition_unwrapped() { String seqData = ">Seq1\nAACDE\n>Seq2\nAA--E\n"; AlignFrame alignFrame = new FileLoader().LoadFileWaitTillLoaded(seqData, DataSourceType.PASTE); AlignViewportI av = alignFrame.getViewport(); av.setShowAnnotation(true); av.setWrapAlignment(false); final int charHeight = av.getCharHeight(); final int charWidth = av.getCharWidth(); // sanity checks: assertTrue(charHeight > 0); assertTrue(charWidth > 0); assertTrue(alignFrame.alignPanel.getSeqPanel().getWidth() > 0); SeqPanel testee = alignFrame.alignPanel.getSeqPanel(); int x = 0; int y = 0; /* * mouse at top left of unwrapped panel */ MouseEvent evt = new MouseEvent(testee, Event.MOUSE_MOVE, 0L, 0, x, y, 0, 0, 0, false, 0); MousePos pos = testee.findMousePosition(evt); assertEquals(pos.column, 0); assertEquals(pos.seqIndex, 0); assertEquals(pos.annotationIndex, -1); } @AfterMethod(alwaysRun = true) public void tearDown() { Desktop.instance.closeAll_actionPerformed(null); } @Test(groups = "Functional") public void testFindMousePosition_wrapped() { Cache.applicationProperties.setProperty("SHOW_ANNOTATIONS", "true"); Cache.applicationProperties.setProperty("WRAP_ALIGNMENT", "true"); AlignFrame alignFrame = new FileLoader().LoadFileWaitTillLoaded( "examples/uniref50.fa", DataSourceType.FILE); AlignViewportI av = alignFrame.getViewport(); av.setScaleAboveWrapped(false); av.setScaleLeftWrapped(false); av.setScaleRightWrapped(false); alignFrame.alignPanel.paintAlignment(false, false); final int charHeight = av.getCharHeight(); final int charWidth = av.getCharWidth(); final int alignmentHeight = av.getAlignment().getHeight(); // sanity checks: assertTrue(charHeight > 0); assertTrue(charWidth > 0); assertTrue(alignFrame.alignPanel.getSeqPanel().getWidth() > 0); SeqPanel testee = alignFrame.alignPanel.getSeqPanel(); int x = 0; int y = 0; /* * mouse at top left of wrapped panel; there is a gap of charHeight * above the alignment */ MouseEvent evt = new MouseEvent(testee, Event.MOUSE_MOVE, 0L, 0, x, y, 0, 0, 0, false, 0); MousePos pos = testee.findMousePosition(evt); assertEquals(pos.column, 0); assertEquals(pos.seqIndex, -1); // above sequences assertEquals(pos.annotationIndex, -1); /* * cursor at bottom of gap above */ y = charHeight - 1; evt = new MouseEvent(testee, Event.MOUSE_MOVE, 0L, 0, x, y, 0, 0, 0, false, 0); pos = testee.findMousePosition(evt); assertEquals(pos.seqIndex, -1); assertEquals(pos.annotationIndex, -1); /* * cursor over top of first sequence */ y = charHeight; evt = new MouseEvent(testee, Event.MOUSE_MOVE, 0L, 0, x, y, 0, 0, 0, false, 0); pos = testee.findMousePosition(evt); assertEquals(pos.seqIndex, 0); assertEquals(pos.annotationIndex, -1); /* * cursor at bottom of first sequence */ y = 2 * charHeight - 1; evt = new MouseEvent(testee, Event.MOUSE_MOVE, 0L, 0, x, y, 0, 0, 0, false, 0); pos = testee.findMousePosition(evt); assertEquals(pos.seqIndex, 0); assertEquals(pos.annotationIndex, -1); /* * cursor at top of second sequence */ y = 2 * charHeight; evt = new MouseEvent(testee, Event.MOUSE_MOVE, 0L, 0, x, y, 0, 0, 0, false, 0); pos = testee.findMousePosition(evt); assertEquals(pos.seqIndex, 1); assertEquals(pos.annotationIndex, -1); /* * cursor at bottom of second sequence */ y = 3 * charHeight - 1; evt = new MouseEvent(testee, Event.MOUSE_MOVE, 0L, 0, x, y, 0, 0, 0, false, 0); pos = testee.findMousePosition(evt); assertEquals(pos.seqIndex, 1); assertEquals(pos.annotationIndex, -1); /* * cursor at bottom of last sequence */ y = charHeight * (1 + alignmentHeight) - 1; evt = new MouseEvent(testee, Event.MOUSE_MOVE, 0L, 0, x, y, 0, 0, 0, false, 0); pos = testee.findMousePosition(evt); assertEquals(pos.seqIndex, alignmentHeight - 1); assertEquals(pos.annotationIndex, -1); /* * cursor below sequences, in 3-pixel gap above annotations */ y += 1; evt = new MouseEvent(testee, Event.MOUSE_MOVE, 0L, 0, x, y, 0, 0, 0, false, 0); pos = testee.findMousePosition(evt); assertEquals(pos.seqIndex, alignmentHeight - 1); assertEquals(pos.annotationIndex, -1); /* * cursor still in the gap above annotations, now at the bottom of it * method reports index of nearest sequence above */ y += SeqCanvas.SEQS_ANNOTATION_GAP - 1; // 3-1 = 2 evt = new MouseEvent(testee, Event.MOUSE_MOVE, 0L, 0, x, y, 0, 0, 0, false, 0); pos = testee.findMousePosition(evt); assertEquals(pos.seqIndex, alignmentHeight - 1); assertEquals(pos.annotationIndex, -1); /* * cursor at the top of the first annotation */ y += 1; evt = new MouseEvent(testee, Event.MOUSE_MOVE, 0L, 0, x, y, 0, 0, 0, false, 0); pos = testee.findMousePosition(evt); assertEquals(pos.seqIndex, alignmentHeight - 1); assertEquals(pos.annotationIndex, 0); // over first annotation /* * cursor at the bottom of the first annotation */ y += av.getAlignment().getAlignmentAnnotation()[0].height - 1; evt = new MouseEvent(testee, Event.MOUSE_MOVE, 0L, 0, x, y, 0, 0, 0, false, 0); pos = testee.findMousePosition(evt); assertEquals(pos.seqIndex, alignmentHeight - 1); assertEquals(pos.annotationIndex, 0); /* * cursor at the top of the second annotation */ y += 1; evt = new MouseEvent(testee, Event.MOUSE_MOVE, 0L, 0, x, y, 0, 0, 0, false, 0); pos = testee.findMousePosition(evt); assertEquals(pos.seqIndex, alignmentHeight - 1); assertEquals(pos.annotationIndex, 1); /* * cursor at the bottom of the second annotation */ y += av.getAlignment().getAlignmentAnnotation()[1].height - 1; evt = new MouseEvent(testee, Event.MOUSE_MOVE, 0L, 0, x, y, 0, 0, 0, false, 0); pos = testee.findMousePosition(evt); assertEquals(pos.seqIndex, alignmentHeight - 1); assertEquals(pos.annotationIndex, 1); /* * cursor at the top of the third annotation */ y += 1; evt = new MouseEvent(testee, Event.MOUSE_MOVE, 0L, 0, x, y, 0, 0, 0, false, 0); pos = testee.findMousePosition(evt); assertEquals(pos.seqIndex, alignmentHeight - 1); assertEquals(pos.annotationIndex, 2); /* * cursor at the bottom of the third annotation */ y += av.getAlignment().getAlignmentAnnotation()[2].height - 1; evt = new MouseEvent(testee, Event.MOUSE_MOVE, 0L, 0, x, y, 0, 0, 0, false, 0); pos = testee.findMousePosition(evt); assertEquals(pos.seqIndex, alignmentHeight - 1); assertEquals(pos.annotationIndex, 2); /* * cursor in gap between wrapped widths */ y += 1; evt = new MouseEvent(testee, Event.MOUSE_MOVE, 0L, 0, x, y, 0, 0, 0, false, 0); pos = testee.findMousePosition(evt); assertEquals(pos.seqIndex, -1); assertEquals(pos.annotationIndex, -1); /* * cursor at bottom of gap between wrapped widths */ y += charHeight - 1; evt = new MouseEvent(testee, Event.MOUSE_MOVE, 0L, 0, x, y, 0, 0, 0, false, 0); pos = testee.findMousePosition(evt); assertEquals(pos.seqIndex, -1); assertEquals(pos.annotationIndex, -1); /* * cursor at top of first sequence, second wrapped width */ y += 1; evt = new MouseEvent(testee, Event.MOUSE_MOVE, 0L, 0, x, y, 0, 0, 0, false, 0); pos = testee.findMousePosition(evt); assertEquals(pos.seqIndex, 0); assertEquals(pos.annotationIndex, -1); } @Test(groups = "Functional") public void testFindMousePosition_wrapped_scaleAbove() { Cache.applicationProperties.setProperty("SHOW_ANNOTATIONS", "true"); Cache.applicationProperties.setProperty("WRAP_ALIGNMENT", "true"); AlignFrame alignFrame = new FileLoader().LoadFileWaitTillLoaded( "examples/uniref50.fa", DataSourceType.FILE); AlignViewportI av = alignFrame.getViewport(); av.setScaleAboveWrapped(true); av.setScaleLeftWrapped(false); av.setScaleRightWrapped(false); alignFrame.alignPanel.paintAlignment(false, false); final int charHeight = av.getCharHeight(); final int charWidth = av.getCharWidth(); final int alignmentHeight = av.getAlignment().getHeight(); // sanity checks: assertTrue(charHeight > 0); assertTrue(charWidth > 0); assertTrue(alignFrame.alignPanel.getSeqPanel().getWidth() > 0); SeqPanel testee = alignFrame.alignPanel.getSeqPanel(); int x = 0; int y = 0; /* * mouse at top left of wrapped panel; there is a gap of charHeight * above the alignment */ MouseEvent evt = new MouseEvent(testee, Event.MOUSE_MOVE, 0L, 0, x, y, 0, 0, 0, false, 0); MousePos pos = testee.findMousePosition(evt); assertEquals(pos.column, 0); assertEquals(pos.seqIndex, -1); // above sequences assertEquals(pos.annotationIndex, -1); /* * cursor at bottom of gap above * two charHeights including scale panel */ y = 2 * charHeight - 1; evt = new MouseEvent(testee, Event.MOUSE_MOVE, 0L, 0, x, y, 0, 0, 0, false, 0); pos = testee.findMousePosition(evt); assertEquals(pos.seqIndex, -1); assertEquals(pos.annotationIndex, -1); /* * cursor over top of first sequence */ y += 1; evt = new MouseEvent(testee, Event.MOUSE_MOVE, 0L, 0, x, y, 0, 0, 0, false, 0); pos = testee.findMousePosition(evt); assertEquals(pos.seqIndex, 0); assertEquals(pos.annotationIndex, -1); /* * cursor at bottom of first sequence */ y += charHeight - 1; evt = new MouseEvent(testee, Event.MOUSE_MOVE, 0L, 0, x, y, 0, 0, 0, false, 0); pos = testee.findMousePosition(evt); assertEquals(pos.seqIndex, 0); assertEquals(pos.annotationIndex, -1); /* * cursor at top of second sequence */ y += 1; evt = new MouseEvent(testee, Event.MOUSE_MOVE, 0L, 0, x, y, 0, 0, 0, false, 0); pos = testee.findMousePosition(evt); assertEquals(pos.seqIndex, 1); assertEquals(pos.annotationIndex, -1); /* * cursor at bottom of second sequence */ y += charHeight - 1; evt = new MouseEvent(testee, Event.MOUSE_MOVE, 0L, 0, x, y, 0, 0, 0, false, 0); pos = testee.findMousePosition(evt); assertEquals(pos.seqIndex, 1); assertEquals(pos.annotationIndex, -1); /* * cursor at bottom of last sequence * (scale + gap + sequences) */ y = charHeight * (2 + alignmentHeight) - 1; evt = new MouseEvent(testee, Event.MOUSE_MOVE, 0L, 0, x, y, 0, 0, 0, false, 0); pos = testee.findMousePosition(evt); assertEquals(pos.seqIndex, alignmentHeight - 1); assertEquals(pos.annotationIndex, -1); /* * cursor below sequences, in 3-pixel gap above annotations */ y += 1; evt = new MouseEvent(testee, Event.MOUSE_MOVE, 0L, 0, x, y, 0, 0, 0, false, 0); pos = testee.findMousePosition(evt); assertEquals(pos.seqIndex, alignmentHeight - 1); assertEquals(pos.annotationIndex, -1); /* * cursor still in the gap above annotations, now at the bottom of it * method reports index of nearest sequence above */ y += SeqCanvas.SEQS_ANNOTATION_GAP - 1; // 3-1 = 2 evt = new MouseEvent(testee, Event.MOUSE_MOVE, 0L, 0, x, y, 0, 0, 0, false, 0); pos = testee.findMousePosition(evt); assertEquals(pos.seqIndex, alignmentHeight - 1); assertEquals(pos.annotationIndex, -1); /* * cursor at the top of the first annotation */ y += 1; evt = new MouseEvent(testee, Event.MOUSE_MOVE, 0L, 0, x, y, 0, 0, 0, false, 0); pos = testee.findMousePosition(evt); assertEquals(pos.seqIndex, alignmentHeight - 1); assertEquals(pos.annotationIndex, 0); // over first annotation /* * cursor at the bottom of the first annotation */ y += av.getAlignment().getAlignmentAnnotation()[0].height - 1; evt = new MouseEvent(testee, Event.MOUSE_MOVE, 0L, 0, x, y, 0, 0, 0, false, 0); pos = testee.findMousePosition(evt); assertEquals(pos.seqIndex, alignmentHeight - 1); assertEquals(pos.annotationIndex, 0); /* * cursor at the top of the second annotation */ y += 1; evt = new MouseEvent(testee, Event.MOUSE_MOVE, 0L, 0, x, y, 0, 0, 0, false, 0); pos = testee.findMousePosition(evt); assertEquals(pos.seqIndex, alignmentHeight - 1); assertEquals(pos.annotationIndex, 1); /* * cursor at the bottom of the second annotation */ y += av.getAlignment().getAlignmentAnnotation()[1].height - 1; evt = new MouseEvent(testee, Event.MOUSE_MOVE, 0L, 0, x, y, 0, 0, 0, false, 0); pos = testee.findMousePosition(evt); assertEquals(pos.seqIndex, alignmentHeight - 1); assertEquals(pos.annotationIndex, 1); /* * cursor at the top of the third annotation */ y += 1; evt = new MouseEvent(testee, Event.MOUSE_MOVE, 0L, 0, x, y, 0, 0, 0, false, 0); pos = testee.findMousePosition(evt); assertEquals(pos.seqIndex, alignmentHeight - 1); assertEquals(pos.annotationIndex, 2); /* * cursor at the bottom of the third annotation */ y += av.getAlignment().getAlignmentAnnotation()[2].height - 1; evt = new MouseEvent(testee, Event.MOUSE_MOVE, 0L, 0, x, y, 0, 0, 0, false, 0); pos = testee.findMousePosition(evt); assertEquals(pos.seqIndex, alignmentHeight - 1); assertEquals(pos.annotationIndex, 2); /* * cursor in gap between wrapped widths */ y += 1; evt = new MouseEvent(testee, Event.MOUSE_MOVE, 0L, 0, x, y, 0, 0, 0, false, 0); pos = testee.findMousePosition(evt); assertEquals(pos.seqIndex, -1); assertEquals(pos.annotationIndex, -1); /* * cursor at bottom of gap between wrapped widths */ y += charHeight - 1; evt = new MouseEvent(testee, Event.MOUSE_MOVE, 0L, 0, x, y, 0, 0, 0, false, 0); pos = testee.findMousePosition(evt); assertEquals(pos.seqIndex, -1); assertEquals(pos.annotationIndex, -1); /* * cursor at top of scale, second wrapped width */ y += 1; evt = new MouseEvent(testee, Event.MOUSE_MOVE, 0L, 0, x, y, 0, 0, 0, false, 0); pos = testee.findMousePosition(evt); assertEquals(pos.seqIndex, -1); assertEquals(pos.annotationIndex, -1); /* * cursor at bottom of scale, second wrapped width */ y += charHeight - 1; evt = new MouseEvent(testee, Event.MOUSE_MOVE, 0L, 0, x, y, 0, 0, 0, false, 0); pos = testee.findMousePosition(evt); assertEquals(pos.seqIndex, -1); assertEquals(pos.annotationIndex, -1); /* * cursor at top of first sequence, second wrapped width */ y += 1; evt = new MouseEvent(testee, Event.MOUSE_MOVE, 0L, 0, x, y, 0, 0, 0, false, 0); pos = testee.findMousePosition(evt); assertEquals(pos.seqIndex, 0); assertEquals(pos.annotationIndex, -1); } @BeforeClass(alwaysRun = true) public static void setUpBeforeClass() throws Exception { /* * use read-only test properties file */ Cache.loadProperties("test/jalview/io/testProps.jvprops"); Jalview.main(new String[] { "-nonews" }); } }