JAL-3087 include full alignment height in repeating wrapped height
[jalview.git] / test / jalview / gui / SeqCanvasTest.java
index 3722e47..bcb1cfd 100644 (file)
@@ -1,3 +1,23 @@
+/*
+ * 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 <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
 package jalview.gui;
 
 import static org.testng.Assert.assertEquals;
@@ -9,11 +29,9 @@ import jalview.io.FileLoader;
 import java.awt.Font;
 import java.awt.FontMetrics;
 
-import junit.extensions.PA;
-
 import org.testng.annotations.Test;
 
-import sun.swing.SwingUtilities2;
+import junit.extensions.PA;
 
 public class SeqCanvasTest
 {
@@ -30,6 +48,9 @@ public class SeqCanvasTest
     AlignmentI al = av.getAlignment();
     assertEquals(al.getWidth(), 157);
     assertEquals(al.getHeight(), 15);
+    av.getRanges().setStartEndSeq(0, 14);
+
+    SeqCanvas testee = af.alignPanel.getSeqPanel().seqCanvas;
 
     av.setWrapAlignment(true);
     av.setFont(new Font("SansSerif", Font.PLAIN, 14), true);
@@ -38,8 +59,6 @@ public class SeqCanvasTest
     assertEquals(charHeight, 17);
     assertEquals(charWidth, 12);
 
-    SeqCanvas testee = af.alignPanel.getSeqPanel().seqCanvas;
-
     /*
      * first with scales above, left, right
      */
@@ -47,9 +66,9 @@ public class SeqCanvasTest
     av.setScaleAboveWrapped(true);
     av.setScaleLeftWrapped(true);
     av.setScaleRightWrapped(true);
