Clover icon

Coverage Report

  1. Project Clover database Thu Aug 13 2020 12:04:21 BST
  2. Package jalview.datamodel

File ResidueCountTest.java

 

Code metrics

16
242
14
1
442
330
22
0.09
17.29
14
1.57

Classes

Class Line # Actions
ResidueCountTest 34 242 22
1.0100%
 

Contributing tests

This file is covered by 13 tests. .

Source view

1    /*
2    * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3    * Copyright (C) $$Year-Rel$$ The Jalview Authors
4    *
5    * This file is part of Jalview.
6    *
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.
11    *
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.
16    *
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.
20    */
21    package jalview.datamodel;
22   
23    import static org.testng.Assert.assertEquals;
24    import static org.testng.Assert.assertFalse;
25    import static org.testng.Assert.assertTrue;
26   
27    import jalview.datamodel.ResidueCount.SymbolCounts;
28    import jalview.gui.JvOptionPane;
29   
30    import org.junit.Assert;
31    import org.testng.annotations.BeforeClass;
32    import org.testng.annotations.Test;
33   
 
34    public class ResidueCountTest
35    {
36   
 
37  1 toggle @BeforeClass(alwaysRun = true)
38    public void setUpJvOptionPane()
39    {
40  1 JvOptionPane.setInteractiveMode(false);
41  1 JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
42    }
43   
44    /**
45    * Test a mix of add and put for nucleotide counting
46    */
 
47  1 toggle @Test(groups = "Functional")
48    public void test_countNucleotide()
49    {
50  1 ResidueCount rc = new ResidueCount(true);
51  1 assertEquals(rc.getCount('A'), 0);
52  1 assertEquals(rc.getGapCount(), 0);
53    // add then add
54  1 assertEquals(rc.add('A'), 1);
55  1 assertEquals(rc.add('a'), 2);
56    // put then add
57  1 rc.put('g', 3);
58  1 assertEquals(rc.add('G'), 4);
59    // add then put
60  1 assertEquals(rc.add('c'), 1);
61  1 rc.put('C', 4);
62  1 assertEquals(rc.add('N'), 1);
63   
64  1 assertEquals(rc.getCount('a'), 2);
65  1 assertEquals(rc.getCount('A'), 2);
66  1 assertEquals(rc.getCount('G'), 4);
67  1 assertEquals(rc.getCount('c'), 4);
68  1 assertEquals(rc.getCount('T'), 0); // never seen
69  1 assertEquals(rc.getCount('N'), 1);
70  1 assertEquals(rc.getCount('?'), 0);
71  1 assertEquals(rc.getCount('-'), 0);
72   
73  1 assertFalse(rc.isCountingInts());
74  1 assertFalse(rc.isUsingOtherData());
75    }
76   
77    /**
78    * Test adding to gap count (either using addGap or add)
79    */
 
80  1 toggle @Test(groups = "Functional")
81    public void testAddGap()
82    {
83  1 ResidueCount rc = new ResidueCount(true);
84  1 rc.addGap();
85  1 rc.add('-');
86  1 rc.add('.');
87  1 rc.add(' ');
88   
89  1 assertEquals(rc.getGapCount(), 4);
90  1 assertEquals(rc.getCount(' '), 4);
91  1 assertEquals(rc.getCount('-'), 4);
92  1 assertEquals(rc.getCount('.'), 4);
93  1 assertFalse(rc.isUsingOtherData());
94  1 assertFalse(rc.isCountingInts());
95    }
96   
 
97  1 toggle @Test(groups = "Functional")
98    public void testOverflow()
99    {
100    /*
101    * overflow from add
102    */
103  1 ResidueCount rc = new ResidueCount(true);
104  1 rc.addGap();
105  1 rc.put('A', Short.MAX_VALUE - 1);
106  1 assertFalse(rc.isCountingInts());
107  1 rc.add('A');
108  1 assertFalse(rc.isCountingInts());
109  1 rc.add('A');
110  1 assertTrue(rc.isCountingInts());
111  1 assertEquals(rc.getCount('a'), Short.MAX_VALUE + 1);
112  1 rc.add('A');
113  1 assertTrue(rc.isCountingInts());
114  1 assertEquals(rc.getCount('a'), Short.MAX_VALUE + 2);
115  1 assertEquals(rc.getGapCount(), 1);
116  1 rc.addGap();
117  1 assertEquals(rc.getGapCount(), 2);
118   
119    /*
120    * overflow from put
121    */
122  1 rc = new ResidueCount(true);
123  1 rc.put('G', Short.MAX_VALUE + 1);
124  1 assertTrue(rc.isCountingInts());
125  1 assertEquals(rc.getCount('g'), Short.MAX_VALUE + 1);
126  1 rc.put('G', 1);
127  1 assertTrue(rc.isCountingInts());
128  1 assertEquals(rc.getCount('g'), 1);
129   
130    /*
131    * underflow from put
132    */
133  1 rc = new ResidueCount(true);
134  1 rc.put('G', Short.MIN_VALUE - 1);
135  1 assertTrue(rc.isCountingInts());
136  1 assertEquals(rc.getCount('g'), Short.MIN_VALUE - 1);
137    }
138   
139    /**
140    * Test a mix of add and put for peptide counting
141    */
 
142  1 toggle @Test(groups = "Functional")
143    public void test_countPeptide()
144    {
145  1 ResidueCount rc = new ResidueCount(false);
146  1 rc.put('q', 4);
147  1 rc.add('Q');
148  1 rc.add('X');
149  1 rc.add('x');
150  1 rc.add('W');
151  1 rc.put('w', 7);
152  1 rc.put('m', 12);
153  1 rc.put('M', 13);
154   
155  1 assertEquals(rc.getCount('q'), 5);
156  1 assertEquals(rc.getCount('X'), 2);
157  1 assertEquals(rc.getCount('W'), 7);
158  1 assertEquals(rc.getCount('m'), 13);
159  1 assertEquals(rc.getCount('G'), 0);
160  1 assertEquals(rc.getCount('-'), 0);
161   
162  1 assertFalse(rc.isCountingInts());
163  1 assertFalse(rc.isUsingOtherData());
164    }
165   
 
166  1 toggle @Test(groups = "Functional")
167    public void test_unexpectedPeptide()
168    {
169  1 ResidueCount rc = new ResidueCount(false);
170    // expected characters (upper or lower case):
171  1 String aas = "ACDEFGHIKLMNPQRSTVWXY";
172  1 String lower = aas.toLowerCase();
173  22 for (int i = 0; i < aas.length(); i++)
174    {
175  21 rc.put(aas.charAt(i), i);
176  21 rc.add(lower.charAt(i));
177    }
178  22 for (int i = 0; i < aas.length(); i++)
179    {
180  21 assertEquals(rc.getCount(aas.charAt(i)), i + 1);
181    }
182  1 assertFalse(rc.isUsingOtherData());
183   
184  1 rc.put('J', 4);
185  1 assertTrue(rc.isUsingOtherData());
186  1 assertEquals(rc.getCount('J'), 4);
187  1 rc.add('j');
188  1 assertEquals(rc.getCount('J'), 5);
189    }
190   
 
191  1 toggle @Test(groups = "Functional")
192    public void test_unexpectedNucleotide()
193    {
194  1 ResidueCount rc = new ResidueCount(true);
195    // expected characters (upper or lower case):
196  1 String nucs = "ACGTUN";
197  1 String lower = nucs.toLowerCase();
198  7 for (int i = 0; i < nucs.length(); i++)
199    {
200  6 rc.put(nucs.charAt(i), i);
201  6 rc.add(lower.charAt(i));
202    }
203  7 for (int i = 0; i < nucs.length(); i++)
204    {
205  6 assertEquals(rc.getCount(nucs.charAt(i)), i + 1);
206    }
207  1 assertFalse(rc.isUsingOtherData());
208   
209  1 rc.add('J');
210  1 assertTrue(rc.isUsingOtherData());
211    }
212   
 
213  1 toggle @Test(groups = "Functional")
214    public void testGetModalCount()
215    {
216  1 ResidueCount rc = new ResidueCount(true);
217  1 rc.add('c');
218  1 rc.add('g');
219  1 rc.add('c');
220  1 assertEquals(rc.getModalCount(), 2);
221   
222    // modal count is in the 'short overflow' counts
223  1 rc = new ResidueCount();
224  1 rc.add('c');
225  1 rc.put('g', Short.MAX_VALUE);
226  1 rc.add('G');
227  1 assertEquals(rc.getModalCount(), Short.MAX_VALUE + 1);
228   
229    // modal count is in the 'other data' counts
230  1 rc = new ResidueCount(false);
231  1 rc.add('Q');
232  1 rc.add('{');
233  1 rc.add('{');
234  1 assertEquals(rc.getModalCount(), 2);
235   
236    // verify modal count excludes gap
237  1 rc = new ResidueCount();
238  1 rc.add('Q');
239  1 rc.add('P');
240  1 rc.add('Q');
241  1 rc.addGap();
242  1 rc.addGap();
243  1 rc.addGap();
244  1 assertEquals(rc.getModalCount(), 2);
245    }
246   
 
247  1 toggle @Test(groups = "Functional")
248    public void testGetResiduesForCount()
249    {
250  1 ResidueCount rc = new ResidueCount(true);
251  1 rc.add('c');
252  1 rc.add('g');
253  1 rc.add('c');
254  1 assertEquals(rc.getResiduesForCount(2), "C");
255  1 assertEquals(rc.getResiduesForCount(1), "G");
256  1 assertEquals(rc.getResiduesForCount(3), "");
257  1 assertEquals(rc.getResiduesForCount(0), "");
258  1 assertEquals(rc.getResiduesForCount(-1), "");
259   
260    // modal count is in the 'short overflow' counts
261  1 rc = new ResidueCount(true);
262  1 rc.add('c');
263  1 rc.put('g', Short.MAX_VALUE);
264  1 rc.add('G');
265  1 assertEquals(rc.getResiduesForCount(Short.MAX_VALUE + 1), "G");
266  1 assertEquals(rc.getResiduesForCount(1), "C");
267   
268    // peptide modal count is in the 'short overflow' counts
269  1 rc = new ResidueCount(false);
270  1 rc.add('c');
271  1 rc.put('p', Short.MAX_VALUE);
272  1 rc.add('P');
273  1 assertEquals(rc.getResiduesForCount(Short.MAX_VALUE + 1), "P");
274  1 assertEquals(rc.getResiduesForCount(1), "C");
275   
276    // modal count is in the 'other data' counts
277  1 rc = new ResidueCount();
278  1 rc.add('Q');
279  1 rc.add('{');
280  1 rc.add('{');
281  1 assertEquals(rc.getResiduesForCount(1), "Q");
282  1 assertEquals(rc.getResiduesForCount(2), "{");
283   
284    // residues share modal count
285  1 rc = new ResidueCount();
286  1 rc.add('G');
287  1 rc.add('G');
288  1 rc.add('c');
289  1 rc.add('C');
290  1 rc.add('U');
291  1 assertEquals(rc.getResiduesForCount(1), "U");
292  1 assertEquals(rc.getResiduesForCount(2), "CG");
293   
294    // expected and unexpected symbols share modal count
295  1 rc = new ResidueCount();
296  1 rc.add('G');
297  1 rc.add('t');
298  1 rc.add('[');
299  1 rc.add('[');
300  1 rc.add('t');
301  1 rc.add('G');
302  1 rc.add('c');
303  1 rc.add('C');
304  1 rc.add('U');
305  1 assertEquals(rc.getResiduesForCount(1), "U");
306  1 assertEquals(rc.getResiduesForCount(2), "CGT[");
307    }
308   
 
309  1 toggle @Test(groups = "Functional")
310    public void testGetSymbolCounts_nucleotide()
311    {
312  1 ResidueCount rc = new ResidueCount(true);
313  1 rc.add('g');
314  1 rc.add('c');
315  1 rc.add('G');
316  1 rc.add('J'); // 'otherData'
317  1 rc.add('g');
318  1 rc.add('N');
319  1 rc.put('[', 0); // 'otherdata'
320   
321  1 SymbolCounts sc = rc.getSymbolCounts();
322  1 Assert.assertArrayEquals(new char[] { 'C', 'G', 'N', 'J', '[' },
323    sc.symbols);
324  1 Assert.assertArrayEquals(new int[] { 1, 3, 1, 1, 0 }, sc.values);
325   
326    // now with overflow to int counts
327  1 rc.put('U', Short.MAX_VALUE);
328  1 rc.add('u');
329  1 sc = rc.getSymbolCounts();
330  1 Assert.assertArrayEquals(new char[] { 'C', 'G', 'N', 'U', 'J', '[' },
331    sc.symbols);
332  1 Assert.assertArrayEquals(new int[] { 1, 3, 1, 32768, 1, 0 }, sc.values);
333    }
334   
 
335  1 toggle @Test(groups = "Functional")
336    public void testGetSymbolCounts_peptide()
337    {
338  1 ResidueCount rc = new ResidueCount(false);
339  1 rc.add('W');
340  1 rc.add('q');
341  1 rc.add('W');
342  1 rc.add('Z'); // 'otherData'
343  1 rc.add('w');
344  1 rc.add('L');
345   
346  1 SymbolCounts sc = rc.getSymbolCounts();
347  1 Assert.assertArrayEquals(new char[] { 'L', 'Q', 'W', 'Z' }, sc.symbols);
348  1 Assert.assertArrayEquals(new int[] { 1, 1, 3, 1 }, sc.values);
349   
350    // now with overflow to int counts
351  1 rc.put('W', Short.MAX_VALUE);
352  1 rc.add('W');
353  1 sc = rc.getSymbolCounts();
354  1 Assert.assertArrayEquals(new char[] { 'L', 'Q', 'W', 'Z' }, sc.symbols);
355  1 Assert.assertArrayEquals(new int[] { 1, 1, 32768, 1 }, sc.values);
356    }
357   
 
358  1 toggle @Test(groups = "Functional")
359    public void testToString()
360    {
361  1 ResidueCount rc = new ResidueCount();
362  1 rc.add('q');
363  1 rc.add('c');
364  1 rc.add('Q');
365  1 assertEquals(rc.toString(), "[ C:1 Q:2 ]");
366   
367    // add 'other data'
368  1 rc.add('{');
369  1 assertEquals(rc.toString(), "[ C:1 Q:2 {:1 ]");
370   
371    // switch from short to int counting:
372  1 rc.put('G', Short.MAX_VALUE);
373  1 rc.add('g');
374  1 assertEquals(rc.toString(), "[ C:1 G:32768 Q:2 {:1 ]");
375    }
376   
 
377  1 toggle @Test(groups = "Functional")
378    public void testGetTooltip()
379    {
380  1 ResidueCount rc = new ResidueCount();
381   
382    // no counts!
383  1 assertEquals(rc.getTooltip(20, 1), "");
384   
385    /*
386    * count 7 C, 6 K, 7 Q, 10 P, 9 W, 1 F (total 40)
387    */
388  8 for (int i = 0; i < 7; i++)
389    {
390  7 rc.add('c');
391  7 rc.add('q');
392    }
393  11 for (int i = 0; i < 10; i++)
394    {
395  10 rc.add('p');
396    }
397  10 for (int i = 0; i < 9; i++)
398    {
399  9 rc.add('W');
400    }
401  7 for (int i = 0; i < 6; i++)
402    {
403  6 rc.add('K');
404    }
405  1 rc.add('F');
406   
407    /*
408    * percentages are rounded (0.5 rounded up)
409    * 10/40 9/40 7/40 6/40 1/40
410    */
411  1 assertEquals(rc.getTooltip(40, 0),
412    "P 25%; W 23%; C 18%; Q 18%; K 15%; F 3%");
413   
414  1 rc.add('Q');
415    /*
416    * 10/30 9/30 8/30 7/30 6/30 1/30
417    */
418  1 assertEquals(rc.getTooltip(30, 1),
419    "P 33.3%; W 30.0%; Q 26.7%; C 23.3%; K 20.0%; F 3.3%");
420    }
421   
 
422  1 toggle @Test(groups = "Functional")
423    public void testPut()
424    {
425  1 ResidueCount rc = new ResidueCount();
426  1 rc.put('q', 3);
427  1 assertEquals(rc.getCount('Q'), 3);
428  1 rc.put(' ', 4);
429  1 assertEquals(rc.getGapCount(), 4);
430  1 rc.put('.', 5);
431  1 assertEquals(rc.getGapCount(), 5);
432  1 rc.put('-', 6);
433  1 assertEquals(rc.getGapCount(), 6);
434   
435  1 rc.put('?', 5);
436  1 assertEquals(rc.getCount('?'), 5);
437  1 rc.put('?', 6);
438  1 rc.put('!', 7);
439  1 assertEquals(rc.getCount('?'), 6);
440  1 assertEquals(rc.getCount('!'), 7);
441    }
442    }