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.Assert.assertEquals;
11 import static org.junit.Assert.assertFalse;
12 import static org.junit.Assert.assertNotNull;
13 import static org.junit.Assert.assertNull;
14 import static org.junit.Assert.assertTrue;
15 import static org.opendaylight.yangtools.yang.stmt.StmtTestUtils.sourceForResource;
17 import com.google.common.collect.Range;
18 import com.google.common.collect.RangeSet;
19 import java.io.IOException;
20 import java.net.URISyntaxException;
21 import java.text.ParseException;
22 import java.util.ArrayList;
23 import java.util.Collection;
24 import java.util.Iterator;
25 import java.util.List;
26 import java.util.Optional;
28 import org.junit.Test;
29 import org.opendaylight.yangtools.yang.common.QName;
30 import org.opendaylight.yangtools.yang.common.Revision;
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.FeatureDefinition;
43 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
44 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
45 import org.opendaylight.yangtools.yang.model.api.ModuleImport;
46 import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
47 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
48 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
49 import org.opendaylight.yangtools.yang.model.api.Status;
50 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
51 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
52 import org.opendaylight.yangtools.yang.model.api.stmt.UnrecognizedStatement;
53 import org.opendaylight.yangtools.yang.model.api.type.DecimalTypeDefinition;
54 import org.opendaylight.yangtools.yang.model.api.type.Int16TypeDefinition;
55 import org.opendaylight.yangtools.yang.model.api.type.Int32TypeDefinition;
56 import org.opendaylight.yangtools.yang.model.api.type.PatternConstraint;
57 import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint;
58 import org.opendaylight.yangtools.yang.model.api.type.StringTypeDefinition;
59 import org.opendaylight.yangtools.yang.model.api.type.TypeDefinitions;
60 import org.opendaylight.yangtools.yang.model.api.type.Uint32TypeDefinition;
61 import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition;
62 import org.opendaylight.yangtools.yang.model.ri.type.BaseTypes;
63 import org.opendaylight.yangtools.yang.parser.rfc7950.reactor.RFC7950Reactors;
64 import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
65 import org.opendaylight.yangtools.yang.parser.spi.meta.SomeModifiersUnresolvedException;
66 import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
67 import org.opendaylight.yangtools.yang.parser.spi.source.StatementStreamSource;
68 import org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor.BuildAction;
70 public class YangParserTest extends AbstractModelTest {
72 public void testHeaders() throws ParseException {
73 assertEquals("foo", FOO.getName());
74 assertEquals(YangVersion.VERSION_1, FOO.getYangVersion());
75 assertEquals(XMLNamespace.of("urn:opendaylight.foo"), FOO.getNamespace());
76 assertEquals("foo", FOO.getPrefix());
78 final Collection<? extends ModuleImport> imports = FOO.getImports();
79 assertEquals(2, imports.size());
81 final ModuleImport import2 = TestUtils.findImport(imports, "br");
82 assertEquals("bar", import2.getModuleName());
83 assertEquals(Revision.ofNullable("2013-07-03"), import2.getRevision());
85 final ModuleImport import3 = TestUtils.findImport(imports, "bz");
86 assertEquals("baz", import3.getModuleName());
87 assertEquals(Revision.ofNullable("2013-02-27"), import3.getRevision());
89 assertEquals(Optional.of("opendaylight"), FOO.getOrganization());
90 assertEquals(Optional.of("http://www.opendaylight.org/"), FOO.getContact());
91 assertEquals(Revision.ofNullable("2013-02-27"), FOO.getRevision());
92 assertFalse(FOO.getReference().isPresent());
96 public void testParseList() {
97 final ContainerSchemaNode interfaces = (ContainerSchemaNode) BAR.getDataChildByName(barQName("interfaces"));
98 final ListSchemaNode ifEntry = (ListSchemaNode) interfaces.getDataChildByName(barQName("ifEntry"));
99 // test SchemaNode args
100 assertEquals(barQName("ifEntry"), ifEntry.getQName());
102 assertFalse(ifEntry.getDescription().isPresent());
103 assertFalse(ifEntry.getReference().isPresent());
104 assertEquals(Status.CURRENT, ifEntry.getStatus());
105 assertEquals(0, ifEntry.getUnknownSchemaNodes().size());
106 // test DataSchemaNode args
107 assertFalse(ifEntry.isAugmenting());
108 assertEquals(Optional.of(Boolean.TRUE), ifEntry.effectiveConfig());
109 // :TODO augment to ifEntry have when condition and so in consequence
110 // ifEntry should be a context node ?
111 // assertNull(constraints.getWhenCondition());
112 assertEquals(0, ifEntry.getMustConstraints().size());
113 ElementCountConstraint constraints = ifEntry.getElementCountConstraint().get();
114 assertEquals((Object) 1, constraints.getMinElements());
115 assertEquals((Object) 11, constraints.getMaxElements());
116 // test AugmentationTarget args
117 final Collection<? extends AugmentationSchemaNode> availableAugmentations = ifEntry.getAvailableAugmentations();
118 assertEquals(2, availableAugmentations.size());
119 // test ListSchemaNode args
120 final List<QName> expectedKey = new ArrayList<>();
121 expectedKey.add(barQName("ifIndex"));
122 assertEquals(expectedKey, ifEntry.getKeyDefinition());
123 assertFalse(ifEntry.isUserOrdered());
124 // test DataNodeContainer args
125 assertEquals(0, ifEntry.getTypeDefinitions().size());
126 assertEquals(4, ifEntry.getChildNodes().size());
127 assertEquals(0, ifEntry.getGroupings().size());
128 assertEquals(0, ifEntry.getUses().size());
130 final LeafSchemaNode ifIndex = (LeafSchemaNode) ifEntry.getDataChildByName(barQName("ifIndex"));
131 assertEquals(ifEntry.getKeyDefinition().get(0), ifIndex.getQName());
132 assertTrue(ifIndex.getType() instanceof Uint32TypeDefinition);
133 assertEquals(Optional.of("minutes"), ifIndex.getType().getUnits());
134 final LeafSchemaNode ifMtu = (LeafSchemaNode) ifEntry.getDataChildByName(barQName("ifMtu"));
135 assertEquals(BaseTypes.int32Type(), ifMtu.getType());
139 public void testTypedefRangesResolving() throws ParseException {
140 final LeafSchemaNode int32Leaf = (LeafSchemaNode) FOO.getDataChildByName(fooQName("int32-leaf"));
142 final Int32TypeDefinition leafType = (Int32TypeDefinition) int32Leaf.getType();
143 assertEquals(fooQName("int32-ext2"), leafType.getQName());
144 assertEquals(Optional.of("mile"), leafType.getUnits());
145 assertEquals(Optional.of("11"), leafType.getDefaultValue());
147 final RangeSet<? extends Number> rangeset = leafType.getRangeConstraint().get().getAllowedRanges();
148 final Set<? extends Range<? extends Number>> ranges = rangeset.asRanges();
149 assertEquals(1, ranges.size());
151 final Range<? extends Number> range = ranges.iterator().next();
152 assertEquals(12, range.lowerEndpoint().intValue());
153 assertEquals(20, range.upperEndpoint().intValue());
155 final Int32TypeDefinition firstBaseType = leafType.getBaseType();
156 assertEquals(barQName("int32-ext2"), firstBaseType.getQName());
157 assertEquals(Optional.of("mile"), firstBaseType.getUnits());
158 assertEquals(Optional.of("11"), firstBaseType.getDefaultValue());
160 final RangeSet<? extends Number> firstRangeset = firstBaseType.getRangeConstraint().get().getAllowedRanges();
161 final Set<? extends Range<? extends Number>> baseRanges = firstRangeset.asRanges();
162 assertEquals(2, baseRanges.size());
164 final Iterator<? extends Range<? extends Number>> it = baseRanges.iterator();
165 final Range<? extends Number> baseTypeRange1 = it.next();
166 assertEquals(3, baseTypeRange1.lowerEndpoint().intValue());
167 assertEquals(9, baseTypeRange1.upperEndpoint().intValue());
168 final Range<? extends Number> baseTypeRange2 = it.next();
169 assertEquals(11, baseTypeRange2.lowerEndpoint().intValue());
170 assertEquals(20, baseTypeRange2.upperEndpoint().intValue());
172 final Int32TypeDefinition secondBaseType = firstBaseType.getBaseType();
173 assertEquals(barQName("int32-ext1"), secondBaseType.getQName());
174 assertEquals(Optional.empty(), secondBaseType.getUnits());
175 assertEquals(Optional.empty(), secondBaseType.getDefaultValue());
177 final Set<? extends Range<? extends Number>> secondRanges = secondBaseType.getRangeConstraint().get()
178 .getAllowedRanges().asRanges();
179 assertEquals(1, secondRanges.size());
180 final Range<? extends Number> secondRange = secondRanges.iterator().next();
181 assertEquals(2, secondRange.lowerEndpoint().intValue());
182 assertEquals(20, secondRange.upperEndpoint().intValue());
184 assertEquals(BaseTypes.int32Type(), secondBaseType.getBaseType());
188 public void testTypedefPatternsResolving() {
189 final LeafSchemaNode stringleaf = (LeafSchemaNode) FOO.getDataChildByName(fooQName("string-leaf"));
191 assertTrue(stringleaf.getType() instanceof StringTypeDefinition);
192 final StringTypeDefinition type = (StringTypeDefinition) stringleaf.getType();
193 assertEquals(barQName("string-ext4"), type.getQName());
194 assertEquals(Optional.empty(), type.getUnits());
195 assertEquals(Optional.empty(), type.getDefaultValue());
196 List<PatternConstraint> patterns = type.getPatternConstraints();
197 assertEquals(1, patterns.size());
198 PatternConstraint pattern = patterns.iterator().next();
199 assertEquals("^(?:[e-z]*)$", pattern.getJavaPatternString());
200 assertEquals(1, type.getLengthConstraint().get().getAllowedRanges().asRanges().size());
202 final StringTypeDefinition baseType1 = type.getBaseType();
203 assertEquals(barQName("string-ext3"), baseType1.getQName());
204 assertEquals(Optional.empty(), baseType1.getUnits());
205 assertEquals(Optional.empty(), baseType1.getDefaultValue());
206 patterns = baseType1.getPatternConstraints();
207 assertEquals(1, patterns.size());
208 pattern = patterns.iterator().next();
209 assertEquals("^(?:[b-u]*)$", pattern.getJavaPatternString());
210 assertEquals(1, baseType1.getLengthConstraint().get().getAllowedRanges().asRanges().size());
212 final StringTypeDefinition baseType2 = baseType1.getBaseType();
213 assertEquals(barQName("string-ext2"), baseType2.getQName());
214 assertEquals(Optional.empty(), baseType2.getUnits());
215 assertEquals(Optional.empty(), baseType2.getDefaultValue());
216 assertTrue(baseType2.getPatternConstraints().isEmpty());
217 final RangeSet<Integer> baseType2Lengths = baseType2.getLengthConstraint().get().getAllowedRanges();
218 assertEquals(1, baseType2Lengths.asRanges().size());
219 Range<Integer> length = baseType2Lengths.span();
220 assertEquals(6, length.lowerEndpoint().intValue());
221 assertEquals(10, length.upperEndpoint().intValue());
223 final StringTypeDefinition baseType3 = baseType2.getBaseType();
224 assertEquals(barQName("string-ext1"), baseType3.getQName());
225 assertEquals(Optional.empty(), baseType3.getUnits());
226 assertEquals(Optional.empty(), baseType3.getDefaultValue());
227 patterns = baseType3.getPatternConstraints();
228 assertEquals(1, patterns.size());
229 pattern = patterns.iterator().next();
230 assertEquals("^(?:[a-k]*)$", pattern.getJavaPatternString());
231 final RangeSet<Integer> baseType3Lengths = baseType3.getLengthConstraint().get().getAllowedRanges();
232 assertEquals(1, baseType3Lengths.asRanges().size());
233 length = baseType3Lengths.span();
234 assertEquals(5, length.lowerEndpoint().intValue());
235 assertEquals(11, length.upperEndpoint().intValue());
237 assertEquals(BaseTypes.stringType(), baseType3.getBaseType());
241 public void testTypedefInvalidPatternsResolving() {
242 final LeafSchemaNode multiplePatternStringLeaf = (LeafSchemaNode) FOO.getDataChildByName(
243 fooQName("multiple-pattern-string-leaf"));
244 StringTypeDefinition type = (StringTypeDefinition) multiplePatternStringLeaf.getType();
245 assertEquals(barQName("multiple-pattern-string"), type.getQName());
246 assertEquals(Optional.empty(), type.getUnits());
247 assertEquals(Optional.empty(), type.getDefaultValue());
248 List<PatternConstraint> patterns = type.getPatternConstraints();
249 assertEquals(2, patterns.size());
250 assertEquals("^(?:[A-Z]*-%22!\\^\\^)$", patterns.get(0).getJavaPatternString());
251 assertEquals("^(?:[e-z]*)$", patterns.get(1).getJavaPatternString());
252 assertEquals(1, type.getLengthConstraint().get().getAllowedRanges().asRanges().size());
254 final LeafSchemaNode multiplePatternDirectStringDefLeaf = (LeafSchemaNode) FOO.getDataChildByName(
255 fooQName("multiple-pattern-direct-string-def-leaf"));
256 type = (StringTypeDefinition) multiplePatternDirectStringDefLeaf.getType();
257 assertEquals(fooQName("string"), type.getQName());
258 assertEquals(Optional.empty(), type.getUnits());
259 assertEquals(Optional.empty(), type.getDefaultValue());
260 patterns = type.getPatternConstraints();
261 assertEquals(3, patterns.size());
263 assertEquals("^(?:[e-z]*)$", patterns.get(0).getJavaPatternString());
264 assertEquals("^(?:[A-Z]*-%22!\\^\\^})$", patterns.get(1).getJavaPatternString());
265 assertEquals("^(?:[a-d]*)$", patterns.get(2).getJavaPatternString());
269 public void testTypedefLengthsResolving() {
270 final LeafSchemaNode lengthLeaf = (LeafSchemaNode) FOO.getDataChildByName(fooQName("length-leaf"));
271 final StringTypeDefinition type = (StringTypeDefinition) lengthLeaf.getType();
273 assertEquals(fooQName("string-ext2"), type.getQName());
274 assertEquals(Optional.empty(), type.getUnits());
275 assertEquals(Optional.empty(), type.getDefaultValue());
276 assertTrue(type.getPatternConstraints().isEmpty());
277 final RangeSet<Integer> typeLengths = type.getLengthConstraint().get().getAllowedRanges();
278 assertEquals(1, typeLengths.asRanges().size());
279 Range<Integer> length = typeLengths.span();
280 assertEquals(7, length.lowerEndpoint().intValue());
281 assertEquals(10, length.upperEndpoint().intValue());
283 final StringTypeDefinition baseType1 = type.getBaseType();
284 assertEquals(barQName("string-ext2"), baseType1.getQName());
285 assertEquals(Optional.empty(), baseType1.getUnits());
286 assertEquals(Optional.empty(), baseType1.getDefaultValue());
287 assertTrue(baseType1.getPatternConstraints().isEmpty());
288 final RangeSet<Integer> baseType2Lengths = baseType1.getLengthConstraint().get().getAllowedRanges();
289 assertEquals(1, baseType2Lengths.asRanges().size());
290 length = baseType2Lengths.span();
291 assertEquals(6, length.lowerEndpoint().intValue());
292 assertEquals(10, length.upperEndpoint().intValue());
294 final StringTypeDefinition baseType2 = baseType1.getBaseType();
295 assertEquals(barQName("string-ext1"), baseType2.getQName());
296 assertEquals(Optional.empty(), baseType2.getUnits());
297 assertEquals(Optional.empty(), baseType2.getDefaultValue());
298 final List<PatternConstraint> patterns = baseType2.getPatternConstraints();
299 assertEquals(1, patterns.size());
300 final PatternConstraint pattern = patterns.iterator().next();
301 assertEquals("^(?:[a-k]*)$", pattern.getJavaPatternString());
302 final RangeSet<Integer> baseType3Lengths = baseType2.getLengthConstraint().get().getAllowedRanges();
303 assertEquals(1, baseType3Lengths.asRanges().size());
304 length = baseType3Lengths.span();
305 assertEquals(5, length.lowerEndpoint().intValue());
306 assertEquals(11, length.upperEndpoint().intValue());
308 assertEquals(BaseTypes.stringType(), baseType2.getBaseType());
312 public void testTypedefDecimal1() {
313 final LeafSchemaNode testleaf = (LeafSchemaNode) FOO.getDataChildByName(fooQName("decimal-leaf"));
315 assertTrue(testleaf.getType() instanceof DecimalTypeDefinition);
316 final DecimalTypeDefinition type = (DecimalTypeDefinition) testleaf.getType();
317 assertEquals(barQName("my-decimal-type"), type.getQName());
318 assertEquals(Optional.empty(), type.getUnits());
319 assertEquals(Optional.empty(), type.getDefaultValue());
320 assertEquals(6, type.getFractionDigits());
321 assertEquals(1, type.getRangeConstraint().get().getAllowedRanges().asRanges().size());
323 final DecimalTypeDefinition typeBase = type.getBaseType();
324 assertEquals(barQName("decimal64"), typeBase.getQName());
325 assertEquals(Optional.empty(), typeBase.getUnits());
326 assertEquals(Optional.empty(), typeBase.getDefaultValue());
327 assertEquals(6, typeBase.getFractionDigits());
328 assertEquals(1, typeBase.getRangeConstraint().get().getAllowedRanges().asRanges().size());
330 assertNull(typeBase.getBaseType());
334 public void testTypedefDecimal2() {
335 final LeafSchemaNode testleaf = (LeafSchemaNode) FOO.getDataChildByName(fooQName("decimal-leaf2"));
337 assertTrue(testleaf.getType() instanceof DecimalTypeDefinition);
338 final DecimalTypeDefinition type = (DecimalTypeDefinition) testleaf.getType();
339 assertEquals(barQName("my-decimal-type"), type.getQName());
340 assertEquals(Optional.empty(), type.getUnits());
341 assertEquals(Optional.empty(), type.getDefaultValue());
342 assertEquals(6, type.getFractionDigits());
343 assertEquals(1, type.getRangeConstraint().get().getAllowedRanges().asRanges().size());
345 final DecimalTypeDefinition baseTypeDecimal = type.getBaseType();
346 assertEquals(6, baseTypeDecimal.getFractionDigits());
350 public void testTypedefUnion() {
351 final LeafSchemaNode unionleaf = (LeafSchemaNode) FOO.getDataChildByName(fooQName("union-leaf"));
353 assertTrue(unionleaf.getType() instanceof UnionTypeDefinition);
354 final UnionTypeDefinition type = (UnionTypeDefinition) unionleaf.getType();
355 assertEquals(barQName("my-union-ext"), type.getQName());
356 assertEquals(Optional.empty(), type.getUnits());
357 assertEquals(Optional.empty(), type.getDefaultValue());
359 final UnionTypeDefinition baseType = type.getBaseType();
360 assertEquals(barQName("my-union"), baseType.getQName());
361 assertEquals(Optional.empty(), baseType.getUnits());
362 assertEquals(Optional.empty(), baseType.getDefaultValue());
364 final UnionTypeDefinition unionType = baseType.getBaseType();
365 final List<TypeDefinition<?>> unionTypes = unionType.getTypes();
366 assertEquals(2, unionTypes.size());
368 final Int16TypeDefinition unionType1 = (Int16TypeDefinition) unionTypes.get(0);
369 assertEquals(barQName("my-union"), baseType.getQName());
370 assertEquals(Optional.empty(), unionType1.getUnits());
371 assertEquals(Optional.empty(), unionType1.getDefaultValue());
373 final RangeConstraint<?> ranges = unionType1.getRangeConstraint().get();
374 assertEquals(1, ranges.getAllowedRanges().asRanges().size());
375 final Range<?> range = ranges.getAllowedRanges().span();
376 assertEquals((short)1, range.lowerEndpoint());
377 assertEquals((short)100, range.upperEndpoint());
378 assertEquals(BaseTypes.int16Type(), unionType1.getBaseType());
380 assertEquals(BaseTypes.int32Type(), unionTypes.get(1));
384 public void testNestedUnionResolving() {
385 final LeafSchemaNode testleaf = (LeafSchemaNode) FOO.getDataChildByName(fooQName("custom-union-leaf"));
387 assertTrue(testleaf.getType() instanceof UnionTypeDefinition);
388 final UnionTypeDefinition type = (UnionTypeDefinition) testleaf.getType();
389 assertEquals(bazQName("union1"), type.getQName());
390 assertEquals(Optional.empty(), type.getUnits());
391 assertEquals(Optional.empty(), type.getDefaultValue());
393 final UnionTypeDefinition typeBase = type.getBaseType();
394 assertEquals(bazQName("union2"), typeBase.getQName());
395 assertEquals(Optional.empty(), typeBase.getUnits());
396 assertEquals(Optional.empty(), typeBase.getDefaultValue());
398 final UnionTypeDefinition union = typeBase.getBaseType();
399 final List<TypeDefinition<?>> unionTypes = union.getTypes();
400 assertEquals(2, unionTypes.size());
401 assertEquals(BaseTypes.int32Type(), unionTypes.get(0));
402 assertTrue(unionTypes.get(1) instanceof UnionTypeDefinition);
404 final UnionTypeDefinition unionType1 = (UnionTypeDefinition) unionTypes.get(1);
405 assertEquals(barQName("nested-union2"), unionType1.getQName());
406 assertEquals(Optional.empty(), unionType1.getUnits());
407 assertEquals(Optional.empty(), unionType1.getDefaultValue());
409 final UnionTypeDefinition nestedUnion = unionType1.getBaseType();
410 final List<TypeDefinition<?>> nestedUnion2Types = nestedUnion.getTypes();
411 assertEquals(2, nestedUnion2Types.size());
412 assertTrue(nestedUnion2Types.get(1) instanceof StringTypeDefinition);
413 assertTrue(nestedUnion2Types.get(0) instanceof UnionTypeDefinition);
415 final UnionTypeDefinition myUnionExt = (UnionTypeDefinition) nestedUnion2Types.get(0);
416 assertEquals(barQName("my-union-ext"), myUnionExt.getQName());
417 assertEquals(Optional.empty(), myUnionExt.getUnits());
418 assertEquals(Optional.empty(), myUnionExt.getDefaultValue());
421 final UnionTypeDefinition myUnion = myUnionExt.getBaseType();
422 assertEquals(barQName("my-union"), myUnion.getQName());
423 assertEquals(Optional.empty(), myUnion.getUnits());
424 assertEquals(Optional.empty(), myUnion.getDefaultValue());
426 final UnionTypeDefinition myUnionBase = myUnion.getBaseType();
427 final List<TypeDefinition<?>> myUnionBaseTypes = myUnionBase.getTypes();
428 assertEquals(2, myUnionBaseTypes.size());
429 assertTrue(myUnionBaseTypes.get(0) instanceof Int16TypeDefinition);
430 assertEquals(BaseTypes.int32Type(), myUnionBaseTypes.get(1));
432 final Int16TypeDefinition int16Ext = (Int16TypeDefinition) myUnionBaseTypes.get(0);
433 assertEquals(TypeDefinitions.INT16, int16Ext.getQName());
434 assertEquals(Optional.empty(), int16Ext.getUnits());
435 assertEquals(Optional.empty(), int16Ext.getDefaultValue());
436 final Set<? extends Range<? extends Number>> ranges = int16Ext.getRangeConstraint().get().getAllowedRanges()
438 assertEquals(1, ranges.size());
439 final Range<? extends Number> range = ranges.iterator().next();
440 assertEquals(1, range.lowerEndpoint().intValue());
441 assertEquals(100, range.upperEndpoint().intValue());
443 assertEquals(BaseTypes.int16Type(), int16Ext.getBaseType());
447 public void testChoice() {
448 final ContainerSchemaNode transfer = (ContainerSchemaNode) FOO.getDataChildByName(fooQName("transfer"));
449 final ChoiceSchemaNode how = (ChoiceSchemaNode) transfer.getDataChildByName(fooQName("how"));
450 final Collection<? extends CaseSchemaNode> cases = how.getCases();
451 assertEquals(5, cases.size());
452 CaseSchemaNode input = null;
453 CaseSchemaNode output = null;
454 for (final CaseSchemaNode caseNode : cases) {
455 if ("input".equals(caseNode.getQName().getLocalName())) {
457 } else if ("output".equals(caseNode.getQName().getLocalName())) {
461 assertNotNull(input);
462 assertNotNull(output);
466 public void testDeviation() {
467 final Collection<? extends Deviation> deviations = FOO.getDeviations();
468 assertEquals(1, deviations.size());
469 final Deviation dev = deviations.iterator().next();
470 assertEquals(Optional.of("system/user ref"), dev.getReference());
472 assertEquals(Absolute.of(barQName("interfaces"), barQName("ifEntry")), dev.getTargetPath());
473 assertEquals(DeviateKind.ADD, dev.getDeviates().iterator().next().getDeviateType());
477 public void testUnknownNode() {
478 final ContainerSchemaNode network = (ContainerSchemaNode) BAZ.getDataChildByName(bazQName("network"));
479 final Collection<? extends UnrecognizedStatement> unknownNodes = network.asEffectiveStatement().getDeclared()
480 .declaredSubstatements(UnrecognizedStatement.class);
481 assertEquals(1, unknownNodes.size());
482 assertEquals("point", unknownNodes.iterator().next().argument());
486 public void testFeature() {
487 final Collection<? extends FeatureDefinition> features = BAZ.getFeatures();
488 assertEquals(3, features.size());
492 public void testExtension() {
493 final Collection<? extends ExtensionDefinition> extensions = BAZ.getExtensionSchemaNodes();
494 assertEquals(1, extensions.size());
495 final ExtensionDefinition extension = extensions.iterator().next();
496 assertEquals("name", extension.getArgument());
498 Optional.of("Takes as argument a name string. Makes the code generator use the given name in the #define."),
499 extension.getDescription());
500 assertTrue(extension.isYinElement());
504 public void testNotification() {
505 final Collection<? extends NotificationDefinition> notifications = BAZ.getNotifications();
506 assertEquals(1, notifications.size());
508 final NotificationDefinition notification = notifications.iterator().next();
509 // test SchemaNode args
510 assertEquals(bazQName("event"), notification.getQName());
511 assertFalse(notification.getDescription().isPresent());
512 assertFalse(notification.getReference().isPresent());
513 assertEquals(Status.CURRENT, notification.getStatus());
514 assertEquals(0, notification.getUnknownSchemaNodes().size());
515 // test DataNodeContainer args
516 assertEquals(0, notification.getTypeDefinitions().size());
517 assertEquals(3, notification.getChildNodes().size());
518 assertEquals(0, notification.getGroupings().size());
519 assertEquals(0, notification.getUses().size());
521 final LeafSchemaNode eventClass = (LeafSchemaNode) notification.getDataChildByName(bazQName("event-class"));
522 assertTrue(eventClass.getType() instanceof StringTypeDefinition);
523 final LeafSchemaNode severity = (LeafSchemaNode) notification.getDataChildByName(bazQName("severity"));
524 assertTrue(severity.getType() instanceof StringTypeDefinition);
528 public void testRpc() {
529 final Collection<? extends RpcDefinition> rpcs = BAZ.getRpcs();
530 assertEquals(1, rpcs.size());
532 final RpcDefinition rpc = rpcs.iterator().next();
533 assertEquals(Optional.of("Retrieve all or part of a specified configuration."), rpc.getDescription());
534 assertEquals(Optional.of("RFC 6241, Section 7.1"), rpc.getReference());
538 public void testTypePath() throws ParseException {
539 final Collection<? extends TypeDefinition<?>> types = BAR.getTypeDefinitions();
542 final Int32TypeDefinition int32ext1 = (Int32TypeDefinition) TestUtils.findTypedef(types, "int32-ext1");
543 assertEquals(barQName("int32-ext1"), int32ext1.getQName());
546 assertEquals(BaseTypes.int32Type(), int32ext1.getBaseType());
550 public void testTypePath2() throws ParseException {
551 final Collection<? extends TypeDefinition<?>> types = BAR.getTypeDefinitions();
554 final DecimalTypeDefinition myDecType = (DecimalTypeDefinition) TestUtils.findTypedef(types, "my-decimal-type");
555 assertEquals(barQName("my-decimal-type"), myDecType.getQName());
557 // my-base-int32-type/int32
558 assertEquals(barQName("decimal64"), myDecType.getBaseType().getQName());
562 public void testSubmodules() {
563 final DataSchemaNode id = FOO.getDataChildByName(fooQName("id"));
565 final DataSchemaNode subExt = FOO.getDataChildByName(fooQName("sub-ext"));
566 assertNotNull(subExt);
567 final DataSchemaNode subTransfer = FOO.getDataChildByName(fooQName("sub-transfer"));
568 assertNotNull(subTransfer);
570 assertEquals(2, FOO.getExtensionSchemaNodes().size());
571 assertEquals(2, FOO.getAugmentations().size());
575 public void unknownStatementInSubmoduleHeaderTest() throws IOException, URISyntaxException, ReactorException {
576 final StatementStreamSource yang1 = sourceForResource("/yang-grammar-test/revisions-extension.yang");
577 final StatementStreamSource yang2 = sourceForResource("/yang-grammar-test/submodule-header-extension.yang");
578 TestUtils.parseYangSources(yang1, yang2);
582 public void unknownStatementBetweenRevisionsTest() throws ReactorException {
583 final SchemaContext result = RFC7950Reactors.defaultReactor().newBuild()
584 .addSource(sourceForResource("/yang-grammar-test/revisions-extension.yang"))
585 .addSource(sourceForResource("/yang-grammar-test/submodule-header-extension.yang"))
587 assertNotNull(result);
591 public void unknownStatementsInStatementsTest() {
592 // FIXME: use a utility for this loading
593 final StatementStreamSource yangFile1 = sourceForResource(
594 "/yang-grammar-test/stmtsep-in-statements.yang");
595 final StatementStreamSource yangFile2 = sourceForResource(
596 "/yang-grammar-test/stmtsep-in-statements2.yang");
597 final StatementStreamSource yangFile3 = sourceForResource(
598 "/yang-grammar-test/stmtsep-in-statements-sub.yang");
600 final BuildAction reactor = RFC7950Reactors.defaultReactor().newBuild()
601 .addSources(yangFile1, yangFile2, yangFile3);
602 // TODO: change test or create new module in order to respect new statement parser validations
604 final SchemaContext result = reactor.buildEffective();
605 } catch (final ReactorException e) {
606 assertEquals(SomeModifiersUnresolvedException.class, e.getClass());
607 assertTrue(e.getCause() instanceof SourceException);
608 assertTrue(e.getCause().getMessage().startsWith("aaa is not a YANG statement or use of extension"));