JAL-3599 Cater for macOS. ScheduledExecutor timeout implemented
[jalview.git] / test / jalview / io / FormatAdapterTest.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.fail;
26
27 import jalview.datamodel.AlignmentI;
28 import jalview.datamodel.SequenceI;
29 import jalview.gui.JvOptionPane;
30
31 import java.io.IOException;
32 import java.util.ArrayList;
33 import java.util.List;
34
35 import org.testng.annotations.BeforeClass;
36 import org.testng.annotations.DataProvider;
37 import org.testng.annotations.Test;
38
39 public class FormatAdapterTest
40 {
41
42   @BeforeClass(alwaysRun = true)
43   public void setUpJvOptionPane()
44   {
45     JvOptionPane.setInteractiveMode(false);
46     JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
47   }
48
49   /**
50    * Test saving and re-reading in a specified format
51    * 
52    * @throws IOException
53    */
54   @Test(groups = { "Functional" }, dataProvider = "formats")
55   public void testRoundTrip(FileFormatI format) throws IOException
56   {
57     try
58     {
59       AlignmentI al = new FormatAdapter().readFile("examples/uniref50.fa",
60               DataSourceType.FILE, FileFormat.Fasta);
61
62       /*
63        * 'gap' is the gap character used in the alignment data file here,
64        * not the user preferred gap character
65        */
66       char gap = al.getGapCharacter();
67       assertNotNull(al);
68
69       SequenceI[] seqs = al.getSequencesArray();
70       String formatted = new FormatAdapter().formatSequences(format, al,
71               false);
72
73       AlignmentI reloaded = new FormatAdapter().readFile(formatted,
74               DataSourceType.PASTE, format);
75       List<SequenceI> reread = reloaded.getSequences();
76       assertEquals("Wrong number of reloaded sequences", seqs.length,
77               reread.size());
78
79       int i = 0;
80       for (SequenceI seq : reread)
81       {
82         String sequenceString = seq.getSequenceAsString();
83
84         /*
85          * special case: MSF always uses '.' as gap character
86          */
87         sequenceString = adjustForGapTreatment(sequenceString, gap, format);
88         assertEquals(String.format("Sequence %d: %s", i, seqs[i].getName()),
89                 seqs[i].getSequenceAsString(), sequenceString);
90         i++;
91       }
92     } catch (IOException e)
93     {
94       fail(String.format("Format %s failed with %s", format,
95               e.getMessage()));
96     }
97   }
98
99   /**
100    * Optionally change the gap character in the string to the given character,
101    * depending on the sequence file format
102    * 
103    * @param sequenceString
104    *          a sequence (as written in 'format' format)
105    * @param gap
106    *          the sequence's original gap character
107    * @param format
108    * @return
109    */
110   String adjustForGapTreatment(String sequenceString, char gap,
111           FileFormatI format)
112   {
113     if (FileFormat.MSF.equals(format))
114     {
115       /*
116        * MSF forces gap character to '.', so change it back
117        * for comparison purposes
118        */
119       sequenceString = sequenceString.replace('.', gap);
120     }
121     return sequenceString;
122   }
123
124   /**
125    * Data provider that serves alignment formats that are both readable and
126    * (text) writable
127    * 
128    * @return
129    */
130   @DataProvider(name = "formats")
131   static Object[][] getFormats()
132   {
133     List<FileFormatI> both = new ArrayList<FileFormatI>();
134     for (FileFormatI format : FileFormats.getInstance().getFormats())
135     {
136       if (format.isReadable() && format.isWritable()
137               && format.isTextFormat())
138       {
139         both.add(format);
140       }
141     }
142
143     Object[][] formats = new Object[both.size()][];
144     int i = 0;
145     for (FileFormatI format : both)
146     {
147       formats[i] = new Object[] { format };
148       i++;
149     }
150     return formats;
151   }
152
153   /**
154    * Enable this to isolate testing to a single file format
155    * 
156    * @throws IOException
157    */
158   @Test(groups = { "Functional" }, enabled = false)
159   public void testOneFormatRoundTrip() throws IOException
160   {
161     testRoundTrip(FileFormat.Json);
162   }
163 }