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;
8 import jalview.datamodel.ResidueCount.SymbolCounts;
10 import org.junit.Assert;
11 import org.testng.annotations.Test;
13 public class ResidueCountTest
16 * Test a mix of add and put for nucleotide counting
18 @Test(groups = "Functional")
19 public void test_countNucleotide()
21 ResidueCount rc = new ResidueCount(true);
22 assertEquals(rc.getCount('A'), 0);
23 assertEquals(rc.getGapCount(), 0);
25 assertEquals(rc.add('A'), 1);
26 assertEquals(rc.add('a'), 2);
29 assertEquals(rc.add('G'), 4);
31 assertEquals(rc.add('c'), 1);
33 assertEquals(rc.add('N'), 1);
35 assertEquals(rc.getCount('a'), 2);
36 assertEquals(rc.getCount('A'), 2);
37 assertEquals(rc.getCount('G'), 4);
38 assertEquals(rc.getCount('c'), 4);
39 assertEquals(rc.getCount('T'), 0); // never seen
40 assertEquals(rc.getCount('N'), 1);
41 assertEquals(rc.getCount('?'), 0);
42 assertEquals(rc.getCount('-'), 0);
44 assertFalse(rc.isCountingInts());
45 assertFalse(rc.isUsingOtherData());
49 * Test adding to gap count (either using addGap or add)
51 @Test(groups = "Functional")
52 public void testAddGap()
54 ResidueCount rc = new ResidueCount(true);
60 assertEquals(rc.getGapCount(), 4);
61 assertEquals(rc.getCount(' '), 4);
62 assertEquals(rc.getCount('-'), 4);
63 assertEquals(rc.getCount('.'), 4);
64 assertFalse(rc.isUsingOtherData());
65 assertFalse(rc.isCountingInts());
68 @Test(groups = "Functional")
69 public void testOverflow()
74 ResidueCount rc = new ResidueCount(true);
76 rc.put('A', Short.MAX_VALUE - 1);
77 assertFalse(rc.isCountingInts());
79 assertFalse(rc.isCountingInts());
81 assertTrue(rc.isCountingInts());
82 assertEquals(rc.getCount('a'), Short.MAX_VALUE + 1);
84 assertTrue(rc.isCountingInts());
85 assertEquals(rc.getCount('a'), Short.MAX_VALUE + 2);
86 assertEquals(rc.getGapCount(), 1);
88 assertEquals(rc.getGapCount(), 2);
93 rc = new ResidueCount(true);
94 rc.put('G', Short.MAX_VALUE + 1);
95 assertTrue(rc.isCountingInts());
96 assertEquals(rc.getCount('g'), Short.MAX_VALUE + 1);
98 assertTrue(rc.isCountingInts());
99 assertEquals(rc.getCount('g'), 1);
104 rc = new ResidueCount(true);
105 rc.put('G', Short.MIN_VALUE - 1);
106 assertTrue(rc.isCountingInts());
107 assertEquals(rc.getCount('g'), Short.MIN_VALUE - 1);
111 * Test a mix of add and put for peptide counting
113 @Test(groups = "Functional")
114 public void test_countPeptide()
116 ResidueCount rc = new ResidueCount(false);
126 assertEquals(rc.getCount('q'), 5);
127 assertEquals(rc.getCount('X'), 2);
128 assertEquals(rc.getCount('W'), 7);
129 assertEquals(rc.getCount('m'), 13);
130 assertEquals(rc.getCount('G'), 0);
131 assertEquals(rc.getCount('-'), 0);
133 assertFalse(rc.isCountingInts());
134 assertFalse(rc.isUsingOtherData());
137 @Test(groups = "Functional")
138 public void test_unexpectedPeptide()
140 ResidueCount rc = new ResidueCount(false);
141 // expected characters (upper or lower case):
142 String aas = "ACDEFGHIKLMNPQRSTVWXY";
143 String lower = aas.toLowerCase();
144 for (int i = 0; i < aas.length(); i++)
146 rc.put(aas.charAt(i), i);
147 rc.add(lower.charAt(i));
149 for (int i = 0; i < aas.length(); i++)
151 assertEquals(rc.getCount(aas.charAt(i)), i + 1);
153 assertFalse(rc.isUsingOtherData());
156 assertTrue(rc.isUsingOtherData());
157 assertEquals(rc.getCount('J'), 4);
159 assertEquals(rc.getCount('J'), 5);
162 @Test(groups = "Functional")
163 public void test_unexpectedNucleotide()
165 ResidueCount rc = new ResidueCount(true);
166 // expected characters (upper or lower case):
167 String nucs = "ACGTUN";
168 String lower = nucs.toLowerCase();
169 for (int i = 0; i < nucs.length(); i++)
171 rc.put(nucs.charAt(i), i);
172 rc.add(lower.charAt(i));
174 for (int i = 0; i < nucs.length(); i++)
176 assertEquals(rc.getCount(nucs.charAt(i)), i + 1);
178 assertFalse(rc.isUsingOtherData());
181 assertTrue(rc.isUsingOtherData());
184 @Test(groups = "Functional")
185 public void testGetModalCount()
187 ResidueCount rc = new ResidueCount(true);
191 assertEquals(rc.getModalCount(), 2);
193 // modal count is in the 'short overflow' counts
194 rc = new ResidueCount();
196 rc.put('g', Short.MAX_VALUE);
198 assertEquals(rc.getModalCount(), Short.MAX_VALUE + 1);
200 // modal count is in the 'other data' counts
201 rc = new ResidueCount(false);
205 assertEquals(rc.getModalCount(), 2);
207 // verify modal count excludes gap
208 rc = new ResidueCount();
215 assertEquals(rc.getModalCount(), 2);
218 @Test(groups = "Functional")
219 public void testGetResiduesForCount()
221 ResidueCount rc = new ResidueCount(true);
225 assertEquals(rc.getResiduesForCount(2), "C");
226 assertEquals(rc.getResiduesForCount(1), "G");
227 assertEquals(rc.getResiduesForCount(3), "");
228 assertEquals(rc.getResiduesForCount(0), "");
229 assertEquals(rc.getResiduesForCount(-1), "");
231 // modal count is in the 'short overflow' counts
232 rc = new ResidueCount(true);
234 rc.put('g', Short.MAX_VALUE);
236 assertEquals(rc.getResiduesForCount(Short.MAX_VALUE + 1), "G");
237 assertEquals(rc.getResiduesForCount(1), "C");
239 // peptide modal count is in the 'short overflow' counts
240 rc = new ResidueCount(false);
242 rc.put('p', Short.MAX_VALUE);
244 assertEquals(rc.getResiduesForCount(Short.MAX_VALUE + 1), "P");
245 assertEquals(rc.getResiduesForCount(1), "C");
247 // modal count is in the 'other data' counts
248 rc = new ResidueCount();
252 assertEquals(rc.getResiduesForCount(1), "Q");
253 assertEquals(rc.getResiduesForCount(2), "{");
255 // residues share modal count
256 rc = new ResidueCount();
262 assertEquals(rc.getResiduesForCount(1), "U");
263 assertEquals(rc.getResiduesForCount(2), "CG");
265 // expected and unexpected symbols share modal count
266 rc = new ResidueCount();
276 assertEquals(rc.getResiduesForCount(1), "U");
277 assertEquals(rc.getResiduesForCount(2), "CGT[");
280 @Test(groups = "Functional")
281 public void testGetSymbolCounts_nucleotide()
283 ResidueCount rc = new ResidueCount(true);
287 rc.add('J'); // 'otherData'
290 rc.put('[', 0); // 'otherdata'
292 SymbolCounts sc = rc.getSymbolCounts();
293 Assert.assertArrayEquals(new char[] { 'C', 'G', 'N', 'J', '[' },
295 Assert.assertArrayEquals(new int[] { 1, 3, 1, 1, 0 }, sc.values);
297 // now with overflow to int counts
298 rc.put('U', Short.MAX_VALUE);
300 sc = rc.getSymbolCounts();
301 Assert.assertArrayEquals(new char[] { 'C', 'G', 'N', 'U', 'J', '[' },
303 Assert.assertArrayEquals(new int[] { 1, 3, 1, 32768, 1, 0 }, sc.values);
306 @Test(groups = "Functional")
307 public void testGetSymbolCounts_peptide()
309 ResidueCount rc = new ResidueCount(false);
313 rc.add('Z'); // 'otherData'
317 SymbolCounts sc = rc.getSymbolCounts();
318 Assert.assertArrayEquals(new char[] { 'L', 'Q', 'W', 'Z' }, sc.symbols);
319 Assert.assertArrayEquals(new int[] { 1, 1, 3, 1 }, sc.values);
321 // now with overflow to int counts
322 rc.put('W', Short.MAX_VALUE);
324 sc = rc.getSymbolCounts();
325 Assert.assertArrayEquals(new char[] { 'L', 'Q', 'W', 'Z' }, sc.symbols);
326 Assert.assertArrayEquals(new int[] { 1, 1, 32768, 1 }, sc.values);
329 @Test(groups = "Functional")
330 public void testToString()
332 ResidueCount rc = new ResidueCount();
336 assertEquals(rc.toString(), "[ C:1 Q:2 ]");
340 assertEquals(rc.toString(), "[ C:1 Q:2 {:1 ]");
342 // switch from short to int counting:
343 rc.put('G', Short.MAX_VALUE);
345 assertEquals(rc.toString(), "[ C:1 G:32768 Q:2 {:1 ]");
348 @Test(groups = "Functional")
349 public void testGetTooltip()
351 ResidueCount rc = new ResidueCount();
354 assertEquals(rc.getTooltip(20, 1), "");
357 * count 7 C, 6 K, 7 Q, 10 P, 9 W, 1 F (total 40)
359 for (int i = 0; i < 7; i++)
364 for (int i = 0; i < 10; i++)
368 for (int i = 0; i < 9; i++)
372 for (int i = 0; i < 6; i++)
378 assertEquals(rc.getTooltip(40, 0),
379 "P 25%; W 22%; C 17%; Q 17%; K 15%; F 2%");
381 assertEquals(rc.getTooltip(30, 1),
382 "P 33.3%; W 30.0%; C 23.3%; Q 23.3%; K 20.0%; F 3.3%");
385 @Test(groups = "Functional")
386 public void testPut()
388 ResidueCount rc = new ResidueCount();
390 assertEquals(rc.getCount('Q'), 3);
392 assertEquals(rc.getGapCount(), 4);
394 assertEquals(rc.getGapCount(), 5);
396 assertEquals(rc.getGapCount(), 6);
399 assertEquals(rc.getCount('?'), 5);
402 assertEquals(rc.getCount('?'), 6);
403 assertEquals(rc.getCount('!'), 7);