2 * Copyright (c) 2018 Pantheon Technologies, s.r.o. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.yangtools.yang.xpath.impl;
10 import static org.hamcrest.MatcherAssert.assertThat;
11 import static org.hamcrest.Matchers.isA;
12 import static org.junit.Assert.assertEquals;
14 import com.google.common.collect.ImmutableBiMap;
16 import java.util.List;
17 import javax.xml.xpath.XPathExpressionException;
18 import org.eclipse.jdt.annotation.Nullable;
19 import org.junit.Before;
20 import org.junit.Test;
21 import org.opendaylight.yangtools.yang.common.BiMapYangNamespaceContext;
22 import org.opendaylight.yangtools.yang.common.QName;
23 import org.opendaylight.yangtools.yang.common.QNameModule;
24 import org.opendaylight.yangtools.yang.common.YangNamespaceContext;
25 import org.opendaylight.yangtools.yang.xpath.api.YangBinaryExpr;
26 import org.opendaylight.yangtools.yang.xpath.api.YangBinaryOperator;
27 import org.opendaylight.yangtools.yang.xpath.api.YangBooleanConstantExpr;
28 import org.opendaylight.yangtools.yang.xpath.api.YangExpr;
29 import org.opendaylight.yangtools.yang.xpath.api.YangLocationPath;
30 import org.opendaylight.yangtools.yang.xpath.api.YangLocationPath.Relative;
31 import org.opendaylight.yangtools.yang.xpath.api.YangXPathAxis;
32 import org.opendaylight.yangtools.yang.xpath.api.YangXPathMathMode;
34 @SuppressWarnings("null")
35 public class XPathParserTest {
36 private static final QNameModule DEFNS = QNameModule.create(URI.create("defaultns"));
37 private static final YangNamespaceContext CONTEXT = new BiMapYangNamespaceContext(ImmutableBiMap.of(
39 "foo", QNameModule.create(URI.create("foo")),
40 "bar", QNameModule.create(URI.create("bar"))));
42 private @Nullable AntlrXPathParser parser;
45 public void before() {
46 parser = new AntlrXPathParser.Unqualified(YangXPathMathMode.IEEE754, CONTEXT, DEFNS);
50 public void testSmoke() throws XPathExpressionException {
51 parseExpr("../a[foo = current()/foo]");
60 parseExpr("@foo:foo");
61 parseExpr("current()");
62 parseExpr("foo:self()");
63 parseExpr("foo:comment()");
64 parseExpr("/a[foo = 2 and bar = 3]");
65 parseExpr("/a[foo = \"2\" and bar = '3']");
66 parseExpr("/foo:a[foo = 2 and bar = 3]");
67 parseExpr("//a[foo = 2 and bar = 3]");
68 parseExpr("//foo:a[foo=2 and bar:bar=3]");
69 parseExpr("a//b[foo = 2]");
70 parseExpr("foo:a//b[foo = 2]");
71 parseExpr("$foo:comment");
72 parseExpr("$comment");
77 public void testUnionSquashing() throws XPathExpressionException {
78 final YangExpr a = parseExpr("a");
79 assertEquals(a, parseExpr("a|a"));
80 assertEquals(a, parseExpr("a|a|a"));
81 assertEquals(a, parseExpr("a|a|a|a"));
83 final YangExpr ab = parseExpr("a|b");
84 assertEquals(ab, parseExpr("a|b|a"));
85 assertEquals(ab, parseExpr("a|b|a|b"));
86 assertEquals(ab, parseExpr("a|a|b|a|b"));
87 assertEquals(ab, parseExpr("a|b|b|a|b"));
88 assertEquals(ab, parseExpr("a|b|a|a|b"));
92 public void testNumberSquashing() throws XPathExpressionException {
93 final YangExpr two = parseExpr("2");
94 assertEquals(two, parseExpr("1 + 1"));
95 assertEquals(two, parseExpr("3 - 1"));
96 assertEquals(two, parseExpr("2 * 1"));
97 assertEquals(two, parseExpr("4 div 2"));
98 assertEquals(two, parseExpr("6 mod 4"));
102 public void testSameExprSquashing() throws XPathExpressionException {
104 assertEquals(YangBooleanConstantExpr.FALSE, parseExpr("/a != /a"));
105 assertEquals(YangBooleanConstantExpr.TRUE, parseExpr("/a = /a"));
108 assertEquals(YangBooleanConstantExpr.FALSE, parseExpr("2 != 2"));
109 assertEquals(YangBooleanConstantExpr.FALSE, parseExpr("2 != (1 + 1)"));
110 assertEquals(YangBooleanConstantExpr.TRUE, parseExpr("2 = 2"));
111 assertEquals(YangBooleanConstantExpr.TRUE, parseExpr("2 = (1 + 1)"));
115 public void testGreaterEqualReference() throws XPathExpressionException {
116 final YangExpr expr = parseExpr(". >= ../lower-port");
117 assertThat(expr, isA(YangBinaryExpr.class));
119 final YangBinaryExpr binary = (YangBinaryExpr) expr;
120 assertEquals(YangBinaryOperator.GTE, binary.getOperator());
121 assertEquals(YangLocationPath.self(), binary.getLeftExpr());
122 assertEquals(YangLocationPath.relative(YangXPathAxis.PARENT.asStep(),
123 YangXPathAxis.CHILD.asStep(QName.create(DEFNS, "lower-port"))), binary.getRightExpr());
127 public void testAnd() throws XPathExpressionException {
128 assertRelative("and");
129 assertRelative("or");
130 assertRelative("div");
131 assertRelative("mod");
132 assertRelative("andor");
135 private void assertRelative(final String str) throws XPathExpressionException {
136 final YangExpr expr = parseExpr(str);
137 assertThat(expr, isA(Relative.class));
138 assertEquals(List.of(YangXPathAxis.CHILD.asStep(QName.create(DEFNS, str))), ((Relative) expr).getSteps());
141 private YangExpr parseExpr(final String xpath) throws XPathExpressionException {
142 return parser.parseExpression(xpath).getRootExpr();