// $HeadURL$ // $Id$ // // Copyright © 2006, 2010, 2011, 2012 by the President and Fellows of Harvard College. // // Screensaver is an open-source project developed by the ICCB-L and NSRB labs // at Harvard Medical School. This software is distributed under the terms of // the GNU General Public License. package edu.harvard.med.screensaver.ui.arch.datatable; import java.math.BigDecimal; import java.util.Arrays; import junit.framework.TestCase; import org.apache.log4j.Logger; import org.joda.time.LocalDate; import edu.harvard.med.screensaver.db.Criterion; import edu.harvard.med.screensaver.db.Criterion.Operator; // TODO: test other operators public class CriterionTest extends TestCase { // static members private static Logger log = Logger.getLogger(CriterionTest.class); @Override protected void setUp() throws Exception { } public void testEqualityOperators() { for (Operator operator : Arrays.asList(Operator.EQUAL, Operator.NOT_EQUAL)) { boolean expectedMatch = operator == Operator.EQUAL; assertMatches(operator, "text", "text", expectedMatch); assertMatches(operator, "text", "txet", !expectedMatch); assertMatches(operator, new Integer(1), new Integer(1), expectedMatch); assertMatches(operator, new Integer(0), new Integer(1), !expectedMatch); assertMatches(operator, new BigDecimal("1.0"), new BigDecimal("1.0"), expectedMatch); assertMatches(operator, new BigDecimal("0.0"), new BigDecimal("1.0"), !expectedMatch); assertMatches(operator, new Double("1.0"), new Double("1.0"), expectedMatch); assertMatches(operator, new Double("0.0"), new Double("1.0"), !expectedMatch); assertMatches(operator, Boolean.TRUE, Boolean.TRUE, expectedMatch); assertMatches(operator, Boolean.TRUE, Boolean.FALSE, !expectedMatch); assertMatches(operator, new LocalDate(2000, 1, 1), new LocalDate(2000, 1, 1), expectedMatch); assertMatches(operator, new LocalDate(2000, 1, 1), new LocalDate(2000, 1, 2), !expectedMatch); } assertMatches(Operator.EQUAL, new Integer(1), Arrays.asList(new Integer(1), new Integer(2)), true); assertMatches(Operator.EQUAL, new Integer(1), Arrays.asList(new Integer(0), new Integer(2)), false); } public void testRankingOperators() { for (Operator operator : Arrays.asList(Operator.GREATER_THAN, Operator.GREATER_THAN_EQUAL, Operator.LESS_THAN, Operator.LESS_THAN_EQUAL)) { boolean expectedEqualityMatches = operator.name().contains("EQUAL"); boolean expectedGreaterThanMatches = operator.name().contains("GREATER"); boolean expectedLessThanMatches = operator.name().contains("LESS"); assertMatches(operator, "text1", "text1", expectedEqualityMatches); assertMatches(operator, "text2", "text1", expectedLessThanMatches); assertMatches(operator, "text1", "text2", expectedGreaterThanMatches); assertMatches(operator, new Integer(1), new Integer(1), expectedEqualityMatches); assertMatches(operator, new Integer(1), new Integer(0), expectedLessThanMatches); assertMatches(operator, new Integer(0), new Integer(1), expectedGreaterThanMatches); assertMatches(operator, new BigDecimal("1.0"), new BigDecimal("1.0"), expectedEqualityMatches); assertMatches(operator, new BigDecimal("1.0"), new BigDecimal("0.0"), expectedLessThanMatches); assertMatches(operator, new BigDecimal("0.0"), new BigDecimal("1.0"), expectedGreaterThanMatches); assertMatches(operator, new Double("1.0"), new Double("1.0"), expectedEqualityMatches); assertMatches(operator, new Double("1.0"), new Double("0.0"), expectedLessThanMatches); assertMatches(operator, new Double("0.0"), new Double("1.0"), expectedGreaterThanMatches); assertMatches(operator, Boolean.TRUE, Boolean.TRUE, expectedEqualityMatches); assertMatches(operator, Boolean.TRUE, Boolean.FALSE, expectedLessThanMatches); assertMatches(operator, Boolean.FALSE, Boolean.TRUE, expectedGreaterThanMatches); assertMatches(operator, new LocalDate(2000, 1, 1), new LocalDate(2000, 1, 1), expectedEqualityMatches); assertMatches(operator, new LocalDate(2000, 1, 2), new LocalDate(2000, 1, 1), expectedLessThanMatches); assertMatches(operator, new LocalDate(2000, 1, 1), new LocalDate(2000, 1, 2), expectedGreaterThanMatches); assertMatches(operator, new Integer(1), Arrays.asList(new Integer(1), new Integer(1)), expectedEqualityMatches); assertMatches(operator, new Integer(2), Arrays.asList(new Integer(0), new Integer(1)), expectedLessThanMatches); assertMatches(operator, new Integer(0), Arrays.asList(new Integer(1), new Integer(2)), expectedGreaterThanMatches); } } public void testLikeOperator() { String data = "Hello World.\nHow *are* you?"; Operator operator = Operator.TEXT_LIKE; assertNotMatches(operator, "Hello", data); assertNotMatches(operator, "helLo", data); assertMatches(operator, "Hello*", data); assertMatches(operator, "hello*", data); assertNotMatches(operator, "Hello\\*", data); assertMatches(operator, "*Hello*", data); assertMatches(operator, "*World*", data); assertMatches(operator, "*World*How*", data); assertNotMatches(operator, "Hello World?", data); assertMatches(operator, "Hello World?*", data); assertMatches(operator, "hello world*", data); assertMatches(operator, "hello world.*How*", data); assertNotMatches(operator, "Hello World\\?", data); assertMatches(operator, "?ello World*", data); assertMatches(operator, "Hello World*you\\?", data); assertMatches(operator, "Hello World*you?", data); assertNotMatches(operator, "Hello World*you\\??", data); assertNotMatches(operator, "?", data); assertMatches(operator, "?*", data); assertNotMatches(operator, "\\?", data); assertMatches(operator, "*", data); assertNotMatches(operator, "\\*", data); assertMatches(operator, "*\\?", data); assertNotMatches(operator, "\\*???\\*", data); assertMatches(operator, "*\\*???\\**", data); assertNotMatches(operator, "\\**\\*", data); assertMatches(operator, "*\\**\\**", data); doTestEmptyAndNullCasesWithOperator(operator); } public void testStartsWithOperator() { String data = "Hello World.\nHow *are* you?"; Operator operator = Operator.TEXT_STARTS_WITH; assertMatches(operator, "Hello", data); assertMatches(operator, "helLo", data); assertMatches(operator, "Hello*", data); assertMatches(operator, "*Hello", data); assertMatches(operator, "*ello", data); assertNotMatches(operator, "Jello", data); assertMatches(operator, "?", data); assertMatches(operator, "*", data); assertNotMatches(operator, "\\?", data); assertNotMatches(operator, "\\*", data); assertMatches(operator, "*\\?", data); assertMatches(operator, "*\\*", data); assertNotMatches(operator, "\\*???\\*", data); assertNotMatches(operator, "\\**\\*", data); assertMatches(operator, "*\\*???\\*", data); assertMatches(operator, "*\\**\\*", data); doTestEmptyAndNullCasesWithOperator(operator); } public void testContainsOperator() { String data = "Hello World.\nHow *are* you?"; Operator operator = Operator.TEXT_CONTAINS; assertMatches(operator, "Hello", data); assertMatches(operator, "Hello*you?", data); assertMatches(operator, "helLo", data); assertMatches(operator, "World", data); assertMatches(operator, "*World*", data); assertMatches(operator, "World*How", data); assertMatches(operator, "World??How", data); assertMatches(operator, "?", data); assertMatches(operator, "*", data); assertMatches(operator, "\\?", data); assertMatches(operator, "\\*", data); assertMatches(operator, "\\*???\\*", data); assertMatches(operator, "\\**\\*", data); doTestEmptyAndNullCasesWithOperator(operator); } public void testRegexCharactersAreIgnoredInUserExpression() { assertNotMatches(Operator.TEXT_LIKE, ".", "x"); assertMatches(Operator.TEXT_LIKE, ".", "."); assertMatches(Operator.TEXT_LIKE, "..", ".."); assertNotMatches(Operator.TEXT_LIKE, "..", ".x"); assertMatches(Operator.TEXT_LIKE, ".*", ".x"); assertMatches(Operator.TEXT_LIKE, ".*", ".x"); assertMatches(Operator.TEXT_LIKE, ".*", ".*"); assertNotMatches(Operator.TEXT_LIKE, ".*", "x*"); assertMatches(Operator.TEXT_LIKE, "*", "*"); assertMatches(Operator.TEXT_LIKE, "\\\\x", "\\x"); assertMatches(Operator.TEXT_LIKE, "\\\\x\\?", "\\x?"); } public void testAnyOperator() { Operator operator = Operator.ANY; assertMatches(operator, null, null); assertMatches(operator, null, ""); assertMatches(operator, null, "x"); assertMatches(operator, "", "x"); assertMatches(operator, "x", null); assertMatches(operator, "x", ""); } public void testEmptyOperators() { Operator operator = Operator.EMPTY; assertMatches(operator, null, null); assertMatches(operator, null, ""); assertNotMatches(operator, null, "x"); assertNotMatches(operator, "", "x"); assertMatches(operator, "x", null); assertMatches(operator, "x", ""); operator = Operator.NOT_EMPTY; assertNotMatches(operator, null, null); assertNotMatches(operator, null, ""); assertMatches(operator, null, "x"); assertMatches(operator, "", "x"); assertNotMatches(operator, "x", null); assertNotMatches(operator, "x", ""); } public void testListValue() { Operator operator = Operator.TEXT_CONTAINS; assertMatches(operator, null, Arrays.asList("x", "y", "z")); assertMatches(operator, "x", Arrays.asList("x", "y", "z")); } private void doTestEmptyAndNullCasesWithOperator(Operator operator) { assert operator != Operator.EMPTY : "cannot test the EMPTY operator with this test method; it is a special case!"; assertMatches(operator, null, null); assertMatches(operator, null, ""); assertMatches(operator, null, "x"); assertMatches(operator, "", "x"); assertNotMatches(operator, "x", null); assertNotMatches(operator, "x", ""); } private void assertMatches(Operator op, Object value, Object data) { assertMatches(op, value, data, true); } private void assertNotMatches(Operator op, Object value, Object data) { assertMatches(op, value, data, false); } private void assertMatches(Operator op, Object value, Object data, boolean expectedResult) { Criterion<Object> criterion = new Criterion<Object>(); criterion.setValue(value); criterion.setOperator(op); if (criterion.isUndefined()) { // undefined criterion does not filter out data assertTrue(criterion.matches(data)); } else { assertEquals(expectedResult, criterion.matches(data)); } } }