X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=test%2Fjalview%2Fio%2FJSONFileTest.java;h=e046d94792e09b10fa8844f0c67f278ad6ca0098;hb=6b90cce63b09fca914a35d49a1b6883664e48a29;hp=0b9f30a107c215332c0df48c3bc706d0110a434b;hpb=02d6b4895305788dbf460a6e0334dba93b0b3423;p=jalview.git diff --git a/test/jalview/io/JSONFileTest.java b/test/jalview/io/JSONFileTest.java index 0b9f30a..e046d94 100644 --- a/test/jalview/io/JSONFileTest.java +++ b/test/jalview/io/JSONFileTest.java @@ -1,6 +1,25 @@ +/* + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors + * + * This file is part of Jalview. + * + * Jalview is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. + * + * Jalview is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Jalview. If not, see . + * The Jalview Authors are detailed in the 'AUTHORS' file. + */ package jalview.io; - import static org.testng.AssertJUnit.assertNotNull; import jalview.api.AlignExportSettingI; @@ -8,14 +27,16 @@ import jalview.datamodel.Alignment; import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.AlignmentI; import jalview.datamodel.Annotation; -import jalview.datamodel.ColumnSelection; +import jalview.datamodel.HiddenColumns; import jalview.datamodel.Sequence; import jalview.datamodel.SequenceFeature; import jalview.datamodel.SequenceGroup; import jalview.datamodel.SequenceI; import jalview.gui.AlignFrame; +import jalview.gui.JvOptionPane; +import jalview.json.binding.biojson.v1.ColourSchemeMapper; import jalview.schemes.ColourSchemeI; -import jalview.schemes.ZappoColourScheme; +import jalview.schemes.ResidueColourScheme; import java.io.IOException; import java.util.ArrayList; @@ -25,6 +46,7 @@ import java.util.List; import org.testng.Assert; import org.testng.AssertJUnit; import org.testng.annotations.AfterTest; +import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeMethod; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; @@ -32,6 +54,13 @@ import org.testng.annotations.Test; public class JSONFileTest { + @BeforeClass(alwaysRun = true) + public void setUpJvOptionPane() + { + JvOptionPane.setInteractiveMode(false); + JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION); + } + private int TEST_SEQ_HEIGHT = 0; private int TEST_GRP_HEIGHT = 0; @@ -44,13 +73,13 @@ public class JSONFileTest private Alignment alignment; - private HashMap expectedSeqs = new HashMap(); + private HashMap expectedSeqs = new HashMap<>(); - private HashMap expectedAnnots = new HashMap(); + private HashMap expectedAnnots = new HashMap<>(); - private HashMap expectedGrps = new HashMap(); + private HashMap expectedGrps = new HashMap<>(); - private ColumnSelection expectedColSel = new ColumnSelection(); + private HiddenColumns expectedColSel = new HiddenColumns(); private SequenceI[] expectedHiddenSeqs = new SequenceI[1]; @@ -62,6 +91,8 @@ public class JSONFileTest private JSONFile jf; + private AlignExportSettingI exportSettings; + @BeforeTest(alwaysRun = true) public void setup() throws Exception { @@ -93,22 +124,24 @@ public class JSONFileTest seqs[3].addSequenceFeature(seqFeature3); seqs[4].addSequenceFeature(seqFeature4); - for (Sequence seq : seqs) { - seq.setDatasetSequence(seq); + seq.createDatasetSequence(); expectedSeqs.put(seq.getName(), seq); } - // create and add sequence groups - ArrayList grpSeqs = new ArrayList(); + // create and add a sequence group + List grpSeqs = new ArrayList<>(); grpSeqs.add(seqs[1]); grpSeqs.add(seqs[2]); grpSeqs.add(seqs[3]); grpSeqs.add(seqs[4]); - ColourSchemeI scheme = JSONFile.getJalviewColorScheme("zappo"); - SequenceGroup seqGrp = new SequenceGroup(grpSeqs, "JGroup:1883305585", - scheme, true, true, false, 21, 29); + SequenceGroup seqGrp = new SequenceGroup(grpSeqs, + "JGroup:1883305585", + null, true, true, false, 21, 29); + ColourSchemeI scheme = ColourSchemeMapper.getJalviewColourScheme( + "zappo", seqGrp); + seqGrp.cs.setColourScheme(scheme); seqGrp.setShowNonconserved(false); seqGrp.setDescription(null); @@ -162,9 +195,9 @@ public class JSONFileTest TEST_SEQ_HEIGHT = expectedSeqs.size(); TEST_GRP_HEIGHT = expectedGrps.size(); TEST_ANOT_HEIGHT = expectedAnnots.size(); - TEST_CS_HEIGHT = expectedColSel.getHiddenColumns().size(); + TEST_CS_HEIGHT = expectedColSel.getHiddenColumnsCopy().size(); - AlignExportSettingI exportSettings = new AlignExportSettingI() + exportSettings = new AlignExportSettingI() { @Override public boolean isExportHiddenSequences() @@ -207,24 +240,26 @@ public class JSONFileTest try { alignment = (Alignment) formatAdapter.readFile(TEST_JSON_FILE, - AppletFormatAdapter.FILE, JSONFile.FILE_DESC); + DataSourceType.FILE, FileFormat.Json); jf = (JSONFile) formatAdapter.getAlignFile(); AlignFrame af = new AlignFrame(alignment, jf.getHiddenSequences(), - jf.getColumnSelection(), AlignFrame.DEFAULT_WIDTH, + jf.getHiddenColumns(), AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT); af.getViewport().setShowSequenceFeatures(jf.isShowSeqFeatures()); - af.changeColour(jf.getColourScheme()); + String colourSchemeName = jf.getGlobalColourScheme(); + ColourSchemeI cs = ColourSchemeMapper.getJalviewColourScheme( + colourSchemeName, alignment); + af.changeColour(cs); af.getViewport().setFeaturesDisplayed(jf.getDisplayedFeatures()); - formatAdapter = new AppletFormatAdapter(af.alignPanel, exportSettings); - String jsonOutput = formatAdapter.formatSequences(JSONFile.FILE_DESC, + String jsonOutput = formatAdapter.formatSequences(FileFormat.Json, af.alignPanel.getAlignment(), false); formatAdapter = new AppletFormatAdapter(); testAlignment = formatAdapter.readFile(jsonOutput, - AppletFormatAdapter.PASTE, JSONFile.FILE_DESC); + DataSourceType.PASTE, FileFormat.Json); testJsonFile = (JSONFile) formatAdapter.getAlignFile(); // System.out.println(jsonOutput); } catch (IOException e) @@ -234,13 +269,13 @@ public class JSONFileTest } - @BeforeMethod(alwaysRun = true) + @BeforeMethod(alwaysRun = true) public void methodSetup() { passedCount = 0; } - @AfterTest + @AfterTest(alwaysRun = true) public void tearDown() throws Exception { testJsonFile = null; @@ -252,13 +287,13 @@ public class JSONFileTest jf = null; } - @Test(groups ={ "Functional" }) + @Test(groups = { "Functional" }) public void roundTripTest() { assertNotNull("JSON roundtrip test failed!", testJsonFile); } - @Test(groups ={ "Functional" }) + @Test(groups = { "Functional" }) public void testSeqParsed() { assertNotNull("Couldn't read supplied alignment data.", testAlignment); @@ -274,46 +309,98 @@ public class JSONFileTest AssertJUnit.assertEquals("Some Sequences did not pass the test", TEST_SEQ_HEIGHT, passedCount); } - - @Test(groups ={ "Functional" }) + + @Test(groups = { "Functional" }) public void hiddenColsTest() { - ColumnSelection cs = testJsonFile.getColumnSelection(); + HiddenColumns cs = testJsonFile.getHiddenColumns(); Assert.assertNotNull(cs); - Assert.assertNotNull(cs.getHiddenColumns()); - List hiddenCols = cs.getHiddenColumns(); + Assert.assertNotNull(cs.getHiddenColumnsCopy()); + List hiddenCols = cs.getHiddenColumnsCopy(); Assert.assertEquals(hiddenCols.size(), TEST_CS_HEIGHT); - Assert.assertEquals(hiddenCols, expectedColSel.getHiddenColumns(), + Assert.assertEquals(hiddenCols.get(0), expectedColSel + .getHiddenColumnsCopy().get(0), "Mismatched hidden columns!"); } - @Test(groups ={ "Functional" }) + @Test(groups = { "Functional" }) public void hiddenSeqsTest() { Assert.assertNotNull(testJsonFile.getHiddenSequences(), "Hidden sequence Expected but found Null"); Assert.assertEquals(jf.getHiddenSequences().length, 1, - "Hidden sequece"); + "Hidden sequence"); } - @Test(groups ={ "Functional" }) + @Test(groups = { "Functional" }) public void colorSchemeTest() { - Assert.assertNotNull(testJsonFile.getColourScheme(), + Assert.assertNotNull(testJsonFile.getGlobalColourScheme(), "Colourscheme is null, parsing failed!"); - Assert.assertTrue( - testJsonFile.getColourScheme() instanceof ZappoColourScheme, + Assert.assertEquals(testJsonFile.getGlobalColourScheme(), "Zappo", "Zappo colour scheme expected!"); } - @Test(groups ={ "Functional" }) + /** + * Test for bug JAL-2489, NPE when exporting BioJSON with global colour + * scheme, and a group colour scheme, set as 'None' + */ + @Test(groups = { "Functional" }) + public void testBioJSONRoundTripWithColourSchemeNone() + { + AppletFormatAdapter formatAdapter = new AppletFormatAdapter(); + + Alignment _alignment; + try + { + // load example BioJSON file + _alignment = (Alignment) formatAdapter.readFile(TEST_JSON_FILE, + DataSourceType.FILE, FileFormat.Json); + JSONFile bioJsonFile = (JSONFile) formatAdapter.getAlignFile(); + AlignFrame alignFrame = new AlignFrame(_alignment, + bioJsonFile.getHiddenSequences(), + bioJsonFile.getHiddenColumns(), AlignFrame.DEFAULT_WIDTH, + AlignFrame.DEFAULT_HEIGHT); + + /* + * Create a group on the alignment; + * Change global and group colour scheme to 'None' and perform round trip + */ + SequenceGroup sg = new SequenceGroup(); + sg.addSequence(_alignment.getSequenceAt(0), false); + sg.setColourScheme(null); + ColourSchemeI cs = ColourSchemeMapper.getJalviewColourScheme( + ResidueColourScheme.NONE, _alignment); + alignFrame.changeColour(cs); + alignFrame.getViewport().setFeaturesDisplayed( + bioJsonFile.getDisplayedFeatures()); + formatAdapter = new AppletFormatAdapter(alignFrame.alignPanel, + exportSettings); + // export BioJSON string + String jsonOutput = formatAdapter.formatSequences(FileFormat.Json, + alignFrame.alignPanel.getAlignment(), false); + // read back Alignment from BioJSON string + formatAdapter = new AppletFormatAdapter(); + formatAdapter.readFile(jsonOutput, DataSourceType.PASTE, + FileFormat.Json); + // assert 'None' colour scheme is retained after round trip + JSONFile _bioJsonFile = (JSONFile) formatAdapter.getAlignFile(); + Assert.assertEquals(_bioJsonFile.getGlobalColourScheme(), + ResidueColourScheme.NONE); + } catch (IOException e) + { + e.printStackTrace(); + } + } + + @Test(groups = { "Functional" }) public void isShowSeqFeaturesSet() { Assert.assertTrue(testJsonFile.isShowSeqFeatures(), "Sequence feature isDisplayed setting expected to be true"); } - @Test(groups ={ "Functional" }) + @Test(groups = { "Functional" }) public void testGrpParsed() { Assert.assertNotNull(testAlignment.getGroups()); @@ -329,7 +416,7 @@ public class JSONFileTest TEST_GRP_HEIGHT, passedCount); } - @Test(groups ={ "Functional" }) + @Test(groups = { "Functional" }) public void testAnnotationParsed() { Assert.assertNotNull(testAlignment.getAlignmentAnnotation()); @@ -403,13 +490,14 @@ public class JSONFileTest + actualGrp.getStartRes()); System.out.println(expectedGrp.getEndRes() + " | " + actualGrp.getEndRes()); + System.out.println(expectedGrp.cs + " | " + actualGrp.cs); if (expectedGrp.getName().equals(actualGrp.getName()) && expectedGrp.getColourText() == actualGrp.getColourText() && expectedGrp.getDisplayBoxes() == actualGrp.getDisplayBoxes() && expectedGrp.getIgnoreGapsConsensus() == actualGrp .getIgnoreGapsConsensus() - && expectedGrp.cs.equals(actualGrp.cs) + && (expectedGrp.cs.getClass().equals(actualGrp.cs.getClass())) && expectedGrp.getSequences().size() == actualGrp .getSequences().size() && expectedGrp.getStartRes() == actualGrp.getStartRes() @@ -477,4 +565,47 @@ public class JSONFileTest // System.out.println(">>>>>>>>>>>>>> features matched : " + matched); return matched; } + + /** + * Test group roundtrip with null (None) group colour scheme + * + * @throws IOException + */ + @Test(groups = { "Functional" }) + public void testGrpParsed_colourNone() throws IOException + { + AlignmentI copy = new Alignment(testAlignment); + SequenceGroup sg = testAlignment.getGroups().get(0); + SequenceGroup copySg = new SequenceGroup(new ArrayList(), + sg.getName(), + null, sg.getDisplayBoxes(), sg.getDisplayText(), + sg.getColourText(), sg.getStartRes(), sg.getEndRes()); + for (SequenceI seq : sg.getSequences()) + { + int seqIndex = testAlignment.findIndex(seq); + copySg.addSequence(copy.getSequenceAt(seqIndex), false); + } + copy.addGroup(copySg); + + AlignFrame af = new AlignFrame(copy, copy.getWidth(), copy.getHeight()); + AppletFormatAdapter formatAdapter = new AppletFormatAdapter( + af.alignPanel); + String jsonOutput = formatAdapter.formatSequences(FileFormat.Json, + copy, false); + formatAdapter = new AppletFormatAdapter(); + AlignmentI newAlignment = formatAdapter.readFile(jsonOutput, + DataSourceType.PASTE, FileFormat.Json); + + Assert.assertNotNull(newAlignment.getGroups()); + for (SequenceGroup seqGrp : newAlignment.getGroups()) + { + SequenceGroup expectedGrp = expectedGrps.get(seqGrp.getName()); + AssertJUnit.assertTrue( + "Failed SequenceGroup Test for >>> " + seqGrp.getName(), + isGroupMatched(expectedGrp, seqGrp)); + passedCount++; + } + AssertJUnit.assertEquals("Some SequenceGroups did not pass the test", + TEST_GRP_HEIGHT, passedCount); + } }