2342cd28440f2c7d5aa83decf17cd7fdb630c0cd
[yangtools.git] / yang / yang-xpath-impl / src / test / java / org / opendaylight / yangtools / yang / xpath / impl / XPathParserTest.java
1 /*
2  * Copyright (c) 2018 Pantheon Technologies, s.r.o.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.yangtools.yang.xpath.impl;
9
10 import static org.hamcrest.MatcherAssert.assertThat;
11 import static org.hamcrest.Matchers.isA;
12 import static org.junit.Assert.assertEquals;
13
14 import com.google.common.collect.ImmutableBiMap;
15 import java.net.URI;
16 import javax.xml.xpath.XPathExpressionException;
17 import org.eclipse.jdt.annotation.Nullable;
18 import org.junit.Before;
19 import org.junit.Test;
20 import org.opendaylight.yangtools.yang.common.BiMapYangNamespaceContext;
21 import org.opendaylight.yangtools.yang.common.QName;
22 import org.opendaylight.yangtools.yang.common.QNameModule;
23 import org.opendaylight.yangtools.yang.common.YangNamespaceContext;
24 import org.opendaylight.yangtools.yang.xpath.api.YangBinaryExpr;
25 import org.opendaylight.yangtools.yang.xpath.api.YangBinaryOperator;
26 import org.opendaylight.yangtools.yang.xpath.api.YangBooleanConstantExpr;
27 import org.opendaylight.yangtools.yang.xpath.api.YangExpr;
28 import org.opendaylight.yangtools.yang.xpath.api.YangLocationPath;
29 import org.opendaylight.yangtools.yang.xpath.api.YangXPathAxis;
30 import org.opendaylight.yangtools.yang.xpath.api.YangXPathMathMode;
31
32 @SuppressWarnings("null")
33 public class XPathParserTest {
34     private static final QNameModule DEFNS = QNameModule.create(URI.create("defaultns"));
35     private static final YangNamespaceContext CONTEXT = new BiMapYangNamespaceContext(ImmutableBiMap.of(
36         "def", DEFNS,
37         "foo", QNameModule.create(URI.create("foo")),
38         "bar", QNameModule.create(URI.create("bar"))));
39
40     private @Nullable AntlrXPathParser parser;
41
42     @Before
43     public void before() {
44         parser = new AntlrXPathParser.Unqualified(YangXPathMathMode.IEEE754, CONTEXT, DEFNS);
45     }
46
47     @Test
48     public void testSmoke() throws XPathExpressionException {
49         parseExpr("../a[foo = current()/foo]");
50
51         parseExpr("3 + 5");
52         parseExpr("/a/b");
53         parseExpr("a/b");
54         parseExpr("./a/b");
55         parseExpr("../a/b");
56         parseExpr("foo:foo");
57         parseExpr("@foo");
58         parseExpr("@foo:foo");
59         parseExpr("current()");
60         parseExpr("foo:self()");
61         parseExpr("foo:comment()");
62         parseExpr("/a[foo = 2 and bar = 3]");
63         parseExpr("/a[foo = \"2\" and bar = '3']");
64         parseExpr("/foo:a[foo = 2 and bar = 3]");
65         parseExpr("//a[foo = 2 and bar = 3]");
66         parseExpr("//foo:a[foo=2 and bar:bar=3]");
67         parseExpr("a//b[foo = 2]");
68         parseExpr("foo:a//b[foo = 2]");
69         parseExpr("$foo:comment");
70         parseExpr("$comment");
71         parseExpr("$self");
72     }
73
74     @Test
75     public void testUnionSquashing() throws XPathExpressionException {
76         final YangExpr a = parseExpr("a");
77         assertEquals(a, parseExpr("a|a"));
78         assertEquals(a, parseExpr("a|a|a"));
79         assertEquals(a, parseExpr("a|a|a|a"));
80
81         final YangExpr ab = parseExpr("a|b");
82         assertEquals(ab, parseExpr("a|b|a"));
83         assertEquals(ab, parseExpr("a|b|a|b"));
84         assertEquals(ab, parseExpr("a|a|b|a|b"));
85         assertEquals(ab, parseExpr("a|b|b|a|b"));
86         assertEquals(ab, parseExpr("a|b|a|a|b"));
87     }
88
89     @Test
90     public void testNumberSquashing() throws XPathExpressionException {
91         final YangExpr two = parseExpr("2");
92         assertEquals(two, parseExpr("1 + 1"));
93         assertEquals(two, parseExpr("3 - 1"));
94         assertEquals(two, parseExpr("2 * 1"));
95         assertEquals(two, parseExpr("4 div 2"));
96         assertEquals(two, parseExpr("6 mod 4"));
97     }
98
99     @Test
100     public void testSameExprSquashing() throws XPathExpressionException {
101         // Expressions
102         assertEquals(YangBooleanConstantExpr.FALSE, parseExpr("/a != /a"));
103         assertEquals(YangBooleanConstantExpr.TRUE, parseExpr("/a = /a"));
104
105         // Numbers
106         assertEquals(YangBooleanConstantExpr.FALSE, parseExpr("2 != 2"));
107         assertEquals(YangBooleanConstantExpr.FALSE, parseExpr("2 != (1 + 1)"));
108         assertEquals(YangBooleanConstantExpr.TRUE, parseExpr("2 = 2"));
109         assertEquals(YangBooleanConstantExpr.TRUE, parseExpr("2 = (1 + 1)"));
110     }
111
112     @Test
113     public void testGreaterEqualReference() throws XPathExpressionException {
114         final YangExpr expr = parseExpr(". >= ../lower-port");
115         assertThat(expr, isA(YangBinaryExpr.class));
116
117         final YangBinaryExpr binary = (YangBinaryExpr) expr;
118         assertEquals(YangBinaryOperator.GTE, binary.getOperator());
119         assertEquals(YangLocationPath.self(), binary.getLeftExpr());
120         assertEquals(YangLocationPath.relative(YangXPathAxis.PARENT.asStep(),
121             YangXPathAxis.CHILD.asStep(QName.create(DEFNS, "lower-port"))), binary.getRightExpr());
122     }
123
124     private YangExpr parseExpr(final String xpath) throws XPathExpressionException {
125         return parser.parseExpression(xpath).getRootExpr();
126     }
127 }