Class |
Line # |
Actions |
|||
---|---|---|---|---|---|
FormatAdapterTest | 39 | 32 | 10 |
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 | 1 | @BeforeClass(alwaysRun = true) |
43 | public void setUpJvOptionPane() | |
44 | { | |
45 | 1 | JvOptionPane.setInteractiveMode(false); |
46 | 1 | JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION); |
47 | } | |
48 | ||
49 | /** | |
50 | * Test saving and re-reading in a specified format | |
51 | * | |
52 | * @throws IOException | |
53 | */ | |
54 | 11 | @Test(groups = { "Functional" }, dataProvider = "formats") |
55 | public void testRoundTrip(FileFormatI format) throws IOException | |
56 | { | |
57 | 11 | try |
58 | { | |
59 | 11 | 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 | 11 | char gap = al.getGapCharacter(); |
67 | 11 | assertNotNull(al); |
68 | ||
69 | 11 | SequenceI[] seqs = al.getSequencesArray(); |
70 | 11 | String formatted = new FormatAdapter().formatSequences(format, al, |
71 | false); | |
72 | ||
73 | 11 | AlignmentI reloaded = new FormatAdapter().readFile(formatted, |
74 | DataSourceType.PASTE, format); | |
75 | 11 | List<SequenceI> reread = reloaded.getSequences(); |
76 | 11 | assertEquals("Wrong number of reloaded sequences", seqs.length, |
77 | reread.size()); | |
78 | ||
79 | 11 | int i = 0; |
80 | 11 | for (SequenceI seq : reread) |
81 | { | |
82 | 165 | String sequenceString = seq.getSequenceAsString(); |
83 | ||
84 | /* | |
85 | * special case: MSF always uses '.' as gap character | |
86 | */ | |
87 | 165 | sequenceString = adjustForGapTreatment(sequenceString, gap, format); |
88 | 165 | assertEquals(String.format("Sequence %d: %s", i, seqs[i].getName()), |
89 | seqs[i].getSequenceAsString(), sequenceString); | |
90 | 165 | i++; |
91 | } | |
92 | } catch (IOException e) | |
93 | { | |
94 | 0 | 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 | 165 | String adjustForGapTreatment(String sequenceString, char gap, |
111 | FileFormatI format) | |
112 | { | |
113 | 165 | if (FileFormat.MSF.equals(format)) |
114 | { | |
115 | /* | |
116 | * MSF forces gap character to '.', so change it back | |
117 | * for comparison purposes | |
118 | */ | |
119 | 15 | sequenceString = sequenceString.replace('.', gap); |
120 | } | |
121 | 165 | 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 | 1 | @DataProvider(name = "formats") |
131 | static Object[][] getFormats() | |
132 | { | |
133 | 1 | List<FileFormatI> both = new ArrayList<FileFormatI>(); |
134 | 1 | for (FileFormatI format : FileFormats.getInstance().getFormats()) |
135 | { | |
136 | 22 | if (format.isReadable() && format.isWritable() |
137 | && format.isTextFormat()) | |
138 | { | |
139 | 11 | both.add(format); |
140 | } | |
141 | } | |
142 | ||
143 | 1 | Object[][] formats = new Object[both.size()][]; |
144 | 1 | int i = 0; |
145 | 1 | for (FileFormatI format : both) |
146 | { | |
147 | 11 | formats[i] = new Object[] { format }; |
148 | 11 | i++; |
149 | } | |
150 | 1 | return formats; |
151 | } | |
152 | ||
153 | /** | |
154 | * Enable this to isolate testing to a single file format | |
155 | * | |
156 | * @throws IOException | |
157 | */ | |
158 | 0 | @Test(groups = { "Functional" }, enabled = false) |
159 | public void testOneFormatRoundTrip() throws IOException | |
160 | { | |
161 | 0 | testRoundTrip(FileFormat.Json); |
162 | } | |
163 | } |