JAL-3746 apply copyright to tests
[jalview.git] / test / jalview / datamodel / features / FeatureMatcherSetTest.java
index 56644fd..3bd125e 100644 (file)
@@ -1,7 +1,28 @@
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
+ * 
+ * This file is part of Jalview.
+ * 
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License 
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *  
+ * Jalview is distributed in the hope that it will be useful, but 
+ * WITHOUT ANY WARRANTY; without even the implied warranty 
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+ * PURPOSE.  See the GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
 package jalview.datamodel.features;
 
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNull;
 import static org.testng.Assert.assertSame;
 import static org.testng.Assert.assertTrue;
 import static org.testng.Assert.fail;
@@ -103,7 +124,8 @@ public class FeatureMatcherSetTest
      * OR failed attribute and score conditions with matched label condition
      */
     fms = new FeatureMatcherSet();
-    fms.or(fm2).or(byScoreFail);
+    fms.or(fm2);
+    fms.or(byScoreFail);
     assertFalse(fms.matches(sf));
     fms.or(byLabelPass);
     assertTrue(fms.matches(sf));
@@ -127,7 +149,7 @@ public class FeatureMatcherSetTest
     FeatureMatcherSetI fms = new FeatureMatcherSet();
     assertEquals(fms.toString(), "");
     fms.and(fm1);
-    assertEquals(fms.toString(), "(AF < 1.2)");
+    assertEquals(fms.toString(), "AF < 1.2");
     fms.and(fm2);
     assertEquals(fms.toString(),
             "(AF < 1.2) and (CLIN_SIG does not contain 'path')");
@@ -138,7 +160,7 @@ public class FeatureMatcherSetTest
     fms = new FeatureMatcherSet();
     assertEquals(fms.toString(), "");
     fms.or(fm1);
-    assertEquals(fms.toString(), "(AF < 1.2)");
+    assertEquals(fms.toString(), "AF < 1.2");
     fms.or(fm2);
     assertEquals(fms.toString(),
             "(AF < 1.2) or (CLIN_SIG does not contain 'path')");
@@ -238,8 +260,8 @@ public class FeatureMatcherSetTest
   }
 
   /**
-   * Tests for the 'compound attribute' key i.e. where first key's value is a map
-   * from which we take the value for the second key, e.g. CSQ : Consequence
+   * Tests for the 'compound attribute' key i.e. where first key's value is a
+   * map from which we take the value for the second key, e.g. CSQ : Consequence
    */
   @Test(groups = "Functional")
   public void testMatches_compoundKey()
@@ -282,4 +304,136 @@ public class FeatureMatcherSetTest
     csq.put("Consequence", "Catastrophic");
     assertTrue(fms.matches(sf));
   }