-    FontMetrics fm = SwingUtilities2.getFontMetrics(testee, av.getFont());
-    int labelWidth = fm.stringWidth("00000"); // width of 3 digits and 2 spaces
-    assertEquals(labelWidth, 45); // note this is not 5 * charWidth
+    FontMetrics fm = testee.getFontMetrics(av.getFont());
+    int labelWidth = fm.stringWidth("000") + charWidth;
+    assertEquals(labelWidth, 39); // 3 x 9 + charWidth
 
     /*
      * width 400 pixels leaves (400 - 2*labelWidth) for residue columns
@@ -117,8 +136,8 @@ public class SeqCanvasTest
     assertEquals(wrappedWidth, 19);
 
     /*
-     * turn off West scale - adds labelWidth (45) to available for residues
-     * which with the 11 remainder makes 56 which is 4 more charWidths rem 8
+     * turn off West scale - adds labelWidth (39) to available for residues
+     * which with the 11 remainder makes 50 which is 4 more charWidths rem 2
      */
     av.setScaleLeftWrapped(false);
     wrappedWidth = testee.calculateWrappedGeometry(canvasWidth,
@@ -126,9 +145,9 @@ public class SeqCanvasTest
     assertEquals(wrappedWidth, 23);
 
     /*
-     * add 4 pixels to width to fit in another whole residue column
+     * add 10 pixels to width to fit in another whole residue column
      */
-    canvasWidth += 3;
+    canvasWidth += 9;
     wrappedWidth = testee.calculateWrappedGeometry(canvasWidth,
             canvasHeight);
     assertEquals(wrappedWidth, 23);
@@ -138,7 +157,7 @@ public class SeqCanvasTest
     assertEquals(wrappedWidth, 24);
 
     /*
-     * turn off East scale to gain 45 more pixels (3 columns remainder 9)
+     * turn off East scale to gain 39 more pixels (3 columns remainder 3)
      */
     av.setScaleRightWrapped(false);
     wrappedWidth = testee.calculateWrappedGeometry(canvasWidth,
@@ -146,15 +165,19 @@ public class SeqCanvasTest
     assertEquals(wrappedWidth, 27);
 
     /*
-     * add 3 pixels to width to gain a residue column
+     * add 9 pixels to width to gain a residue column
      */
-    canvasWidth += 3;
+    canvasWidth += 8;
+    wrappedWidth = testee.calculateWrappedGeometry(canvasWidth,
+            canvasHeight);
+    assertEquals(wrappedWidth, 27);
+    canvasWidth += 1;
     wrappedWidth = testee.calculateWrappedGeometry(canvasWidth,
             canvasHeight);
     assertEquals(wrappedWidth, 28);
 
     /*
-     * now West but not East scale - lose 45 pixels or 4 columns
+     * now West but not East scale - lose 39 pixels or 4 columns
      */
     av.setScaleLeftWrapped(true);
     wrappedWidth = testee.calculateWrappedGeometry(canvasWidth,
@@ -162,9 +185,9 @@ public class SeqCanvasTest
     assertEquals(wrappedWidth, 24);
 
     /*
-     * adding 9 pixels to width regains one column
+     * adding 3 pixels to width regains one column
      */
-    canvasWidth += 8;
+    canvasWidth += 2;
     wrappedWidth = testee.calculateWrappedGeometry(canvasWidth,
             canvasHeight);
     assertEquals(wrappedWidth, 24);
@@ -197,6 +220,7 @@ public class SeqCanvasTest
     assertEquals(al.getHeight(), 15);
   
     av.setWrapAlignment(true);
+    av.getRanges().setStartEndSeq(0, 14);
     av.setFont(new Font("SansSerif", Font.PLAIN, 14), true);
     int charHeight = av.getCharHeight();
     int charWidth = av.getCharWidth();
@@ -212,9 +236,9 @@ public class SeqCanvasTest
     av.setScaleAboveWrapped(true);
     av.setScaleLeftWrapped(true);
     av.setScaleRightWrapped(true);
-    FontMetrics fm = SwingUtilities2.getFontMetrics(testee, av.getFont());
-    int labelWidth = fm.stringWidth("00000"); // width of 3 digits and 2 spaces
-    assertEquals(labelWidth, 45); // note this is not 5 * charWidth
+    FontMetrics fm = testee.getFontMetrics(av.getFont());
+    int labelWidth = fm.stringWidth("000") + charWidth;
+    assertEquals(labelWidth, 39); // 3 x 9 + charWidth
     int annotationHeight = testee.getAnnotationHeight();
 
     /*
@@ -274,4 +298,42 @@ public class SeqCanvasTest
     testee.calculateWrappedGeometry(canvasWidth, canvasHeight);
     assertEquals(PA.getValue(testee, "wrappedVisibleWidths"), 3);
   }
+
+  /**
+   * Test simulates loading an unwrapped alignment, shrinking it vertically so
+   * not all sequences are visible, then changing to wrapped mode. The ranges
+   * endSeq should be unchanged, but the vertical repeat height should include
+   * all sequences.
+   */
+  @Test(groups = "Functional")
+  public void testCalculateWrappedGeometry_fromScrolled()
+  {
+    AlignFrame af = new FileLoader().LoadFileWaitTillLoaded(
+            "examples/uniref50.fa", DataSourceType.FILE);
+    AlignViewport av = af.getViewport();
+    AlignmentI al = av.getAlignment();
+    assertEquals(al.getWidth(), 157);
+    assertEquals(al.getHeight(), 15);
+    av.getRanges().setStartEndSeq(0, 3);
+    av.setShowAnnotation(false);
+    av.setScaleAboveWrapped(true);
+
+    SeqCanvas testee = af.alignPanel.getSeqPanel().seqCanvas;
+
+    av.setWrapAlignment(true);
+    av.setFont(new Font("SansSerif", Font.PLAIN, 14), true);
+    int charHeight = av.getCharHeight();
+    int charWidth = av.getCharWidth();
+    assertEquals(charHeight, 17);
+    assertEquals(charWidth, 12);
+
+    int canvasWidth = 400;
+    int canvasHeight = 300;
+    testee.calculateWrappedGeometry(canvasWidth, canvasHeight);
+
+    assertEquals(av.getRanges().getEndSeq(), 3); // unchanged
+    int repeatingHeight = (int) PA.getValue(testee,
+            "wrappedRepeatHeightPx");
+    assertEquals(repeatingHeight, charHeight * (2 + al.getHeight()));
+  }
 }