package org.limewire.util; import java.util.Properties; import org.limewire.util.RPNParser.StringLookup; import junit.framework.Test; public class RPNParserTest extends BaseTestCase { public RPNParserTest(String name) { super(name); } public static Test suite() { return buildTestSuite(RPNParserTest.class); } public void testArithmetic() throws Exception { RPNParser p = new RPNParser("1","2","<"); // 1 < 2 assertTrue(p.evaluate()); p = new RPNParser("1","2",">"); assertFalse(p.evaluate()); // 0 == 0 p = new RPNParser("0","0","=="); assertTrue(p.evaluate()); } public void testOr() throws Exception { // true or true is true RPNParser p = new RPNParser("true","true","OR"); assertTrue(p.evaluate()); // true or false is true p = new RPNParser("true","false","OR"); assertTrue(p.evaluate()); // false or true is true p = new RPNParser("false","true","OR"); assertTrue(p.evaluate()); // false or false is false p = new RPNParser("false","false","OR"); assertFalse(p.evaluate()); } public void testAnd() throws Exception { // true and true is true RPNParser p = new RPNParser("true","true","AND"); assertTrue(p.evaluate()); // true and false is false p = new RPNParser("true","false","AND"); assertFalse(p.evaluate()); // false and true is true p = new RPNParser("false","true","AND"); assertFalse(p.evaluate()); // false and false is false p = new RPNParser("false","false","AND"); assertFalse(p.evaluate()); } public void testNot() throws Exception { // not true is false RPNParser p = new RPNParser("true","NOT"); assertFalse(p.evaluate()); // not false is true p = new RPNParser("false","NOT"); assertTrue(p.evaluate()); } public void testInvalid() throws Exception { RPNParser p; try { p = new RPNParser("asdf","NOT"); p.evaluate(); fail("invalid operand"); } catch (IllegalArgumentException expected){} try { p = new RPNParser("3","N"); p.evaluate(); fail("invalid operation"); } catch (IllegalArgumentException expected){} try { p = new RPNParser("3","1","NOT"); p.evaluate(); fail("logic on number"); } catch (IllegalArgumentException expected){} try { p = new RPNParser("true","false","<"); p.evaluate(); fail("arithmetic on boolean"); } catch (IllegalArgumentException expected){} try { p = new RPNParser("false","OR"); p.evaluate(); fail("not enough operands"); } catch (IllegalArgumentException expected){} try { p = new RPNParser("true","true","NOT"); p.evaluate(); fail("too many operands"); } catch (IllegalArgumentException expected){} } public void testComposite() throws Exception { // ((5 > 4) && (4 < 3)) || ( 5 > 0 && false) || (0 == 0) RPNParser p = new RPNParser("5","4",">","4","3","<","AND","5","0",">","false","AND","OR","0","0","==","OR"); assertTrue(p.evaluate()); } public void testPropsLookup() throws Exception { MyLookup p = new MyLookup(); p.setProperty("x","1"); p.setProperty("y", "2"); p.setProperty("yes", "true"); p.setProperty("no", "false"); p.setProperty("maybe","whatever"); RPNParser r = new RPNParser("maybe","whatever","=="); assertTrue(r.evaluate(p)); // x < y ? r = new RPNParser("x","y","<"); assertTrue(r.evaluate(p)); // x > 1 ? r = new RPNParser("x","1",">"); assertFalse(r.evaluate(p)); // y == 2 ? r = new RPNParser("y","2","=="); assertTrue(r.evaluate(p)); // x > 0 == yes? r = new RPNParser("x","0",">","yes","=="); assertTrue(r.evaluate(p)); // yes == !no? r = new RPNParser("yes","no","NOT","=="); assertTrue(r.evaluate(p)); // !yes ? r = new RPNParser("yes","NOT"); assertFalse(r.evaluate(p)); } public void testContains() throws Exception { RPNParser p = new RPNParser("badger","adge","CONTAINS"); assertTrue(p.evaluate()); p = new RPNParser("adge","badger","CONTAINS"); assertFalse(p.evaluate()); } public void testMatches() throws Exception { RPNParser p = new RPNParser("[a-c]a.*","badger","MATCHES"); assertTrue(p.evaluate()); p = new RPNParser(".*er.","badger","MATCHES"); assertFalse(p.evaluate()); try { p = new RPNParser(false,"[a-c]a.*","badger","MATCHES"); p.evaluate(); fail("experimental was allowed"); } catch (IllegalArgumentException expected){} } private static class MyLookup extends Properties implements StringLookup { public String lookup(String key) { return getProperty(key); } } }