import java.awt.Rectangle;
import java.io.File;
import java.io.IOException;
+import java.math.BigInteger;
import java.util.ArrayList;
+import java.util.BitSet;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import jalview.bin.Cache;
import jalview.datamodel.AlignmentAnnotation;
import jalview.datamodel.AlignmentI;
+import jalview.datamodel.Annotation;
+import jalview.datamodel.ContactListI;
+import jalview.datamodel.ContactMatrix;
+import jalview.datamodel.ContactMatrixI;
import jalview.datamodel.DBRefEntry;
import jalview.datamodel.GeneLocus;
+import jalview.datamodel.GroupSet;
import jalview.datamodel.HiddenSequences;
import jalview.datamodel.Mapping;
import jalview.datamodel.PDBEntry;
import jalview.util.matcher.Condition;
import jalview.viewmodel.AlignmentViewport;
import jalview.viewmodel.seqfeatures.FeatureRendererModel;
+import jalview.ws.datamodel.MappableContactMatrixI;
+import jalview.ws.datamodel.alphafold.PAEContactMatrix;
@Test(singleThreaded = true)
public class Jalview2xmlTests extends Jalview2xmlBase
@BeforeClass(alwaysRun = true)
public void setUpJvOptionPane()
{
+ if (Desktop.instance != null)
+ Desktop.instance.closeAll_actionPerformed(null);
JvOptionPane.setInteractiveMode(false);
JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
}
assertFalse(Jalview2XML.isVersionStringLaterThan("2.8.3b1", "2.8.3"));
assertFalse(Jalview2XML.isVersionStringLaterThan("2.8.3", "2.8.2b1"));
assertFalse(Jalview2XML.isVersionStringLaterThan("2.8.0b2", "2.8.0b1"));
+ /*
+ * test for patch release versions
+ */
+ assertFalse(Jalview2XML.isVersionStringLaterThan("2.11.3.0", "2.11.2"));
+ assertTrue(Jalview2XML.isVersionStringLaterThan("2.11.3.0", "2.11.4"));
+ assertFalse(
+ Jalview2XML.isVersionStringLaterThan("2.12.2.0b1", "2.12.2.0"));
+ assertFalse(
+ Jalview2XML.isVersionStringLaterThan("2.12.2.3", "2.12.2.2"));
+
}
/**
* @throws IOException
*/
@Test(groups = { "Functional" })
+ public void testStoreAndRecoverAnnotationRowElementColours()
+ throws IOException
+ {
+ Desktop.instance.closeAll_actionPerformed(null);
+ AlignFrame af = new FileLoader().LoadFileWaitTillLoaded("SEQ\tMNQ",
+ DataSourceType.PASTE);
+
+ AlignViewport av = af.getViewport();
+ AlignmentI al = av.getAlignment();
+ SequenceI fsq;
+ fsq = al.getSequenceAt(0);
+ Annotation annots[] = new Annotation[fsq.getLength()];
+ AlignmentAnnotation ala = new AlignmentAnnotation("Colour", "Annots",
+ annots);
+ annots[0] = new Annotation(1.0f);
+ annots[1] = new Annotation(2.0f);
+ annots[2] = new Annotation(3.0f);
+ annots[0].colour = Color.RED;
+ annots[1].colour = Color.GREEN;
+ annots[2].colour = Color.BLUE;
+ ala.validateRangeAndDisplay();
+ al.getSequenceAt(0).addAlignmentAnnotation(ala);
+ al.addAnnotation(ala);
+ /*
+ * and colour by annotation
+ */
+ AnnotationColourGradient acg = new AnnotationColourGradient(ala,
+ af.alignPanel.av.getGlobalColourScheme(), 0);
+ acg.setSeqAssociated(true);
+ acg.setPredefinedColours(true);
+ af.changeColour(acg);
+ Color seqcol[] = new Color[3];
+ for (int iStart = fsq.findIndex(fsq.getStart()), i = 0; i < 3; i++)
+ {
+ seqcol[i] = af.alignPanel.getSeqPanel().seqCanvas
+ .getSequenceRenderer()
+ .getResidueColour(fsq, iStart + i, null);
+ }
+ /*
+ * save project, close windows, reload project, verify
+ */
+ File tfile = File.createTempFile(
+ "testStoreAndRecoverAnnotRowElemColors", ".jvp");
+ tfile.deleteOnExit();
+ new Jalview2XML(false).saveState(tfile);
+ // Desktop.instance.closeAll_actionPerformed(null);
+ af = new FileLoader().LoadFileWaitTillLoaded(tfile.getAbsolutePath(),
+ DataSourceType.FILE);
+ Assert.assertNotNull(af, "Failed to reload project");
+ /*
+ * verify alignment annotation has colors
+ */
+ av = af.getViewport();
+
+ ColourSchemeI loadedCscheme = av.getGlobalColourScheme();
+ Assert.assertTrue(loadedCscheme instanceof AnnotationColourGradient,
+ "Didn't apply Annotation colour gradient");
+ acg = (AnnotationColourGradient) loadedCscheme;
+ assertTrue(acg.isSeqAssociated());
+ assertTrue(acg.isPredefinedColours());
+
+ al = av.getAlignment();
+ fsq = al.getSequenceAt(0);
+ ala = fsq.getAnnotation()[0];
+ Assert.assertNotNull(ala, "No annotation row recovered");
+ Assert.assertNotNull(ala.annotations);
+ for (int iStart = al.getSequenceAt(0)
+ .findIndex(al.getSequenceAt(0).getStart()), i = 0; i < 3; i++)
+ {
+ Assert.assertTrue(ala.annotations[i].colour != null);
+ Assert.assertTrue(ala.annotations[i].colour.equals(annots[i].colour));
+ Color newseqcol = af.alignPanel.getSeqPanel().seqCanvas
+ .getSequenceRenderer()
+ .getResidueColour(fsq, iStart + i, null);
+ Assert.assertTrue(seqcol[i].equals(newseqcol),
+ "Sequence shading is different");
+
+ }
+
+ }
+
+ /**
+ * Configure an alignment and a sub-group each with distinct colour schemes,
+ * Conservation and PID thresholds, and confirm these are restored from the
+ * saved project.
+ *
+ * @throws IOException
+ */
+ @Test(groups = { "Functional" })
public void testStoreAndRecoverColourThresholds() throws IOException
{
Desktop.instance.closeAll_actionPerformed(null);
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 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, 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());
+ }
+
}