1 package jalview.datamodel;
3 import static org.testng.Assert.assertEquals;
4 import static org.testng.Assert.assertFalse;
5 import static org.testng.Assert.assertTrue;
7 import jalview.datamodel.ResidueCount.SymbolCounts;
9 import org.junit.Assert;
10 import org.testng.annotations.Test;
12 public class ResidueCountTest
15 * Test a mix of add and put for nucleotide counting
17 @Test(groups = "Functional")
18 public void test_countNucleotide()
20 ResidueCount rc = new ResidueCount(true);
21 assertEquals(rc.getCount('A'), 0);
22 assertEquals(rc.getGapCount(), 0);
24 assertEquals(rc.add('A'), 1);
25 assertEquals(rc.add('a'), 2);
28 assertEquals(rc.add('G'), 4);
30 assertEquals(rc.add('c'), 1);
32 assertEquals(rc.add('N'), 1);
34 assertEquals(rc.getCount('a'), 2);
35 assertEquals(rc.getCount('A'), 2);
36 assertEquals(rc.getCount('G'), 4);
37 assertEquals(rc.getCount('c'), 4);
38 assertEquals(rc.getCount('T'), 0); // never seen
39 assertEquals(rc.getCount('N'), 1);
40 assertEquals(rc.getCount('?'), 0);
41 assertEquals(rc.getCount('-'), 0);
43 assertFalse(rc.isCountingInts());
44 assertFalse(rc.isUsingOtherData());
48 * Test adding to gap count (either using addGap or add)
50 @Test(groups = "Functional")
51 public void testAddGap()
53 ResidueCount rc = new ResidueCount(true);
59 assertEquals(rc.getGapCount(), 4);
60 assertEquals(rc.getCount(' '), 4);
61 assertEquals(rc.getCount('-'), 4);
62 assertEquals(rc.getCount('.'), 4);
63 assertFalse(rc.isUsingOtherData());
64 assertFalse(rc.isCountingInts());
67 @Test(groups = "Functional")
68 public void testOverflow()
73 ResidueCount rc = new ResidueCount(true);
75 rc.put('A', Short.MAX_VALUE - 1);
76 assertFalse(rc.isCountingInts());
78 assertFalse(rc.isCountingInts());
80 assertTrue(rc.isCountingInts());
81 assertEquals(rc.getCount('a'), Short.MAX_VALUE + 1);
83 assertTrue(rc.isCountingInts());
84 assertEquals(rc.getCount('a'), Short.MAX_VALUE + 2);
85 assertEquals(rc.getGapCount(), 1);
87 assertEquals(rc.getGapCount(), 2);
92 rc = new ResidueCount(true);
93 rc.put('G', Short.MAX_VALUE + 1);
94 assertTrue(rc.isCountingInts());
95 assertEquals(rc.getCount('g'), Short.MAX_VALUE + 1);
97 assertTrue(rc.isCountingInts());
98 assertEquals(rc.getCount('g'), 1);
103 rc = new ResidueCount(true);
104 rc.put('G', Short.MIN_VALUE - 1);
105 assertTrue(rc.isCountingInts());
106 assertEquals(rc.getCount('g'), Short.MIN_VALUE - 1);
110 * Test a mix of add and put for peptide counting
112 @Test(groups = "Functional")
113 public void test_countPeptide()
115 ResidueCount rc = new ResidueCount(false);
125 assertEquals(rc.getCount('q'), 5);
126 assertEquals(rc.getCount('X'), 2);
127 assertEquals(rc.getCount('W'), 7);
128 assertEquals(rc.getCount('m'), 13);
129 assertEquals(rc.getCount('G'), 0);
130 assertEquals(rc.getCount('-'), 0);
132 assertFalse(rc.isCountingInts());
133 assertFalse(rc.isUsingOtherData());
136 @Test(groups = "Functional")
137 public void test_unexpectedPeptide()
139 ResidueCount rc = new ResidueCount(false);
140 // expected characters (upper or lower case):
141 String aas = "ACDEFGHIKLMNPQRSTVWXY";
142 String lower = aas.toLowerCase();
143 for (int i = 0; i < aas.length(); i++)
145 rc.put(aas.charAt(i), i);
146 rc.add(lower.charAt(i));
148 for (int i = 0; i < aas.length(); i++)
150 assertEquals(rc.getCount(aas.charAt(i)), i + 1);
152 assertFalse(rc.isUsingOtherData());
155 assertTrue(rc.isUsingOtherData());
156 assertEquals(rc.getCount('J'), 4);
158 assertEquals(rc.getCount('J'), 5);
161 @Test(groups = "Functional")
162 public void test_unexpectedNucleotide()
164 ResidueCount rc = new ResidueCount(true);
165 // expected characters (upper or lower case):
166 String nucs = "ACGTUN";
167 String lower = nucs.toLowerCase();
168 for (int i = 0; i < nucs.length(); i++)
170 rc.put(nucs.charAt(i), i);
171 rc.add(lower.charAt(i));
173 for (int i = 0; i < nucs.length(); i++)
175 assertEquals(rc.getCount(nucs.charAt(i)), i + 1);
177 assertFalse(rc.isUsingOtherData());
180 assertTrue(rc.isUsingOtherData());
183 @Test(groups = "Functional")
184 public void testGetModalCount()
186 ResidueCount rc = new ResidueCount(true);
190 assertEquals(rc.getModalCount(), 2);
192 // modal count is in the 'short overflow' counts
193 rc = new ResidueCount();
195 rc.put('g', Short.MAX_VALUE);
197 assertEquals(rc.getModalCount(), Short.MAX_VALUE + 1);
199 // modal count is in the 'other data' counts
200 rc = new ResidueCount(false);
204 assertEquals(rc.getModalCount(), 2);
206 // verify modal count excludes gap
207 rc = new ResidueCount();
214 assertEquals(rc.getModalCount(), 2);
217 @Test(groups = "Functional")
218 public void testGetResiduesForCount()
220 ResidueCount rc = new ResidueCount(true);
224 assertEquals(rc.getResiduesForCount(2), "C");
225 assertEquals(rc.getResiduesForCount(1), "G");
226 assertEquals(rc.getResiduesForCount(3), "");
227 assertEquals(rc.getResiduesForCount(0), "");
228 assertEquals(rc.getResiduesForCount(-1), "");
230 // modal count is in the 'short overflow' counts
231 rc = new ResidueCount(true);
233 rc.put('g', Short.MAX_VALUE);
235 assertEquals(rc.getResiduesForCount(Short.MAX_VALUE + 1), "G");
236 assertEquals(rc.getResiduesForCount(1), "C");
238 // peptide modal count is in the 'short overflow' counts
239 rc = new ResidueCount(false);
241 rc.put('p', Short.MAX_VALUE);
243 assertEquals(rc.getResiduesForCount(Short.MAX_VALUE + 1), "P");
244 assertEquals(rc.getResiduesForCount(1), "C");
246 // modal count is in the 'other data' counts
247 rc = new ResidueCount();
251 assertEquals(rc.getResiduesForCount(1), "Q");
252 assertEquals(rc.getResiduesForCount(2), "{");
254 // residues share modal count
255 rc = new ResidueCount();
261 assertEquals(rc.getResiduesForCount(1), "U");
262 assertEquals(rc.getResiduesForCount(2), "CG");
264 // expected and unexpected symbols share modal count
265 rc = new ResidueCount();
275 assertEquals(rc.getResiduesForCount(1), "U");
276 assertEquals(rc.getResiduesForCount(2), "CGT[");
279 @Test(groups = "Functional")
280 public void testGetSymbolCounts_nucleotide()
282 ResidueCount rc = new ResidueCount(true);
286 rc.add('J'); // 'otherData'
289 rc.put('[', 0); // 'otherdata'
291 SymbolCounts sc = rc.getSymbolCounts();
292 Assert.assertArrayEquals(new char[] { 'C', 'G', 'N', 'J', '[' },
294 Assert.assertArrayEquals(new int[] { 1, 3, 1, 1, 0 }, sc.values);
296 // now with overflow to int counts
297 rc.put('U', Short.MAX_VALUE);
299 sc = rc.getSymbolCounts();
300 Assert.assertArrayEquals(new char[] { 'C', 'G', 'N', 'U', 'J', '[' },
302 Assert.assertArrayEquals(new int[] { 1, 3, 1, 32768, 1, 0 }, sc.values);
305 @Test(groups = "Functional")
306 public void testGetSymbolCounts_peptide()
308 ResidueCount rc = new ResidueCount(false);
312 rc.add('Z'); // 'otherData'
316 SymbolCounts sc = rc.getSymbolCounts();
317 Assert.assertArrayEquals(new char[] { 'L', 'Q', 'W', 'Z' }, sc.symbols);
318 Assert.assertArrayEquals(new int[] { 1, 1, 3, 1 }, sc.values);
320 // now with overflow to int counts
321 rc.put('W', Short.MAX_VALUE);
323 sc = rc.getSymbolCounts();
324 Assert.assertArrayEquals(new char[] { 'L', 'Q', 'W', 'Z' }, sc.symbols);
325 Assert.assertArrayEquals(new int[] { 1, 1, 32768, 1 }, sc.values);
328 @Test(groups = "Functional")
329 public void testToString()
331 ResidueCount rc = new ResidueCount();
335 assertEquals(rc.toString(), "[ C:1 Q:2 ]");
339 assertEquals(rc.toString(), "[ C:1 Q:2 {:1 ]");
341 // switch from short to int counting:
342 rc.put('G', Short.MAX_VALUE);
344 assertEquals(rc.toString(), "[ C:1 G:32768 Q:2 {:1 ]");
347 @Test(groups = "Functional")
348 public void testGetTooltip()
350 ResidueCount rc = new ResidueCount();
353 assertEquals(rc.getTooltip(20, 1), "");
356 * count 7 C, 6 K, 7 Q, 10 P, 9 W, 1 F (total 40)
358 for (int i = 0; i < 7; i++)
363 for (int i = 0; i < 10; i++)
367 for (int i = 0; i < 9; i++)
371 for (int i = 0; i < 6; i++)
378 * percentages are rounded (0.5 rounded up)
379 * 10/40 9/40 7/40 6/40 1/40
381 assertEquals(rc.getTooltip(40, 0),
382 "P 25%; W 23%; C 18%; Q 18%; K 15%; F 3%");
386 * 10/30 9/30 8/30 7/30 6/30 1/30
388 assertEquals(rc.getTooltip(30, 1),
389 "P 33.3%; W 30.0%; Q 26.7%; C 23.3%; K 20.0%; F 3.3%");
392 @Test(groups = "Functional")
393 public void testPut()
395 ResidueCount rc = new ResidueCount();
397 assertEquals(rc.getCount('Q'), 3);
399 assertEquals(rc.getGapCount(), 4);
401 assertEquals(rc.getGapCount(), 5);
403 assertEquals(rc.getGapCount(), 6);
406 assertEquals(rc.getCount('?'), 5);
409 assertEquals(rc.getCount('?'), 6);
410 assertEquals(rc.getCount('!'), 7);