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;
8 import jalview.gui.JvOptionPane;
10 import org.junit.Assert;
11 import org.testng.annotations.BeforeClass;
12 import org.testng.annotations.Test;
14 public class ResidueCountTest
17 @BeforeClass(alwaysRun = true)
18 public void setUpJvOptionPane()
20 JvOptionPane.setInteractiveMode(false);
21 JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
25 * Test a mix of add and put for nucleotide counting
27 @Test(groups = "Functional")
28 public void test_countNucleotide()
30 ResidueCount rc = new ResidueCount(true);
31 assertEquals(rc.getCount('A'), 0);
32 assertEquals(rc.getGapCount(), 0);
34 assertEquals(rc.add('A'), 1);
35 assertEquals(rc.add('a'), 2);
38 assertEquals(rc.add('G'), 4);
40 assertEquals(rc.add('c'), 1);
42 assertEquals(rc.add('N'), 1);
44 assertEquals(rc.getCount('a'), 2);
45 assertEquals(rc.getCount('A'), 2);
46 assertEquals(rc.getCount('G'), 4);
47 assertEquals(rc.getCount('c'), 4);
48 assertEquals(rc.getCount('T'), 0); // never seen
49 assertEquals(rc.getCount('N'), 1);
50 assertEquals(rc.getCount('?'), 0);
51 assertEquals(rc.getCount('-'), 0);
53 assertFalse(rc.isCountingInts());
54 assertFalse(rc.isUsingOtherData());
58 * Test adding to gap count (either using addGap or add)
60 @Test(groups = "Functional")
61 public void testAddGap()
63 ResidueCount rc = new ResidueCount(true);
69 assertEquals(rc.getGapCount(), 4);
70 assertEquals(rc.getCount(' '), 4);
71 assertEquals(rc.getCount('-'), 4);
72 assertEquals(rc.getCount('.'), 4);
73 assertFalse(rc.isUsingOtherData());
74 assertFalse(rc.isCountingInts());
77 @Test(groups = "Functional")
78 public void testOverflow()
83 ResidueCount rc = new ResidueCount(true);
85 rc.put('A', Short.MAX_VALUE - 1);
86 assertFalse(rc.isCountingInts());
88 assertFalse(rc.isCountingInts());
90 assertTrue(rc.isCountingInts());
91 assertEquals(rc.getCount('a'), Short.MAX_VALUE + 1);
93 assertTrue(rc.isCountingInts());
94 assertEquals(rc.getCount('a'), Short.MAX_VALUE + 2);
95 assertEquals(rc.getGapCount(), 1);
97 assertEquals(rc.getGapCount(), 2);
102 rc = new ResidueCount(true);
103 rc.put('G', Short.MAX_VALUE + 1);
104 assertTrue(rc.isCountingInts());
105 assertEquals(rc.getCount('g'), Short.MAX_VALUE + 1);
107 assertTrue(rc.isCountingInts());
108 assertEquals(rc.getCount('g'), 1);
113 rc = new ResidueCount(true);
114 rc.put('G', Short.MIN_VALUE - 1);
115 assertTrue(rc.isCountingInts());
116 assertEquals(rc.getCount('g'), Short.MIN_VALUE - 1);
120 * Test a mix of add and put for peptide counting
122 @Test(groups = "Functional")
123 public void test_countPeptide()
125 ResidueCount rc = new ResidueCount(false);
135 assertEquals(rc.getCount('q'), 5);
136 assertEquals(rc.getCount('X'), 2);
137 assertEquals(rc.getCount('W'), 7);
138 assertEquals(rc.getCount('m'), 13);
139 assertEquals(rc.getCount('G'), 0);
140 assertEquals(rc.getCount('-'), 0);
142 assertFalse(rc.isCountingInts());
143 assertFalse(rc.isUsingOtherData());
146 @Test(groups = "Functional")
147 public void test_unexpectedPeptide()
149 ResidueCount rc = new ResidueCount(false);
150 // expected characters (upper or lower case):
151 String aas = "ACDEFGHIKLMNPQRSTVWXY";
152 String lower = aas.toLowerCase();
153 for (int i = 0; i < aas.length(); i++)
155 rc.put(aas.charAt(i), i);
156 rc.add(lower.charAt(i));
158 for (int i = 0; i < aas.length(); i++)
160 assertEquals(rc.getCount(aas.charAt(i)), i + 1);
162 assertFalse(rc.isUsingOtherData());
165 assertTrue(rc.isUsingOtherData());
166 assertEquals(rc.getCount('J'), 4);
168 assertEquals(rc.getCount('J'), 5);
171 @Test(groups = "Functional")
172 public void test_unexpectedNucleotide()
174 ResidueCount rc = new ResidueCount(true);
175 // expected characters (upper or lower case):
176 String nucs = "ACGTUN";
177 String lower = nucs.toLowerCase();
178 for (int i = 0; i < nucs.length(); i++)
180 rc.put(nucs.charAt(i), i);
181 rc.add(lower.charAt(i));
183 for (int i = 0; i < nucs.length(); i++)
185 assertEquals(rc.getCount(nucs.charAt(i)), i + 1);
187 assertFalse(rc.isUsingOtherData());
190 assertTrue(rc.isUsingOtherData());
193 @Test(groups = "Functional")
194 public void testGetModalCount()
196 ResidueCount rc = new ResidueCount(true);
200 assertEquals(rc.getModalCount(), 2);
202 // modal count is in the 'short overflow' counts
203 rc = new ResidueCount();
205 rc.put('g', Short.MAX_VALUE);
207 assertEquals(rc.getModalCount(), Short.MAX_VALUE + 1);
209 // modal count is in the 'other data' counts
210 rc = new ResidueCount(false);
214 assertEquals(rc.getModalCount(), 2);
216 // verify modal count excludes gap
217 rc = new ResidueCount();
224 assertEquals(rc.getModalCount(), 2);
227 @Test(groups = "Functional")
228 public void testGetResiduesForCount()
230 ResidueCount rc = new ResidueCount(true);
234 assertEquals(rc.getResiduesForCount(2), "C");
235 assertEquals(rc.getResiduesForCount(1), "G");
236 assertEquals(rc.getResiduesForCount(3), "");
237 assertEquals(rc.getResiduesForCount(0), "");
238 assertEquals(rc.getResiduesForCount(-1), "");
240 // modal count is in the 'short overflow' counts
241 rc = new ResidueCount(true);
243 rc.put('g', Short.MAX_VALUE);
245 assertEquals(rc.getResiduesForCount(Short.MAX_VALUE + 1), "G");
246 assertEquals(rc.getResiduesForCount(1), "C");
248 // peptide modal count is in the 'short overflow' counts
249 rc = new ResidueCount(false);
251 rc.put('p', Short.MAX_VALUE);
253 assertEquals(rc.getResiduesForCount(Short.MAX_VALUE + 1), "P");
254 assertEquals(rc.getResiduesForCount(1), "C");
256 // modal count is in the 'other data' counts
257 rc = new ResidueCount();
261 assertEquals(rc.getResiduesForCount(1), "Q");
262 assertEquals(rc.getResiduesForCount(2), "{");
264 // residues share modal count
265 rc = new ResidueCount();
271 assertEquals(rc.getResiduesForCount(1), "U");
272 assertEquals(rc.getResiduesForCount(2), "CG");
274 // expected and unexpected symbols share modal count
275 rc = new ResidueCount();
285 assertEquals(rc.getResiduesForCount(1), "U");
286 assertEquals(rc.getResiduesForCount(2), "CGT[");
289 @Test(groups = "Functional")
290 public void testGetSymbolCounts_nucleotide()
292 ResidueCount rc = new ResidueCount(true);
296 rc.add('J'); // 'otherData'
299 rc.put('[', 0); // 'otherdata'
301 SymbolCounts sc = rc.getSymbolCounts();
302 Assert.assertArrayEquals(new char[] { 'C', 'G', 'N', 'J', '[' },
304 Assert.assertArrayEquals(new int[] { 1, 3, 1, 1, 0 }, sc.values);
306 // now with overflow to int counts
307 rc.put('U', Short.MAX_VALUE);
309 sc = rc.getSymbolCounts();
310 Assert.assertArrayEquals(new char[] { 'C', 'G', 'N', 'U', 'J', '[' },
312 Assert.assertArrayEquals(new int[] { 1, 3, 1, 32768, 1, 0 }, sc.values);
315 @Test(groups = "Functional")
316 public void testGetSymbolCounts_peptide()
318 ResidueCount rc = new ResidueCount(false);
322 rc.add('Z'); // 'otherData'
326 SymbolCounts sc = rc.getSymbolCounts();
327 Assert.assertArrayEquals(new char[] { 'L', 'Q', 'W', 'Z' }, sc.symbols);
328 Assert.assertArrayEquals(new int[] { 1, 1, 3, 1 }, sc.values);
330 // now with overflow to int counts
331 rc.put('W', Short.MAX_VALUE);
333 sc = rc.getSymbolCounts();
334 Assert.assertArrayEquals(new char[] { 'L', 'Q', 'W', 'Z' }, sc.symbols);
335 Assert.assertArrayEquals(new int[] { 1, 1, 32768, 1 }, sc.values);
338 @Test(groups = "Functional")
339 public void testToString()
341 ResidueCount rc = new ResidueCount();
345 assertEquals(rc.toString(), "[ C:1 Q:2 ]");
349 assertEquals(rc.toString(), "[ C:1 Q:2 {:1 ]");
351 // switch from short to int counting:
352 rc.put('G', Short.MAX_VALUE);
354 assertEquals(rc.toString(), "[ C:1 G:32768 Q:2 {:1 ]");
357 @Test(groups = "Functional")
358 public void testGetTooltip()
360 ResidueCount rc = new ResidueCount();
363 assertEquals(rc.getTooltip(20, 1), "");
366 * count 7 C, 6 K, 7 Q, 10 P, 9 W, 1 F (total 40)
368 for (int i = 0; i < 7; i++)
373 for (int i = 0; i < 10; i++)
377 for (int i = 0; i < 9; i++)
381 for (int i = 0; i < 6; i++)
388 * percentages are rounded (0.5 rounded up)
389 * 10/40 9/40 7/40 6/40 1/40
391 assertEquals(rc.getTooltip(40, 0),
392 "P 25%; W 23%; C 18%; Q 18%; K 15%; F 3%");
396 * 10/30 9/30 8/30 7/30 6/30 1/30
398 assertEquals(rc.getTooltip(30, 1),
399 "P 33.3%; W 30.0%; Q 26.7%; C 23.3%; K 20.0%; F 3.3%");
402 @Test(groups = "Functional")
403 public void testPut()
405 ResidueCount rc = new ResidueCount();
407 assertEquals(rc.getCount('Q'), 3);
409 assertEquals(rc.getGapCount(), 4);
411 assertEquals(rc.getGapCount(), 5);
413 assertEquals(rc.getGapCount(), 6);
416 assertEquals(rc.getCount('?'), 5);
419 assertEquals(rc.getCount('?'), 6);
420 assertEquals(rc.getCount('!'), 7);