JAL-2154 xref test harness - test fails if there are differences between dataset...
authorJim Procter <jprocter@issues.jalview.org>
Tue, 16 Aug 2016 09:39:11 +0000 (10:39 +0100)
committerJim Procter <jprocter@issues.jalview.org>
Tue, 16 Aug 2016 09:39:11 +0000 (10:39 +0100)
Currently fails !

test/jalview/io/CrossRef2xmlTests.java

index dd6aac6..f0d3240 100644 (file)
@@ -24,12 +24,18 @@ import static org.testng.AssertJUnit.assertTrue;
 
 import jalview.analysis.CrossRef;
 import jalview.api.AlignmentViewPanel;
+import jalview.datamodel.AlignedCodonFrame;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.SequenceI;
 import jalview.gui.AlignFrame;
 import jalview.gui.CrossRefAction;
 import jalview.gui.Desktop;
+import jalview.gui.Jalview2XML;
 
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.IdentityHashMap;
 import java.util.List;
 
@@ -64,70 +70,279 @@ public class CrossRef2xmlTests extends Jalview2xmlBase
     // . codonframes
     //
     //
+    HashMap<String, String> dbtoviewBit = new HashMap<String, String>();
+    List<String> keyseq = new ArrayList<String>();
+    HashMap<String, File> savedProjects = new HashMap<String, File>();
+
     for (String[] did : new String[][] { { "UNIPROT", "P01731" } })
     {
-      AlignFrame af = jalview.gui.SequenceFetcher.fetchAndShow(did[0],
-              did[1]).get(0);
-      assertTrue("Didn't read in the example file correctly.", af != null);
-      boolean dna = af.getViewport().getAlignment().isNucleotide();
-      AlignmentI retral = af.getViewport().getAlignment();
-      AlignmentI dataset = retral.getDataset();
-      SequenceI[] seqs = retral.getSequencesArray();
-      List<String> ptypes = (seqs == null || seqs.length == 0) ? null
-              : new CrossRef(seqs, dataset)
-                      .findXrefSourcesForSequences(dna);
-      /*
-       * map between a view, and views generated after retrieving xrefs
-       */
-      IdentityHashMap<AlignmentViewPanel, List<AlignmentViewPanel>> viewxrefview = new IdentityHashMap<AlignmentViewPanel, List<AlignmentViewPanel>>();
-      /*
-       * map between a particular view and it's originating dbref path
-       */
-      IdentityHashMap<AlignmentViewPanel, String> viewsourcedb = new IdentityHashMap<AlignmentViewPanel, String>();
-
-      String first = did[0] + " " + did[1];
-      viewsourcedb.put(af.alignPanel, first);
-      for (String db : ptypes)
+      // pass counters - 0 - first pass, 1 means retrieve project rather than
+      // perform action
+      int pass1 = 0, pass2 = 0, pass3 = 0;
+      // each do loop performs two iterations in the first outer loop pass, but
+      // only performs one iteration on the second outer loop
+      // ie. pass 1 = 0 {pass 2= 0 { pass 3 = 0,1 }, pass 2=1 { pass 3 = 0 }}, 1
+      // { pass 2 = 0 { pass 3 = 0 } }
+      do
       {
-        // retrieve and show cross-refs in this thread
-        CrossRefAction cra = new CrossRefAction(af, seqs, dna, db);
-        cra.run();
-        Assert.assertTrue(cra.getXrefViews().size() > 0,
-                "No crossrefs retrieved for " + db);
-        viewxrefview.put(af.alignPanel, cra.getXrefViews());
-
-        for (AlignmentViewPanel avp : cra.getXrefViews())
+        String first = did[0] + " " + did[1];
+        AlignFrame af = null;
+        if (pass1 == 0)
+        {
+          // retrieve dbref
+
+          keyseq.add(first);
+
+          af = jalview.gui.SequenceFetcher.fetchAndShow(did[0], did[1])
+                  .get(0);
+          assertTrue("Didn't retrieve " + first, af != null);
+          // store project to recover on next pass
+          stringify(dbtoviewBit, savedProjects, first, af.alignPanel);
+        }
+        else
         {
+          Desktop.instance.closeAll_actionPerformed(null);
+          // recover stored project
+          af = new FileLoader(false).LoadFileWaitTillLoaded(savedProjects
+                  .get(first).toString(), FormatAdapter.FILE);
+        }
 
-          SequenceI[] xrseqs = avp.getAlignment().getSequencesArray();
-          String nextxref = first + " -> " + db;
-          viewsourcedb.put(avp, nextxref);
-          List<String> xrptypes = (seqs == null || seqs.length == 0) ? null
-                  : new CrossRef(xrseqs, dataset)
-                          .findXrefSourcesForSequences(avp
-                                  .getAlignViewport().isNucleotide());
-          for (String xrefdb : xrptypes)
+        boolean dna = af.getViewport().getAlignment().isNucleotide();
+        AlignmentI retral = af.getViewport().getAlignment();
+        AlignmentI dataset = retral.getDataset();
+        SequenceI[] seqs = retral.getSequencesArray();
+        List<String> ptypes = (seqs == null || seqs.length == 0) ? null
+                : new CrossRef(seqs, dataset)
+                        .findXrefSourcesForSequences(dna);
+
+        /*
+         * map between a view, and views generated after retrieving xrefs
+         */
+        IdentityHashMap<AlignmentViewPanel, List<AlignmentViewPanel>> viewxrefview = new IdentityHashMap<AlignmentViewPanel, List<AlignmentViewPanel>>();
+        /*
+         * map between a particular view and it's originating dbref path
+         */
+        IdentityHashMap<AlignmentViewPanel, String> viewsourcedb = new IdentityHashMap<AlignmentViewPanel, String>();
+
+        viewsourcedb.put(af.alignPanel, first);
+        for (String db : ptypes)
+        {
+          pass2 = 0;
+          do // second cross ref and recover crossref loop
           {
-            AlignFrame nextaf = Desktop.getAlignFrameFor(avp
-                    .getAlignViewport());
-            cra = new CrossRefAction(nextaf, xrseqs, avp.getAlignViewport()
-                    .isNucleotide(), xrefdb);
-            cra.run();
-            Assert.assertTrue(cra.getXrefViews().size() > 0,
-                    "No crossrefs found for '" + nextxref + "' to "
-                            + xrefdb + " via '" + nextaf.getTitle() + "'");
-            // save views for analysis
-            viewxrefview.put(avp, cra.getXrefViews());
-            for (AlignmentViewPanel nextavp : cra.getXrefViews())
+            // counter for splitframe views retrieved via crossref
+            int p = 0;
+            // build next key so we an retrieve all views
+            String nextxref = first + " -> " + db + "{" + p + "}";
+            // perform crossref action, or retrieve stored project
+            List<AlignmentViewPanel> cra_views = new ArrayList<AlignmentViewPanel>();
+            CrossRefAction cra = null;
+            if (pass2 == 0)
+            { // retrieve and show cross-refs in this thread
+              cra = new CrossRefAction(af, seqs, dna, db);
+              cra.run();
+              Assert.assertTrue(cra.getXrefViews().size() > 0,
+                      "No crossrefs retrieved for " + db);
+              cra_views = cra.getXrefViews();
+              viewxrefview.put(af.alignPanel, cra.getXrefViews());
+            }
+            else
             {
+              Desktop.instance.closeAll_actionPerformed(null);
+              // recover stored project
+              AlignFrame af2 = new FileLoader(false)
+                      .LoadFileWaitTillLoaded(savedProjects.get(first)
+                              .toString(), FormatAdapter.FILE);
+              // gymnastics to recover the alignPanel/Complementary alignPanel
+              if (af2.getViewport().isNucleotide())
+              {
+                // top view, then bottom
+                cra_views.add(af2.getViewport().getAlignPanel());
+                cra_views.add(((jalview.gui.AlignViewport) af2
+                        .getViewport().getCodingComplement())
+                        .getAlignPanel());
+
+              }
+              else
+              {
+                // bottom view, then top
+                cra_views.add(((jalview.gui.AlignViewport) af2
+                        .getViewport().getCodingComplement())
+                        .getAlignPanel());
+                cra_views.add(af2.getViewport().getAlignPanel());
 
-              viewsourcedb.put(nextavp, nextxref + " -> " + xrefdb);
+              }
             }
-          }
+            for (AlignmentViewPanel avp : cra_views)
+            {
+
+              SequenceI[] xrseqs = avp.getAlignment().getSequencesArray();
+              nextxref = first + " -> " + db + "{" + p++ + "}";
+
+              viewsourcedb.put(avp, nextxref);
+              stringify(dbtoviewBit, savedProjects, nextxref, avp);
+              keyseq.add(nextxref);
+
+              List<String> xrptypes = (seqs == null || seqs.length == 0) ? null
+                      : new CrossRef(xrseqs, dataset)
+                              .findXrefSourcesForSequences(avp
+                                      .getAlignViewport().isNucleotide());
+              for (String xrefdb : xrptypes)
+              {
+                pass3 = 0;
+                do // 3rd cross ref and recover crossref loop
+                {
+                  List<AlignmentViewPanel> cra_views2 = new ArrayList<AlignmentViewPanel>();
+                  int q = 0;
+                  String nextnextxref = "{" + p + "}" + nextxref + " -> "
+                          + xrefdb + "{" + q + "}";
+
+                  AlignFrame nextaf = Desktop.getAlignFrameFor(avp
+                          .getAlignViewport());
+                  if (pass3 == 0)
+                  {
+
+                    cra = new CrossRefAction(nextaf, xrseqs, avp
+                            .getAlignViewport().isNucleotide(), xrefdb);
+                    cra.run();
+                    Assert.assertTrue(cra.getXrefViews().size() > 0,
+                            "No crossrefs found for '" + nextxref + "' to "
+                                    + xrefdb + " via '" + nextaf.getTitle()
+                                    + "'");
+                    cra_views2 = cra.getXrefViews();
+                  }
+                  else
+                  {
+                    Desktop.instance.closeAll_actionPerformed(null);
+                    // recover stored project
+                    AlignFrame af2 = new FileLoader(false)
+                            .LoadFileWaitTillLoaded(
+                                    savedProjects.get(nextnextxref)
+                                            .toString(), FormatAdapter.FILE);
+                    // gymnastics to recover the alignPanel/Complementary
+                    // alignPanel
+                    if (af2.getViewport().isNucleotide())
+                    {
+                      // top view, then bottom
+                      cra_views2.add(af2.getViewport().getAlignPanel());
+                      cra_views2.add(((jalview.gui.AlignViewport) af2
+                              .getViewport().getCodingComplement())
+                              .getAlignPanel());
+
+                    }
+                    else
+                    {
+                      // bottom view, then top
+                      cra_views2.add(((jalview.gui.AlignViewport) af2
+                              .getViewport().getCodingComplement())
+                              .getAlignPanel());
+                      cra_views2.add(af2.getViewport().getAlignPanel());
+                    }
+                    Assert.assertEquals(cra_views2.size(), 2);
+                    Assert.assertNotNull(cra_views2.get(0));
+                    Assert.assertNotNull(cra_views2.get(1));
+                  }
+
+                  for (AlignmentViewPanel nextavp : cra_views2)
+                  {
+                    nextnextxref = "{" + p + "}" + nextxref + " -> "
+                            + xrefdb + "{" + q++ + "}";
+                    viewsourcedb.put(nextavp, nextnextxref);
+                    stringify(dbtoviewBit, savedProjects, nextnextxref,
+                            nextavp);
+                    keyseq.add(nextnextxref);
+                  }
+                } while (pass3++ < 2 && pass2 < 1);
+              }
+            }
+          } while (pass2++ < 2 && pass1 < 1);
         }
-      }
+      } while (++pass1 < 2);
     }
