X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=test%2Fjalview%2Fproject%2FJalview2xmlTests.java;h=d08ae7df21e4dcc43d8f498a0090238c0c0749b9;hb=refs%2Fheads%2Ffeature%2FJAL-3081customAnnOrder;hp=a0f1f6d4190e227d3f89a4919359123ef227504c;hpb=716b7ed46ecee85d5a5ced3e2c0cf65523b278ae;p=jalview.git diff --git a/test/jalview/project/Jalview2xmlTests.java b/test/jalview/project/Jalview2xmlTests.java index a0f1f6d..d08ae7d 100644 --- a/test/jalview/project/Jalview2xmlTests.java +++ b/test/jalview/project/Jalview2xmlTests.java @@ -23,6 +23,7 @@ package jalview.project; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertNotSame; import static org.testng.Assert.assertNull; import static org.testng.Assert.assertSame; import static org.testng.Assert.assertTrue; @@ -32,8 +33,10 @@ import jalview.api.AlignViewportI; import jalview.api.AlignmentViewPanel; import jalview.api.FeatureColourI; import jalview.api.ViewStyleI; +import jalview.bin.Cache; import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.AlignmentI; +import jalview.datamodel.Annotation; import jalview.datamodel.HiddenSequences; import jalview.datamodel.PDBEntry; import jalview.datamodel.PDBEntry.Type; @@ -70,6 +73,7 @@ import jalview.schemes.TCoffeeColourScheme; import jalview.structure.StructureImportSettings; import jalview.util.matcher.Condition; import jalview.viewmodel.AlignmentViewport; +import jalview.viewmodel.AlignmentViewport.AutoAnnotation; import java.awt.Color; import java.io.File; @@ -99,7 +103,7 @@ public class Jalview2xmlTests extends Jalview2xmlBase } @Test(groups = { "Functional" }) - public void testRNAStructureRecovery() throws Exception + public void testRestoreRNAStructure() throws Exception { String inFile = "examples/RF00031_folded.stk"; String tfile = File.createTempFile("JalviewTest", ".jvp") @@ -109,65 +113,73 @@ public class Jalview2xmlTests extends Jalview2xmlBase assertNotNull(af, "Didn't read input file " + inFile); int olddsann = countDsAnn(af.getViewport()); assertTrue(olddsann > 0, "Didn't find any dataset annotations"); - af.changeColour_actionPerformed(JalviewColourScheme.RNAHelices - .toString()); + af.changeColour_actionPerformed( + JalviewColourScheme.RNAHelices.toString()); assertTrue( - af.getViewport().getGlobalColourScheme() instanceof RNAHelicesColour, + af.getViewport() + .getGlobalColourScheme() instanceof RNAHelicesColour, "Couldn't apply RNA helices colourscheme"); assertTrue(af.saveAlignment(tfile, FileFormat.Jalview), "Failed to store as a project."); af.closeMenuItem_actionPerformed(true); af = null; - af = new FileLoader() - .LoadFileWaitTillLoaded(tfile, DataSourceType.FILE); + af = new FileLoader().LoadFileWaitTillLoaded(tfile, + DataSourceType.FILE); assertNotNull(af, "Failed to import new project"); int newdsann = countDsAnn(af.getViewport()); assertEquals(olddsann, newdsann, "Differing numbers of dataset sequence annotation\nOriginally " + olddsann + " and now " + newdsann); - System.out - .println("Read in same number of annotations as originally present (" + System.out.println( + "Read in same number of annotations as originally present (" + olddsann + ")"); assertTrue( - af.getViewport().getGlobalColourScheme() instanceof RNAHelicesColour, + af.getViewport() + .getGlobalColourScheme() instanceof RNAHelicesColour, "RNA helices colourscheme was not applied on import."); } @Test(groups = { "Functional" }) - public void testTCoffeeScores() throws Exception + public void testRestoreTCoffeeColouring() throws Exception { - String inFile = "examples/uniref50.fa", inAnnot = "examples/uniref50.score_ascii"; + String inFile = "examples/uniref50.fa", + inAnnot = "examples/uniref50.score_ascii"; String tfile = File.createTempFile("JalviewTest", ".jvp") .getAbsolutePath(); AlignFrame af = new FileLoader().LoadFileWaitTillLoaded(inFile, DataSourceType.FILE); assertNotNull(af, "Didn't read input file " + inFile); af.loadJalviewDataFile(inAnnot, DataSourceType.FILE, null, null); - assertSame(af.getViewport().getGlobalColourScheme().getClass(), + AlignViewport viewport = af.getViewport(); + assertSame(viewport.getGlobalColourScheme().getClass(), TCoffeeColourScheme.class, "Didn't set T-coffee colourscheme"); - assertNotNull(ColourSchemeProperty.getColourScheme(af.getViewport() - .getAlignment(), af.getViewport().getGlobalColourScheme() - .getSchemeName()), "Recognise T-Coffee score from string"); + assertNotNull( + ColourSchemeProperty.getColourScheme(viewport, + viewport.getAlignment(), + viewport.getGlobalColourScheme() + .getSchemeName()), + "Recognise T-Coffee score from string"); assertTrue(af.saveAlignment(tfile, FileFormat.Jalview), "Failed to store as a project."); af.closeMenuItem_actionPerformed(true); af = null; - af = new FileLoader() - .LoadFileWaitTillLoaded(tfile, DataSourceType.FILE); + af = new FileLoader().LoadFileWaitTillLoaded(tfile, + DataSourceType.FILE); assertNotNull(af, "Failed to import new project"); assertSame(af.getViewport().getGlobalColourScheme().getClass(), TCoffeeColourScheme.class, "Didn't set T-coffee colourscheme for imported project."); - System.out - .println("T-Coffee score shading successfully recovered from project."); + System.out.println( + "T-Coffee score shading successfully recovered from project."); } @Test(groups = { "Functional" }) - public void testColourByAnnotScores() throws Exception + public void testRestoreColourByAnnotion() throws Exception { - String inFile = "examples/uniref50.fa", inAnnot = "examples/testdata/uniref50_iupred.jva"; + String inFile = "examples/uniref50.fa", + inAnnot = "examples/testdata/uniref50_iupred.jva"; String tfile = File.createTempFile("JalviewTest", ".jvp") .getAbsolutePath(); AlignFrame af = new FileLoader().LoadFileWaitTillLoaded(inFile, @@ -178,12 +190,12 @@ public class Jalview2xmlTests extends Jalview2xmlBase .getSequenceAt(0).getAnnotation("IUPredWS (Short)"); assertTrue( - aa != null && aa.length > 0, + aa != null && aa.length > 0, "Didn't find any IUPred annotation to use to shade alignment."); AnnotationColourGradient cs = new AnnotationColourGradient(aa[0], null, AnnotationColourGradient.ABOVE_THRESHOLD); - AnnotationColourGradient gcs = new AnnotationColourGradient(aa[0], - null, AnnotationColourGradient.BELOW_THRESHOLD); + AnnotationColourGradient gcs = new AnnotationColourGradient(aa[0], null, + AnnotationColourGradient.BELOW_THRESHOLD); cs.setSeqAssociated(true); gcs.setSeqAssociated(true); af.changeColour(cs); @@ -199,15 +211,15 @@ public class Jalview2xmlTests extends Jalview2xmlBase "Failed to store as a project."); af.closeMenuItem_actionPerformed(true); af = null; - af = new FileLoader() - .LoadFileWaitTillLoaded(tfile, DataSourceType.FILE); + af = new FileLoader().LoadFileWaitTillLoaded(tfile, + DataSourceType.FILE); assertNotNull(af, "Failed to import new project"); // check for group and alignment colourschemes ColourSchemeI _rcs = af.getViewport().getGlobalColourScheme(); - ColourSchemeI _rgcs = af.getViewport().getAlignment().getGroups() - .get(0).getColourScheme(); + ColourSchemeI _rgcs = af.getViewport().getAlignment().getGroups().get(0) + .getColourScheme(); assertNotNull(_rcs, "Didn't recover global colourscheme"); assertTrue(_rcs instanceof AnnotationColourGradient, "Didn't recover annotation colour global scheme"); @@ -217,8 +229,8 @@ public class Jalview2xmlTests extends Jalview2xmlBase boolean diffseqcols = false, diffgseqcols = false; SequenceI[] sqs = af.getViewport().getAlignment().getSequencesArray(); - for (int p = 0, pSize = af.getViewport().getAlignment().getWidth(); p < pSize - && (!diffseqcols || !diffgseqcols); p++) + for (int p = 0, pSize = af.getViewport().getAlignment() + .getWidth(); p < pSize && (!diffseqcols || !diffgseqcols); p++) { if (_rcs.findColour(sqs[0].getCharAt(p), p, sqs[0], null, 0f) != _rcs .findColour(sqs[5].getCharAt(p), p, sqs[5], null, 0f)) @@ -227,8 +239,8 @@ public class Jalview2xmlTests extends Jalview2xmlBase } } assertTrue(diffseqcols, "Got Different sequence colours"); - System.out - .println("Per sequence colourscheme (Background) successfully applied and recovered."); + System.out.println( + "Per sequence colourscheme (Background) successfully applied and recovered."); assertNotNull(_rgcs, "Didn't recover group colourscheme"); assertTrue(_rgcs instanceof AnnotationColourGradient, @@ -237,25 +249,26 @@ public class Jalview2xmlTests extends Jalview2xmlBase assertTrue(__rcs.isSeqAssociated(), "Group Annotation colourscheme wasn't sequence associated"); - for (int p = 0, pSize = af.getViewport().getAlignment().getWidth(); p < pSize - && (!diffseqcols || !diffgseqcols); p++) + for (int p = 0, pSize = af.getViewport().getAlignment() + .getWidth(); p < pSize && (!diffseqcols || !diffgseqcols); p++) { - if (_rgcs.findColour(sqs[1].getCharAt(p), p, sqs[1], null, 0f) != _rgcs - .findColour(sqs[2].getCharAt(p), p, sqs[2], null, 0f)) + if (_rgcs.findColour(sqs[1].getCharAt(p), p, sqs[1], null, + 0f) != _rgcs.findColour(sqs[2].getCharAt(p), p, sqs[2], null, + 0f)) { diffgseqcols = true; } } assertTrue(diffgseqcols, "Got Different group sequence colours"); - System.out - .println("Per sequence (Group) colourscheme successfully applied and recovered."); + System.out.println( + "Per sequence (Group) colourscheme successfully applied and recovered."); } @Test(groups = { "Functional" }) public void gatherViewsHere() throws Exception { - int origCount = Desktop.getAlignFrames() == null ? 0 : Desktop - .getAlignFrames().length; + int origCount = Desktop.getAlignFrames() == null ? 0 + : Desktop.getAlignFrames().length; AlignFrame af = new FileLoader().LoadFileWaitTillLoaded( "examples/exampleFile_2_7.jar", DataSourceType.FILE); assertNotNull(af, "Didn't read in the example file correctly."); @@ -336,14 +349,14 @@ public class Jalview2xmlTests extends Jalview2xmlBase sq.findPosition(p); try { - assertTrue( - (alaa.annotations[p] == null && refan.annotations[p] == null) - || alaa.annotations[p].value == refan.annotations[p].value, + assertTrue((alaa.annotations[p] == null + && refan.annotations[p] == null) + || alaa.annotations[p].value == refan.annotations[p].value, "Mismatch at alignment position " + p); } catch (NullPointerException q) { - Assert.fail("Mismatch of alignment annotations at position " - + p + " Ref seq ann: " + refan.annotations[p] + Assert.fail("Mismatch of alignment annotations at position " + p + + " Ref seq ann: " + refan.annotations[p] + " alignment " + alaa.annotations[p]); } } @@ -378,10 +391,10 @@ public class Jalview2xmlTests extends Jalview2xmlBase AssertJUnit.assertFalse(structureStyle.sameStyle(groupStyle)); groups.getAlignViewport().setViewStyle(structureStyle); - AssertJUnit.assertFalse(groupStyle.sameStyle(groups.getAlignViewport() - .getViewStyle())); - Assert.assertTrue(structureStyle.sameStyle(groups.getAlignViewport() - .getViewStyle())); + AssertJUnit.assertFalse( + groupStyle.sameStyle(groups.getAlignViewport().getViewStyle())); + Assert.assertTrue(structureStyle + .sameStyle(groups.getAlignViewport().getViewStyle())); } @@ -391,7 +404,7 @@ public class Jalview2xmlTests extends Jalview2xmlBase * @throws Exception */ @Test(groups = { "Functional" }, enabled = true) - public void testStoreAndRecoverExpandedviews() throws Exception + public void testRestoreExpandedviews() throws Exception { Desktop.instance.closeAll_actionPerformed(null); @@ -402,9 +415,7 @@ public class Jalview2xmlTests extends Jalview2xmlBase // check FileLoader returned a reference to the one alignFrame that is // actually on the Desktop - assertSame( - af, - Desktop.getAlignFrameFor(af.getViewport()), + assertSame(af, Desktop.getAlignFrameFor(af.getViewport()), "Jalview2XML.loadAlignFrame() didn't return correct AlignFrame reference for multiple view window"); Desktop.explodeViews(af); @@ -412,7 +423,7 @@ public class Jalview2xmlTests extends Jalview2xmlBase int oldviews = Desktop.getAlignFrames().length; Assert.assertEquals(Desktop.getAlignFrames().length, Desktop.getAlignmentPanels(afid).length); - File tfile = File.createTempFile("testStoreAndRecoverExpanded", ".jvp"); + File tfile = File.createTempFile("testRestoreExpandedviews", ".jvp"); try { new Jalview2XML(false).saveState(tfile); @@ -431,11 +442,12 @@ public class Jalview2xmlTests extends Jalview2xmlBase af = new FileLoader().LoadFileWaitTillLoaded(tfile.getAbsolutePath(), DataSourceType.FILE); Assert.assertNotNull(af); + Assert.assertEquals(Desktop.getAlignFrames().length, + Desktop.getAlignmentPanels( + af.getViewport().getSequenceSetId()).length); Assert.assertEquals( - Desktop.getAlignFrames().length, - Desktop.getAlignmentPanels(af.getViewport().getSequenceSetId()).length); - Assert.assertEquals( - Desktop.getAlignmentPanels(af.getViewport().getSequenceSetId()).length, + Desktop.getAlignmentPanels( + af.getViewport().getSequenceSetId()).length, oldviews); } @@ -446,7 +458,7 @@ public class Jalview2xmlTests extends Jalview2xmlBase * @throws Exception */ @Test(groups = { "Functional" }) - public void testStoreAndRecoverReferenceSeqSettings() throws Exception + public void testRestoreReferenceSeqSettings() throws Exception { Desktop.instance.closeAll_actionPerformed(null); AlignFrame af = new FileLoader().LoadFileWaitTillLoaded( @@ -478,7 +490,7 @@ public class Jalview2xmlTests extends Jalview2xmlBase n++; } - File tfile = File.createTempFile("testStoreAndRecoverReferenceSeq", + File tfile = File.createTempFile("testRestoreReferenceSeqSettings", ".jvp"); try { @@ -537,8 +549,8 @@ public class Jalview2xmlTests extends Jalview2xmlBase assertTrue(Jalview2XML.isVersionStringLaterThan(null, "Test")); assertTrue(Jalview2XML.isVersionStringLaterThan(null, "TEST")); assertTrue(Jalview2XML.isVersionStringLaterThan("2.8.3", "Test")); - assertTrue(Jalview2XML - .isVersionStringLaterThan(null, "Automated Build")); + assertTrue( + Jalview2XML.isVersionStringLaterThan(null, "Automated Build")); assertTrue(Jalview2XML.isVersionStringLaterThan("2.8.3", "Automated Build")); assertTrue(Jalview2XML.isVersionStringLaterThan("2.8.3", @@ -579,7 +591,7 @@ public class Jalview2xmlTests extends Jalview2xmlBase * @throws Exception */ @Test(groups = { "Functional" }) - public void testStoreAndRecoverGroupRepSeqs() throws Exception + public void testRestoreGroupRepSeqs() throws Exception { Desktop.instance.closeAll_actionPerformed(null); AlignFrame af = new FileLoader().LoadFileWaitTillLoaded( @@ -647,8 +659,7 @@ public class Jalview2xmlTests extends Jalview2xmlBase n++; } - File tfile = File - .createTempFile("testStoreAndRecoverGroupReps", ".jvp"); + File tfile = File.createTempFile("testRestoreGroupRepSeqs", ".jvp"); try { new Jalview2XML(false).saveState(tfile); @@ -687,9 +698,7 @@ public class Jalview2xmlTests extends Jalview2xmlBase */ List hidden = hiddenSeqNames.get(ap.getViewName()); HiddenSequences hs = alignment.getHiddenSequences(); - assertEquals( - hidden.size(), - hs.getSize(), + assertEquals(hidden.size(), hs.getSize(), "wrong number of restored hidden sequences in " + ap.getViewName()); } @@ -701,7 +710,7 @@ public class Jalview2xmlTests extends Jalview2xmlBase * @throws Exception */ @Test(groups = { "Functional" }) - public void testStoreAndRecoverPDBEntry() throws Exception + public void testRestorePDBEntry() throws Exception { Desktop.instance.closeAll_actionPerformed(null); String exampleFile = "examples/3W5V.pdb"; @@ -731,16 +740,20 @@ public class Jalview2xmlTests extends Jalview2xmlBase pdbEntries[1] = new PDBEntry("3W5V", "B", Type.PDB, testFile); pdbEntries[2] = new PDBEntry("3W5V", "C", Type.PDB, testFile); pdbEntries[3] = new PDBEntry("3W5V", "D", Type.PDB, testFile); - Assert.assertEquals(seqs[0].getDatasetSequence().getAllPDBEntries() - .get(0), pdbEntries[0]); - Assert.assertEquals(seqs[1].getDatasetSequence().getAllPDBEntries() - .get(0), pdbEntries[1]); - Assert.assertEquals(seqs[2].getDatasetSequence().getAllPDBEntries() - .get(0), pdbEntries[2]); - Assert.assertEquals(seqs[3].getDatasetSequence().getAllPDBEntries() - .get(0), pdbEntries[3]); - - File tfile = File.createTempFile("testStoreAndRecoverPDBEntry", ".jvp"); + Assert.assertEquals( + seqs[0].getDatasetSequence().getAllPDBEntries().get(0), + pdbEntries[0]); + Assert.assertEquals( + seqs[1].getDatasetSequence().getAllPDBEntries().get(0), + pdbEntries[1]); + Assert.assertEquals( + seqs[2].getDatasetSequence().getAllPDBEntries().get(0), + pdbEntries[2]); + Assert.assertEquals( + seqs[3].getDatasetSequence().getAllPDBEntries().get(0), + pdbEntries[3]); + + File tfile = File.createTempFile("testRestorePDBEntry", ".jvp"); try { new Jalview2XML(false).saveState(tfile); @@ -797,7 +810,7 @@ public class Jalview2xmlTests extends Jalview2xmlBase * @throws IOException */ @Test(groups = { "Functional" }) - public void testStoreAndRecoverColourThresholds() throws IOException + public void testRestoreColourThresholds() throws IOException { Desktop.instance.closeAll_actionPerformed(null); AlignFrame af = new FileLoader().LoadFileWaitTillLoaded( @@ -809,6 +822,7 @@ public class Jalview2xmlTests extends Jalview2xmlBase /* * Colour alignment by Buried Index, Above 10% PID, By Conservation 20% */ + av.setColourAppliesToAllGroups(false); af.changeColour_actionPerformed(JalviewColourScheme.Buried.toString()); assertTrue(av.getGlobalColourScheme() instanceof BuriedColourScheme); af.abovePIDThreshold_actionPerformed(true); @@ -834,8 +848,8 @@ public class Jalview2xmlTests extends Jalview2xmlBase sg.setEndRes(25); av.setSelectionGroup(sg); PopupMenu popupMenu = new PopupMenu(af.alignPanel, null, null); - popupMenu.changeColour_actionPerformed(JalviewColourScheme.Strand - .toString()); + popupMenu.changeColour_actionPerformed( + JalviewColourScheme.Strand.toString()); assertTrue(sg.getColourScheme() instanceof StrandColourScheme); assertEquals(al.getGroups().size(), 1); assertSame(al.getGroups().get(0), sg); @@ -854,7 +868,7 @@ public class Jalview2xmlTests extends Jalview2xmlBase /* * save project, close windows, reload project, verify */ - File tfile = File.createTempFile("testStoreAndRecoverColourThresholds", + File tfile = File.createTempFile("testRestoreColourThresholds", ".jvp"); tfile.deleteOnExit(); new Jalview2XML(false).saveState(tfile); @@ -890,7 +904,7 @@ public class Jalview2xmlTests extends Jalview2xmlBase * @throws IOException */ @Test(groups = { "Functional" }) - public void testSaveLoadFeatureColoursAndFilters() throws IOException + public void testRestoreFeatureColoursAndFilters() throws IOException { AlignFrame af = new FileLoader().LoadFileWaitTillLoaded( ">Seq1\nACDEFGHIKLM", DataSourceType.PASTE); @@ -921,8 +935,8 @@ public class Jalview2xmlTests extends Jalview2xmlBase fr.setColour("type2", byLabel); // type3: by score above threshold - FeatureColourI byScore = new FeatureColour(Color.BLACK, Color.BLUE, 1, - 10); + FeatureColourI byScore = new FeatureColour(null, Color.BLACK, + Color.BLUE, null, 1, 10); byScore.setAboveThreshold(true); byScore.setThreshold(2f); fr.setColour("type3", byScore); @@ -934,8 +948,8 @@ public class Jalview2xmlTests extends Jalview2xmlBase fr.setColour("type4", byAF); // type5: by attribute CSQ:PolyPhen below threshold - FeatureColourI byPolyPhen = new FeatureColour(Color.BLACK, Color.BLUE, - 1, 10); + FeatureColourI byPolyPhen = new FeatureColour(null, Color.BLACK, + Color.BLUE, null, 1, 10); byPolyPhen.setBelowThreshold(true); byPolyPhen.setThreshold(3f); byPolyPhen.setAttributeName("CSQ", "PolyPhen"); @@ -978,8 +992,8 @@ public class Jalview2xmlTests extends Jalview2xmlBase */ af.closeMenuItem_actionPerformed(true); af = null; - af = new FileLoader() - .LoadFileWaitTillLoaded(filePath, DataSourceType.FILE); + af = new FileLoader().LoadFileWaitTillLoaded(filePath, + DataSourceType.FILE); assertNotNull(af, "Failed to import new project"); /* @@ -1108,27 +1122,31 @@ public class Jalview2xmlTests extends Jalview2xmlBase } @Test(groups = "Functional") - public void testPcaViewAssociation() throws IOException + public void testRestorePCAViewAssociation() throws IOException { Desktop.instance.closeAll_actionPerformed(null); final String PCAVIEWNAME = "With PCA"; // create a new tempfile - File tempfile = File.createTempFile("jvPCAviewAssoc", "jvp"); + File tempfile = File.createTempFile("testRestorePCAViewAssociation", + "jvp"); { String exampleFile = "examples/uniref50.fa"; AlignFrame af = new FileLoader().LoadFileWaitTillLoaded(exampleFile, DataSourceType.FILE); assertNotNull(af, "Didn't read in the example file correctly."); + AlignmentPanel origView = (AlignmentPanel) af.getAlignPanels().get(0); AlignmentPanel newview = af.newView(PCAVIEWNAME, true); // create another for good measure af.newView("Not the PCA View", true); - PCAPanel pcaPanel = new PCAPanel(newview, "BLOSUM62", + PCAPanel pcaPanel = new PCAPanel(origView, "BLOSUM62", new SimilarityParams(true, true, true, false)); - // we're in the test exec thread, so we can just run synchronously here pcaPanel.run(); + // now switch the linked view + pcaPanel.selectAssociatedView(newview); + assertTrue(pcaPanel.getAlignViewport() == newview.getAlignViewport(), "PCA should be associated with 'With PCA' view: test is broken"); @@ -1151,11 +1169,229 @@ public class Jalview2xmlTests extends Jalview2xmlBase "PCA and the tabbed alignment view should be the only two windows on the desktop"); PCAPanel pcaPanel = (PCAPanel) frames[frames[0] == af ? 1 : 0]; - AlignmentViewPanel restoredNewView = af.getAlignPanels().get(1); + AlignmentViewPanel restoredNewView = null; + for (AlignmentViewPanel alignpanel : Desktop.getAlignmentPanels(null)) + { + if (alignpanel.getAlignViewport() == pcaPanel.getAlignViewport()) + { + restoredNewView = alignpanel; + } + } assertEquals(restoredNewView.getViewName(), PCAVIEWNAME); assertTrue( restoredNewView.getAlignViewport() == pcaPanel .getAlignViewport(), "Didn't restore correct view association for the PCA view"); } + + /** + * Tests that annotation ordering is faithfully restored, on project reload or + * New View, even if preference settings have changed + * + * @throws Exception + */ + @Test(groups = { "Functional" }) + public void testRestoreAnnotationOrdering() throws Exception + { + Desktop.instance.closeAll_actionPerformed(null); + Cache.setProperty("SHOW_ANNOTATION", "true"); + Cache.setProperty("SHOW_CONSERVATION", "true"); + Cache.setProperty("SHOW_QUALITY", "false"); + Cache.setProperty("SHOW_IDENTITY", "false"); + Cache.setProperty("SHOW_OCCUPANCY", "true"); + AlignFrame af = new FileLoader().LoadFileWaitTillLoaded( + "examples/uniref50.fa", DataSourceType.FILE); + assertNotNull(af, "Didn't read in the example file correctly."); + + AlignFrame[] afs = Desktop.getAlignFrames(); + assertEquals(afs.length, 1); + AlignmentI alignment = afs[0].getViewport().getAlignment(); + AlignmentAnnotation[] anns = alignment.getAlignmentAnnotation(); + assertEquals(anns.length, 2); + + /* + * this order is hard wired in AlignmentViewport.initAutoAnnotation() + */ + assertEquals(anns[0].label, "Conservation"); + assertEquals(anns[1].label, "Occupancy"); + + /* + * add two user annotations, adjust order, height and visibility + */ + AlignmentAnnotation tmp = anns[0]; + anns[0] = anns[1]; + anns[1] = tmp; + Annotation[] an1 = new Annotation[] { new Annotation(2f) }; + Annotation[] an2 = new Annotation[] { new Annotation(3f) }; + alignment.addAnnotation(new AlignmentAnnotation("hello", "desc1", an1), + 1); + alignment.addAnnotation(new AlignmentAnnotation("world", "desc2", an2), + 3); + anns = alignment.getAlignmentAnnotation(); + assertEquals(anns[0].label, "Occupancy"); + assertEquals(anns[1].label, "hello"); + assertEquals(anns[2].label, "Conservation"); + assertEquals(anns[3].label, "world"); + anns[0].graphHeight = 60; + anns[0].visible = false; + anns[1].graphHeight = 70; + anns[2].graphHeight = 80; + anns[3].graphHeight = 90; + anns[3].visible = false; + + /* + * save project to temporary file and reload on to an empty desktop, + * verify annotation order, height and visibility is restored + */ + File projectFile = File.createTempFile("jvTest", ".jvp"); + new Jalview2XML(false).saveState(projectFile); + Desktop.instance.closeAll_actionPerformed(null); + if (Desktop.getAlignFrames() != null) + { + Assert.assertEquals(Desktop.getAlignFrames().length, 0); + } + + af = new FileLoader().LoadFileWaitTillLoaded( + projectFile.getAbsolutePath(), + DataSourceType.FILE); + anns = af.getViewport().getAlignment().getAlignmentAnnotation(); + assertEquals(anns.length, 4); + assertEquals(anns[0].label, "Occupancy"); + assertEquals(anns[1].label, "hello"); + assertEquals(anns[2].label, "Conservation"); + assertEquals(anns[3].label, "world"); + assertEquals(anns[0].graphHeight, 60); + assertEquals(anns[1].graphHeight, 70); + assertEquals(anns[2].graphHeight, 80); + assertEquals(anns[3].graphHeight, 90); + assertFalse(anns[0].visible); + assertTrue(anns[1].visible); + assertTrue(anns[2].visible); + assertFalse(anns[3].visible); + + /* + * make a new view of the alignment (uses project save/load code) + * and verify annotations are ordered the same + */ + AlignmentPanel newPanel = af.newView("new", true); + AlignmentAnnotation[] newAnns = newPanel.getAlignment() + .getAlignmentAnnotation(); + assertEquals(newAnns.length, 4); + assertEquals(newAnns[0].label, "Occupancy"); + assertEquals(newAnns[1].label, "hello"); + assertEquals(newAnns[2].label, "Conservation"); + assertEquals(newAnns[3].label, "world"); + assertEquals(newAnns[0].graphHeight, 60); + assertEquals(newAnns[1].graphHeight, 70); + assertEquals(newAnns[2].graphHeight, 80); + assertEquals(newAnns[3].graphHeight, 90); + assertFalse(newAnns[0].visible); + assertTrue(newAnns[1].visible); + assertTrue(newAnns[2].visible); + assertFalse(newAnns[3].visible); + newPanel.closePanel(); + + /* + * reload the project with Preferences set to not create Occupancy, but to + * create Quality; annotations should still appear as saved in the project; + * preferences should be left unchanged (after temporary override) + */ + Desktop.instance.closeAll_actionPerformed(null); + Cache.setProperty("SHOW_OCCUPANCY", "false"); + Cache.removeProperty("SHOW_QUALITY"); // will default to true + Map originalPreferences = Cache.getProperties( + AutoAnnotation.OCCUPANCY.preferenceKey, + AutoAnnotation.CONSERVATION.preferenceKey, + AutoAnnotation.QUALITY.preferenceKey, + AutoAnnotation.CONSENSUS.preferenceKey); + af = new FileLoader().LoadFileWaitTillLoaded( + projectFile.getAbsolutePath(), DataSourceType.FILE); + alignment = af.getViewport().getAlignment(); + anns = alignment.getAlignmentAnnotation(); + assertEquals(anns.length, 4); + assertEquals(anns[0].label, "Occupancy"); + assertEquals(anns[1].label, "hello"); + assertEquals(anns[2].label, "Conservation"); + assertEquals(anns[3].label, "world"); + Map newPreferences = Cache.getProperties( + AutoAnnotation.OCCUPANCY.preferenceKey, + AutoAnnotation.CONSERVATION.preferenceKey, + AutoAnnotation.QUALITY.preferenceKey, + AutoAnnotation.CONSENSUS.preferenceKey); + assertEquals(originalPreferences, newPreferences); + assertNull(Cache.getProperty(AutoAnnotation.QUALITY.preferenceKey)); + + /* + * make a new view, reorder its annotations, and delete and hide + * a different annotation in each of the two views + */ + newPanel = af.newView("new", true); + af.getViewport().setViewName("Original"); + + /* + * just for interest - new view has the same manual annotation objects, + * but new auto-calculated annotations + */ + AlignmentI newAlignment = newPanel.getAlignment(); + newAnns = newAlignment.getAlignmentAnnotation(); + assertNotSame(anns[0], newAnns[0]); + assertSame(anns[1], newAnns[1]); + assertNotSame(anns[2], newAnns[2]); + assertSame(anns[3], newAnns[3]); + + alignment.deleteAnnotation(anns[2]); // delete Conservation view 1 + anns[1].visible = false; // hide 'hello' view 1 + + tmp = newAnns[0]; + newAnns[0] = newAnns[3]; // 'world' moved to top of new view + newAnns[3] = tmp; // then hello, Conservation, Occupancy + newAnns[0].visible = false; // hide 'world' in new view + newAnns[3].graphHeight = 99; // set height of Occupancy + newAlignment.deleteAnnotation(newAnns[1]); // delete 'hello' in new view + + /* + * save, reload and verify annotations in both views + */ + ((AlignViewport) newPanel.getAlignViewport()).setViewName("New View"); + projectFile = File.createTempFile("jvTest", ".jvp"); + new Jalview2XML(false).saveState(projectFile); + Desktop.instance.closeAll_actionPerformed(null); + af = new FileLoader().LoadFileWaitTillLoaded( + projectFile.getAbsolutePath(), DataSourceType.FILE); + assertEquals(af.getAlignPanels().size(), 2); + + /* + * check first view + */ + AlignViewportI firstViewport = af.getAlignPanels().get(0) + .getAlignViewport(); + assertEquals(((AlignViewport) firstViewport).getViewName(), "Original"); + alignment = firstViewport.getAlignment(); + anns = alignment.getAlignmentAnnotation(); + assertEquals(anns.length, 3); + assertEquals(anns[0].label, "Occupancy"); + assertEquals(anns[1].label, "hello"); + assertEquals(anns[2].label, "world"); + assertFalse(anns[0].visible); + assertFalse(anns[1].visible); + assertFalse(anns[2].visible); + + /* + * check second view + */ + AlignViewportI secondViewport = af.getAlignPanels().get(1) + .getAlignViewport(); + assertEquals(((AlignViewport) secondViewport).getViewName(), + "New View"); + alignment = secondViewport.getAlignment(); + anns = alignment.getAlignmentAnnotation(); + assertEquals(anns.length, 3); + assertEquals(anns[0].label, "world"); + assertEquals(anns[1].label, "Conservation"); + assertEquals(anns[2].label, "Occupancy"); + assertFalse(anns[0].visible); + assertTrue(anns[1].visible); + assertFalse(anns[2].visible); + assertEquals(anns[2].graphHeight, 99); + } }