+/*
+ * 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 <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+package jalview.io;
+
+import static org.testng.AssertJUnit.assertEquals;
+import static org.testng.AssertJUnit.assertNotNull;
+import static org.testng.AssertJUnit.assertTrue;
+
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.SequenceFeature;
+import jalview.gui.AlignFrame;
+
+import java.awt.Color;
+import java.io.File;
+import java.io.IOException;
+import java.util.Map;
+
+import org.testng.annotations.Test;
+
+public class FeaturesFileTest
+{
+
+ static String TestFiles[][] = {
+ { "Test example features import/export",
+ "examples/uniref50.fa", "examples/exampleFeatures.txt" } };
+
+ @Test(groups = { "Functional" })
+ public void testParse() throws Exception
+ {
+ testFeaturesFileIO("Features file test");
+ }
+
+ public static AlignmentI readAlignmentFile(File f) throws IOException
+ {
+ System.out.println("Reading file: " + f);
+ String ff = f.getPath();
+ FormatAdapter rf = new FormatAdapter();
+
+ AlignmentI al = rf.readFile(ff, AppletFormatAdapter.FILE,
+ new IdentifyFile().Identify(ff, AppletFormatAdapter.FILE));
+
+ al.setDataset(null); // creates dataset sequences
+ assertNotNull("Couldn't read supplied alignment data.", al);
+ return al;
+ }
+
+ /**
+ * Helper method for testing
+ *
+ * @param testname
+ * @param f
+ * alignment file
+ * @param featFile
+ * features file to load on to the alignment
+ * @throws IOException
+ */
+ public static void testFeaturesFileIO(String testname) throws IOException
+ {
+ File f = new File("examples/uniref50.fa");
+ AlignmentI al = readAlignmentFile(f);
+ AlignFrame af = new AlignFrame(al, 500, 500);
+ Map<String, Object> colours = af.getFeatureRenderer()
+ .getFeatureColours();
+ FeaturesFile featuresFile = new FeaturesFile(
+ "examples/exampleFeatures.txt", FormatAdapter.FILE);
+ assertTrue("Test " + testname + "\nFailed to parse features file.",
+ featuresFile.parse(al.getDataset(), colours, true));
+
+ /*
+ * Refetch the colour map from the FeatureRenderer (to confirm it has been
+ * updated - JAL-1904), and verify (some) feature group colours
+ */
+ colours = af.getFeatureRenderer().getFeatureColours();
+ assertEquals("26 feature group colours not found", 26, colours.size());
+ assertEquals(colours.get("Cath"), new Color(0x93b1d1));
+ assertEquals(colours.get("ASX-MOTIF"), new Color(0x6addbb));
+
+ /*
+ * verify (some) features on sequences
+ */
+ SequenceFeature[] sfs = al.getSequenceAt(0).getDatasetSequence()
+ .getSequenceFeatures(); // FER_CAPAA
+ assertEquals(7, sfs.length);
+ SequenceFeature sf = sfs[0];
+ assertEquals("Iron-sulfur (2Fe-2S)", sf.description);
+ assertEquals(39, sf.begin);
+ assertEquals(39, sf.end);
+ assertEquals("uniprot", sf.featureGroup);
+ assertEquals("METAL", sf.type);
+ sf = sfs[1];
+ assertEquals("Iron-sulfur (2Fe-2S)", sf.description);
+ assertEquals(44, sf.begin);
+ assertEquals(44, sf.end);
+ assertEquals("uniprot", sf.featureGroup);
+ assertEquals("METAL", sf.type);
+ sf = sfs[2];
+ assertEquals("Iron-sulfur (2Fe-2S)", sf.description);
+ assertEquals(47, sf.begin);
+ assertEquals(47, sf.end);
+ assertEquals("uniprot", sf.featureGroup);
+ assertEquals("METAL", sf.type);
+ sf = sfs[3];
+ assertEquals("Iron-sulfur (2Fe-2S)", sf.description);
+ assertEquals(77, sf.begin);
+ assertEquals(77, sf.end);
+ assertEquals("uniprot", sf.featureGroup);
+ assertEquals("METAL", sf.type);
+ sf = sfs[4];
+ assertEquals("Fer2 Status: True Positive Pfam 8_8%LINK%",
+ sf.description);
+ assertEquals("Pfam 8_8|http://pfam.sanger.ac.uk/family/PF00111",
+ sf.links.get(0).toString());
+ assertEquals(8, sf.begin);
+ assertEquals(83, sf.end);
+ assertEquals("uniprot", sf.featureGroup);
+ assertEquals("Pfam", sf.type);
+ sf = sfs[5];
+ assertEquals("Ferredoxin_fold Status: True Positive ", sf.description);
+ assertEquals(3, sf.begin);
+ assertEquals(93, sf.end);
+ assertEquals("uniprot", sf.featureGroup);
+ assertEquals("Cath", sf.type);
+ sf = sfs[6];
+ assertEquals(
+ "High confidence server. Only hits with scores over 0.8 are reported. PHOSPHORYLATION (T) 89_8%LINK%",
+ sf.description);
+ assertEquals(
+ "PHOSPHORYLATION (T) 89_8|http://www.cbs.dtu.dk/cgi-bin/proview/webface-link?seqid=P83527&service=NetPhos-2.0",
+ sf.links.get(0).toString());
+ assertEquals(89, sf.begin);
+ assertEquals(89, sf.end);
+ assertEquals("netphos", sf.featureGroup);
+ assertEquals("PHOSPHORYLATION (T)", sf.type);
+ }
+}