-    Thread.sleep(50000);
   }
 
+  /**
+   * first time called, record strings derived from alignment and
+   * alignedcodonframes, and save view to a project file. Second time called,
+   * compare strings to existing ones. org.testng.Assert.assertTrue on
+   * stringmatch
+   * 
+   * @param dbtoviewBit
+   *          map between xrefpath and view string
+   * @param savedProjects
+   *          - map from xrefpath to saved project filename (createTempFile)
+   * @param xrefpath
+   *          - xrefpath - unique ID for this context (composed of sequence of
+   *          db-fetch/cross-ref actions preceeding state)
+   * @param avp
+   *          - viewpanel to store (for viewpanels in splitframe, the same
+   *          project should be written for both panels, only one needs
+   *          recovering for comparison on the next stringify call, but each
+   *          viewpanel needs to be called with a distinct xrefpath to ensure
+   *          each one's strings are compared)
+   */
+  private void stringify(HashMap<String, String> dbtoviewBit,
+          HashMap<String, File> savedProjects, String xrefpath,
+          AlignmentViewPanel avp)
+  {
+    if (savedProjects != null)
+    {
+      if (savedProjects.get(xrefpath) == null)
+    {
+      // write a project file for this view. On the second pass, this will be
+      // recovered and cross-references verified
+      try
+      {
+        File prfile = File.createTempFile("crossRefTest", ".jvp");
+        AlignFrame af = Desktop.getAlignFrameFor(avp.getAlignViewport());
+        new Jalview2XML(false).saveAlignment(af, prfile.toString(),
+                af.getTitle());
+        System.out.println("Written view from '" + xrefpath + "' as '"
+                + prfile.getAbsolutePath() + "'");
+        savedProjects.put(xrefpath, prfile);
+      } catch (IOException q)
+      {
+        Assert.fail("Unexpected IO Exception", q);
+      }
+      }
+      else
+      {
+        System.out.println("Stringify check on view from '" + xrefpath
+                + "' [ possibly retrieved from '"
+                + savedProjects.get(xrefpath).getAbsolutePath() + "' ]");
+
+      }
+    }
+
+    StringBuilder sbr = new StringBuilder();
+    sbr.append(avp.getAlignment().toString());
+    sbr.append("\n");
+    sbr.append("<End of alignment>");
+    sbr.append("\n");
+    sbr.append(avp.getAlignment().getDataset());
+    sbr.append("\n");
+    sbr.append("<End of dataset>");
+    sbr.append("\n");
+    int p = 0;
+    if (avp.getAlignment().getCodonFrames() != null)
+    {
+      for (AlignedCodonFrame ac : avp.getAlignment().getCodonFrames())
+      {
+        sbr.append("<AlignedCodonFrame " + p++ + ">");
+        sbr.append("\n");
+        sbr.append(ac.toString());
+        sbr.append("\n");
+      }
+    }
+    String dbt = dbtoviewBit.get(xrefpath);
+    if (dbt == null)
+    {
+      dbtoviewBit.put(xrefpath, sbr.toString());
+    }
+    else
+    {
+      Assert.assertEquals(sbr.toString(), dbt,
+              "stringify mismatch for " + xrefpath);
+    }
+  }
 }