+
+  /**
+   * Tests for toStableString which (unlike toString) does not i18n the
+   * conditions
+   * 
+   * @see FeatureMatcherTest#testToStableString()
+   */
+  @Test(groups = "Functional")
+  public void testToStableString()
+  {
+    FeatureMatcherI fm1 = FeatureMatcher.byAttribute(Condition.LT, "1.2",
+            "AF");
+    assertEquals(fm1.toStableString(), "AF LT 1.2");
+
+    FeatureMatcher fm2 = FeatureMatcher.byAttribute(Condition.NotContains,
+            "path", "CLIN_SIG");
+    assertEquals(fm2.toStableString(), "CLIN_SIG NotContains path");
+
+    /*
+     * AND them
+     */
+    FeatureMatcherSetI fms = new FeatureMatcherSet();
+    assertEquals(fms.toStableString(), "");
+    fms.and(fm1);
+    // no brackets needed if a single condition
+    assertEquals(fms.toStableString(), "AF LT 1.2");
+    // brackets if more than one condition
+    fms.and(fm2);
+    assertEquals(fms.toStableString(),
+            "(AF LT 1.2) AND (CLIN_SIG NotContains path)");
+
+    /*
+     * OR them
+     */
+    fms = new FeatureMatcherSet();
+    assertEquals(fms.toStableString(), "");
+    fms.or(fm1);
+    assertEquals(fms.toStableString(), "AF LT 1.2");
+    fms.or(fm2);
+    assertEquals(fms.toStableString(),
+            "(AF LT 1.2) OR (CLIN_SIG NotContains path)");
+
+    /*
+     * attribute or value including space is quoted
+     */
+    FeatureMatcher fm3 = FeatureMatcher.byAttribute(Condition.NotMatches,
+            "foo bar", "CSQ", "Poly Phen");
+    assertEquals(fm3.toStableString(),
+            "'CSQ:Poly Phen' NotMatches 'foo bar'");
+    fms.or(fm3);
+    assertEquals(fms.toStableString(),
+            "(AF LT 1.2) OR (CLIN_SIG NotContains path) OR ('CSQ:Poly Phen' NotMatches 'foo bar')");
+
+    try
+    {
+      fms.and(fm1);
+      fail("Expected exception");
+    } catch (IllegalStateException e)
+    {
+      // expected
+    }
+  }
+
+  /**
+   * Tests for parsing a string representation of a FeatureMatcherSet
+   * 
+   * @see FeatureMatcherSetTest#testToStableString()
+   */
+  @Test(groups = "Functional")
+  public void testFromString()
+  {
+    String descriptor = "AF LT 1.2";
+    FeatureMatcherSetI fms = FeatureMatcherSet.fromString(descriptor);
+
+    /*
+     * shortcut asserts by verifying a 'roundtrip', 
+     * which we trust if other tests pass :-)
+     */
+    assertEquals(fms.toStableString(), descriptor);
+
+    // brackets optional, quotes optional, condition case insensitive
+    fms = FeatureMatcherSet.fromString("('AF' lt '1.2')");
+    assertEquals(fms.toStableString(), descriptor);
+
+    descriptor = "(AF LT 1.2) AND (CLIN_SIG NotContains path)";
+    fms = FeatureMatcherSet.fromString(descriptor);
+    assertEquals(fms.toStableString(), descriptor);
+
+    // AND is not case-sensitive
+    fms = FeatureMatcherSet
+            .fromString("(AF LT 1.2) and (CLIN_SIG NotContains path)");
+    assertEquals(fms.toStableString(), descriptor);
+
+    descriptor = "(AF LT 1.2) OR (CLIN_SIG NotContains path)";
+    fms = FeatureMatcherSet.fromString(descriptor);
+    assertEquals(fms.toStableString(), descriptor);
+
+    // OR is not case-sensitive
+    fms = FeatureMatcherSet
+            .fromString("(AF LT 1.2) or (CLIN_SIG NotContains path)");
+    assertEquals(fms.toStableString(), descriptor);
+
+    // can get away without brackets on last match condition
+    fms = FeatureMatcherSet
+            .fromString("(AF LT 1.2) or CLIN_SIG NotContains path");
+    assertEquals(fms.toStableString(), descriptor);
+
+    descriptor = "(AF LT 1.2) OR (CLIN_SIG NotContains path) OR ('CSQ:Poly Phen' NotMatches 'foo bar')";
+    fms = FeatureMatcherSet.fromString(descriptor);
+    assertEquals(fms.toStableString(), descriptor);
+
+    // can't mix OR and AND
+    descriptor = "(AF LT 1.2) OR (CLIN_SIG NotContains path) AND ('CSQ:Poly Phen' NotMatches 'foo bar')";
+    assertNull(FeatureMatcherSet.fromString(descriptor));
+
+    // can't mix AND and OR
+    descriptor = "(AF LT 1.2) and (CLIN_SIG NotContains path) or ('CSQ:Poly Phen' NotMatches 'foo bar')";
+    assertNull(FeatureMatcherSet.fromString(descriptor));
+
+    // brackets missing
+    assertNull(FeatureMatcherSet
+            .fromString("AF LT 1.2 or CLIN_SIG NotContains path"));
+
+    // invalid conjunction
+    assertNull(FeatureMatcherSet.fromString("(AF LT 1.2) but (AF GT -2)"));
+
+    // unbalanced quote (1)
+    assertNull(FeatureMatcherSet.fromString("('AF lt '1.2')"));
+
+    // unbalanced quote (2)
+    assertNull(FeatureMatcherSet.fromString("('AF' lt '1.2)"));
+  }
 }