7c62854ef9415e5bb31cb13c27ae37251868f19f
[jalview.git] / test / jalview / analysis / scoremodels / ScoreMatrixTest.java
1 package jalview.analysis.scoremodels;
2
3 import static org.testng.Assert.assertEquals;
4 import static org.testng.Assert.assertFalse;
5 import static org.testng.Assert.assertNotNull;
6 import static org.testng.Assert.assertNull;
7 import static org.testng.Assert.assertTrue;
8
9 import java.io.ByteArrayInputStream;
10
11 import org.testng.annotations.Test;
12
13 public class ScoreMatrixTest
14 {
15   @Test(groups = "Functional")
16   public void testBuildSymbolIndex()
17   {
18     short[] index = ScoreMatrix.buildSymbolIndex("AX-. yxYp".toCharArray());
19
20     assertEquals(index.length, 128); // ASCII character set size
21
22     assertEquals(index['A'], 0);
23     assertEquals(index['a'], 0); // lower-case mapping added
24     assertEquals(index['X'], 1);
25     assertEquals(index['-'], 2);
26     assertEquals(index['.'], 3);
27     assertEquals(index[' '], 4);
28     assertEquals(index['y'], 5); // lower-case override
29     assertEquals(index['x'], 6); // lower-case override
30     assertEquals(index['Y'], 7);
31     assertEquals(index['p'], 8);
32     assertEquals(index['P'], -1); // lower-case doesn't map upper-case
33
34     /*
35      * check all unmapped symbols have index for unmapped
36      */
37     for (int c = 0; c < index.length; c++)
38     {
39       if (!"AaXx-. Yyp".contains(String.valueOf((char) c)))
40       {
41         assertEquals(index[c], -1);
42       }
43     }
44   }
45
46   /**
47    * check that characters not in the basic ASCII set are simply ignored
48    */
49   @Test(groups = "Functional")
50   public void testBuildSymbolIndex_nonAscii()
51   {
52     char[] weird = new char[] { 128, 245, 'P' };
53     short[] index = ScoreMatrix.buildSymbolIndex(weird);
54     assertEquals(index.length, 128);
55     assertEquals(index['P'], 2);
56     assertEquals(index['p'], 2);
57     for (int c = 0; c < index.length; c++)
58     {
59       if (c != 'P' && c != 'p')
60       {
61         assertEquals(index[c], -1);
62       }
63     }
64   }
65
66   /**
67    * Test a successful parse of a (small) score matrix file
68    */
69   @Test(groups = "Functional")
70   public void testParse()
71   {
72     /*
73      * some messy but valid input data, with comma, space
74      * or tab (or combinations) as score value delimiters
75      * this example includes 'guide' symbols on score rows
76      */
77     String data = "ScoreMatrix MyTest\n" + "ATU tx-\n"
78             + "A,1.1,1.2,1.3,1.4, 1.5, 1.6, 1.7\n"
79             + "T,2.1 2.2 2.3 2.4 2.5 2.6 2.7\n"
80             + "U\t3.1\t3.2\t3.3\t3.4\t3.5\t3.6\t3.7\n"
81             + " 4.1 ,4.2,\t,4.3 ,\t4.4\t, \4.5,4.6 4.7\n"
82             + "t, 5.1,5.3,5.3,5.4,5.5, 5.6, 5.7\n"
83             + "x\t6.1, 6.2 6.3 6.4 6.5 6.6 6.7\n"
84             + "-, \t7.1\t7.2 7.3, 7.4, 7.5\t,7.6,7.7\n";
85     ScoreMatrix sm = ScoreMatrix.parse(new ByteArrayInputStream(data
86             .getBytes()));
87     assertNotNull(sm);
88     assertEquals(sm.getName(), "MyTest");
89     assertTrue(sm.isDNA());
90     assertFalse(sm.isProtein());
91     assertEquals(sm.getPairwiseScore('A', 'A'), 1.1f);
92     assertEquals(sm.getPairwiseScore('A', 'T'), 1.2f);
93     assertEquals(sm.getPairwiseScore('a', 'T'), 1.2f); // A/a equivalent
94     assertEquals(sm.getPairwiseScore('A', 't'), 1.5f); // T/t not equivalent
95     assertEquals(sm.getPairwiseScore('a', 't'), 1.5f);
96     assertEquals(sm.getPairwiseScore('T', ' '), 2.4f);
97     assertEquals(sm.getPairwiseScore('U', 'x'), 3.6f);
98     assertEquals(sm.getPairwiseScore('u', 'x'), 3.6f);
99     assertEquals(sm.getPairwiseScore('U', 'X'), 0f); // X (upper) unmapped
100     assertEquals(sm.getPairwiseScore('A', '.'), 0f); // . unmapped
101     assertEquals(sm.getPairwiseScore('-', '-'), 7.7f);
102     assertEquals(sm.getPairwiseScore('A', (char) 128), 0f); // out of range
103
104     /*
105      * without guide symbols on score rows
106      */
107     data = "ScoreMatrix MyTest\nXY\n1 2\n3 4\n";
108     sm = ScoreMatrix.parse(new ByteArrayInputStream(data.getBytes()));
109     assertNotNull(sm);
110     assertEquals(sm.getPairwiseScore('X', 'X'), 1f);
111     assertEquals(sm.getPairwiseScore('X', 'y'), 2f);
112     assertEquals(sm.getPairwiseScore('y', 'x'), 3f);
113     assertEquals(sm.getPairwiseScore('y', 'Y'), 4f);
114     assertEquals(sm.getPairwiseScore('D', 'R'), 0f);
115   }
116
117   @Test(groups = "Functional")
118   public void testParse_invalidInput()
119   {
120     /*
121      * valid first
122      */
123     String data = "ScoreMatrix MyTest\nXY\n1 2\n3 4\n";
124     ScoreMatrix sm = ScoreMatrix.parse(new ByteArrayInputStream(data
125             .getBytes()));
126     assertNotNull(sm);
127
128     /*
129      * Name missing
130      */
131     data = "ScoreMatrix\nXY\n1 2\n3 4\n";
132     sm = ScoreMatrix.parse(new ByteArrayInputStream(data.getBytes()));
133     assertNull(sm);
134
135     /*
136      * ScoreMatrix header missing
137      */
138     data = "XY\n1 2\n3 4\n";
139     sm = ScoreMatrix.parse(new ByteArrayInputStream(data.getBytes()));
140     assertNull(sm);
141
142     /*
143      * Not enough rows
144      */
145     data = "ScoreMatrix MyTest\nXY\n1 2\n";
146     sm = ScoreMatrix.parse(new ByteArrayInputStream(data.getBytes()));
147     assertNull(sm);
148
149     /*
150      * Not enough columns
151      */
152     data = "ScoreMatrix MyTest\nXY\n1 2\n3\n";
153     sm = ScoreMatrix.parse(new ByteArrayInputStream(data.getBytes()));
154     assertNull(sm);
155
156     /*
157      * Too many columns
158      */
159     data = "ScoreMatrix MyTest\nXY\n1 2\n3 4 5\n";
160     sm = ScoreMatrix.parse(new ByteArrayInputStream(data.getBytes()));
161     assertNull(sm);
162
163     /*
164      * Too many rows
165      */
166     data = "ScoreMatrix MyTest\nXY\n1 2\n3 4\n6 7";
167     sm = ScoreMatrix.parse(new ByteArrayInputStream(data.getBytes()));
168     assertNull(sm);
169
170     /*
171      * unsupported delimiter |
172      */
173     data = "ScoreMatrix MyTest\nXY\n1|2\n3|4\n";
174     sm = ScoreMatrix.parse(new ByteArrayInputStream(data.getBytes()));
175     assertNull(sm);
176
177     /*
178      * Bad float value
179      */
180     data = "ScoreMatrix MyTest\nXY\n1 2\n3 four\n";
181     sm = ScoreMatrix.parse(new ByteArrayInputStream(data.getBytes()));
182     assertNull(sm);
183
184     /*
185      * Bad guide character on scores row
186      */
187     data = "ScoreMatrix MyTest\nXY\nX 1 2\ny 3 4\n";
188     sm = ScoreMatrix.parse(new ByteArrayInputStream(data.getBytes()));
189     assertNull(sm);
190   }
191 }