Improve SchemaInferenceStack error reporting
[yangtools.git] / model / yang-model-util / src / test / java / org / opendaylight / yangtools / yang / model / util / SchemaInferenceStackTest.java
1 /*
2  * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
3  * Copyright (c) 2021 PANTHEON.tech, s.r.o.
4  *
5  * This program and the accompanying materials are made available under the
6  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
7  * and is available at http://www.eclipse.org/legal/epl-v10.html
8  */
9 package org.opendaylight.yangtools.yang.model.util;
10
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertNotNull;
13 import static org.junit.Assert.assertSame;
14 import static org.junit.Assert.assertThrows;
15 import static org.mockito.Mockito.doReturn;
16 import static org.mockito.Mockito.mock;
17
18 import org.junit.BeforeClass;
19 import org.junit.Test;
20 import org.opendaylight.yangtools.yang.common.QName;
21 import org.opendaylight.yangtools.yang.common.Revision;
22 import org.opendaylight.yangtools.yang.common.XMLNamespace;
23 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
24 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
25 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
26 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
27 import org.opendaylight.yangtools.yang.model.api.Module;
28 import org.opendaylight.yangtools.yang.model.api.PathExpression;
29 import org.opendaylight.yangtools.yang.model.api.PathExpression.LocationPathSteps;
30 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
31 import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
32 import org.opendaylight.yangtools.yang.xpath.api.YangLocationPath;
33 import org.opendaylight.yangtools.yang.xpath.api.YangXPathAxis;
34
35 public class SchemaInferenceStackTest {
36     private static EffectiveModelContext context;
37     private static Module myModule;
38
39     @BeforeClass
40     public static void beforeClass() {
41         context = YangParserTestUtils.parseYangResourceDirectory("/schema-context-util");
42         myModule = context.findModule(XMLNamespace.of("uri:my-module"), Revision.of("2014-10-07")).get();
43     }
44
45     @Test
46     public void findDataSchemaNodeTest() {
47         final Module importedModule = context.findModule(XMLNamespace.of("uri:imported-module"),
48             Revision.of("2014-10-07")).get();
49
50         final QName myImportedContainer = QName.create(importedModule.getQNameModule(), "my-imported-container");
51         final QName myImportedLeaf = QName.create(importedModule.getQNameModule(), "my-imported-leaf");
52
53         final SchemaNode testNode = ((ContainerSchemaNode) importedModule.getDataChildByName(myImportedContainer))
54             .getDataChildByName(myImportedLeaf);
55
56         final PathExpression expr = mock(PathExpression.class);
57         doReturn(true).when(expr).isAbsolute();
58         doReturn(new LocationPathSteps(YangLocationPath.absolute(
59             YangXPathAxis.CHILD.asStep(myImportedContainer), YangXPathAxis.CHILD.asStep(myImportedLeaf))))
60                 .when(expr).getSteps();
61
62         assertEquals(testNode, SchemaInferenceStack.of(context).resolvePathExpression(expr));
63     }
64
65     @Test
66     public void findDataSchemaNodeTest2() {
67         final QName myLeafInGrouping2 = QName.create(myModule.getQNameModule(), "my-leaf-in-gouping2");
68         final PathExpression expr = mock(PathExpression.class);
69         doReturn(true).when(expr).isAbsolute();
70         doReturn(new LocationPathSteps(YangLocationPath.relative(YangXPathAxis.CHILD.asStep(myLeafInGrouping2))))
71             .when(expr).getSteps();
72
73         final GroupingDefinition grouping = getGroupingByName(myModule, "my-grouping");
74         final SchemaInferenceStack stack = SchemaInferenceStack.of(context);
75         assertSame(grouping, stack.enterGrouping(grouping.getQName()));
76         assertEquals(grouping.getDataChildByName(myLeafInGrouping2), stack.resolvePathExpression(expr));
77     }
78
79     @Test
80     public void enterGroupingNegativeTest() {
81         final SchemaInferenceStack stack = SchemaInferenceStack.of(context);
82         assertNotExistentGrouping(stack, "module (uri:my-module?revision=2014-10-07)my-module");
83         stack.enterDataTree(QName.create(myModule.getQNameModule(), "my-container"));
84         assertNotExistentGrouping(stack, "schema parent (uri:my-module?revision=2014-10-07)my-container");
85     }
86
87     @Test
88     public void enterNestedTypedefTest() {
89         final SchemaInferenceStack stack = SchemaInferenceStack.of(context);
90         stack.enterDataTree(QName.create(myModule.getQNameModule(), "my-container"));
91         assertNotNull(stack.enterTypedef(QName.create(myModule.getQNameModule(), "my-typedef-in-container")));
92     }
93
94     @Test
95     public void enterTypedefNegativeTest() {
96         final SchemaInferenceStack stack = SchemaInferenceStack.of(context);
97         assertNotExistentTypedef(stack, "module (uri:my-module?revision=2014-10-07)my-module");
98         stack.enterDataTree(QName.create(myModule.getQNameModule(), "my-container"));
99         assertNotExistentTypedef(stack, "schema parent (uri:my-module?revision=2014-10-07)my-container");
100     }
101
102     private static void assertNotExistentGrouping(final SchemaInferenceStack stack, final String parentDesc) {
103         final QName nonExistent = QName.create(myModule.getQNameModule(), "non-existent");
104         assertEquals("Grouping (uri:my-module?revision=2014-10-07)non-existent not present in " + parentDesc,
105             assertThrows(IllegalArgumentException.class, () -> stack.enterGrouping(nonExistent)).getMessage());
106     }
107
108     private static void assertNotExistentTypedef(final SchemaInferenceStack stack, final String parentDesc) {
109         final QName nonExistent = QName.create(myModule.getQNameModule(), "non-existent");
110         assertEquals("Typedef (uri:my-module?revision=2014-10-07)non-existent not present in " + parentDesc,
111             assertThrows(IllegalArgumentException.class, () -> stack.enterTypedef(nonExistent)).getMessage());
112     }
113
114     private static GroupingDefinition getGroupingByName(final DataNodeContainer dataNodeContainer, final String name) {
115         for (final GroupingDefinition grouping : dataNodeContainer.getGroupings()) {
116             if (grouping.getQName().getLocalName().equals(name)) {
117                 return grouping;
118             }
119         }
120         return null;
121     }
122 }