package jalview.analysis.scoremodels; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertNull; import static org.testng.Assert.assertTrue; import java.io.ByteArrayInputStream; import org.testng.annotations.Test; public class ScoreMatrixTest { @Test(groups = "Functional") public void testBuildSymbolIndex() { short[] index = ScoreMatrix.buildSymbolIndex("AX-. yxYp".toCharArray()); assertEquals(index.length, 128); // ASCII character set size assertEquals(index['A'], 0); assertEquals(index['a'], 0); // lower-case mapping added assertEquals(index['X'], 1); assertEquals(index['-'], 2); assertEquals(index['.'], 3); assertEquals(index[' '], 4); assertEquals(index['y'], 5); // lower-case override assertEquals(index['x'], 6); // lower-case override assertEquals(index['Y'], 7); assertEquals(index['p'], 8); assertEquals(index['P'], -1); // lower-case doesn't map upper-case /* * check all unmapped symbols have index for unmapped */ for (int c = 0; c < index.length; c++) { if (!"AaXx-. Yyp".contains(String.valueOf((char) c))) { assertEquals(index[c], -1); } } } /** * check that characters not in the basic ASCII set are simply ignored */ @Test(groups = "Functional") public void testBuildSymbolIndex_nonAscii() { char[] weird = new char[] { 128, 245, 'P' }; short[] index = ScoreMatrix.buildSymbolIndex(weird); assertEquals(index.length, 128); assertEquals(index['P'], 2); assertEquals(index['p'], 2); for (int c = 0; c < index.length; c++) { if (c != 'P' && c != 'p') { assertEquals(index[c], -1); } } } /** * Test a successful parse of a (small) score matrix file */ @Test(groups = "Functional") public void testParse() { /* * some messy but valid input data, with comma, space * or tab (or combinations) as score value delimiters */ String data = "ScoreMatrix MyTest\n" + "ATU tx-\n" + "1.1,1.2,1.3,1.4, 1.5, 1.6, 1.7\n" + "2.1 2.2 2.3 2.4 2.5 2.6 2.7\n" + "3.1\t3.2\t3.3\t3.4\t3.5\t3.6\t3.7\n" + " 4.1 ,4.2,\t,4.3 ,\t4.4\t, \4.5,4.6 4.7\n" + ", 5.1,5.3,5.3,5.4,5.5, 5.6, 5.7\n" + "\t6.1, 6.2 6.3 6.4 6.5 6.6 6.7\n" + ", \t7.1\t7.2 7.3, 7.4, 7.5\t,7.6,7.7\n"; ScoreMatrix sm = ScoreMatrix.parse(new ByteArrayInputStream(data .getBytes())); assertNotNull(sm); assertEquals(sm.getName(), "MyTest"); assertTrue(sm.isDNA()); assertFalse(sm.isProtein()); assertEquals(sm.getPairwiseScore('A', 'A'), 1.1f); assertEquals(sm.getPairwiseScore('A', 'T'), 1.2f); assertEquals(sm.getPairwiseScore('a', 'T'), 1.2f); // A/a equivalent assertEquals(sm.getPairwiseScore('A', 't'), 1.5f); // T/t not equivalent assertEquals(sm.getPairwiseScore('a', 't'), 1.5f); assertEquals(sm.getPairwiseScore('T', ' '), 2.4f); assertEquals(sm.getPairwiseScore('U', 'x'), 3.6f); assertEquals(sm.getPairwiseScore('u', 'x'), 3.6f); assertEquals(sm.getPairwiseScore('U', 'X'), 0f); // X (upper) unmapped assertEquals(sm.getPairwiseScore('A', '.'), 0f); // . unmapped assertEquals(sm.getPairwiseScore('-', '-'), 7.7f); assertEquals(sm.getPairwiseScore('A', (char) 128), 0f); // out of range } @Test(groups = "Functional") public void testParse_invalidInput() { /* * valid first */ String data = "ScoreMatrix MyTest\nXY\n1 2\n3 4\n"; ScoreMatrix sm = ScoreMatrix.parse(new ByteArrayInputStream(data .getBytes())); assertNotNull(sm); /* * Name missing */ data = "ScoreMatrix\nXY\n1 2\n3 4\n"; sm = ScoreMatrix.parse(new ByteArrayInputStream(data.getBytes())); assertNull(sm); /* * ScoreMatrix header missing */ data = "XY\n1 2\n3 4\n"; sm = ScoreMatrix.parse(new ByteArrayInputStream(data.getBytes())); assertNull(sm); /* * Not enough rows */ data = "ScoreMatrix MyTest\nXY\n1 2\n"; sm = ScoreMatrix.parse(new ByteArrayInputStream(data.getBytes())); assertNull(sm); /* * Not enough columns */ data = "ScoreMatrix MyTest\nXY\n1 2\n3\n"; sm = ScoreMatrix.parse(new ByteArrayInputStream(data.getBytes())); assertNull(sm); /* * Too many columns */ data = "ScoreMatrix MyTest\nXY\n1 2\n3 4 5\n"; sm = ScoreMatrix.parse(new ByteArrayInputStream(data.getBytes())); assertNull(sm); /* * Too many rows */ data = "ScoreMatrix MyTest\nXY\n1 2\n3 4\n6 7"; sm = ScoreMatrix.parse(new ByteArrayInputStream(data.getBytes())); assertNull(sm); /* * unsupported delimiter | */ data = "ScoreMatrix MyTest\nXY\n1|2\n3|4\n"; sm = ScoreMatrix.parse(new ByteArrayInputStream(data.getBytes())); assertNull(sm); /* * Bad float value */ data = "ScoreMatrix MyTest\nXY\n1 2\n3 four\n"; sm = ScoreMatrix.parse(new ByteArrayInputStream(data.getBytes())); assertNull(sm); } }