1 package jalview.analysis;
3 import static org.testng.Assert.assertEquals;
4 import static org.testng.Assert.assertFalse;
5 import static org.testng.Assert.assertTrue;
7 import jalview.analysis.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);
74 rc.put('A', Short.MAX_VALUE - 1);
75 assertFalse(rc.isCountingInts());
77 assertFalse(rc.isCountingInts());
79 assertTrue(rc.isCountingInts());
80 assertEquals(rc.getCount('a'), Short.MAX_VALUE + 1);
85 rc = new ResidueCount(true);
86 rc.put('G', Short.MAX_VALUE + 1);
87 assertTrue(rc.isCountingInts());
88 assertEquals(rc.getCount('g'), Short.MAX_VALUE + 1);
92 * Test a mix of add and put for peptide counting
94 @Test(groups = "Functional")
95 public void test_countPeptide()
97 ResidueCount rc = new ResidueCount(false);
107 assertEquals(rc.getCount('q'), 5);
108 assertEquals(rc.getCount('X'), 2);
109 assertEquals(rc.getCount('W'), 7);
110 assertEquals(rc.getCount('m'), 13);
111 assertEquals(rc.getCount('G'), 0);
112 assertEquals(rc.getCount('-'), 0);
114 assertFalse(rc.isCountingInts());
115 assertFalse(rc.isUsingOtherData());
118 @Test(groups = "Functional")
119 public void test_unexpectedPeptide()
121 ResidueCount rc = new ResidueCount(false);
122 // expected characters (upper or lower case):
123 String aas = "ACDEFGHIKLMNPQRSTVWXY";
124 String lower = aas.toLowerCase();
125 for (int i = 0; i < aas.length(); i++)
127 rc.put(aas.charAt(i), i);
128 rc.add(lower.charAt(i));
130 for (int i = 0; i < aas.length(); i++)
132 assertEquals(rc.getCount(aas.charAt(i)), i + 1);
134 assertFalse(rc.isUsingOtherData());
137 assertTrue(rc.isUsingOtherData());
140 @Test(groups = "Functional")
141 public void test_unexpectedNucleotide()
143 ResidueCount rc = new ResidueCount(true);
144 // expected characters (upper or lower case):
145 String nucs = "ACGTUN";
146 String lower = nucs.toLowerCase();
147 for (int i = 0; i < nucs.length(); i++)
149 rc.put(nucs.charAt(i), i);
150 rc.add(lower.charAt(i));
152 for (int i = 0; i < nucs.length(); i++)
154 assertEquals(rc.getCount(nucs.charAt(i)), i + 1);
156 assertFalse(rc.isUsingOtherData());
159 assertTrue(rc.isUsingOtherData());
162 @Test(groups = "Functional")
163 public void testGetModalCount()
165 ResidueCount rc = new ResidueCount();
169 assertEquals(rc.getModalCount(), 2);
171 // modal count is in the 'short overflow' counts
172 rc = new ResidueCount();
174 rc.put('g', Short.MAX_VALUE);
176 assertEquals(rc.getModalCount(), Short.MAX_VALUE + 1);
178 // modal count is in the 'other data' counts
179 rc = new ResidueCount();
183 assertEquals(rc.getModalCount(), 2);
185 // verify modal count excludes gap
186 rc = new ResidueCount();
193 assertEquals(rc.getModalCount(), 2);
196 @Test(groups = "Functional")
197 public void testGetResiduesForCount()
199 ResidueCount rc = new ResidueCount();
203 assertEquals(rc.getResiduesForCount(2), "C");
204 assertEquals(rc.getResiduesForCount(1), "G");
205 assertEquals(rc.getResiduesForCount(3), "");
206 assertEquals(rc.getResiduesForCount(0), "");
207 assertEquals(rc.getResiduesForCount(-1), "");
209 // modal count is in the 'short overflow' counts
210 rc = new ResidueCount();
212 rc.put('g', Short.MAX_VALUE);
214 assertEquals(rc.getResiduesForCount(Short.MAX_VALUE + 1), "G");
215 assertEquals(rc.getResiduesForCount(1), "C");
217 // modal count is in the 'other data' counts
218 rc = new ResidueCount();
222 assertEquals(rc.getResiduesForCount(1), "Q");
223 assertEquals(rc.getResiduesForCount(2), "{");
225 // residues share modal count
226 rc = new ResidueCount();
232 assertEquals(rc.getResiduesForCount(1), "U");
233 assertEquals(rc.getResiduesForCount(2), "CG");
235 // expected and unexpected symbols share modal count
236 rc = new ResidueCount();
246 assertEquals(rc.getResiduesForCount(1), "U");
247 assertEquals(rc.getResiduesForCount(2), "CGT[");
250 @Test(groups = "Functional")
251 public void testGetSymbolCounts()
253 ResidueCount rc = new ResidueCount();
257 rc.add('J'); // 'otherData'
261 SymbolCounts sc = rc.getSymbolCounts();
262 Assert.assertArrayEquals(new char[] { 'C', 'Q', 'X', 'J' }, sc.symbols);
263 Assert.assertArrayEquals(new int[] { 1, 3, 1, 1 }, sc.values);
265 // now with overflow to int counts
266 rc.put('g', Short.MAX_VALUE);
268 sc = rc.getSymbolCounts();
269 Assert.assertArrayEquals(new char[] { 'C', 'G', 'Q', 'X', 'J' },
271 Assert.assertArrayEquals(new int[] { 1, 32768, 3, 1, 1 }, sc.values);
274 @Test(groups = "Functional")
275 public void testToString()
277 ResidueCount rc = new ResidueCount();
281 assertEquals(rc.toString(), "[ C:1 Q:2 ]");
285 assertEquals(rc.toString(), "[ C:1 Q:2 {:1 ]");
287 // switch from short to int counting:
288 rc.put('G', Short.MAX_VALUE);
290 assertEquals(rc.toString(), "[ C:1 G:32768 Q:2 {:1 ]");