+
+ /**
+ * test store and recovery of Overview windows
+ *
+ * @throws Exception
+ */
+ @Test(groups = { "Functional" }, enabled = true)
+ public void testStoreAndRecoverOverview() throws Exception
+ {
+ Desktop.instance.closeAll_actionPerformed(null);
+
+ Cache.setProperty("SHOW_OVERVIEW", "false");
+ Cache.setProperty(Preferences.USE_LEGACY_GAP, "false");
+ Cache.setColourProperty(Preferences.GAP_COLOUR, Color.green);
+ Cache.setColourProperty(Preferences.HIDDEN_COLOUR, Color.yellow);
+ Cache.setProperty(Preferences.SHOW_OV_HIDDEN_AT_START, "true");
+
+ AlignFrame af = new FileLoader().LoadFileWaitTillLoaded(
+ "examples/uniref50.fa", DataSourceType.FILE);
+
+ /*
+ * open and resize / reposition overview
+ */
+ af.overviewMenuItem_actionPerformed(null);
+ OverviewPanel ov1 = af.alignPanel.getOverviewPanel();
+ assertNotNull(ov1);
+ ov1.setFrameBounds(20, 30, 200, 400);
+ assertEquals(ov1.getTitle(), "Overview examples/uniref50.fa");
+ assertTrue(ov1.isShowHiddenRegions());
+
+ /*
+ * open a New View and its Overview and reposition it
+ */
+ af.newView_actionPerformed(null);
+ af.overviewMenuItem_actionPerformed(null);
+ OverviewPanel ov2 = af.alignPanel.getOverviewPanel();
+ assertNotNull(ov2);
+ assertNotSame(ov1, ov2);
+ ov2.setFrameBounds(25, 35, 205, 405);
+ assertEquals(ov1.getTitle(), "Overview examples/uniref50.fa Original");
+ assertEquals(ov2.getTitle(), "Overview examples/uniref50.fa View 1");
+
+ File tfile = File.createTempFile("testStoreAndRecoverOverview", ".jvp");
+ new Jalview2XML(false).saveState(tfile);
+ Desktop.instance.closeAll_actionPerformed(null);
+
+ /*
+ * change preferences (should _not_ affect reloaded Overviews)
+ */
+ Cache.setProperty("SHOW_OVERVIEW", "true");
+ Cache.setProperty(Preferences.USE_LEGACY_GAP, "true");
+ Cache.setColourProperty(Preferences.GAP_COLOUR, Color.blue);
+ Cache.setColourProperty(Preferences.HIDDEN_COLOUR, Color.orange);
+ Cache.setProperty(Preferences.SHOW_OV_HIDDEN_AT_START, "false");
+
+ af = new FileLoader().LoadFileWaitTillLoaded(tfile.getAbsolutePath(),
+ DataSourceType.FILE);
+
+ /*
+ * workaround: explicitly select View 1 (not in focus after restore)
+ */
+ af.tabSelectionChanged(1);
+
+ /*
+ * verify restored overview for View 1
+ */
+ ov2 = af.alignPanel.getOverviewPanel();
+ assertEquals(ov2.getCanvas().getGapColour(), Color.green);
+ // 'non-legacy' colouring uses white for non-gapped residues
+ assertEquals(ov2.getCanvas().getResidueColour(), Color.white);
+ assertEquals(ov2.getCanvas().getHiddenColour(), Color.yellow);
+ assertEquals(ov2.getTitle(), "Overview examples/uniref50.fa View 1");
+ assertEquals(ov2.getFrameBounds(), new Rectangle(25, 35, 205, 405));
+ assertTrue(ov2.isShowHiddenRegions());
+
+ /*
+ * verify restored overview for Original view
+ */
+ af.tabSelectionChanged(0);
+ ov1 = af.alignPanel.getOverviewPanel();
+ assertEquals(ov1.getCanvas().getGapColour(), Color.green);
+ // 'non-legacy' colouring uses white for non-gapped residues
+ assertEquals(ov1.getCanvas().getResidueColour(), Color.white);
+ assertEquals(ov1.getCanvas().getHiddenColour(), Color.yellow);
+ assertEquals(ov1.getTitle(), "Overview examples/uniref50.fa Original");
+ assertEquals(ov1.getFrameBounds(), new Rectangle(20, 30, 200, 400));
+ assertTrue(ov1.isShowHiddenRegions());
+ }
+
+ /**
+ * Test that a view with no Overview is restored with no Overview, even if
+ * 'Open Overview' is selected in Preferences
+ *
+ * @throws Exception
+ */
+ @Test(groups = { "Functional" }, enabled = true)
+ public void testStoreAndRecoverNoOverview() throws Exception
+ {
+ Cache.setProperty("SHOW_OVERVIEW", "false");
+ Desktop.instance.closeAll_actionPerformed(null);
+ AlignFrame af = new FileLoader().LoadFileWaitTillLoaded(
+ ">seq1\nMATRSQFLVNF\n", DataSourceType.PASTE);
+
+ File tfile = File.createTempFile("testStoreAndRecoverOverview", ".jvp");
+ new Jalview2XML(false).saveState(tfile);
+ Desktop.instance.closeAll_actionPerformed(null);
+
+ Cache.setProperty("SHOW_OVERVIEW", "true");
+ af = new FileLoader().LoadFileWaitTillLoaded(tfile.getAbsolutePath(),
+ DataSourceType.FILE);
+
+ assertNull(af.alignPanel.getOverviewPanel());
+ }
+
+ /**
+ * Test that a view from an older version of Jalview is restored with Overview
+ * automatically shown when the preference is set
+ *
+ * @throws Exception
+ */
+ @Test(groups = { "Functional" }, enabled = true)
+ public void testAutoShowOverviewForLegacyProjects() throws Exception
+ {
+ Desktop.instance.closeAll_actionPerformed(null);
+ Cache.setProperty("SHOW_OVERVIEW", "true");
+ AlignFrame af = new FileLoader().LoadFileWaitTillLoaded(
+ "examples/exampleFile.jvp", DataSourceType.FILE);
+
+ Cache.setProperty("SHOW_OVERVIEW", "false");
+ assertNotNull(af.alignPanel.getOverviewPanel());
+ }
+
+ /**
+ * Test that loading example.jvp, doing some stuff, then hitting reload
+ * doesn't leave the modified window still open
+ *
+ * See JAL-4127 - interactively performing the same actions and reloading
+ * works fine, but programmatically they do not
+ *
+ * @throws Exception
+ */
+ @Test(groups = { "Functional" }, enabled = false)
+ public void testReloadActuallyReloads() throws Exception
+ {
+ Desktop.instance.closeAll_actionPerformed(null);
+ AlignFrame af = new FileLoader().LoadFileWaitTillLoaded(
+ "examples/exampleFile.jvp", DataSourceType.FILE);
+ af.getViewport().getColumnSelection().addElement(3);
+ af.hideSelColumns_actionPerformed(null);
+ af.newView("new", true);
+ af.reload_actionPerformed(null);
+ Thread.sleep(30);
+ // af exists still but isn't shown
+ assertTrue(af.isClosed());
+ }
+
+ @Test(groups = { "Functional" })
+ public void testMatrixToFloatsAndBack()
+ {
+ int imax = 2000;
+ int i = imax;
+ SequenceI sq = new Sequence("dummy", "SEQ");
+ while (sq.getLength() < i)
+ {
+ sq.setSequence(sq.getSequenceAsString() + 'Q');
+ }
+ float[][] paevals = new float[i][i];
+ for (i = imax - 1; i >= 0; i--)
+ {
+ for (int j = 0; j <= i; j++)
+ {
+ paevals[i][j] = ((i - j < 2)
+ || ((i > 1 && i < 5) && (j > 1 && i < 5))) ? 1 : 0f;
+ paevals[j][i] = -paevals[i][j];
+ }
+ }
+ PAEContactMatrix dummyMat = new PAEContactMatrix(sq, paevals);
+ String content = ContactMatrix.contactToFloatString(dummyMat);
+ Assert.assertTrue(content.contains("\t1.")); // at least one element must be
+ // 1
+ float[][] vals = ContactMatrix.fromFloatStringToContacts(content,
+ sq.getLength(), sq.getLength());
+ assertEquals(vals[3][4], paevals[3][4]);
+ assertEquals(vals[4][3], paevals[4][3]);
+
+ // test recovery
+ for (i = 0; i < imax; i++)
+ {
+ for (int j = 0; j < imax; j++)
+ {
+ assertEquals(vals[i][j], paevals[i][j]);
+ }
+ }
+ }
+
+ @Test(groups = { "Functional" })
+ public void testPAEsaveRestore() throws Exception
+ {
+ Desktop.instance.closeAll_actionPerformed(null);
+ AlignFrame af = new FileLoader().LoadFileWaitTillLoaded(
+ ">seq1\nMATRSQFLVNF\n", DataSourceType.PASTE);
+ AlignmentI al = af.getViewport().getAlignment();
+ // PAE matrices are added as reference annotation to the dataset sequence
+ // at least for now.
+ SequenceI sq = al.getSequenceAt(0).getDatasetSequence();
+ int i = sq.getLength();
+ float[][] paevals = new float[i][i];
+ for (i = i - 1; i >= 0; i--)
+ {
+ for (int j = 0; j <= i; j++)
+ {
+ paevals[i][j] = ((i - j < 2)
+ || ((i > 1 && i < 5) && (j > 1 && i < 5))) ? 1 : 0f;
+ paevals[j][i] = -paevals[i][j];
+ }
+ }
+ PAEContactMatrix dummyMat = new PAEContactMatrix(sq, paevals);
+ String content = ContactMatrix.contactToFloatString(dummyMat);
+ Assert.assertTrue(content.contains("\t1.")); // at least one element must be
+ // 1
+ float[][] vals = ContactMatrix.fromFloatStringToContacts(content,
+ sq.getLength(), sq.getLength());
+ assertEquals(vals[3][4], paevals[3][4]);
+ assertEquals(vals[4][3], paevals[4][3]);
+ dummyMat.setGroupSet(GroupSet.makeGroups(dummyMat, false, 0.5f, false));
+ Assert.assertNotSame(dummyMat.getNewick(), "");
+ AlignmentAnnotation paeCm = sq.addContactList(dummyMat);
+ al.addAnnotation(paeCm);
+ // verify store/restore of group bitsets
+ for (BitSet gp : dummyMat.getGroups())
+ {
+ StringBuilder sb = new StringBuilder();
+ for (long val : gp.toLongArray())
+ {
+ if (sb.length() > 0)
+ {
+ sb.append(",");
+ }
+ sb.append(val);
+ }
+ String[] longvals = sb.toString().split(",");
+ long[] newlongvals = new long[longvals.length];
+ for (int lv = 0; lv < longvals.length; lv++)
+ {
+ try
+ {
+ newlongvals[lv] = Long.valueOf(longvals[lv]);
+ } catch (Exception x)
+ {
+ Assert.fail("failed to deserialise bitset element ");
+ }
+ }
+ BitSet newGp = BitSet.valueOf(newlongvals);
+ assertTrue(gp.equals(newGp));
+ }
+ File tfile = File.createTempFile("testStoreAndRecoverPAEmatrix",
+ ".jvp");
+ new Jalview2XML(false).saveState(tfile);
+ Desktop.instance.closeAll_actionPerformed(null);
+
+ af = new FileLoader().LoadFileWaitTillLoaded(tfile.getAbsolutePath(),
+ DataSourceType.FILE);
+ AlignmentI newAl = af.getViewport().getAlignment();
+ SequenceI newSeq = newAl.getSequenceAt(0).getDatasetSequence();
+ // check annotation of the expected type exists
+ Assert.assertEquals(newSeq.getAnnotation().length, 1);
+ Assert.assertEquals(newSeq.getAnnotation()[0].graph, paeCm.graph);
+
+ // check a contact matrix was recovered
+ Assert.assertEquals(newSeq.getContactMaps().size(), 1);
+ // and can be found for the annotation on the sequence
+ ContactMatrixI restoredMat = newSeq
+ .getContactMatrixFor(newSeq.getAnnotation()[0]);
+ Assert.assertNotNull(restoredMat);
+ MapList oldMap = ((MappableContactMatrixI) dummyMat).getMapFor(sq);
+ MapList newMap = ((MappableContactMatrixI) restoredMat)
+ .getMapFor(newSeq);
+ Assert.assertEquals(oldMap.getFromRanges(), newMap.getFromRanges());
+ Assert.assertEquals(oldMap.getToRanges(), newMap.getToRanges());
+ Assert.assertEquals(oldMap.getFromRatio(), newMap.getFromRatio());
+ Assert.assertEquals(oldMap.getToRatio(), newMap.getToRatio());
+ for (i = sq.getLength() - 1; i >= 0; i--)
+ {
+ ContactListI oldCM = dummyMat.getContactList(i),
+ newCM = restoredMat.getContactList(i);
+ for (int j = oldCM.getContactHeight(); j >= 0; j--)
+ {
+ double old_j = oldCM.getContactAt(j);
+ double new_j = newCM.getContactAt(j);
+ Assert.assertEquals(old_j, new_j);
+ }
+ }
+ Assert.assertEquals(restoredMat.hasGroups(), dummyMat.hasGroups());
+ Assert.assertEquals(restoredMat.getGroups(), dummyMat.getGroups());
+ Assert.assertEquals(restoredMat.hasTree(), dummyMat.hasTree());
+ Assert.assertEquals(restoredMat.getNewick(), dummyMat.getNewick());
+
+ // verify no duplicate PAE matrix data when new view created and saved
+
+ // add reference annotations to view first, then copy
+ AlignmentUtils.addReferenceAnnotationTo(newAl, newAl.getSequenceAt(0),
+ newSeq.getAnnotation()[0], null);
+
+ AlignmentViewPanel newview = af.newView("copy of PAE", true);
+
+ // redundant asserts here check all is good with the new view firest...
+ AlignmentI newviewAl = newview.getAlignment();
+ SequenceI newviewSeq = newviewAl.getSequenceAt(0);
+ // check annotation of the expected type exists
+ Assert.assertEquals(newviewSeq.getAnnotation().length, 1);
+ Assert.assertEquals(newviewSeq.getAnnotation()[0].graph, paeCm.graph);
+ // check we have just one contact matrix mapping
+ Assert.assertEquals(newviewSeq.getContactMaps().size(), 1);
+
+ // and can be found for the annotation on the sequence
+ ContactMatrixI newviewMat = newviewSeq
+ .getContactMatrixFor(newviewSeq.getAnnotation()[0]);
+ Assert.assertNotNull(newviewMat);
+
+ Assert.assertTrue(newviewMat == restoredMat);
+
+ // save the two views and restore. Now look at visible annotation to check
+ // all views have shared refs.
+
+ tfile = File.createTempFile("testStoreAndRecoverPAEmatrixTwoViews",
+ ".jvp");
+ new Jalview2XML(false).saveState(tfile);
+ Desktop.instance.closeAll_actionPerformed(null);
+
+ af = new FileLoader().LoadFileWaitTillLoaded(tfile.getAbsolutePath(),
+ DataSourceType.FILE);
+ newAl = af.getAlignPanels().get(0).getAlignment();
+ AlignmentAnnotation view1aa = newAl.getSequenceAt(0).getAnnotation()[0];
+
+ newviewAl = af.getAlignPanels().get(1).getAlignment();
+ AlignmentAnnotation view2aa = newviewAl.getSequenceAt(0)
+ .getAnnotation()[0];
+
+ // annotations are shared across alignment views - so should still have an
+ // identical pair of annotations.
+ Assert.assertTrue(view1aa == view2aa);
+ // identical annotations means identical contact matrix mappings
+ Assert.assertEquals(
+ newAl.getDataset().getSequenceAt(0).getContactMaps().size(), 1);
+
+ // TODO Verify when distinct mappable PAEs are created, only one PAE dataset
+ // is actually held.
+ // Assert.assertTrue(view1aa!=view2aa);
+ // restoredMat = newAl.getContactMatrixFor(view1aa);
+ // newviewMat = newviewAl.getContactMatrixFor(view2aa);
+ // Assert.assertTrue(restoredMat!=newviewMat);
+
+ }
+
+ @Test(groups = "Functional")
+ public void testStoreAndRestoreIDwidthAndAnnotationHeight()
+ throws IOException
+ {
+ Desktop.instance.closeAll_actionPerformed(null);
+ final String SECONDVIEW = "With Diffferent IDwidth";
+ // create a new tempfile
+ File tempfile = File.createTempFile("jvIdWidthStoreRestore", "jvp");
+
+ AlignFrame af = new FileLoader().LoadFileWaitTillLoaded(
+ "examples/exampleFile.jvp", DataSourceType.FILE);
+ assertNotNull(af, "Didn't read in the example file correctly.");
+ // FIXME JAL-4281 test made platform dependent to pass, but probably
+ // shouldn't be platform dependent
+ assertEquals(af.alignPanel.getAlignViewport().getIdWidth(),
+ Platform.isAMacAndNotJS() ? 144 : 138,
+ "Legacy project import should have fixed ID width");
+ assertTrue(
+ af.alignPanel.getIdPanel().getIdCanvas().isManuallyAdjusted());
+
+ af.alignPanel.getAlignViewport().setIdWidth(100);
+ af.alignPanel.updateLayout();
+ assertTrue(
+ af.alignPanel.getIdPanel().getIdCanvas().isManuallyAdjusted());
+
+ Jalview2XML jv2xml = new jalview.project.Jalview2XML(false);
+ tempfile.delete();
+ jv2xml.saveState(tempfile);
+ assertTrue(jv2xml.errorMessage == null,
+ "Failed to save dummy project with PCA: test broken");
+ af = null;
+ // load again.
+ Desktop.instance.closeAll_actionPerformed(null);
+ af = new FileLoader().LoadFileWaitTillLoaded(
+ tempfile.getCanonicalPath(), DataSourceType.FILE);
+ assertTrue(
+ af.alignPanel.getIdPanel().getIdCanvas().isManuallyAdjusted());
+ assertEquals(af.alignPanel.getAlignViewport().getIdWidth(), 100,
+ "New project exported and import should have adjusted ID width");
+
+ af.alignPanel.getAlignViewport().setIdWidth(100);
+ af.alignPanel.updateLayout();
+ assertTrue(
+ af.alignPanel.getIdPanel().getIdCanvas().isManuallyAdjusted());
+
+ // now make it autoadjusted
+ af.alignPanel.getAlignViewport().setIdWidth(-1);
+ af.alignPanel.getIdPanel().getIdCanvas().setManuallyAdjusted(false);
+ af.alignPanel.updateLayout();
+ assertFalse(
+ af.alignPanel.getIdPanel().getIdCanvas().isManuallyAdjusted());
+ assertTrue(af.alignPanel.getAlignViewport().getIdWidth() > -1,
+ "New project exported and import should have adjusted ID width");
+
+ jv2xml = new jalview.project.Jalview2XML(false);
+ tempfile.delete();
+ jv2xml.saveState(tempfile);
+ assertTrue(jv2xml.errorMessage == null,
+ "Failed to save dummy project with PCA: test broken");
+ af = null;
+ // load again.
+ Desktop.instance.closeAll_actionPerformed(null);
+ af = new FileLoader().LoadFileWaitTillLoaded(
+ tempfile.getCanonicalPath(), DataSourceType.FILE);
+ assertFalse(
+ af.alignPanel.getIdPanel().getIdCanvas().isManuallyAdjusted());
+ assertTrue(af.alignPanel.getAlignViewport().getIdWidth() > -1,
+ "New project exported and import should have adjusted ID width");
+ }
+