package de.westnordost.streetcomplete.data.osm.tql;
import junit.framework.TestCase;
import java.util.Iterator;
public class BooleanExpressionTest extends TestCase
{
public void testExpand00() { checkExpand("a", "a"); }
public void testExpand01() { checkExpand("a*b*c", "a*b*c"); }
public void testExpand02() { checkExpand("a+b+c", "a+b+c"); }
public void testExpand03() { checkExpand("a+b*c+d", "a+b*c+d"); }
public void testExpand04() { checkExpand("a*b+c*d", "a*b+c*d"); }
public void testExpand10() { checkExpand("(a+b)*c", "a*c+b*c"); }
public void testExpand11() { checkExpand("a*(b+c)", "a*b+a*c"); }
public void testExpand12() { checkExpand("a*(b+c)*d", "a*b*d+a*c*d"); }
public void testExpand20() { checkExpand("a*(b+c*d)", "a*b+a*c*d"); }
public void testExpand21() { checkExpand("a+b*(c+d)", "a+b*c+b*d"); }
public void testExpand22() { checkExpand("(a+b)*c+d", "a*c+b*c+d"); }
public void testExpand30() { checkExpand("((a+b)*c+d)*e", "a*c*e+b*c*e+d*e"); }
public void testExpand31() { checkExpand("a*(b+c*(d+e))", "a*b+a*c*d+a*c*e"); }
public void testExpand32() { checkExpand("z*(y+x*(a+b)*c+d)*e", "z*y*e+z*x*a*c*e+z*x*b*c*e+z*d*e"); }
public void testExpand40() { checkExpand("(x+y)*z*(a+b)", "x*z*a+x*z*b+y*z*a+y*z*b"); }
public void testMatchLeaf()
{
assertTrue(evalExpression("1"));
assertFalse(evalExpression("0"));
}
public void testMatchOr()
{
assertTrue(evalExpression("1+1"));
assertTrue(evalExpression("1+0"));
assertTrue(evalExpression("0+1"));
assertFalse(evalExpression("0+0"));
assertTrue(evalExpression("0+0+1"));
}
public void testMatchAnd()
{
assertTrue(evalExpression("1*1"));
assertFalse(evalExpression("1*0"));
assertFalse(evalExpression("0*1"));
assertFalse(evalExpression("0*0"));
assertTrue(evalExpression("1*1*1"));
assertFalse(evalExpression("1*1*0"));
}
public void testMatchAndInOr()
{
assertTrue(evalExpression("(1*0)+1"));
assertFalse(evalExpression("(1*0)+0"));
assertTrue(evalExpression("(1*1)+0"));
assertTrue(evalExpression("(1*1)+1"));
}
public void testMatchOrInAnd()
{
assertTrue(evalExpression("(1+0)*1"));
assertFalse(evalExpression("(1+0)*0"));
assertFalse(evalExpression("(0+0)*0"));
assertFalse(evalExpression("(0+0)*1"));
}
public void testTypeNotInitiallySet()
{
BooleanExpression x = new BooleanExpression();
assertFalse(x.isAnd());
assertFalse(x.isOr());
assertFalse(x.isRoot());
assertFalse(x.isValue());
}
public void testAddAnd()
{
BooleanExpression x = new BooleanExpression();
assertTrue(x.addAnd().isAnd());
}
public void testAddOr()
{
BooleanExpression x = new BooleanExpression();
assertTrue(x.addOr().isOr());
}
public void testSetAsRoot()
{
BooleanExpression x = new BooleanExpression(true);
assertTrue(x.isRoot());
}
public void testSetAsValue()
{
BooleanExpression<BooleanExpressionValue> x = new BooleanExpression<>();
x.addValue(new TestBooleanExpressionValue("jo"));
assertTrue(x.getFirstChild().isValue());
assertEquals("jo", ((TestBooleanExpressionValue)x.getFirstChild().getValue()).getValue());
}
public void testGetParent()
{
BooleanExpression parent = new BooleanExpression();
assertNull(parent.getParent());
assertEquals(parent, parent.addOpenBracket().getParent());
}
public void testCopyStringEquals()
{
BooleanExpression tree = TestBooleanExpressionParser.parse("(a+b)*c");
BooleanExpression treeCopy = tree.copy();
assertEquals(treeCopy.toString(), tree.toString());
}
public void testCopyIsDeep()
{
BooleanExpression<BooleanExpressionValue> tree = TestBooleanExpressionParser.parse("(a+b)*c");
BooleanExpression<BooleanExpressionValue> treeCopy = tree.copy();
checkRecursiveEqualsButNotSame(tree, treeCopy);
}
private void checkRecursiveEqualsButNotSame(BooleanExpression<BooleanExpressionValue> tree,
BooleanExpression<BooleanExpressionValue> treeCopy)
{
assertNotSame(tree, treeCopy);
assertEquals(tree.toString(), treeCopy.toString());
Iterator<BooleanExpression<BooleanExpressionValue>> treeIt = tree.getChildren().iterator();
Iterator<BooleanExpression<BooleanExpressionValue>> treeCopyIt = treeCopy.getChildren().iterator();
while(treeIt.hasNext())
{
checkRecursiveEqualsButNotSame(treeIt.next(), treeCopyIt.next());
}
}
private void checkExpand(String input, String expected)
{
BooleanExpression tree = TestBooleanExpressionParser.parse(input);
tree.expand();
assertEquals(expected, translateOutput(tree.toString()));
}
private String translateOutput(String output)
{
return output.replaceAll(" and ", "*").replaceAll(" or ", "+");
}
private boolean evalExpression(String input)
{
BooleanExpression<BooleanExpressionValue> expr = TestBooleanExpressionParser.parse(input);
return expr.matches("1");
}
}