*/
package jalview.gui;
+import static org.junit.Assert.assertNotEquals;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertNotSame;
import jalview.bin.Jalview;
import jalview.datamodel.Alignment;
import jalview.datamodel.AlignmentI;
+import jalview.datamodel.HiddenColumns;
import jalview.datamodel.Sequence;
import jalview.datamodel.SequenceFeature;
import jalview.datamodel.SequenceGroup;
import jalview.datamodel.SequenceI;
import jalview.io.DataSourceType;
import jalview.io.FileLoader;
-import jalview.io.Jalview2xmlTests;
+import jalview.project.Jalview2xmlTests;
import jalview.renderer.ResidueShaderI;
import jalview.schemes.BuriedColourScheme;
import jalview.schemes.FeatureColour;
import jalview.util.MessageManager;
import java.awt.Color;
-import java.util.List;
+import java.util.Iterator;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeClass;
AlignFrame af;
@BeforeClass(alwaysRun = true)
- public void setUpJvOptionPane()
- {
- JvOptionPane.setInteractiveMode(false);
- JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
- }
-
- @Test(groups = "Functional")
- public void testHideFeatureColumns()
- {
- SequenceI seq1 = new Sequence("Seq1", "ABCDEFGHIJ");
- SequenceI seq2 = new Sequence("Seq2", "ABCDEFGHIJ");
- seq1.addSequenceFeature(new SequenceFeature("Metal", "", 1, 5, 0f, null));
- seq2.addSequenceFeature(new SequenceFeature("Metal", "", 6, 10, 10f,
- null));
- seq1.addSequenceFeature(new SequenceFeature("Turn", "", 2, 4,
- Float.NaN, null));
- seq2.addSequenceFeature(new SequenceFeature("Turn", "", 7, 9,
- Float.NaN, null));
- AlignmentI al = new Alignment(new SequenceI[] { seq1, seq2 });
- AlignFrame alignFrame = new AlignFrame(al, al.getWidth(),
- al.getHeight());
-
- /*
- * make all features visible (select feature columns checks visibility)
- */
- alignFrame.getFeatureRenderer().findAllFeatures(true);
-
- /*
- * hiding a feature not present does nothing
- */
- assertFalse(alignFrame.hideFeatureColumns("exon", true));
- assertTrue(alignFrame.getViewport().getColumnSelection().isEmpty());
- assertTrue(alignFrame.getViewport().getAlignment().getHiddenColumns()
- .getHiddenColumnsCopy().isEmpty());
- assertFalse(alignFrame.hideFeatureColumns("exon", false));
- assertTrue(alignFrame.getViewport().getColumnSelection().isEmpty());
- assertTrue(alignFrame.getViewport().getAlignment().getHiddenColumns()
- .getHiddenColumnsCopy().isEmpty());
-
- /*
- * hiding a feature in all columns does nothing
- */
- assertFalse(alignFrame.hideFeatureColumns("Metal", true));
- assertTrue(alignFrame.getViewport().getColumnSelection().isEmpty());
- List<int[]> hidden = alignFrame.getViewport().getAlignment()
- .getHiddenColumns().getHiddenColumnsCopy();
- assertTrue(hidden.isEmpty());
-
- /*
- * threshold Metal to hide features where score < 5
- * seq1 feature in columns 1-5 is hidden
- * seq2 feature in columns 6-10 is shown
- */
- FeatureColourI fc = new FeatureColour(Color.red, Color.blue, 0f, 10f);
- fc.setAboveThreshold(true);
- fc.setThreshold(5f);
- alignFrame.getFeatureRenderer().setColour("Metal", fc);
- assertTrue(alignFrame.hideFeatureColumns("Metal", true));
- hidden = alignFrame.getViewport().getAlignment().getHiddenColumns()
- .getHiddenColumnsCopy();
- assertEquals(hidden.size(), 1);
- assertEquals(hidden.get(0)[0], 5);
- assertEquals(hidden.get(0)[1], 9);
-
- /*
- * hide a feature present in some columns
- * sequence positions [2-4], [7-9] are column positions
- * [1-3], [6-8] base zero
- */
- alignFrame.getViewport().showAllHiddenColumns();
- assertTrue(alignFrame.hideFeatureColumns("Turn", true));
- hidden = alignFrame.getViewport().getAlignment().getHiddenColumns()
- .getHiddenColumnsCopy();
- assertEquals(hidden.size(), 2);
- assertEquals(hidden.get(0)[0], 1);
- assertEquals(hidden.get(0)[1], 3);
- assertEquals(hidden.get(1)[0], 6);
- assertEquals(hidden.get(1)[1], 8);
- }
-
- @BeforeClass(alwaysRun = true)
public static void setUpBeforeClass() throws Exception
{
+ setUpJvOptionPane();
/*
* use read-only test properties file
*/
}
/**
- * configure (read-only) properties for test to ensure Consensus is computed
- * for colour Above PID testing
+ * configure (read-only) properties for test to ensure Consensus is computed for
+ * colour Above PID testing
*/
@BeforeMethod(alwaysRun = true)
public void setUp()
}
}
+ public static void setUpJvOptionPane()
+ {
+ JvOptionPane.setInteractiveMode(false);
+ JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
+ }
+
+ @Test(groups = "Functional")
+ public void testHideFeatureColumns()
+ {
+ SequenceI seq1 = new Sequence("Seq1/01-10", "A---BCDEFG-HIJ");
+ SequenceI seq2 = new Sequence("Seq2/11-20", "-AB-CDEF--GHIJ");
+ String METAL = "Metal";
+ String TURN = "Turn";
+ seq1.addSequenceFeature(
+ new SequenceFeature(METAL, "", 1, 5, 0f, null));
+ seq2.addSequenceFeature(
+ new SequenceFeature(METAL, "", 16, 20, 10f, null));
+ seq1.addSequenceFeature(
+ new SequenceFeature(TURN, "", 2, 4, Float.NaN, null));
+ seq2.addSequenceFeature(
+ new SequenceFeature(TURN, "", 17, 19, Float.NaN, null));
+ AlignmentI al = new Alignment(new SequenceI[] { seq1, seq2 });
+ AlignFrame alignFrame = new AlignFrame(al, al.getWidth(),
+ al.getHeight());
+
+ /*
+ * make all features visible (select feature columns checks visibility)
+ */
+ alignFrame.getFeatureRenderer().findAllFeatures(true);
+
+ /*
+ * hiding a feature not present does nothing
+ */
+ assertFalse(alignFrame.hideFeatureColumns(true, "exon"));
+ assertTrue(alignFrame.getViewport().getColumnSelection().isEmpty());
+ assertEquals(alignFrame.getViewport().getAlignment().getHiddenColumns()
+ .getNumberOfRegions(), 0);
+
+ assertFalse(alignFrame.hideFeatureColumns(false, "exon"));
+ assertTrue(alignFrame.getViewport().getColumnSelection().isEmpty());
+ assertEquals(alignFrame.getViewport().getAlignment().getHiddenColumns()
+ .getNumberOfRegions(), 0);
+
+ /*
+ * hiding a feature in all columns does nothing
+ */
+ assertFalse(alignFrame.hideFeatureColumns(true, METAL));
+ assertTrue(alignFrame.getViewport().getColumnSelection().isEmpty());
+ assertEquals(alignFrame.getViewport().getAlignment().getHiddenColumns()
+ .getNumberOfRegions(), 0);
+
+
+ /*
+ * threshold Metal to hide features where score < 5
+ * seq1 feature in columns 1-8 is hidden
+ * seq2 feature in columns 8-14 is shown
+ * result: columns 8-14 are hidden
+ * note this includes gapped columns spanned by the feature
+ */
+ FeatureColourI fc = new FeatureColour(null, Color.red, Color.blue, null,
+ 0f, 10f);
+ fc.setAboveThreshold(true);
+ fc.setThreshold(5f);
+ alignFrame.getFeatureRenderer().setColour(METAL, fc);
+ assertTrue(alignFrame.hideFeatureColumns(true, METAL));
+ HiddenColumns hidden = alignFrame.getViewport().getAlignment().getHiddenColumns();
+ assertEquals(hidden.getNumberOfRegions(), 1);
+ Iterator<int[]> regions = hidden.iterator();
+ assertEquals(regions.next(), new int[] { 7, 13 }); // base 0
+ assertFalse(regions.hasNext());
+
+ /*
+ * hide a feature present in some columns
+ * seq1 positions [2-4] are column positions [4-6] base zero
+ * seq2 positions [17-19] are column positions [10-12] base zero
+ */
+ alignFrame.getViewport().showAllHiddenColumns();
+ assertTrue(alignFrame.hideFeatureColumns(true, TURN));
+ regions = alignFrame.getViewport().getAlignment()
+ .getHiddenColumns().iterator();
+ assertEquals(alignFrame.getViewport().getAlignment().getHiddenColumns()
+ .getNumberOfRegions(), 2);
+ assertEquals(regions.next(), new int[] { 4, 6 });
+ assertEquals(regions.next(), new int[] { 10, 12 });
+ assertFalse(regions.hasNext());
+
+ /*
+ * hiding a contact feature should only hide start and end positions,
+ * not the intermediate columns
+ */
+ String DISULFIDE = "Disulfide Bond";
+ seq1.addSequenceFeature(
+ new SequenceFeature(DISULFIDE, "", 1, 5, 0f, null));
+ alignFrame.getViewport().showAllHiddenColumns();
+ assertTrue(alignFrame.hideFeatureColumns(true, DISULFIDE));
+ regions = alignFrame.getViewport().getAlignment().getHiddenColumns()
+ .iterator();
+ assertEquals(alignFrame.getViewport().getAlignment().getHiddenColumns()
+ .getNumberOfRegions(), 2);
+ assertEquals(regions.next(), new int[] { 0, 0 });
+ assertEquals(regions.next(), new int[] { 7, 7 });
+ assertFalse(regions.hasNext());
+
+ /*
+ * hide multiple feature types:
+ * TURN columns hides 4-6, 10-12
+ * DISULFIDE columns hides 0, 7
+ * combined is { 0-0, 4-7, 10-12 }
+ */
+ alignFrame.getViewport().showAllHiddenColumns();
+ assertTrue(alignFrame.hideFeatureColumns(true, TURN, DISULFIDE));
+ regions = alignFrame.getViewport().getAlignment().getHiddenColumns()
+ .iterator();
+ assertEquals(alignFrame.getViewport().getAlignment().getHiddenColumns()
+ .getNumberOfRegions(), 3);
+ assertEquals(regions.next(), new int[] { 0, 0 });
+ assertEquals(regions.next(), new int[] { 4, 7 });
+ assertEquals(regions.next(), new int[] { 10, 12 });
+ assertFalse(regions.hasNext());
+ }
+
/**
* Test that changing background (alignment) colour scheme
* <ul>
sp.valueChanged(22);
assertEquals(av2.getResidueShading().getConservationInc(), 22);
}
+
+ /**
+ * Verify that making a New View preserves the dataset reference for the
+ * alignment. Otherwise, see a 'duplicate jar entry' reference when trying to
+ * save alignments with multiple views, and codon mappings will not be shared
+ * across all panels in a split frame.
+ *
+ * @see Jalview2xmlTests#testStoreAndRecoverColourThresholds()
+ */
+ @Test(groups = "Functional")
+ public void testNewView_dsRefPreserved()
+ {
+ AlignViewport av = af.getViewport();
+ AlignmentI al = av.getAlignment();
+ AlignmentI original_ds = al.getDataset();
+ af.newView_actionPerformed(null);
+ assertNotEquals("New view didn't select the a new panel", av,
+ af.getViewport());
+ org.testng.Assert.assertEquals(original_ds,
+ af.getViewport().getAlignment().getDataset(),
+ "Dataset was not preserved in new view");
+ }
}