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.junit.Assert.assertEquals;
12 import com.google.common.collect.ImmutableBiMap;
14 import javax.xml.xpath.XPathExpressionException;
15 import org.eclipse.jdt.annotation.Nullable;
16 import org.junit.Before;
17 import org.junit.Test;
18 import org.opendaylight.yangtools.yang.common.BiMapYangNamespaceContext;
19 import org.opendaylight.yangtools.yang.common.QNameModule;
20 import org.opendaylight.yangtools.yang.common.YangNamespaceContext;
21 import org.opendaylight.yangtools.yang.xpath.api.YangBooleanConstantExpr;
22 import org.opendaylight.yangtools.yang.xpath.api.YangExpr;
23 import org.opendaylight.yangtools.yang.xpath.api.YangXPathMathMode;
25 @SuppressWarnings("null")
26 public class XPathParserTest {
27 private static final QNameModule DEFNS = QNameModule.create(URI.create("defaultns"));
28 private static final YangNamespaceContext CONTEXT = new BiMapYangNamespaceContext(ImmutableBiMap.of(
30 "foo", QNameModule.create(URI.create("foo")),
31 "bar", QNameModule.create(URI.create("bar"))), DEFNS);
33 private @Nullable AntlrXPathParser parser;
36 public void before() {
37 parser = new AntlrXPathParser(YangXPathMathMode.IEEE754, CONTEXT);
41 public void testSmoke() throws XPathExpressionException {
49 parseExpr("@foo:foo");
50 parseExpr("current()");
51 parseExpr("foo:self()");
52 parseExpr("foo:comment()");
53 parseExpr("/a[foo = 2 and bar = 3]");
54 parseExpr("/a[foo = \"2\" and bar = '3']");
55 parseExpr("/foo:a[foo = 2 and bar = 3]");
56 parseExpr("//a[foo = 2 and bar = 3]");
57 parseExpr("//foo:a[foo=2 and bar:bar=3]");
58 parseExpr("a//b[foo = 2]");
59 parseExpr("foo:a//b[foo = 2]");
60 parseExpr("$foo:comment");
61 parseExpr("$comment");
66 public void testUnionSquashing() throws XPathExpressionException {
67 final YangExpr a = parseExpr("a");
68 assertEquals(a, parseExpr("a|a"));
69 assertEquals(a, parseExpr("a|a|a"));
70 assertEquals(a, parseExpr("a|a|a|a"));
72 final YangExpr ab = parseExpr("a|b");
73 assertEquals(ab, parseExpr("a|b|a"));
74 assertEquals(ab, parseExpr("a|b|a|b"));
75 assertEquals(ab, parseExpr("a|a|b|a|b"));
76 assertEquals(ab, parseExpr("a|b|b|a|b"));
77 assertEquals(ab, parseExpr("a|b|a|a|b"));
81 public void testNumberSquashing() throws XPathExpressionException {
82 final YangExpr two = parseExpr("2");
83 assertEquals(two, parseExpr("1 + 1"));
84 assertEquals(two, parseExpr("3 - 1"));
85 assertEquals(two, parseExpr("2 * 1"));
86 assertEquals(two, parseExpr("4 div 2"));
87 assertEquals(two, parseExpr("6 mod 4"));
91 public void testSameExprSquashing() throws XPathExpressionException {
93 assertEquals(YangBooleanConstantExpr.FALSE, parseExpr("/a != /a"));
94 assertEquals(YangBooleanConstantExpr.TRUE, parseExpr("/a = /a"));
97 assertEquals(YangBooleanConstantExpr.FALSE, parseExpr("2 != 2"));
98 assertEquals(YangBooleanConstantExpr.FALSE, parseExpr("2 != (1 + 1)"));
99 assertEquals(YangBooleanConstantExpr.TRUE, parseExpr("2 = 2"));
100 assertEquals(YangBooleanConstantExpr.TRUE, parseExpr("2 = (1 + 1)"));
103 private YangExpr parseExpr(final String xpath) throws XPathExpressionException {
104 return parser.parseExpression(xpath).getRootExpr();