Merge branch 'master' of ../controller
[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.junit.Assert.assertEquals;
11
12 import com.google.common.collect.ImmutableBiMap;
13 import java.net.URI;
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;
24
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(
29         "def", DEFNS,
30         "foo", QNameModule.create(URI.create("foo")),
31         "bar", QNameModule.create(URI.create("bar"))));
32
33     private @Nullable AntlrXPathParser parser;
34
35     @Before
36     public void before() {
37         parser = new AntlrXPathParser.Unqualified(YangXPathMathMode.IEEE754, CONTEXT, DEFNS);
38     }
39
40     @Test
41     public void testSmoke() throws XPathExpressionException {
42         parseExpr("../a[foo = current()/foo]");
43
44         parseExpr("3 + 5");
45         parseExpr("/a/b");
46         parseExpr("a/b");
47         parseExpr("./a/b");
48         parseExpr("../a/b");
49         parseExpr("foo:foo");
50         parseExpr("@foo");
51         parseExpr("@foo:foo");
52         parseExpr("current()");
53         parseExpr("foo:self()");
54         parseExpr("foo:comment()");
55         parseExpr("/a[foo = 2 and bar = 3]");
56         parseExpr("/a[foo = \"2\" and bar = '3']");
57         parseExpr("/foo:a[foo = 2 and bar = 3]");
58         parseExpr("//a[foo = 2 and bar = 3]");
59         parseExpr("//foo:a[foo=2 and bar:bar=3]");
60         parseExpr("a//b[foo = 2]");
61         parseExpr("foo:a//b[foo = 2]");
62         parseExpr("$foo:comment");
63         parseExpr("$comment");
64         parseExpr("$self");
65     }
66
67     @Test
68     public void testUnionSquashing() throws XPathExpressionException {
69         final YangExpr a = parseExpr("a");
70         assertEquals(a, parseExpr("a|a"));
71         assertEquals(a, parseExpr("a|a|a"));
72         assertEquals(a, parseExpr("a|a|a|a"));
73
74         final YangExpr ab = parseExpr("a|b");
75         assertEquals(ab, parseExpr("a|b|a"));
76         assertEquals(ab, parseExpr("a|b|a|b"));
77         assertEquals(ab, parseExpr("a|a|b|a|b"));
78         assertEquals(ab, parseExpr("a|b|b|a|b"));
79         assertEquals(ab, parseExpr("a|b|a|a|b"));
80     }
81
82     @Test
83     public void testNumberSquashing() throws XPathExpressionException {
84         final YangExpr two = parseExpr("2");
85         assertEquals(two, parseExpr("1 + 1"));
86         assertEquals(two, parseExpr("3 - 1"));
87         assertEquals(two, parseExpr("2 * 1"));
88         assertEquals(two, parseExpr("4 div 2"));
89         assertEquals(two, parseExpr("6 mod 4"));
90     }
91
92     @Test
93     public void testSameExprSquashing() throws XPathExpressionException {
94         // Expressions
95         assertEquals(YangBooleanConstantExpr.FALSE, parseExpr("/a != /a"));
96         assertEquals(YangBooleanConstantExpr.TRUE, parseExpr("/a = /a"));
97
98         // Numbers
99         assertEquals(YangBooleanConstantExpr.FALSE, parseExpr("2 != 2"));
100         assertEquals(YangBooleanConstantExpr.FALSE, parseExpr("2 != (1 + 1)"));
101         assertEquals(YangBooleanConstantExpr.TRUE, parseExpr("2 = 2"));
102         assertEquals(YangBooleanConstantExpr.TRUE, parseExpr("2 = (1 + 1)"));
103     }
104
105     private YangExpr parseExpr(final String xpath) throws XPathExpressionException {
106         return parser.parseExpression(xpath).getRootExpr();
107     }
108 }