//Dstl (c) Crown Copyright 2017
package uk.gov.dstl.baleen.uima.utils.select;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
public class QueryParserTest {
@Test
public void testOrGetsCorrectPrecedence() {
// tests that a selector "a b, c d, e f" evals to (a AND b) OR (c AND d) OR (e AND f)"
// top level or, three child ands
Evaluator<Object> eval = QueryParser.parse("a b, c d, e f");
assertTrue(eval instanceof CombiningEvaluator.Or);
CombiningEvaluator.Or<Object> or = (CombiningEvaluator.Or<Object>) eval;
assertEquals(3, or.evaluators.size());
for (Evaluator<Object> innerEval : or.evaluators) {
assertTrue(innerEval instanceof CombiningEvaluator.And);
CombiningEvaluator.And<Object> and = (CombiningEvaluator.And<Object>) innerEval;
assertEquals(2, and.evaluators.size());
assertTrue(and.evaluators.get(0) instanceof Evaluator.TypeName);
assertTrue(and.evaluators.get(1) instanceof StructuralEvaluator.Parent);
}
}
@Test
public void testParsesMultiCorrectly() {
Evaluator<Object> eval = QueryParser.parse(".foo > ol, ol > li + li");
assertTrue(eval instanceof CombiningEvaluator.Or);
CombiningEvaluator.Or<Object> or = (CombiningEvaluator.Or<Object>) eval;
assertEquals(2, or.evaluators.size());
CombiningEvaluator.And<Object> andLeft = (CombiningEvaluator.And<Object>) or.evaluators.get(0);
CombiningEvaluator.And<Object> andRight = (CombiningEvaluator.And<Object>) or.evaluators.get(1);
assertEquals("ol :immediateParent(.foo)", andLeft.toString());
assertEquals(2, andLeft.evaluators.size());
assertEquals("li :prev(li :immediateParent(ol))", andRight.toString());
assertEquals(2, andLeft.evaluators.size());
}
@Test
public void testEvaluatorStrings() {
assertEquals("*", QueryParser.parse("*").toString());
assertEquals(":empty", QueryParser.parse(":empty").toString());
assertEquals(":root", QueryParser.parse(":root").toString());
assertEquals("Type", QueryParser.parse("Type").toString());
assertEquals(".class", QueryParser.parse(".class").toString());
assertEquals("[a^=b]", QueryParser.parse("[a^=b]").toString());
assertEquals("Test [a!=b]", QueryParser.parse("Test[a!=b]").toString());
assertEquals(".class [c*=d]", QueryParser.parse(".class[c*=d]").toString());
assertEquals(":matchesOwn(boom)", QueryParser.parse(":matchesOwn(boom)").toString());
assertEquals(":has(child :immediateParent(Parent))",
QueryParser.parse(":has(Parent > child)").toString());
assertEquals(":not(child :parent(Ancestor))",
QueryParser.parse(":not(Ancestor child)").toString());
assertEquals("S2 :nth-child(2) :prev(S1)",
QueryParser.parse("S1 + S2:nth-child(2)").toString());
assertEquals("S2 [level] :prev*(S1 :nth-of-type(2n+1))",
QueryParser.parse("S1:nth-of-type(odd) ~ S2[level]").toString());
assertEquals("S2 [att~=test] :prev*(S1 :contains(test))",
QueryParser.parse("S1:contains(test) ~ S2[att~=test]").toString());
assertEquals("S2 :only-child :parent(S1 :containsOwn(t))",
QueryParser.parse("S1:containsOwn(t) S2:only-child").toString());
assertEquals("S2 :gt(3) :parent(S1 :matches((?i)t))",
QueryParser.parse("S1:matches((?i)t) S2:gt(3)").toString());
assertEquals("S3 [s$=t] :immediateParent(S2 :lt(3) :parent(S1 :eq(1)))",
QueryParser.parse("S1:eq(1) S2:lt(3) > S3[s$=t]").toString());
}
@Test(expected = Selector.SelectorParseException.class)
public void exceptionOnUncloseAttribute() {
QueryParser.parse("section > a[href=\"]");
}
@Test(expected = Selector.SelectorParseException.class)
public void testParsesSingleQuoteInContains() {
QueryParser.parse("p:contains(One \" One)");
}
}