2 * Copyright (c) 2016 Cisco Systems, Inc. and others. 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.stmt;
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;
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.common.Revision;
23 import org.opendaylight.yangtools.yang.common.XMLNamespace;
24 import org.opendaylight.yangtools.yang.model.api.AnydataSchemaNode;
25 import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode;
26 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
27 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
28 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
29 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
30 import org.opendaylight.yangtools.yang.model.api.Module;
31 import org.opendaylight.yangtools.yang.model.api.MustDefinition;
32 import org.opendaylight.yangtools.yang.model.api.Status;
33 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
34 import org.opendaylight.yangtools.yang.model.api.UsesNode;
36 class YangParserSimpleTest extends AbstractYangTest {
37 private static final XMLNamespace NS = XMLNamespace.of("urn:opendaylight:simple-nodes");
38 private static final QNameModule SN = QNameModule.create(NS, Revision.of("2013-07-30"));
39 private static final QName SN_NODES = QName.create(SN, "nodes");
41 private static Module MODULE;
44 static void beforeClass() throws Exception {
45 MODULE = assertEffectiveModelDir("/simple-test").findModules("simple-nodes").iterator().next();
49 void testParseAnyXml() {
50 final AnyxmlSchemaNode data = (AnyxmlSchemaNode) MODULE.getDataChildByName(
51 QName.create(MODULE.getQNameModule(), "data"));
52 assertNotEquals(null, data);
54 "RegularAnyxmlEffectiveStatement{argument=(urn:opendaylight:simple-nodes?revision=2013-07-30)data}",
57 // test SchemaNode args
58 assertEquals(QName.create(SN, "data"), data.getQName());
59 assertEquals(Optional.of("anyxml desc"), data.getDescription());
60 assertEquals(Optional.of("data ref"), data.getReference());
61 assertEquals(Status.OBSOLETE, data.getStatus());
62 assertEquals(0, data.getUnknownSchemaNodes().size());
63 // test DataSchemaNode args
64 assertFalse(data.isAugmenting());
65 assertEquals(Optional.of(Boolean.FALSE), data.effectiveConfig());
67 assertTrue(data.isMandatory());
68 assertEquals("class != 'wheel'", data.getWhenCondition().orElseThrow().toString());
69 final Collection<? extends MustDefinition> mustConstraints = data.getMustConstraints();
70 assertEquals(2, mustConstraints.size());
72 final String must1 = "ifType != 'ethernet' or (ifType = 'ethernet' and ifMTU = 1500)";
73 final String must2 = "ifType != 'atm' or (ifType = 'atm' and ifMTU <= 17966 and ifMTU >= 64)";
75 boolean found1 = false;
76 boolean found2 = false;
77 for (final MustDefinition must : mustConstraints) {
78 if (must1.equals(must.getXpath().toString())) {
80 assertEquals(Optional.of("An ethernet MTU must be 1500"), must.getErrorMessage());
81 } else if (must2.equals(must.getXpath().toString())) {
83 assertEquals(Optional.of("An atm MTU must be 64 .. 17966"), must.getErrorMessage());
84 assertEquals(Optional.of("anyxml data error-app-tag"), must.getErrorAppTag());
85 assertEquals(Optional.of("an error occured in data"), must.getDescription());
86 assertEquals(Optional.of("data must ref"), must.getReference());
94 void testParseAnyData() {
95 final AnydataSchemaNode anydata = (AnydataSchemaNode) MODULE.findDataChildByName(
96 QName.create(MODULE.getQNameModule(), "data2")).orElse(null);
98 assertNotNull(anydata, "'anydata data not found'");
100 "RegularAnydataEffectiveStatement{argument=(urn:opendaylight:simple-nodes?revision=2013-07-30)data2}",
103 // test SchemaNode args
104 assertEquals(QName.create(SN, "data2"), anydata.getQName());
105 assertEquals(Optional.of("anydata desc"), anydata.getDescription());
106 assertEquals(Optional.of("data ref"), anydata.getReference());
107 assertEquals(Status.OBSOLETE, anydata.getStatus());
108 assertEquals(0, anydata.getUnknownSchemaNodes().size());
109 // test DataSchemaNode args
110 assertFalse(anydata.isAugmenting());
111 assertEquals(Optional.of(Boolean.FALSE), anydata.effectiveConfig());
113 assertTrue(anydata.isMandatory());
114 assertTrue(anydata.getWhenCondition().isPresent());
115 assertEquals("class != 'wheel'", anydata.getWhenCondition().orElseThrow().toString());
116 final Collection<? extends MustDefinition> mustConstraints = anydata.getMustConstraints();
117 assertEquals(2, mustConstraints.size());
119 final String must1 = "ifType != 'ethernet' or (ifType = 'ethernet' and ifMTU = 1500)";
120 final String must2 = "ifType != 'atm' or (ifType = 'atm' and ifMTU <= 17966 and ifMTU >= 64)";
122 boolean found1 = false;
123 boolean found2 = false;
124 for (final MustDefinition must : mustConstraints) {
125 if (must1.equals(must.getXpath().toString())) {
127 assertEquals(Optional.of("An ethernet MTU must be 1500"), must.getErrorMessage());
128 } else if (must2.equals(must.getXpath().toString())) {
130 assertEquals(Optional.of("An atm MTU must be 64 .. 17966"), must.getErrorMessage());
131 assertEquals(Optional.of("anydata data error-app-tag"), must.getErrorAppTag());
132 assertEquals(Optional.of("an error occured in data"), must.getDescription());
133 assertEquals(Optional.of("data must ref"), must.getReference());
141 void testParseContainer() {
142 final ContainerSchemaNode nodes = (ContainerSchemaNode) MODULE
143 .getDataChildByName(QName.create(MODULE.getQNameModule(), "nodes"));
144 // test SchemaNode args
145 assertEquals(SN_NODES, nodes.getQName());
146 assertEquals(Optional.of("nodes collection"), nodes.getDescription());
147 assertEquals(Optional.of("nodes ref"), nodes.getReference());
148 assertEquals(Status.CURRENT, nodes.getStatus());
149 assertEquals(0, nodes.getUnknownSchemaNodes().size());
150 // test DataSchemaNode args
151 assertFalse(nodes.isAugmenting());
152 assertEquals(Optional.of(Boolean.FALSE), nodes.effectiveConfig());
155 assertEquals("class != 'wheel'", nodes.getWhenCondition().orElseThrow().toString());
156 final Collection<? extends MustDefinition> mustConstraints = nodes.getMustConstraints();
157 assertEquals(2, mustConstraints.size());
159 final String must1 = "ifType != 'atm' or (ifType = 'atm' and ifMTU <= 17966 and ifMTU >= 64)";
160 final String errMsg1 = "An atm MTU must be 64 .. 17966";
161 final String must2 = "ifId != 0";
163 boolean found1 = false;
164 boolean found2 = false;
165 for (final MustDefinition must : mustConstraints) {
166 if (must1.equals(must.getXpath().toString())) {
168 assertEquals(Optional.of(errMsg1), must.getErrorMessage());
169 } else if (must2.equals(must.getXpath().toString())) {
171 assertFalse(must.getErrorMessage().isPresent());
172 assertFalse(must.getErrorAppTag().isPresent());
173 assertFalse(must.getDescription().isPresent());
174 assertFalse(must.getReference().isPresent());
180 assertTrue(nodes.isPresenceContainer());
183 final Collection<? extends TypeDefinition<?>> typedefs = nodes.getTypeDefinitions();
184 assertEquals(1, typedefs.size());
185 final TypeDefinition<?> nodesType = typedefs.iterator().next();
186 final QName typedefQName = QName.create(SN, "nodes-type");
187 assertEquals(typedefQName, nodesType.getQName());
188 assertFalse(nodesType.getDescription().isPresent());
189 assertFalse(nodesType.getReference().isPresent());
190 assertEquals(Status.CURRENT, nodesType.getStatus());
191 assertEquals(0, nodesType.getUnknownSchemaNodes().size());
194 // total size = 8: defined 6, inserted by uses 2
195 assertEquals(8, nodes.getChildNodes().size());
196 final LeafListSchemaNode added = (LeafListSchemaNode) nodes.getDataChildByName(QName.create(
197 MODULE.getQNameModule(), "added"));
198 assertEquals(QName.create(SN, "added"), added.getQName());
199 assertEquals(QName.create(SN, "mytype"), added.getType().getQName());
201 final ListSchemaNode links = (ListSchemaNode) nodes.getDataChildByName(QName.create(
202 MODULE.getQNameModule(), "links"));
203 assertFalse(links.isUserOrdered());
205 final Collection<? extends GroupingDefinition> groupings = nodes.getGroupings();
206 assertEquals(1, groupings.size());
207 final GroupingDefinition nodeGroup = groupings.iterator().next();
208 assertEquals(QName.create(SN, "node-group"), nodeGroup.getQName());
210 final Collection<? extends UsesNode> uses = nodes.getUses();
211 assertEquals(1, uses.size());
212 final UsesNode use = uses.iterator().next();
213 assertEquals(nodeGroup, use.getSourceGrouping());