JAL-4134 store/restore Newick tree for PAE annotation row
[jalview.git] / test / jalview / project / Jalview2xmlTests.java
index 91ea959..fa6c25c 100644 (file)
@@ -54,6 +54,9 @@ 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.HiddenSequences;
@@ -97,6 +100,7 @@ import jalview.util.MapList;
 import jalview.util.matcher.Condition;
 import jalview.viewmodel.AlignmentViewport;
 import jalview.viewmodel.seqfeatures.FeatureRendererModel;
+import jalview.ws.datamodel.alphafold.PAEContactMatrix;
 
 @Test(singleThreaded = true)
 public class Jalview2xmlTests extends Jalview2xmlBase
@@ -593,6 +597,16 @@ public class Jalview2xmlTests extends Jalview2xmlBase
     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"));
+
   }
 
   /**
@@ -859,8 +873,11 @@ public class Jalview2xmlTests extends Jalview2xmlBase
     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);
+    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
@@ -869,7 +886,7 @@ public class Jalview2xmlTests extends Jalview2xmlBase
             "testStoreAndRecoverAnnotRowElemColors", ".jvp");
     tfile.deleteOnExit();
     new Jalview2XML(false).saveState(tfile);
-    //Desktop.instance.closeAll_actionPerformed(null);
+    // Desktop.instance.closeAll_actionPerformed(null);
     af = new FileLoader().LoadFileWaitTillLoaded(tfile.getAbsolutePath(),
             DataSourceType.FILE);
     Assert.assertNotNull(af, "Failed to reload project");
@@ -877,9 +894,10 @@ public class Jalview2xmlTests extends Jalview2xmlBase
      * verify alignment annotation has colors
      */
     av = af.getViewport();
-    
+
     ColourSchemeI loadedCscheme = av.getGlobalColourScheme();
-    Assert.assertTrue(loadedCscheme instanceof AnnotationColourGradient,"Didn't apply Annotation colour gradient");
+    Assert.assertTrue(loadedCscheme instanceof AnnotationColourGradient,
+            "Didn't apply Annotation colour gradient");
     acg = (AnnotationColourGradient) loadedCscheme;
     assertTrue(acg.isSeqAssociated());
     assertTrue(acg.isPredefinedColours());
@@ -892,13 +910,16 @@ public class Jalview2xmlTests extends Jalview2xmlBase
     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 != 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");
+      Color newseqcol = af.alignPanel.getSeqPanel().seqCanvas
+              .getSequenceRenderer()
+              .getResidueColour(fsq, iStart + i, null);
+      Assert.assertTrue(seqcol[i].equals(newseqcol),
+              "Sequence shading is different");
 
     }
-    
+
   }
 
   /**
@@ -1477,4 +1498,113 @@ public class Jalview2xmlTests extends Jalview2xmlBase
 
     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]);
+    dummyMat.makeGroups(0.5f, false);
+    Assert.assertNotSame(dummyMat.getNewick(), "");
+    AlignmentAnnotation paeCm = sq.addContactList(dummyMat);
+    al.addAnnotation(paeCm);
+    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);
+    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--)
+      {
+        Assert.assertEquals(oldCM.getContactAt(j), newCM.getContactAt(j));
+      }
+    }
+    Assert.assertEquals(dummyMat.hasGroups(), restoredMat.hasGroups());
+    Assert.assertEquals(dummyMat.getGroups(), restoredMat.getGroups());
+    Assert.assertEquals(dummyMat.hasTree(), restoredMat.hasTree());
+    Assert.assertEquals(dummyMat.getNewick(), restoredMat.getNewick());
+    
+    
+  }
+
 }