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.hamcrest.CoreMatchers.instanceOf;
11 import static org.hamcrest.CoreMatchers.startsWith;
12 import static org.hamcrest.MatcherAssert.assertThat;
13 import static org.junit.Assert.assertEquals;
14 import static org.junit.Assert.assertFalse;
15 import static org.junit.Assert.assertNotNull;
16 import static org.junit.Assert.assertNull;
17 import static org.junit.Assert.assertThrows;
18 import static org.junit.Assert.assertTrue;
20 import com.google.common.collect.Range;
21 import com.google.common.collect.RangeSet;
22 import java.text.ParseException;
23 import java.util.ArrayList;
24 import java.util.Collection;
25 import java.util.List;
26 import java.util.Optional;
27 import org.junit.Test;
28 import org.opendaylight.yangtools.yang.common.QName;
29 import org.opendaylight.yangtools.yang.common.Revision;
30 import org.opendaylight.yangtools.yang.common.UnresolvedQName.Unqualified;
31 import org.opendaylight.yangtools.yang.common.XMLNamespace;
32 import org.opendaylight.yangtools.yang.common.YangVersion;
33 import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
34 import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode;
35 import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
36 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
37 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
38 import org.opendaylight.yangtools.yang.model.api.DeviateKind;
39 import org.opendaylight.yangtools.yang.model.api.Deviation;
40 import org.opendaylight.yangtools.yang.model.api.ElementCountConstraint;
41 import org.opendaylight.yangtools.yang.model.api.ExtensionDefinition;
42 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
43 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
44 import org.opendaylight.yangtools.yang.model.api.ModuleImport;
45 import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
46 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
47 import org.opendaylight.yangtools.yang.model.api.Status;
48 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
49 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
50 import org.opendaylight.yangtools.yang.model.api.stmt.UnrecognizedStatement;
51 import org.opendaylight.yangtools.yang.model.api.type.DecimalTypeDefinition;
52 import org.opendaylight.yangtools.yang.model.api.type.Int16TypeDefinition;
53 import org.opendaylight.yangtools.yang.model.api.type.Int32TypeDefinition;
54 import org.opendaylight.yangtools.yang.model.api.type.PatternConstraint;
55 import org.opendaylight.yangtools.yang.model.api.type.StringTypeDefinition;
56 import org.opendaylight.yangtools.yang.model.api.type.TypeDefinitions;
57 import org.opendaylight.yangtools.yang.model.api.type.Uint32TypeDefinition;
58 import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition;
59 import org.opendaylight.yangtools.yang.model.ri.type.BaseTypes;
60 import org.opendaylight.yangtools.yang.parser.spi.meta.SomeModifiersUnresolvedException;
61 import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
63 public class YangParserTest extends AbstractModelTest {
65 public void testHeaders() throws ParseException {
66 assertEquals("foo", FOO.getName());
67 assertEquals(YangVersion.VERSION_1, FOO.getYangVersion());
68 assertEquals(XMLNamespace.of("urn:opendaylight.foo"), FOO.getNamespace());
69 assertEquals("foo", FOO.getPrefix());
71 final Collection<? extends ModuleImport> imports = FOO.getImports();
72 assertEquals(2, imports.size());
74 final ModuleImport import2 = TestUtils.findImport(imports, "br");
75 assertEquals(Unqualified.of("bar"), import2.getModuleName());
76 assertEquals(Revision.ofNullable("2013-07-03"), import2.getRevision());
78 final ModuleImport import3 = TestUtils.findImport(imports, "bz");
79 assertEquals(Unqualified.of("baz"), import3.getModuleName());
80 assertEquals(Revision.ofNullable("2013-02-27"), import3.getRevision());
82 assertEquals(Optional.of("opendaylight"), FOO.getOrganization());
83 assertEquals(Optional.of("http://www.opendaylight.org/"), FOO.getContact());
84 assertEquals(Revision.ofNullable("2013-02-27"), FOO.getRevision());
85 assertFalse(FOO.getReference().isPresent());
89 public void testParseList() {
90 final ContainerSchemaNode interfaces = (ContainerSchemaNode) BAR.getDataChildByName(barQName("interfaces"));
91 final ListSchemaNode ifEntry = (ListSchemaNode) interfaces.getDataChildByName(barQName("ifEntry"));
92 // test SchemaNode args
93 assertEquals(barQName("ifEntry"), ifEntry.getQName());
95 assertFalse(ifEntry.getDescription().isPresent());
96 assertFalse(ifEntry.getReference().isPresent());
97 assertEquals(Status.CURRENT, ifEntry.getStatus());
98 assertEquals(0, ifEntry.getUnknownSchemaNodes().size());
99 // test DataSchemaNode args
100 assertFalse(ifEntry.isAugmenting());
101 assertEquals(Optional.of(Boolean.TRUE), ifEntry.effectiveConfig());
102 // :TODO augment to ifEntry have when condition and so in consequence
103 // ifEntry should be a context node ?
104 // assertNull(constraints.getWhenCondition());
105 assertEquals(0, ifEntry.getMustConstraints().size());
106 ElementCountConstraint constraints = ifEntry.getElementCountConstraint().orElseThrow();
107 assertEquals((Object) 1, constraints.getMinElements());
108 assertEquals((Object) 11, constraints.getMaxElements());
109 // test AugmentationTarget args
110 final Collection<? extends AugmentationSchemaNode> availableAugmentations = ifEntry.getAvailableAugmentations();
111 assertEquals(2, availableAugmentations.size());
112 // test ListSchemaNode args
113 final List<QName> expectedKey = new ArrayList<>();
114 expectedKey.add(barQName("ifIndex"));
115 assertEquals(expectedKey, ifEntry.getKeyDefinition());
116 assertFalse(ifEntry.isUserOrdered());
117 // test DataNodeContainer args
118 assertEquals(0, ifEntry.getTypeDefinitions().size());
119 assertEquals(4, ifEntry.getChildNodes().size());
120 assertEquals(0, ifEntry.getGroupings().size());
121 assertEquals(0, ifEntry.getUses().size());
123 final LeafSchemaNode ifIndex = (LeafSchemaNode) ifEntry.getDataChildByName(barQName("ifIndex"));
124 assertEquals(ifEntry.getKeyDefinition().get(0), ifIndex.getQName());
125 assertTrue(ifIndex.getType() instanceof Uint32TypeDefinition);
126 assertEquals(Optional.of("minutes"), ifIndex.getType().getUnits());
127 final LeafSchemaNode ifMtu = (LeafSchemaNode) ifEntry.getDataChildByName(barQName("ifMtu"));
128 assertEquals(BaseTypes.int32Type(), ifMtu.getType());
132 public void testTypedefRangesResolving() throws ParseException {
133 final LeafSchemaNode int32Leaf = (LeafSchemaNode) FOO.getDataChildByName(fooQName("int32-leaf"));
135 final Int32TypeDefinition leafType = (Int32TypeDefinition) int32Leaf.getType();
136 assertEquals(fooQName("int32-ext2"), leafType.getQName());
137 assertEquals(Optional.of("mile"), leafType.getUnits());
138 assertEquals(Optional.of("11"), leafType.getDefaultValue());
140 final var ranges = leafType.getRangeConstraint().orElseThrow().getAllowedRanges().asRanges();
141 assertEquals(1, ranges.size());
143 final var range = ranges.iterator().next();
144 assertEquals(12, range.lowerEndpoint().intValue());
145 assertEquals(20, range.upperEndpoint().intValue());
147 final Int32TypeDefinition firstBaseType = leafType.getBaseType();
148 assertEquals(barQName("int32-ext2"), firstBaseType.getQName());
149 assertEquals(Optional.of("mile"), firstBaseType.getUnits());
150 assertEquals(Optional.of("11"), firstBaseType.getDefaultValue());
152 final var baseRanges = firstBaseType.getRangeConstraint().orElseThrow().getAllowedRanges().asRanges();
153 assertEquals(2, baseRanges.size());
155 final var it = baseRanges.iterator();
156 final var baseTypeRange1 = it.next();
157 assertEquals(3, baseTypeRange1.lowerEndpoint().intValue());
158 assertEquals(9, baseTypeRange1.upperEndpoint().intValue());
159 final var baseTypeRange2 = it.next();
160 assertEquals(11, baseTypeRange2.lowerEndpoint().intValue());
161 assertEquals(20, baseTypeRange2.upperEndpoint().intValue());
163 final Int32TypeDefinition secondBaseType = firstBaseType.getBaseType();
164 assertEquals(barQName("int32-ext1"), secondBaseType.getQName());
165 assertEquals(Optional.empty(), secondBaseType.getUnits());
166 assertEquals(Optional.empty(), secondBaseType.getDefaultValue());
168 final var secondRanges = secondBaseType.getRangeConstraint().orElseThrow().getAllowedRanges().asRanges();
169 assertEquals(1, secondRanges.size());
170 final var secondRange = secondRanges.iterator().next();
171 assertEquals(2, secondRange.lowerEndpoint().intValue());
172 assertEquals(20, secondRange.upperEndpoint().intValue());
174 assertEquals(BaseTypes.int32Type(), secondBaseType.getBaseType());
178 public void testTypedefPatternsResolving() {
179 final LeafSchemaNode stringleaf = (LeafSchemaNode) FOO.getDataChildByName(fooQName("string-leaf"));
181 assertTrue(stringleaf.getType() instanceof StringTypeDefinition);
182 final StringTypeDefinition type = (StringTypeDefinition) stringleaf.getType();
183 assertEquals(barQName("string-ext4"), type.getQName());
184 assertEquals(Optional.empty(), type.getUnits());
185 assertEquals(Optional.empty(), type.getDefaultValue());
186 List<PatternConstraint> patterns = type.getPatternConstraints();
187 assertEquals(1, patterns.size());
188 PatternConstraint pattern = patterns.iterator().next();
189 assertEquals("^(?:[e-z]*)$", pattern.getJavaPatternString());
190 assertEquals(1, type.getLengthConstraint().orElseThrow().getAllowedRanges().asRanges().size());
192 final StringTypeDefinition baseType1 = type.getBaseType();
193 assertEquals(barQName("string-ext3"), baseType1.getQName());
194 assertEquals(Optional.empty(), baseType1.getUnits());
195 assertEquals(Optional.empty(), baseType1.getDefaultValue());
196 patterns = baseType1.getPatternConstraints();
197 assertEquals(1, patterns.size());
198 pattern = patterns.iterator().next();
199 assertEquals("^(?:[b-u]*)$", pattern.getJavaPatternString());
200 assertEquals(1, baseType1.getLengthConstraint().orElseThrow().getAllowedRanges().asRanges().size());
202 final StringTypeDefinition baseType2 = baseType1.getBaseType();
203 assertEquals(barQName("string-ext2"), baseType2.getQName());
204 assertEquals(Optional.empty(), baseType2.getUnits());
205 assertEquals(Optional.empty(), baseType2.getDefaultValue());
206 assertTrue(baseType2.getPatternConstraints().isEmpty());
207 final RangeSet<Integer> baseType2Lengths = baseType2.getLengthConstraint().orElseThrow().getAllowedRanges();
208 assertEquals(1, baseType2Lengths.asRanges().size());
209 Range<Integer> length = baseType2Lengths.span();
210 assertEquals(6, length.lowerEndpoint().intValue());
211 assertEquals(10, length.upperEndpoint().intValue());
213 final StringTypeDefinition baseType3 = baseType2.getBaseType();
214 assertEquals(barQName("string-ext1"), baseType3.getQName());
215 assertEquals(Optional.empty(), baseType3.getUnits());
216 assertEquals(Optional.empty(), baseType3.getDefaultValue());
217 patterns = baseType3.getPatternConstraints();
218 assertEquals(1, patterns.size());
219 pattern = patterns.iterator().next();
220 assertEquals("^(?:[a-k]*)$", pattern.getJavaPatternString());
221 final RangeSet<Integer> baseType3Lengths = baseType3.getLengthConstraint().orElseThrow().getAllowedRanges();
222 assertEquals(1, baseType3Lengths.asRanges().size());
223 length = baseType3Lengths.span();
224 assertEquals(5, length.lowerEndpoint().intValue());
225 assertEquals(11, length.upperEndpoint().intValue());
227 assertEquals(BaseTypes.stringType(), baseType3.getBaseType());
231 public void testTypedefInvalidPatternsResolving() {
232 final LeafSchemaNode multiplePatternStringLeaf = (LeafSchemaNode) FOO.getDataChildByName(
233 fooQName("multiple-pattern-string-leaf"));
234 StringTypeDefinition type = (StringTypeDefinition) multiplePatternStringLeaf.getType();
235 assertEquals(barQName("multiple-pattern-string"), type.getQName());
236 assertEquals(Optional.empty(), type.getUnits());
237 assertEquals(Optional.empty(), type.getDefaultValue());
238 List<PatternConstraint> patterns = type.getPatternConstraints();
239 assertEquals(2, patterns.size());
240 assertEquals("^(?:[A-Z]*-%22!\\^\\^)$", patterns.get(0).getJavaPatternString());
241 assertEquals("^(?:[e-z]*)$", patterns.get(1).getJavaPatternString());
242 assertEquals(1, type.getLengthConstraint().orElseThrow().getAllowedRanges().asRanges().size());
244 final LeafSchemaNode multiplePatternDirectStringDefLeaf = (LeafSchemaNode) FOO.getDataChildByName(
245 fooQName("multiple-pattern-direct-string-def-leaf"));
246 type = (StringTypeDefinition) multiplePatternDirectStringDefLeaf.getType();
247 assertEquals(fooQName("string"), type.getQName());
248 assertEquals(Optional.empty(), type.getUnits());
249 assertEquals(Optional.empty(), type.getDefaultValue());
250 patterns = type.getPatternConstraints();
251 assertEquals(3, patterns.size());
253 assertEquals("^(?:[e-z]*)$", patterns.get(0).getJavaPatternString());
254 assertEquals("^(?:[A-Z]*-%22!\\^\\^})$", patterns.get(1).getJavaPatternString());
255 assertEquals("^(?:[a-d]*)$", patterns.get(2).getJavaPatternString());
259 public void testTypedefLengthsResolving() {
260 final LeafSchemaNode lengthLeaf = (LeafSchemaNode) FOO.getDataChildByName(fooQName("length-leaf"));
261 final StringTypeDefinition type = (StringTypeDefinition) lengthLeaf.getType();
263 assertEquals(fooQName("string-ext2"), type.getQName());
264 assertEquals(Optional.empty(), type.getUnits());
265 assertEquals(Optional.empty(), type.getDefaultValue());
266 assertTrue(type.getPatternConstraints().isEmpty());
267 final RangeSet<Integer> typeLengths = type.getLengthConstraint().orElseThrow().getAllowedRanges();
268 assertEquals(1, typeLengths.asRanges().size());
269 Range<Integer> length = typeLengths.span();
270 assertEquals(7, length.lowerEndpoint().intValue());
271 assertEquals(10, length.upperEndpoint().intValue());
273 final StringTypeDefinition baseType1 = type.getBaseType();
274 assertEquals(barQName("string-ext2"), baseType1.getQName());
275 assertEquals(Optional.empty(), baseType1.getUnits());
276 assertEquals(Optional.empty(), baseType1.getDefaultValue());
277 assertTrue(baseType1.getPatternConstraints().isEmpty());
278 final RangeSet<Integer> baseType2Lengths = baseType1.getLengthConstraint().orElseThrow().getAllowedRanges();
279 assertEquals(1, baseType2Lengths.asRanges().size());
280 length = baseType2Lengths.span();
281 assertEquals(6, length.lowerEndpoint().intValue());
282 assertEquals(10, length.upperEndpoint().intValue());
284 final StringTypeDefinition baseType2 = baseType1.getBaseType();
285 assertEquals(barQName("string-ext1"), baseType2.getQName());
286 assertEquals(Optional.empty(), baseType2.getUnits());
287 assertEquals(Optional.empty(), baseType2.getDefaultValue());
288 final List<PatternConstraint> patterns = baseType2.getPatternConstraints();
289 assertEquals(1, patterns.size());
290 final PatternConstraint pattern = patterns.iterator().next();
291 assertEquals("^(?:[a-k]*)$", pattern.getJavaPatternString());
292 final RangeSet<Integer> baseType3Lengths = baseType2.getLengthConstraint().orElseThrow().getAllowedRanges();
293 assertEquals(1, baseType3Lengths.asRanges().size());
294 length = baseType3Lengths.span();
295 assertEquals(5, length.lowerEndpoint().intValue());
296 assertEquals(11, length.upperEndpoint().intValue());
298 assertEquals(BaseTypes.stringType(), baseType2.getBaseType());
302 public void testTypedefDecimal1() {
303 final LeafSchemaNode testleaf = (LeafSchemaNode) FOO.getDataChildByName(fooQName("decimal-leaf"));
305 assertTrue(testleaf.getType() instanceof DecimalTypeDefinition);
306 final DecimalTypeDefinition type = (DecimalTypeDefinition) testleaf.getType();
307 assertEquals(barQName("my-decimal-type"), type.getQName());
308 assertEquals(Optional.empty(), type.getUnits());
309 assertEquals(Optional.empty(), type.getDefaultValue());
310 assertEquals(6, type.getFractionDigits());
311 assertEquals(1, type.getRangeConstraint().orElseThrow().getAllowedRanges().asRanges().size());
313 final DecimalTypeDefinition typeBase = type.getBaseType();
314 assertEquals(barQName("decimal64"), typeBase.getQName());
315 assertEquals(Optional.empty(), typeBase.getUnits());
316 assertEquals(Optional.empty(), typeBase.getDefaultValue());
317 assertEquals(6, typeBase.getFractionDigits());
318 assertEquals(1, typeBase.getRangeConstraint().orElseThrow().getAllowedRanges().asRanges().size());
320 assertNull(typeBase.getBaseType());
324 public void testTypedefDecimal2() {
325 final LeafSchemaNode testleaf = (LeafSchemaNode) FOO.getDataChildByName(fooQName("decimal-leaf2"));
327 assertTrue(testleaf.getType() instanceof DecimalTypeDefinition);
328 final DecimalTypeDefinition type = (DecimalTypeDefinition) testleaf.getType();
329 assertEquals(barQName("my-decimal-type"), type.getQName());
330 assertEquals(Optional.empty(), type.getUnits());
331 assertEquals(Optional.empty(), type.getDefaultValue());
332 assertEquals(6, type.getFractionDigits());
333 assertEquals(1, type.getRangeConstraint().orElseThrow().getAllowedRanges().asRanges().size());
335 final DecimalTypeDefinition baseTypeDecimal = type.getBaseType();
336 assertEquals(6, baseTypeDecimal.getFractionDigits());
340 public void testTypedefUnion() {
341 final LeafSchemaNode unionleaf = (LeafSchemaNode) FOO.getDataChildByName(fooQName("union-leaf"));
343 assertTrue(unionleaf.getType() instanceof UnionTypeDefinition);
344 final UnionTypeDefinition type = (UnionTypeDefinition) unionleaf.getType();
345 assertEquals(barQName("my-union-ext"), type.getQName());
346 assertEquals(Optional.empty(), type.getUnits());
347 assertEquals(Optional.empty(), type.getDefaultValue());
349 final UnionTypeDefinition baseType = type.getBaseType();
350 assertEquals(barQName("my-union"), baseType.getQName());
351 assertEquals(Optional.empty(), baseType.getUnits());
352 assertEquals(Optional.empty(), baseType.getDefaultValue());
354 final UnionTypeDefinition unionType = baseType.getBaseType();
355 final List<TypeDefinition<?>> unionTypes = unionType.getTypes();
356 assertEquals(2, unionTypes.size());
358 final Int16TypeDefinition unionType1 = (Int16TypeDefinition) unionTypes.get(0);
359 assertEquals(barQName("my-union"), baseType.getQName());
360 assertEquals(Optional.empty(), unionType1.getUnits());
361 assertEquals(Optional.empty(), unionType1.getDefaultValue());
363 final var ranges = unionType1.getRangeConstraint().orElseThrow();
364 assertEquals(1, ranges.getAllowedRanges().asRanges().size());
365 final var range = ranges.getAllowedRanges().span();
366 assertEquals(Short.valueOf("1"), range.lowerEndpoint());
367 assertEquals(Short.valueOf("100"), range.upperEndpoint());
368 assertEquals(BaseTypes.int16Type(), unionType1.getBaseType());
370 assertEquals(BaseTypes.int32Type(), unionTypes.get(1));
374 public void testNestedUnionResolving() {
375 final LeafSchemaNode testleaf = (LeafSchemaNode) FOO.getDataChildByName(fooQName("custom-union-leaf"));
377 assertTrue(testleaf.getType() instanceof UnionTypeDefinition);
378 final UnionTypeDefinition type = (UnionTypeDefinition) testleaf.getType();
379 assertEquals(bazQName("union1"), type.getQName());
380 assertEquals(Optional.empty(), type.getUnits());
381 assertEquals(Optional.empty(), type.getDefaultValue());
383 final UnionTypeDefinition typeBase = type.getBaseType();
384 assertEquals(bazQName("union2"), typeBase.getQName());
385 assertEquals(Optional.empty(), typeBase.getUnits());
386 assertEquals(Optional.empty(), typeBase.getDefaultValue());
388 final UnionTypeDefinition union = typeBase.getBaseType();
389 final List<TypeDefinition<?>> unionTypes = union.getTypes();
390 assertEquals(2, unionTypes.size());
391 assertEquals(BaseTypes.int32Type(), unionTypes.get(0));
392 assertTrue(unionTypes.get(1) instanceof UnionTypeDefinition);
394 final UnionTypeDefinition unionType1 = (UnionTypeDefinition) unionTypes.get(1);
395 assertEquals(barQName("nested-union2"), unionType1.getQName());
396 assertEquals(Optional.empty(), unionType1.getUnits());
397 assertEquals(Optional.empty(), unionType1.getDefaultValue());
399 final UnionTypeDefinition nestedUnion = unionType1.getBaseType();
400 final List<TypeDefinition<?>> nestedUnion2Types = nestedUnion.getTypes();
401 assertEquals(2, nestedUnion2Types.size());
402 assertTrue(nestedUnion2Types.get(1) instanceof StringTypeDefinition);
403 assertTrue(nestedUnion2Types.get(0) instanceof UnionTypeDefinition);
405 final UnionTypeDefinition myUnionExt = (UnionTypeDefinition) nestedUnion2Types.get(0);
406 assertEquals(barQName("my-union-ext"), myUnionExt.getQName());
407 assertEquals(Optional.empty(), myUnionExt.getUnits());
408 assertEquals(Optional.empty(), myUnionExt.getDefaultValue());
411 final UnionTypeDefinition myUnion = myUnionExt.getBaseType();
412 assertEquals(barQName("my-union"), myUnion.getQName());
413 assertEquals(Optional.empty(), myUnion.getUnits());
414 assertEquals(Optional.empty(), myUnion.getDefaultValue());
416 final UnionTypeDefinition myUnionBase = myUnion.getBaseType();
417 final List<TypeDefinition<?>> myUnionBaseTypes = myUnionBase.getTypes();
418 assertEquals(2, myUnionBaseTypes.size());
419 assertTrue(myUnionBaseTypes.get(0) instanceof Int16TypeDefinition);
420 assertEquals(BaseTypes.int32Type(), myUnionBaseTypes.get(1));
422 final Int16TypeDefinition int16Ext = (Int16TypeDefinition) myUnionBaseTypes.get(0);
423 assertEquals(TypeDefinitions.INT16, int16Ext.getQName());
424 assertEquals(Optional.empty(), int16Ext.getUnits());
425 assertEquals(Optional.empty(), int16Ext.getDefaultValue());
426 final var ranges = int16Ext.getRangeConstraint().orElseThrow().getAllowedRanges().asRanges();
427 assertEquals(1, ranges.size());
428 final var range = ranges.iterator().next();
429 assertEquals(1, range.lowerEndpoint().intValue());
430 assertEquals(100, range.upperEndpoint().intValue());
432 assertEquals(BaseTypes.int16Type(), int16Ext.getBaseType());
436 public void testChoice() {
437 final ContainerSchemaNode transfer = (ContainerSchemaNode) FOO.getDataChildByName(fooQName("transfer"));
438 final ChoiceSchemaNode how = (ChoiceSchemaNode) transfer.getDataChildByName(fooQName("how"));
439 final var cases = how.getCases();
440 assertEquals(5, cases.size());
441 CaseSchemaNode input = null;
442 CaseSchemaNode output = null;
443 for (final CaseSchemaNode caseNode : cases) {
444 if ("input".equals(caseNode.getQName().getLocalName())) {
446 } else if ("output".equals(caseNode.getQName().getLocalName())) {
450 assertNotNull(input);
451 assertNotNull(output);
455 public void testDeviation() {
456 final var deviations = FOO.getDeviations();
457 assertEquals(1, deviations.size());
458 final Deviation dev = deviations.iterator().next();
459 assertEquals(Optional.of("system/user ref"), dev.getReference());
461 assertEquals(Absolute.of(barQName("interfaces"), barQName("ifEntry")), dev.getTargetPath());
462 assertEquals(DeviateKind.ADD, dev.getDeviates().iterator().next().getDeviateType());
466 public void testUnknownNode() {
467 final ContainerSchemaNode network = (ContainerSchemaNode) BAZ.getDataChildByName(bazQName("network"));
468 final var unknownNodes = network.asEffectiveStatement().getDeclared()
469 .declaredSubstatements(UnrecognizedStatement.class);
470 assertEquals(1, unknownNodes.size());
471 assertEquals("point", unknownNodes.iterator().next().argument());
475 public void testFeature() {
476 final var features = BAZ.getFeatures();
477 assertEquals(3, features.size());
481 public void testExtension() {
482 final var extensions = BAZ.getExtensionSchemaNodes();
483 assertEquals(1, extensions.size());
484 final ExtensionDefinition extension = extensions.iterator().next();
485 assertEquals("name", extension.getArgument());
487 Optional.of("Takes as argument a name string. Makes the code generator use the given name in the #define."),
488 extension.getDescription());
489 assertTrue(extension.isYinElement());
493 public void testNotification() {
494 final var notifications = BAZ.getNotifications();
495 assertEquals(1, notifications.size());
497 final NotificationDefinition notification = notifications.iterator().next();
498 // test SchemaNode args
499 assertEquals(bazQName("event"), notification.getQName());
500 assertFalse(notification.getDescription().isPresent());
501 assertFalse(notification.getReference().isPresent());
502 assertEquals(Status.CURRENT, notification.getStatus());
503 assertEquals(0, notification.getUnknownSchemaNodes().size());
504 // test DataNodeContainer args
505 assertEquals(0, notification.getTypeDefinitions().size());
506 assertEquals(3, notification.getChildNodes().size());
507 assertEquals(0, notification.getGroupings().size());
508 assertEquals(0, notification.getUses().size());
510 final LeafSchemaNode eventClass = (LeafSchemaNode) notification.getDataChildByName(bazQName("event-class"));
511 assertTrue(eventClass.getType() instanceof StringTypeDefinition);
512 final LeafSchemaNode severity = (LeafSchemaNode) notification.getDataChildByName(bazQName("severity"));
513 assertTrue(severity.getType() instanceof StringTypeDefinition);
517 public void testRpc() {
518 final var rpcs = BAZ.getRpcs();
519 assertEquals(1, rpcs.size());
521 final RpcDefinition rpc = rpcs.iterator().next();
522 assertEquals(Optional.of("Retrieve all or part of a specified configuration."), rpc.getDescription());
523 assertEquals(Optional.of("RFC 6241, Section 7.1"), rpc.getReference());
527 public void testTypePath() throws ParseException {
528 final Collection<? extends TypeDefinition<?>> types = BAR.getTypeDefinitions();
531 final Int32TypeDefinition int32ext1 = (Int32TypeDefinition) TestUtils.findTypedef(types, "int32-ext1");
532 assertEquals(barQName("int32-ext1"), int32ext1.getQName());
535 assertEquals(BaseTypes.int32Type(), int32ext1.getBaseType());
539 public void testTypePath2() throws ParseException {
540 final var types = BAR.getTypeDefinitions();
543 final DecimalTypeDefinition myDecType = (DecimalTypeDefinition) TestUtils.findTypedef(types, "my-decimal-type");
544 assertEquals(barQName("my-decimal-type"), myDecType.getQName());
546 // my-base-int32-type/int32
547 assertEquals(barQName("decimal64"), myDecType.getBaseType().getQName());
551 public void testSubmodules() {
552 final DataSchemaNode id = FOO.getDataChildByName(fooQName("id"));
554 final DataSchemaNode subExt = FOO.getDataChildByName(fooQName("sub-ext"));
555 assertNotNull(subExt);
556 final DataSchemaNode subTransfer = FOO.getDataChildByName(fooQName("sub-transfer"));
557 assertNotNull(subTransfer);
559 assertEquals(2, FOO.getExtensionSchemaNodes().size());
560 assertEquals(2, FOO.getAugmentations().size());
564 public void unknownStatementInSubmoduleHeaderTest() throws Exception {
565 TestUtils.parseYangSource(
566 "/yang-grammar-test/revisions-extension.yang",
567 "/yang-grammar-test/submodule-header-extension.yang");
571 public void unknownStatementBetweenRevisionsTest() throws Exception {
572 TestUtils.parseYangSource(
573 "/yang-grammar-test/revisions-extension.yang",
574 "/yang-grammar-test/submodule-header-extension.yang");
578 public void unknownStatementsInStatementsTest() {
579 final var ex = assertThrows(SomeModifiersUnresolvedException.class,
580 () -> TestUtils.parseYangSource(
581 "/yang-grammar-test/stmtsep-in-statements.yang",
582 "/yang-grammar-test/stmtsep-in-statements2.yang",
583 "/yang-grammar-test/stmtsep-in-statements-sub.yang"));
584 final var cause = ex.getCause();
585 assertThat(cause, instanceOf(SourceException.class));
586 assertThat(cause.getMessage(), startsWith("aaa is not a YANG statement or use of extension"));