JAL-2403 further test coverage for ScoreMatrix, min/max getters
[jalview.git] / test / jalview / analysis / scoremodels / ScoreMatrixTest.java
index 5c699d1..9c9e917 100644 (file)
@@ -1,8 +1,11 @@
 package jalview.analysis.scoremodels;
 
 import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNotEquals;
 import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertNotSame;
+import static org.testng.Assert.assertNull;
 import static org.testng.Assert.assertTrue;
 import static org.testng.internal.junit.ArrayAsserts.assertArrayEquals;
 
@@ -38,6 +41,8 @@ public class ScoreMatrixTest
     assertEquals(sm.getPairwiseScore('A', 'D'), 0f);
     assertEquals(sm.getMatrixIndex('c'), 2);
     assertEquals(sm.getMatrixIndex(' '), -1);
+
+    assertEquals(sm.getGapIndex(), -1); // no gap symbol
   }
 
   @Test(
@@ -76,7 +81,12 @@ public class ScoreMatrixTest
   @Test(groups = "Functional")
   public void testBuildSymbolIndex()
   {
-    short[] index = ScoreMatrix.buildSymbolIndex("AX-. yxYp".toCharArray());
+    float[][] scores = new float[2][];
+    scores[0] = new float[] { 1f, 2f };
+    scores[1] = new float[] { 3f, 4f };
+    ScoreMatrix sm = new ScoreMatrix("Test", new char[] { 'A', '.' },
+            scores);
+    short[] index = sm.buildSymbolIndex("AX-yxYp".toCharArray());
 
     assertEquals(index.length, 128); // ASCII character set size
 
@@ -84,12 +94,10 @@ public class ScoreMatrixTest
     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['y'], 3); // lower-case override
+    assertEquals(index['x'], 4); // lower-case override
+    assertEquals(index['Y'], 5);
+    assertEquals(index['p'], 6);
     assertEquals(index['P'], -1); // lower-case doesn't map upper-case
 
     /*
@@ -110,8 +118,13 @@ public class ScoreMatrixTest
   @Test(groups = "Functional")
   public void testBuildSymbolIndex_nonAscii()
   {
+    float[][] scores = new float[2][];
+    scores[0] = new float[] { 1f, 2f };
+    scores[1] = new float[] { 3f, 4f };
+    ScoreMatrix sm = new ScoreMatrix("Test", new char[] { 'A', '.' },
+            scores);
     char[] weird = new char[] { 128, 245, 'P' };
-    short[] index = ScoreMatrix.buildSymbolIndex(weird);
+    short[] index = sm.buildSymbolIndex(weird);
     assertEquals(index.length, 128);
     assertEquals(index['P'], 2);
     assertEquals(index['p'], 2);
@@ -149,7 +162,7 @@ public class ScoreMatrixTest
     assertEquals(sm.getMatrixIndex('X'), 22);
     assertEquals(sm.getMatrixIndex('x'), 22);
     assertEquals(sm.getMatrixIndex('-'), 23);
-    assertEquals(sm.getMatrixIndex('*'), 24);
+    assertEquals(sm.getMatrixIndex('*'), -1);
     assertEquals(sm.getMatrixIndex('.'), -1);
     assertEquals(sm.getMatrixIndex(' '), -1);
     assertEquals(sm.getMatrixIndex('?'), -1);
@@ -157,6 +170,13 @@ public class ScoreMatrixTest
   }
 
   @Test(groups = "Functional")
+  public void testGetGapIndex()
+  {
+    ScoreMatrix sm = ScoreModels.getInstance().getBlosum62();
+    assertEquals(sm.getGapIndex(), 23);
+  }
+
+  @Test(groups = "Functional")
   public void testGetSize()
   {
     ScoreMatrix sm = ScoreModels.getInstance().getBlosum62();
@@ -244,6 +264,12 @@ public class ScoreMatrixTest
             .toCharArray(), sm.getMatrix());
     assertTrue(sm.equals(sm2));
     assertEquals(sm.hashCode(), sm2.hashCode());
+
+    sm2 = ScoreModels.getInstance().getPam250();
+    assertFalse(sm.equals(sm2));
+    assertNotEquals(sm.hashCode(), sm2.hashCode());
+
+    assertFalse(sm.equals("hello"));
   }
 
   /**
@@ -397,6 +423,12 @@ public class ScoreMatrixTest
   {
     ScoreMatrix sm = ScoreModels.getInstance().getBlosum62();
 
+    assertTrue(sm.isProtein());
+    assertFalse(sm.isDNA());
+    assertNull(sm.getDescription());
+    sm.setDescription("BLOSUM62");
+    assertEquals(sm.getDescription(), "BLOSUM62");
+
     /*
      * verify expected scores against ARNDCQEGHILKMFPSTWYVBZX
      * scraped from https://www.ncbi.nlm.nih.gov/Class/FieldGuide/BLOSUM62.txt
@@ -477,4 +509,85 @@ public class ScoreMatrixTest
               String.format("%s->%s", res, c2));
     }
   }
+
+  @Test(groups = "Functional")
+  public void testConstructor_gapDash()
+  {
+    float[][] scores = new float[2][];
+    scores[0] = new float[] { 1f, 2f };
+    scores[1] = new float[] { 4f, 5f };
+    ScoreMatrix sm = new ScoreMatrix("Test", new char[] { 'A', '-' },
+            scores);
+    assertEquals(sm.getSize(), 2);
+    assertArrayEquals(scores, sm.getMatrix());
+    assertEquals(sm.getPairwiseScore('A', 'a'), 1f);
+    assertEquals(sm.getPairwiseScore('A', 'A'), 1f);
+    assertEquals(sm.getPairwiseScore('a', '-'), 2f);
+    assertEquals(sm.getPairwiseScore('-', 'A'), 4f);
+    assertEquals(sm.getMatrixIndex('a'), 0);
+    assertEquals(sm.getMatrixIndex('A'), 0);
+    assertEquals(sm.getMatrixIndex('-'), 1);
+    assertEquals(sm.getMatrixIndex(' '), -1);
+    assertEquals(sm.getMatrixIndex('.'), -1);
+  
+    assertEquals(sm.getGapIndex(), 1);
+  }
+
+  @Test(groups = "Functional")
+  public void testGetPairwiseScore()
+  {
+    float[][] scores = new float[2][];
+    scores[0] = new float[] { 1f, 2f };
+    scores[1] = new float[] { 4f, 5f };
+    ScoreMatrix sm = new ScoreMatrix("Test", new char[] { 'A', 'B' },
+            scores);
+    assertEquals(sm.getPairwiseScore('A', 'A'), 1f);
+    assertEquals(sm.getPairwiseScore('A', 'a'), 1f);
+    assertEquals(sm.getPairwiseScore('A', 'B'), 2f);
+    assertEquals(sm.getPairwiseScore('b', 'a'), 4f);
+    assertEquals(sm.getPairwiseScore('B', 'b'), 5f);
+
+    /*
+     * unknown symbols currently score zero
+     */
+    assertEquals(sm.getPairwiseScore('A', '-'), 0f);
+    assertEquals(sm.getPairwiseScore('-', '-'), 0f);
+    assertEquals(sm.getPairwiseScore('Q', 'W'), 0f);
+
+    /*
+     * symbols not in basic ASCII set score zero
+     */
+    char c = (char) 200;
+    assertEquals(sm.getPairwiseScore('Q', c), 0f);
+    assertEquals(sm.getPairwiseScore(c, 'Q'), 0f);
+  }
+
+  @Test(groups = "Functional")
+  public void testGetMinimumScore()
+  {
+    ScoreMatrix sm = ScoreModels.getInstance().getBlosum62();
+    assertEquals(sm.getMinimumScore(), -4f);
+  }
+
+  @Test(groups = "Functional")
+  public void testGetMaximumScore()
+  {
+    ScoreMatrix sm = ScoreModels.getInstance().getBlosum62();
+    assertEquals(sm.getMaximumScore(), 11f);
+  }
+
+  @Test(groups = "Functional")
+  public void testOutputMatrix_html()
+  {
+    float[][] scores = new float[2][];
+    scores[0] = new float[] { 1f, 2f };
+    scores[1] = new float[] { 4f, -5.3E-10f };
+    ScoreMatrix sm = new ScoreMatrix("Test", "AB".toCharArray(), scores);
+    String html = sm.outputMatrix(true);
+    String expected = "<table border=\"1\"><tr><th></th><th>&nbsp;A&nbsp;</th><th>&nbsp;B&nbsp;</th></tr>\n"
+            + "<tr><td>A</td><td>1.0</td><td>2.0</td></tr>\n"
+            + "<tr><td>B</td><td>4.0</td><td>-5.3E-10</td></tr>\n"
+            + "</table>";
+    assertEquals(html, expected);
+  }
 }