2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
5 * This file is part of Jalview.
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.
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.
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.
21 package jalview.datamodel;
23 import static org.testng.Assert.assertEquals;
24 import static org.testng.Assert.assertFalse;
25 import static org.testng.Assert.assertTrue;
27 import jalview.datamodel.ResidueCount.SymbolCounts;
28 import jalview.gui.JvOptionPane;
30 import org.junit.Assert;
31 import org.testng.annotations.BeforeClass;
32 import org.testng.annotations.Test;
34 public class ResidueCountTest
37 @BeforeClass(alwaysRun = true)
38 public void setUpJvOptionPane()
40 JvOptionPane.setInteractiveMode(false);
41 JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
45 * Test a mix of add and put for nucleotide counting
47 @Test(groups = "Functional")
48 public void test_countNucleotide()
50 ResidueCount rc = new ResidueCount(true);
51 assertEquals(rc.getCount('A'), 0);
52 assertEquals(rc.getGapCount(), 0);
54 assertEquals(rc.add('A'), 1);
55 assertEquals(rc.add('a'), 2);
58 assertEquals(rc.add('G'), 4);
60 assertEquals(rc.add('c'), 1);
62 assertEquals(rc.add('N'), 1);
64 assertEquals(rc.getCount('a'), 2);
65 assertEquals(rc.getCount('A'), 2);
66 assertEquals(rc.getCount('G'), 4);
67 assertEquals(rc.getCount('c'), 4);
68 assertEquals(rc.getCount('T'), 0); // never seen
69 assertEquals(rc.getCount('N'), 1);
70 assertEquals(rc.getCount('?'), 0);
71 assertEquals(rc.getCount('-'), 0);
73 assertFalse(rc.isCountingInts());
74 assertFalse(rc.isUsingOtherData());
78 * Test adding to gap count (either using addGap or add)
80 @Test(groups = "Functional")
81 public void testAddGap()
83 ResidueCount rc = new ResidueCount(true);
89 assertEquals(rc.getGapCount(), 4);
90 assertEquals(rc.getCount(' '), 4);
91 assertEquals(rc.getCount('-'), 4);
92 assertEquals(rc.getCount('.'), 4);
93 assertFalse(rc.isUsingOtherData());
94 assertFalse(rc.isCountingInts());
96 rc.set(ResidueCount.GAP_COUNT, Short.MAX_VALUE-2);
97 assertEquals(rc.getGapCount(), Short.MAX_VALUE-2);
98 assertFalse(rc.isCountingInts());
100 assertEquals(rc.getGapCount(), Short.MAX_VALUE-1);
101 assertFalse(rc.isCountingInts());
103 assertEquals(rc.getGapCount(), Short.MAX_VALUE);
105 assertTrue(rc.isCountingInts());
106 assertEquals(rc.getGapCount(), Short.MAX_VALUE+1);
109 @Test(groups = "Functional")
110 public void testOverflow()
115 ResidueCount rc = new ResidueCount(true);
117 rc.put('A', Short.MAX_VALUE - 1);
118 assertFalse(rc.isCountingInts());
120 assertFalse(rc.isCountingInts());
122 assertTrue(rc.isCountingInts());
123 assertEquals(rc.getCount('a'), Short.MAX_VALUE + 1);
125 assertTrue(rc.isCountingInts());
126 assertEquals(rc.getCount('a'), Short.MAX_VALUE + 2);
127 assertEquals(rc.getGapCount(), 1);
129 assertEquals(rc.getGapCount(), 2);
134 rc = new ResidueCount(true);
135 rc.put('G', Short.MAX_VALUE + 1);
136 assertTrue(rc.isCountingInts());
137 assertEquals(rc.getCount('g'), Short.MAX_VALUE + 1);
139 assertTrue(rc.isCountingInts());
140 assertEquals(rc.getCount('g'), 1);
145 rc = new ResidueCount(true);
146 rc.put('G', Short.MIN_VALUE - 1);
147 assertTrue(rc.isCountingInts());
148 assertEquals(rc.getCount('g'), Short.MIN_VALUE - 1);
152 * Test a mix of add and put for peptide counting
154 @Test(groups = "Functional")
155 public void test_countPeptide()
157 ResidueCount rc = new ResidueCount(false);
167 assertEquals(rc.getCount('q'), 5);
168 assertEquals(rc.getCount('X'), 2);
169 assertEquals(rc.getCount('W'), 7);
170 assertEquals(rc.getCount('m'), 13);
171 assertEquals(rc.getCount('G'), 0);
172 assertEquals(rc.getCount('-'), 0);
174 assertFalse(rc.isCountingInts());
175 assertFalse(rc.isUsingOtherData());
178 @Test(groups = "Functional")
179 public void test_unexpectedPeptide()
181 ResidueCount rc = new ResidueCount(false);
182 // expected characters (upper or lower case):
183 String aas = "ACDEFGHIKLMNPQRSTVWXY";
184 String lower = aas.toLowerCase();
185 for (int i = 0; i < aas.length(); i++)
187 rc.put(aas.charAt(i), i);
188 rc.add(lower.charAt(i));
190 for (int i = 0; i < aas.length(); i++)
192 assertEquals(rc.getCount(aas.charAt(i)), i + 1);
194 assertFalse(rc.isUsingOtherData());
197 assertTrue(rc.isUsingOtherData());
198 assertEquals(rc.getCount('J'), 4);
200 assertEquals(rc.getCount('J'), 5);
203 @Test(groups = "Functional")
204 public void test_unexpectedNucleotide()
206 ResidueCount rc = new ResidueCount(true);
207 // expected characters (upper or lower case):
208 String nucs = "ACGTUN";
209 String lower = nucs.toLowerCase();
210 for (int i = 0; i < nucs.length(); i++)
212 rc.put(nucs.charAt(i), i);
213 rc.add(lower.charAt(i));
215 for (int i = 0; i < nucs.length(); i++)
217 assertEquals(rc.getCount(nucs.charAt(i)), i + 1);
219 assertFalse(rc.isUsingOtherData());
222 assertTrue(rc.isUsingOtherData());
225 @Test(groups = "Functional")
226 public void testGetModalCount()
228 ResidueCount rc = new ResidueCount(true);
232 assertEquals(rc.getModalCount(), 2);
234 // modal count is in the 'short overflow' counts
235 rc = new ResidueCount();
237 rc.put('g', Short.MAX_VALUE);
239 assertEquals(rc.getModalCount(), Short.MAX_VALUE + 1);
241 // modal count is in the 'other data' counts
242 rc = new ResidueCount(false);
246 assertEquals(rc.getModalCount(), 2);
248 // verify modal count excludes gap
249 rc = new ResidueCount();
256 assertEquals(rc.getModalCount(), 2);
259 @Test(groups = "Functional")
260 public void testGetResiduesForCount()
262 ResidueCount rc = new ResidueCount(true);
266 assertEquals(rc.getResiduesForCount(2), "C");
267 assertEquals(rc.getResiduesForCount(1), "G");
268 assertEquals(rc.getResiduesForCount(3), "");
269 assertEquals(rc.getResiduesForCount(0), "");
270 assertEquals(rc.getResiduesForCount(-1), "");
272 // modal count is in the 'short overflow' counts
273 rc = new ResidueCount(true);
275 rc.put('g', Short.MAX_VALUE);
277 assertEquals(rc.getResiduesForCount(Short.MAX_VALUE + 1), "G");
278 assertEquals(rc.getResiduesForCount(1), "C");
280 // peptide modal count is in the 'short overflow' counts
281 rc = new ResidueCount(false);
283 rc.put('p', Short.MAX_VALUE);
285 assertEquals(rc.getResiduesForCount(Short.MAX_VALUE + 1), "P");
286 assertEquals(rc.getResiduesForCount(1), "C");
288 // modal count is in the 'other data' counts
289 rc = new ResidueCount();
293 assertEquals(rc.getResiduesForCount(1), "Q");
294 assertEquals(rc.getResiduesForCount(2), "{");
296 // residues share modal count
297 rc = new ResidueCount();
303 assertEquals(rc.getResiduesForCount(1), "U");
304 assertEquals(rc.getResiduesForCount(2), "CG");
306 // expected and unexpected symbols share modal count
307 rc = new ResidueCount();
317 assertEquals(rc.getResiduesForCount(1), "U");
318 assertEquals(rc.getResiduesForCount(2), "CGT[");
321 @Test(groups = "Functional")
322 public void testGetSymbolCounts_nucleotide()
324 ResidueCount rc = new ResidueCount(true);
328 rc.add('J'); // 'otherData'
331 rc.put('[', 0); // 'otherdata'
333 SymbolCounts sc = rc.getSymbolCounts();
334 Assert.assertArrayEquals(new char[] { 'C', 'G', 'N', 'J', '[' },
336 Assert.assertArrayEquals(new int[] { 1, 3, 1, 1, 0 }, sc.values);
338 // now with overflow to int counts
339 rc.put('U', Short.MAX_VALUE);
341 sc = rc.getSymbolCounts();
342 Assert.assertArrayEquals(new char[] { 'C', 'G', 'N', 'U', 'J', '[' },
344 Assert.assertArrayEquals(new int[] { 1, 3, 1, 32768, 1, 0 }, sc.values);
347 @Test(groups = "Functional")
348 public void testGetSymbolCounts_peptide()
350 ResidueCount rc = new ResidueCount(false);
354 rc.add('Z'); // 'otherData'
358 SymbolCounts sc = rc.getSymbolCounts();
359 Assert.assertArrayEquals(new char[] { 'L', 'Q', 'W', 'Z' }, sc.symbols);
360 Assert.assertArrayEquals(new int[] { 1, 1, 3, 1 }, sc.values);
362 // now with overflow to int counts
363 rc.put('W', Short.MAX_VALUE);
365 sc = rc.getSymbolCounts();
366 Assert.assertArrayEquals(new char[] { 'L', 'Q', 'W', 'Z' }, sc.symbols);
367 Assert.assertArrayEquals(new int[] { 1, 1, 32768, 1 }, sc.values);
370 @Test(groups = "Functional")
371 public void testToString()
373 ResidueCount rc = new ResidueCount();
377 assertEquals(rc.toString(), "[ C:1 Q:2 ]");
381 assertEquals(rc.toString(), "[ C:1 Q:2 {:1 ]");
383 // switch from short to int counting:
384 rc.put('G', Short.MAX_VALUE);
386 assertEquals(rc.toString(), "[ C:1 G:32768 Q:2 {:1 ]");
389 @Test(groups = "Functional")
390 public void testGetTooltip()
392 ResidueCount rc = new ResidueCount();
395 assertEquals(rc.getTooltip(20, 1), "");
398 * count 7 C, 6 K, 7 Q, 10 P, 9 W, 1 F (total 40)
400 for (int i = 0; i < 7; i++)
405 for (int i = 0; i < 10; i++)
409 for (int i = 0; i < 9; i++)
413 for (int i = 0; i < 6; i++)
420 * percentages are rounded (0.5 rounded up)
421 * 10/40 9/40 7/40 6/40 1/40
423 assertEquals(rc.getTooltip(40, 0),
424 "P 25%; W 23%; C 18%; Q 18%; K 15%; F 3%");
428 * 10/30 9/30 8/30 7/30 6/30 1/30
430 assertEquals(rc.getTooltip(30, 1),
431 "P 33.3%; W 30.0%; Q 26.7%; C 23.3%; K 20.0%; F 3.3%");
434 @Test(groups = "Functional")
435 public void testPut()
437 ResidueCount rc = new ResidueCount();
439 assertEquals(rc.getCount('Q'), 3);
441 assertEquals(rc.getGapCount(), 4);
443 assertEquals(rc.getGapCount(), 5);
445 assertEquals(rc.getGapCount(), 6);
448 assertEquals(rc.getCount('?'), 5);
451 assertEquals(rc.getCount('?'), 6);
452 assertEquals(rc.getCount('!'), 7);