Merge branch 'bug/JAL-3612_overviewFeatureOrdering' into develop
[jalview.git] / test / jalview / io / AnnotationFileIOTest.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
7  * Jalview is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License 
9  * as published by the Free Software Foundation, either version 3
10  * of the License, or (at your option) any later version.
11  *  
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  */
21 package jalview.io;
22
23 import static org.testng.AssertJUnit.assertEquals;
24 import static org.testng.AssertJUnit.assertNotNull;
25 import static org.testng.AssertJUnit.assertTrue;
26
27 import java.awt.Color;
28 import java.io.File;
29 import java.util.Hashtable;
30 import java.util.List;
31
32 import org.testng.Assert;
33 import org.testng.annotations.BeforeClass;
34 import org.testng.annotations.Test;
35
36 import jalview.datamodel.AlignmentI;
37 import jalview.datamodel.HiddenColumns;
38 import jalview.datamodel.SequenceGroup;
39 import jalview.gui.AlignFrame;
40 import jalview.gui.JvOptionPane;
41 import jalview.io.AnnotationFile.ViewDef;
42
43 public class AnnotationFileIOTest
44 {
45
46   @BeforeClass(alwaysRun = true)
47   public void setUpJvOptionPane()
48   {
49     JvOptionPane.setInteractiveMode(false);
50     JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
51   }
52
53   static String TestFiles[][] = { { "Test example annotation import/export",
54       "examples/uniref50.fa", "examples/testdata/example_annot_file.jva" },
55       { "Test multiple combine annotation statements import/export",
56           "examples/uniref50.fa",
57           "examples/testdata/test_combine_annot.jva" },
58       { "Test multiple combine annotation statements with sequence_ref import/export",
59           "examples/uniref50.fa", "examples/testdata/uniref50_iupred.jva" },
60       { "Test group only annotation file parsing results in parser indicating annotation was parsed",
61           "examples/uniref50.fa", "examples/testdata/test_grpannot.jva" },
62       { "Test hiding/showing of insertions on sequence_ref",
63           "examples/uniref50.fa",
64           "examples/testdata/uniref50_seqref.jva" } };
65
66   @Test(groups = { "Functional" })
67   public void exampleAnnotationFileIO() throws Exception
68   {
69     for (String[] testPair : TestFiles)
70     {
71       testAnnotationFileIO(testPair[0], new File(testPair[1]),
72               new File(testPair[2]));
73     }
74   }
75
76   protected AlignmentI readAlignmentFile(File f)
77   {
78     System.out.println("Reading file: " + f);
79     String ff = f.getPath();
80     try
81     {
82       FormatAdapter rf = new FormatAdapter();
83
84       AlignmentI al = rf.readFile(ff, DataSourceType.FILE,
85               new IdentifyFile().identify(ff, DataSourceType.FILE));
86
87       // make sure dataset is initialised ? not sure about this
88       for (int i = 0; i < al.getSequencesArray().length; ++i)
89       {
90         al.getSequenceAt(i).createDatasetSequence();
91       }
92       assertNotNull("Couldn't read supplied alignment data.", al);
93       return al;
94     } catch (Exception e)
95     {
96       e.printStackTrace();
97     }
98     Assert.fail(
99             "Couln't read the alignment in file '" + f.toString() + "'");
100     return null;
101   }
102
103   /**
104    * test alignment data in given file can be imported, exported and reimported
105    * with no dataloss
106    * 
107    * @param f
108    *          - source datafile (IdentifyFile.identify() should work with it)
109    * @param ioformat
110    *          - label for IO class used to write and read back in the data from
111    *          f
112    */
113   void testAnnotationFileIO(String testname, File f, File annotFile)
114   {
115     System.out.println("Test: " + testname + "\nReading annotation file '"
116             + annotFile + "' onto : " + f);
117     String af = annotFile.getPath();
118     try
119     {
120       AlignmentI al = readAlignmentFile(f);
121       HiddenColumns cs = new HiddenColumns();
122       assertTrue("Test " + testname
123               + "\nAlignment was not annotated - annotation file not imported.",
124               new AnnotationFile().readAnnotationFile(al, cs, af,
125                       DataSourceType.FILE));
126
127       AnnotationFile aff = new AnnotationFile();
128       // ViewDef is not used by Jalview
129       ViewDef v = aff.new ViewDef(null, al.getHiddenSequences(), cs,
130               new Hashtable());
131       String anfileout = new AnnotationFile().printAnnotations(
132               al.getAlignmentAnnotation(), al.getGroups(),
133               al.getProperties(), null, al, v);
134       assertTrue("Test " + testname
135               + "\nAlignment annotation file was not regenerated. Null string",
136               anfileout != null);
137       assertTrue("Test " + testname
138               + "\nAlignment annotation file was not regenerated. Empty string",
139               anfileout.length() > "JALVIEW_ANNOTATION".length());
140
141       System.out.println(
142               "Output annotation file:\n" + anfileout + "\n<<EOF\n");
143
144       AlignmentI al_new = readAlignmentFile(f);
145       assertTrue("Test " + testname
146               + "\nregenerated annotation file did not annotate alignment.",
147               new AnnotationFile().readAnnotationFile(al_new, anfileout,
148                       DataSourceType.PASTE));
149
150       // test for consistency in io
151       StockholmFileTest.testAlignmentEquivalence(al, al_new, false, false,
152               false);
153       return;
154     } catch (Exception e)
155     {
156       e.printStackTrace();
157     }
158     Assert.fail("Test " + testname
159             + "\nCouldn't complete Annotation file roundtrip input/output/input test for '"
160             + annotFile + "'.");
161   }
162
163   @Test(groups = "Functional")
164   public void testAnnotateAlignmentView()
165   {
166     long t1 = System.currentTimeMillis();
167     /*
168      * JAL-3779 test multiple groups of the same name get annotated
169      */
170     AlignFrame af = new FileLoader().LoadFileWaitTillLoaded(
171             ">Seq1\nQRSIL\n>Seq2\nFTHND\n>Seq3\nRPVSL\n",
172             DataSourceType.PASTE);
173     long t2 = System.currentTimeMillis();
174     System.err.println("t0: " + (t2 - t1));
175     // seq1 and seq3 are in distinct groups both named Group1
176     String annotationFile = "JALVIEW_ANNOTATION\nSEQUENCE_GROUP\tGroup1\t*\t*\t1\n"
177             + "SEQUENCE_GROUP\tGroup2\t*\t*\t2\n"
178             + "SEQUENCE_GROUP\tGroup1\t*\t*\t3\n"
179             + "PROPERTIES\tGroup1\toutlineColour=blue\tidColour=red\n";
180     new AnnotationFile().annotateAlignmentView(af.getViewport(),
181             annotationFile, DataSourceType.PASTE);
182
183     AlignmentI al = af.getViewport().getAlignment();
184     List<SequenceGroup> groups = al.getGroups();
185     assertEquals(3, groups.size());
186     SequenceGroup sg = groups.get(0);
187     assertEquals("Group1", sg.getName());
188     assertTrue(sg.contains(al.getSequenceAt(0)));
189     assertEquals(Color.BLUE, sg.getOutlineColour());
190     assertEquals(Color.RED, sg.getIdColour());
191     sg = groups.get(1);
192     assertEquals("Group2", sg.getName());
193     assertTrue(sg.contains(al.getSequenceAt(1)));
194
195     /*
196      * the bug fix: a second group of the same name is also given properties
197      */
198     sg = groups.get(2);
199     assertEquals("Group1", sg.getName());
200     assertTrue(sg.contains(al.getSequenceAt(2)));
201     assertEquals(Color.BLUE, sg.getOutlineColour());
202     assertEquals(Color.RED, sg.getIdColour());
203   }
204 }