Deprecate simple DataTreeFactory.create()
[yangtools.git] / parser / yang-parser-rfc7950 / src / test / java / org / opendaylight / yangtools / yang / stmt / YangParserSimpleTest.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. and others.  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.stmt;
9
10 import static org.junit.jupiter.api.Assertions.assertEquals;
11 import static org.junit.jupiter.api.Assertions.assertFalse;
12 import static org.junit.jupiter.api.Assertions.assertNotEquals;
13 import static org.junit.jupiter.api.Assertions.assertNotNull;
14 import static org.junit.jupiter.api.Assertions.assertTrue;
15
16 import java.util.Collection;
17 import java.util.Optional;
18 import org.junit.jupiter.api.BeforeAll;
19 import org.junit.jupiter.api.Test;
20 import org.opendaylight.yangtools.yang.common.QName;
21 import org.opendaylight.yangtools.yang.common.QNameModule;
22 import org.opendaylight.yangtools.yang.model.api.AnydataSchemaNode;
23 import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode;
24 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
25 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
26 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
27 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
28 import org.opendaylight.yangtools.yang.model.api.Module;
29 import org.opendaylight.yangtools.yang.model.api.MustDefinition;
30 import org.opendaylight.yangtools.yang.model.api.Status;
31 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
32 import org.opendaylight.yangtools.yang.model.api.UsesNode;
33
34 class YangParserSimpleTest extends AbstractYangTest {
35     private static final QNameModule SN = QNameModule.of("urn:opendaylight:simple-nodes", "2013-07-30");
36     private static final QName SN_NODES = QName.create(SN, "nodes");
37
38     private static Module MODULE;
39
40     @BeforeAll
41     static void beforeClass() throws Exception {
42         MODULE = assertEffectiveModelDir("/simple-test").findModules("simple-nodes").iterator().next();
43     }
44
45     @Test
46     void testParseAnyXml() {
47         final AnyxmlSchemaNode data = (AnyxmlSchemaNode) MODULE.getDataChildByName(
48             QName.create(MODULE.getQNameModule(), "data"));
49         assertNotEquals(null, data);
50         assertEquals(
51             "RegularAnyxmlEffectiveStatement{argument=(urn:opendaylight:simple-nodes?revision=2013-07-30)data}",
52             data.toString());
53
54         // test SchemaNode args
55         assertEquals(QName.create(SN, "data"), data.getQName());
56         assertEquals(Optional.of("anyxml desc"), data.getDescription());
57         assertEquals(Optional.of("data ref"), data.getReference());
58         assertEquals(Status.OBSOLETE, data.getStatus());
59         assertEquals(0, data.getUnknownSchemaNodes().size());
60         // test DataSchemaNode args
61         assertFalse(data.isAugmenting());
62         assertEquals(Optional.of(Boolean.FALSE), data.effectiveConfig());
63
64         assertTrue(data.isMandatory());
65         assertEquals("class != 'wheel'", data.getWhenCondition().orElseThrow().toString());
66         final Collection<? extends MustDefinition> mustConstraints = data.getMustConstraints();
67         assertEquals(2, mustConstraints.size());
68
69         final String must1 = "ifType != 'ethernet' or (ifType = 'ethernet' and ifMTU = 1500)";
70         final String must2 = "ifType != 'atm' or (ifType = 'atm' and ifMTU <= 17966 and ifMTU >= 64)";
71
72         boolean found1 = false;
73         boolean found2 = false;
74         for (final MustDefinition must : mustConstraints) {
75             if (must1.equals(must.getXpath().toString())) {
76                 found1 = true;
77                 assertEquals(Optional.of("An ethernet MTU must be 1500"), must.getErrorMessage());
78             } else if (must2.equals(must.getXpath().toString())) {
79                 found2 = true;
80                 assertEquals(Optional.of("An atm MTU must be  64 .. 17966"), must.getErrorMessage());
81                 assertEquals(Optional.of("anyxml data error-app-tag"), must.getErrorAppTag());
82                 assertEquals(Optional.of("an error occured in data"), must.getDescription());
83                 assertEquals(Optional.of("data must ref"), must.getReference());
84             }
85         }
86         assertTrue(found1);
87         assertTrue(found2);
88     }
89
90     @Test
91     void testParseAnyData() {
92         final AnydataSchemaNode anydata = (AnydataSchemaNode) MODULE.findDataChildByName(
93             QName.create(MODULE.getQNameModule(), "data2")).orElse(null);
94
95         assertNotNull(anydata, "'anydata data not found'");
96         assertEquals(
97             "RegularAnydataEffectiveStatement{argument=(urn:opendaylight:simple-nodes?revision=2013-07-30)data2}",
98             anydata.toString());
99
100         // test SchemaNode args
101         assertEquals(QName.create(SN, "data2"), anydata.getQName());
102         assertEquals(Optional.of("anydata desc"), anydata.getDescription());
103         assertEquals(Optional.of("data ref"), anydata.getReference());
104         assertEquals(Status.OBSOLETE, anydata.getStatus());
105         assertEquals(0, anydata.getUnknownSchemaNodes().size());
106         // test DataSchemaNode args
107         assertFalse(anydata.isAugmenting());
108         assertEquals(Optional.of(Boolean.FALSE), anydata.effectiveConfig());
109
110         assertTrue(anydata.isMandatory());
111         assertTrue(anydata.getWhenCondition().isPresent());
112         assertEquals("class != 'wheel'", anydata.getWhenCondition().orElseThrow().toString());
113         final Collection<? extends MustDefinition> mustConstraints = anydata.getMustConstraints();
114         assertEquals(2, mustConstraints.size());
115
116         final String must1 = "ifType != 'ethernet' or (ifType = 'ethernet' and ifMTU = 1500)";
117         final String must2 = "ifType != 'atm' or (ifType = 'atm' and ifMTU <= 17966 and ifMTU >= 64)";
118
119         boolean found1 = false;
120         boolean found2 = false;
121         for (final MustDefinition must : mustConstraints) {
122             if (must1.equals(must.getXpath().toString())) {
123                 found1 = true;
124                 assertEquals(Optional.of("An ethernet MTU must be 1500"), must.getErrorMessage());
125             } else if (must2.equals(must.getXpath().toString())) {
126                 found2 = true;
127                 assertEquals(Optional.of("An atm MTU must be  64 .. 17966"), must.getErrorMessage());
128                 assertEquals(Optional.of("anydata data error-app-tag"), must.getErrorAppTag());
129                 assertEquals(Optional.of("an error occured in data"), must.getDescription());
130                 assertEquals(Optional.of("data must ref"), must.getReference());
131             }
132         }
133         assertTrue(found1);
134         assertTrue(found2);
135     }
136
137     @Test
138     void testParseContainer() {
139         final ContainerSchemaNode nodes = (ContainerSchemaNode) MODULE
140             .getDataChildByName(QName.create(MODULE.getQNameModule(), "nodes"));
141         // test SchemaNode args
142         assertEquals(SN_NODES, nodes.getQName());
143         assertEquals(Optional.of("nodes collection"), nodes.getDescription());
144         assertEquals(Optional.of("nodes ref"), nodes.getReference());
145         assertEquals(Status.CURRENT, nodes.getStatus());
146         assertEquals(0, nodes.getUnknownSchemaNodes().size());
147         // test DataSchemaNode args
148         assertFalse(nodes.isAugmenting());
149         assertEquals(Optional.of(Boolean.FALSE), nodes.effectiveConfig());
150
151         // constraints
152         assertEquals("class != 'wheel'", nodes.getWhenCondition().orElseThrow().toString());
153         final Collection<? extends MustDefinition> mustConstraints = nodes.getMustConstraints();
154         assertEquals(2, mustConstraints.size());
155
156         final String must1 = "ifType != 'atm' or (ifType = 'atm' and ifMTU <= 17966 and ifMTU >= 64)";
157         final String errMsg1 = "An atm MTU must be  64 .. 17966";
158         final String must2 = "ifId != 0";
159
160         boolean found1 = false;
161         boolean found2 = false;
162         for (final MustDefinition must : mustConstraints) {
163             if (must1.equals(must.getXpath().toString())) {
164                 found1 = true;
165                 assertEquals(Optional.of(errMsg1), must.getErrorMessage());
166             } else if (must2.equals(must.getXpath().toString())) {
167                 found2 = true;
168                 assertFalse(must.getErrorMessage().isPresent());
169                 assertFalse(must.getErrorAppTag().isPresent());
170                 assertFalse(must.getDescription().isPresent());
171                 assertFalse(must.getReference().isPresent());
172             }
173         }
174         assertTrue(found1);
175         assertTrue(found2);
176
177         assertTrue(nodes.isPresenceContainer());
178
179         // typedef
180         final Collection<? extends TypeDefinition<?>> typedefs = nodes.getTypeDefinitions();
181         assertEquals(1, typedefs.size());
182         final TypeDefinition<?> nodesType = typedefs.iterator().next();
183         final QName typedefQName = QName.create(SN, "nodes-type");
184         assertEquals(typedefQName, nodesType.getQName());
185         assertFalse(nodesType.getDescription().isPresent());
186         assertFalse(nodesType.getReference().isPresent());
187         assertEquals(Status.CURRENT, nodesType.getStatus());
188         assertEquals(0, nodesType.getUnknownSchemaNodes().size());
189
190         // child nodes
191         // total size = 8: defined 6, inserted by uses 2
192         assertEquals(8, nodes.getChildNodes().size());
193         final LeafListSchemaNode added = (LeafListSchemaNode) nodes.getDataChildByName(QName.create(
194             MODULE.getQNameModule(), "added"));
195         assertEquals(QName.create(SN, "added"), added.getQName());
196         assertEquals(QName.create(SN, "mytype"), added.getType().getQName());
197
198         final ListSchemaNode links = (ListSchemaNode) nodes.getDataChildByName(QName.create(
199             MODULE.getQNameModule(), "links"));
200         assertFalse(links.isUserOrdered());
201
202         final Collection<? extends GroupingDefinition> groupings = nodes.getGroupings();
203         assertEquals(1, groupings.size());
204         final GroupingDefinition nodeGroup = groupings.iterator().next();
205         assertEquals(QName.create(SN, "node-group"), nodeGroup.getQName());
206
207         final Collection<? extends UsesNode> uses = nodes.getUses();
208         assertEquals(1, uses.size());
209         final UsesNode use = uses.iterator().next();
210         assertEquals(nodeGroup, use.getSourceGrouping());
211     }
212 }