From: gmungoc Date: Wed, 29 Jun 2016 08:17:29 +0000 (+0100) Subject: JAL-1369 fix bug reloading a project with group sequence reps X-Git-Tag: Release_2_10_0~151^2 X-Git-Url: http://source.jalview.org/gitweb/?a=commitdiff_plain;h=8f5031f8cc3b6da5ce8d639a5b6e0365c1904623;p=jalview.git JAL-1369 fix bug reloading a project with group sequence reps --- diff --git a/src/jalview/gui/Jalview2XML.java b/src/jalview/gui/Jalview2XML.java index 01e60d4..945651b 100644 --- a/src/jalview/gui/Jalview2XML.java +++ b/src/jalview/gui/Jalview2XML.java @@ -4144,25 +4144,25 @@ public class Jalview2XML { for (int s = 0; s < JSEQ.length; s++) { - jalview.datamodel.SequenceGroup hidden = new jalview.datamodel.SequenceGroup(); - + SequenceGroup hidden = new SequenceGroup(); + boolean isRepresentative = false; for (int r = 0; r < JSEQ[s].getHiddenSequencesCount(); r++) { - hidden.addSequence( - al.getSequenceAt(JSEQ[s].getHiddenSequences(r)), false); + isRepresentative = true; + SequenceI sequenceToHide = al.getSequenceAt(JSEQ[s] + .getHiddenSequences(r)); + hidden.addSequence(sequenceToHide, false); + // remove from hiddenSeqs list so we don't try to hide it twice + hiddenSeqs.remove(sequenceToHide); + } + if (isRepresentative) + { + SequenceI representativeSequence = al.getSequenceAt(s); + hidden.addSequence(representativeSequence, false); + af.viewport.hideRepSequences(representativeSequence, hidden); } - af.viewport.hideRepSequences(al.getSequenceAt(s), hidden); } - // jalview.datamodel.SequenceI[] hseqs = new - // jalview.datamodel.SequenceI[hiddenSeqs - // .size()]; - // - // for (int s = 0; s < hiddenSeqs.size(); s++) - // { - // hseqs[s] = (jalview.datamodel.SequenceI) hiddenSeqs.elementAt(s); - // } - SequenceI[] hseqs = hiddenSeqs.toArray(new SequenceI[hiddenSeqs .size()]); af.viewport.hideSequence(hseqs); diff --git a/test/jalview/io/Jalview2xmlTests.java b/test/jalview/io/Jalview2xmlTests.java index a77e10a..38153df 100644 --- a/test/jalview/io/Jalview2xmlTests.java +++ b/test/jalview/io/Jalview2xmlTests.java @@ -22,6 +22,8 @@ package jalview.io; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertFalse; +import static org.testng.AssertJUnit.assertNotNull; +import static org.testng.AssertJUnit.assertSame; import static org.testng.AssertJUnit.assertTrue; import jalview.api.AlignViewportI; @@ -31,6 +33,7 @@ import jalview.bin.Cache; import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.AlignmentI; import jalview.datamodel.HiddenSequences; +import jalview.datamodel.SequenceCollectionI; import jalview.datamodel.SequenceGroup; import jalview.datamodel.SequenceI; import jalview.gui.AlignFrame; @@ -437,12 +440,8 @@ public class Jalview2xmlTests assertTrue("Didn't read in the example file correctly.", af != null); String afid = af.getViewport().getSequenceSetId(); - /* - * remember representative and hidden sequences marked - * on each panel - */ + // remember reference sequence for each panel Map refseqs = new HashMap(); - Map> hiddenSeqNames = new HashMap>(); /* * mark sequence 2, 3, 4.. in panels 1, 2, 3... @@ -456,31 +455,7 @@ public class Jalview2xmlTests int repIndex = n % alignment.getHeight(); SequenceI rep = alignment.getSequenceAt(repIndex); refseqs.put(ap.getViewName(), rep); - List hiddenNames = new ArrayList(); - hiddenSeqNames.put(ap.getViewName(), hiddenNames); - - /* - * hide rep sequence and the one before it - */ - SequenceI seqToHide = alignment.getSequenceAt(repIndex); - SequenceGroup sg = new SequenceGroup(); - sg.addSequence(seqToHide, false); - SequenceI precedingSeq = alignment.getSequenceAt(repIndex - 1); - sg.addSequence(precedingSeq, false); - av.setSelectionGroup(sg); - ((AlignmentViewport) av).hideSequences(seqToHide, true); - /* - * record names of hidden sequences - */ - HiddenSequences hs = alignment.getHiddenSequences(); - for (SequenceI seq : hs.hiddenSequences) - { - if (seq != null) - { - hiddenNames.add(seq.getName()); - } - } // code from mark/unmark sequence as reference in jalview.gui.PopupMenu // todo refactor this to an alignment view controller av.setDisplayReferenceSeq(true); @@ -526,16 +501,6 @@ public class Jalview2xmlTests "Display reference sequence view setting not set."); Assert.assertTrue(ap.getAlignViewport().isColourByReferenceSeq(), "Colour By Reference Seq view setting not set."); - - /* - * verify hidden sequences in restored panel - */ - List hidden = hiddenSeqNames.get(ap.getViewName()); - HiddenSequences hs = alignment.getHiddenSequences(); - assertEquals( - "wrong number of restored hidden sequences in " - + ap.getViewName(), - hidden.size(), hs.getSize()); } } @@ -592,4 +557,126 @@ public class Jalview2xmlTests assertFalse(Jalview2XML.isVersionStringLaterThan("2.8.3", "2.8.2b1")); assertFalse(Jalview2XML.isVersionStringLaterThan("2.8.0b2", "2.8.0b1")); } + + /** + * Test save and reload of a project with a different sequence group (and + * representative sequence) in each view. + * + * @throws Exception + */ + @Test(groups = { "Functional" }) + public void testStoreAndRecoverGroupRepSeqs() throws Exception + { + Desktop.instance.closeAll_actionPerformed(null); + AlignFrame af = new FileLoader().LoadFileWaitTillLoaded( + "examples/uniref50.fa", FormatAdapter.FILE); + assertTrue("Didn't read in the example file correctly.", af != null); + String afid = af.getViewport().getSequenceSetId(); + // make a second view of the alignment + af.newView_actionPerformed(null); + + /* + * remember representative and hidden sequences marked + * on each panel + */ + Map repSeqs = new HashMap(); + Map> hiddenSeqNames = new HashMap>(); + + /* + * mark sequence 2, 3, 4.. in panels 1, 2, 3... + * as reference sequence for itself and the preceding sequence + */ + int n = 1; + for (AlignmentViewPanel ap : Desktop.getAlignmentPanels(afid)) + { + AlignViewportI av = ap.getAlignViewport(); + AlignmentI alignment = ap.getAlignment(); + int repIndex = n % alignment.getHeight(); + // ensure at least one preceding sequence i.e. index >= 1 + repIndex = Math.max(repIndex, 1); + SequenceI repSeq = alignment.getSequenceAt(repIndex); + repSeqs.put(ap.getViewName(), repSeq); + List hiddenNames = new ArrayList(); + hiddenSeqNames.put(ap.getViewName(), hiddenNames); + + /* + * have rep sequence represent itself and the one before it + * this hides the group (except for the rep seq) + */ + SequenceGroup sg = new SequenceGroup(); + sg.addSequence(repSeq, false); + SequenceI precedingSeq = alignment.getSequenceAt(repIndex - 1); + sg.addSequence(precedingSeq, false); + sg.setSeqrep(repSeq); + assertTrue(sg.getSequences().contains(repSeq)); + assertTrue(sg.getSequences().contains(precedingSeq)); + av.setSelectionGroup(sg); + assertSame(repSeq, sg.getSeqrep()); + + /* + * represent group with sequence adds to a map of hidden rep sequences + * (it does not create a group on the alignment) + */ + ((AlignmentViewport) av).hideSequences(repSeq, true); + assertSame(repSeq, sg.getSeqrep()); + assertTrue(sg.getSequences().contains(repSeq)); + assertTrue(sg.getSequences().contains(precedingSeq)); + assertTrue("alignment has groups", alignment.getGroups().isEmpty()); + Map hiddenRepSeqsMap = av.getHiddenRepSequences(); + assertNotNull(hiddenRepSeqsMap); + assertEquals(1, hiddenRepSeqsMap.size()); + assertSame(sg, hiddenRepSeqsMap.get(repSeq)); + assertTrue(alignment.getHiddenSequences().isHidden(precedingSeq)); + assertFalse(alignment.getHiddenSequences().isHidden(repSeq)); + hiddenNames.add(precedingSeq.getName()); + + n++; + } + File tfile = File + .createTempFile("testStoreAndRecoverGroupReps", + ".jvp"); + try + { + new Jalview2XML(false).saveState(tfile); + } catch (Throwable e) + { + Assert.fail("Didn't save the expanded view state", e); + } + Desktop.instance.closeAll_actionPerformed(null); + if (Desktop.getAlignFrames() != null) + { + Assert.assertEquals(Desktop.getAlignFrames().length, 0); + } + + af = new FileLoader().LoadFileWaitTillLoaded( + tfile.getAbsolutePath(), FormatAdapter.FILE); + afid = af.getViewport().getSequenceSetId(); + + for (AlignmentViewPanel ap : Desktop.getAlignmentPanels(afid)) + { + String viewName = ap.getViewName(); + AlignViewportI av = ap.getAlignViewport(); + AlignmentI alignment = ap.getAlignment(); + List groups = alignment.getGroups(); + assertNotNull(groups); + assertTrue("Alignment has groups", groups.isEmpty()); + Map hiddenRepSeqsMap = av + .getHiddenRepSequences(); + assertNotNull("No hidden represented sequences", hiddenRepSeqsMap); + assertEquals(1, hiddenRepSeqsMap.size()); + assertEquals(repSeqs.get(viewName).getDisplayId(true), + hiddenRepSeqsMap.keySet().iterator().next() + .getDisplayId(true)); + + /* + * verify hidden sequences in restored panel + */ + List hidden = hiddenSeqNames.get(ap.getViewName()); + HiddenSequences hs = alignment.getHiddenSequences(); + assertEquals( + "wrong number of restored hidden sequences in " + + ap.getViewName(), + hidden.size(), hs.getSize()); + } + } }