2 * Copyright (c) 2013 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.parser.impl;
10 import static org.junit.Assert.*;
12 import java.io.FileNotFoundException;
14 import java.text.ParseException;
15 import java.util.ArrayList;
16 import java.util.Date;
17 import java.util.List;
20 import org.junit.Before;
21 import org.junit.Test;
22 import org.opendaylight.yangtools.yang.common.QName;
23 import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode;
24 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
25 import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode;
26 import org.opendaylight.yangtools.yang.model.api.ChoiceNode;
27 import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition;
28 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
29 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
30 import org.opendaylight.yangtools.yang.model.api.Deviation;
31 import org.opendaylight.yangtools.yang.model.api.Deviation.Deviate;
32 import org.opendaylight.yangtools.yang.model.api.ExtensionDefinition;
33 import org.opendaylight.yangtools.yang.model.api.FeatureDefinition;
34 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
35 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
36 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
37 import org.opendaylight.yangtools.yang.model.api.Module;
38 import org.opendaylight.yangtools.yang.model.api.ModuleImport;
39 import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
40 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
41 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
42 import org.opendaylight.yangtools.yang.model.api.Status;
43 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
44 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
45 import org.opendaylight.yangtools.yang.model.api.type.LengthConstraint;
46 import org.opendaylight.yangtools.yang.model.api.type.PatternConstraint;
47 import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint;
48 import org.opendaylight.yangtools.yang.model.util.Decimal64;
49 import org.opendaylight.yangtools.yang.model.util.ExtendedType;
50 import org.opendaylight.yangtools.yang.model.util.Int16;
51 import org.opendaylight.yangtools.yang.model.util.Int32;
52 import org.opendaylight.yangtools.yang.model.util.StringType;
53 import org.opendaylight.yangtools.yang.model.util.Uint32;
54 import org.opendaylight.yangtools.yang.model.util.UnionType;
56 public class YangParserTest {
57 private final URI nodesNS = URI.create("urn:simple.nodes.test");
58 private final URI typesNS = URI.create("urn:simple.types.test");
59 private final URI customNS = URI.create("urn:custom.nodes.test");
60 private Date nodesRev;
61 private Date typesRev;
62 private Date customRev;
64 private Set<Module> modules;
67 public void init() throws FileNotFoundException, ParseException {
68 nodesRev = TestUtils.simpleDateFormat.parse("2013-02-27");
69 typesRev = TestUtils.simpleDateFormat.parse("2013-07-03");
70 customRev = TestUtils.simpleDateFormat.parse("2013-02-27");
72 modules = TestUtils.loadModules(getClass().getResource("/model").getPath());
73 assertEquals(3, modules.size());
77 public void testHeaders() throws ParseException {
78 Module test = TestUtils.findModule(modules, "nodes");
80 assertEquals("nodes", test.getName());
81 assertEquals("1", test.getYangVersion());
82 assertEquals(nodesNS, test.getNamespace());
83 assertEquals("n", test.getPrefix());
85 Set<ModuleImport> imports = test.getImports();
86 assertEquals(2, imports.size());
88 ModuleImport import2 = TestUtils.findImport(imports, "t");
89 assertEquals("types", import2.getModuleName());
90 assertEquals(typesRev, import2.getRevision());
92 ModuleImport import3 = TestUtils.findImport(imports, "c");
93 assertEquals("custom", import3.getModuleName());
94 assertEquals(customRev, import3.getRevision());
96 assertEquals("opendaylight", test.getOrganization());
97 assertEquals("http://www.opendaylight.org/", test.getContact());
98 Date expectedRevision = TestUtils.createDate("2013-02-27");
99 assertEquals(expectedRevision, test.getRevision());
100 assertEquals(" WILL BE DEFINED LATER", test.getReference());
104 public void testOrderingTypedef() {
105 Module test = TestUtils.findModule(modules, "types");
106 Set<TypeDefinition<?>> typedefs = test.getTypeDefinitions();
107 String[] expectedOrder = new String[] { "int32-ext1", "int32-ext2", "my-decimal-type", "my-union",
108 "my-union-ext", "nested-union2", "string-ext1", "string-ext2", "string-ext3", "string-ext4" };
109 String[] actualOrder = new String[typedefs.size()];
112 for (TypeDefinition<?> type : typedefs) {
113 actualOrder[i] = type.getQName().getLocalName();
116 assertArrayEquals(expectedOrder, actualOrder);
120 public void testOrderingChildNodes() {
121 Module test = TestUtils.findModule(modules, "nodes");
122 AugmentationSchema augment1 = null;
123 for (AugmentationSchema as : test.getAugmentations()) {
124 if ("if:ifType='ds0'".equals(as.getWhenCondition().toString())) {
129 assertNotNull(augment1);
131 String[] expectedOrder = new String[] { "ds0ChannelNumber", "interface-id", "my-type", "odl", "schemas" };
132 String[] actualOrder = new String[expectedOrder.length];
135 for (DataSchemaNode augmentChild : augment1.getChildNodes()) {
136 actualOrder[i] = augmentChild.getQName().getLocalName();
140 assertArrayEquals(expectedOrder, actualOrder);
144 public void testOrderingNestedChildNodes1() {
145 Module test = TestUtils.findModule(modules, "nodes");
147 Set<DataSchemaNode> childNodes = test.getChildNodes();
148 String[] expectedOrder = new String[] { "address", "addresses", "custom-union-leaf", "data", "datas",
149 "decimal-leaf", "decimal-leaf2", "ext", "how", "int32-leaf", "length-leaf", "mycont", "peer", "port",
150 "string-leaf", "transfer", "union-leaf" };
151 String[] actualOrder = new String[childNodes.size()];
154 for (DataSchemaNode child : childNodes) {
155 actualOrder[i] = child.getQName().getLocalName();
158 assertArrayEquals(expectedOrder, actualOrder);
162 public void testOrderingNestedChildNodes2() {
163 Module test = TestUtils.findModule(modules, "custom");
164 Set<GroupingDefinition> groupings = test.getGroupings();
165 assertEquals(1, groupings.size());
166 GroupingDefinition target = groupings.iterator().next();
168 Set<DataSchemaNode> childNodes = target.getChildNodes();
169 String[] expectedOrder = new String[] { "address", "addresses", "data", "how", "port" };
170 String[] actualOrder = new String[childNodes.size()];
173 for (DataSchemaNode child : childNodes) {
174 actualOrder[i] = child.getQName().getLocalName();
177 assertArrayEquals(expectedOrder, actualOrder);
181 public void testParseList() {
182 Module test = TestUtils.findModule(modules, "types");
183 URI expectedNamespace = URI.create("urn:simple.types.test");
184 String expectedPrefix = "t";
186 ContainerSchemaNode interfaces = (ContainerSchemaNode) test.getDataChildByName("interfaces");
188 ListSchemaNode ifEntry = (ListSchemaNode) interfaces.getDataChildByName("ifEntry");
189 // test SchemaNode args
190 QName expectedQName = new QName(expectedNamespace, typesRev, expectedPrefix, "ifEntry");
191 assertEquals(expectedQName, ifEntry.getQName());
192 SchemaPath expectedPath = TestUtils.createPath(true, expectedNamespace, typesRev, expectedPrefix, "interfaces",
194 assertEquals(expectedPath, ifEntry.getPath());
195 assertNull(ifEntry.getDescription());
196 assertNull(ifEntry.getReference());
197 assertEquals(Status.CURRENT, ifEntry.getStatus());
198 assertEquals(0, ifEntry.getUnknownSchemaNodes().size());
199 // test DataSchemaNode args
200 assertFalse(ifEntry.isAugmenting());
201 assertTrue(ifEntry.isConfiguration());
202 ConstraintDefinition constraints = ifEntry.getConstraints();
203 assertNull(constraints.getWhenCondition());
204 assertEquals(0, constraints.getMustConstraints().size());
205 assertFalse(constraints.isMandatory());
206 assertEquals(1, (int) constraints.getMinElements());
207 assertEquals(11, (int) constraints.getMaxElements());
208 // test AugmentationTarget args
209 Set<AugmentationSchema> availableAugmentations = ifEntry.getAvailableAugmentations();
210 assertEquals(2, availableAugmentations.size());
211 // test ListSchemaNode args
212 List<QName> expectedKey = new ArrayList<QName>();
213 expectedKey.add(new QName(expectedNamespace, typesRev, expectedPrefix, "ifIndex"));
214 assertEquals(expectedKey, ifEntry.getKeyDefinition());
215 assertFalse(ifEntry.isUserOrdered());
216 // test DataNodeContainer args
217 assertEquals(0, ifEntry.getTypeDefinitions().size());
218 assertEquals(4, ifEntry.getChildNodes().size());
219 assertEquals(0, ifEntry.getGroupings().size());
220 assertEquals(0, ifEntry.getUses().size());
222 LeafSchemaNode ifIndex = (LeafSchemaNode) ifEntry.getDataChildByName("ifIndex");
223 assertTrue(ifIndex.getType() instanceof Uint32);
224 LeafSchemaNode ifMtu = (LeafSchemaNode) ifEntry.getDataChildByName("ifMtu");
225 assertTrue(ifMtu.getType() instanceof Int32);
229 public void testTypedefRangesResolving() throws ParseException {
230 Module testModule = TestUtils.findModule(modules, "nodes");
231 LeafSchemaNode int32Leaf = (LeafSchemaNode) testModule.getDataChildByName("int32-leaf");
233 ExtendedType leafType = (ExtendedType) int32Leaf.getType();
234 QName leafTypeQName = leafType.getQName();
235 assertEquals("int32-ext2", leafTypeQName.getLocalName());
236 assertEquals("n", leafTypeQName.getPrefix());
237 assertEquals(nodesNS, leafTypeQName.getNamespace());
238 assertEquals(nodesRev, leafTypeQName.getRevision());
239 assertNull(leafType.getUnits());
240 assertNull(leafType.getDefaultValue());
241 assertTrue(leafType.getLengths().isEmpty());
242 assertTrue(leafType.getPatterns().isEmpty());
243 List<RangeConstraint> ranges = leafType.getRanges();
244 assertEquals(1, ranges.size());
245 RangeConstraint range = ranges.get(0);
246 assertEquals(12L, range.getMin());
247 assertEquals(20L, range.getMax());
249 ExtendedType baseType = (ExtendedType) leafType.getBaseType();
250 QName baseTypeQName = baseType.getQName();
251 assertEquals("int32-ext2", baseTypeQName.getLocalName());
252 assertEquals("t", baseTypeQName.getPrefix());
253 assertEquals(typesNS, baseTypeQName.getNamespace());
254 assertEquals(typesRev, baseTypeQName.getRevision());
255 assertEquals("mile", baseType.getUnits());
256 assertEquals("11", baseType.getDefaultValue());
257 assertTrue(leafType.getLengths().isEmpty());
258 assertTrue(leafType.getPatterns().isEmpty());
259 List<RangeConstraint> baseTypeRanges = baseType.getRanges();
260 assertEquals(2, baseTypeRanges.size());
261 RangeConstraint baseTypeRange1 = baseTypeRanges.get(0);
262 assertEquals(3L, baseTypeRange1.getMin());
263 assertEquals(9L, baseTypeRange1.getMax());
264 RangeConstraint baseTypeRange2 = baseTypeRanges.get(1);
265 assertEquals(11L, baseTypeRange2.getMin());
266 assertEquals(20L, baseTypeRange2.getMax());
268 ExtendedType base = (ExtendedType) baseType.getBaseType();
269 QName baseQName = base.getQName();
270 assertEquals("int32-ext1", baseQName.getLocalName());
271 assertEquals("t", baseQName.getPrefix());
272 assertEquals(typesNS, baseQName.getNamespace());
273 assertEquals(typesRev, baseQName.getRevision());
274 assertNull(base.getUnits());
275 assertNull(base.getDefaultValue());
276 assertTrue(leafType.getLengths().isEmpty());
277 assertTrue(leafType.getPatterns().isEmpty());
278 List<RangeConstraint> baseRanges = base.getRanges();
279 assertEquals(1, baseRanges.size());
280 RangeConstraint baseRange = baseRanges.get(0);
281 assertEquals(2L, baseRange.getMin());
282 assertEquals(20L, baseRange.getMax());
284 assertTrue(base.getBaseType() instanceof Int32);
288 public void testTypedefPatternsResolving() {
289 Module testModule = TestUtils.findModule(modules, "nodes");
290 LeafSchemaNode stringleaf = (LeafSchemaNode) testModule.getDataChildByName("string-leaf");
292 ExtendedType type = (ExtendedType) stringleaf.getType();
293 QName typeQName = type.getQName();
294 assertEquals("string-ext4", typeQName.getLocalName());
295 assertEquals("t", typeQName.getPrefix());
296 assertEquals(typesNS, typeQName.getNamespace());
297 assertEquals(typesRev, typeQName.getRevision());
298 assertNull(type.getUnits());
299 assertNull(type.getDefaultValue());
300 List<PatternConstraint> patterns = type.getPatterns();
301 assertEquals(1, patterns.size());
302 PatternConstraint pattern = patterns.iterator().next();
303 assertEquals("[e-z]*", pattern.getRegularExpression());
304 assertTrue(type.getLengths().isEmpty());
305 assertTrue(type.getRanges().isEmpty());
307 ExtendedType baseType1 = (ExtendedType) type.getBaseType();
308 QName baseType1QName = baseType1.getQName();
309 assertEquals("string-ext3", baseType1QName.getLocalName());
310 assertEquals("t", baseType1QName.getPrefix());
311 assertEquals(typesNS, baseType1QName.getNamespace());
312 assertEquals(typesRev, baseType1QName.getRevision());
313 assertNull(baseType1.getUnits());
314 assertNull(baseType1.getDefaultValue());
315 patterns = baseType1.getPatterns();
316 assertEquals(1, patterns.size());
317 pattern = patterns.iterator().next();
318 assertEquals("[b-u]*", pattern.getRegularExpression());
319 assertTrue(baseType1.getLengths().isEmpty());
320 assertTrue(baseType1.getRanges().isEmpty());
322 ExtendedType baseType2 = (ExtendedType) baseType1.getBaseType();
323 QName baseType2QName = baseType2.getQName();
324 assertEquals("string-ext2", baseType2QName.getLocalName());
325 assertEquals("t", baseType2QName.getPrefix());
326 assertEquals(typesNS, baseType2QName.getNamespace());
327 assertEquals(typesRev, baseType2QName.getRevision());
328 assertNull(baseType2.getUnits());
329 assertNull(baseType2.getDefaultValue());
330 assertTrue(baseType2.getPatterns().isEmpty());
331 List<LengthConstraint> baseType2Lengths = baseType2.getLengths();
332 assertEquals(1, baseType2Lengths.size());
333 LengthConstraint length = baseType2Lengths.get(0);
334 assertEquals(6L, length.getMin());
335 assertEquals(10L, length.getMax());
336 assertTrue(baseType2.getRanges().isEmpty());
338 ExtendedType baseType3 = (ExtendedType) baseType2.getBaseType();
339 QName baseType3QName = baseType3.getQName();
340 assertEquals("string-ext1", baseType3QName.getLocalName());
341 assertEquals("t", baseType3QName.getPrefix());
342 assertEquals(typesNS, baseType3QName.getNamespace());
343 assertEquals(typesRev, baseType3QName.getRevision());
344 assertNull(baseType3.getUnits());
345 assertNull(baseType3.getDefaultValue());
346 patterns = baseType3.getPatterns();
347 assertEquals(1, patterns.size());
348 pattern = patterns.iterator().next();
349 assertEquals("[a-k]*", pattern.getRegularExpression());
350 List<LengthConstraint> baseType3Lengths = baseType3.getLengths();
351 assertEquals(1, baseType3Lengths.size());
352 length = baseType3Lengths.get(0);
353 assertEquals(5L, length.getMin());
354 assertEquals(11L, length.getMax());
355 assertTrue(baseType3.getRanges().isEmpty());
357 assertTrue(baseType3.getBaseType() instanceof StringType);
361 public void testTypedefLengthsResolving() {
362 Module testModule = TestUtils.findModule(modules, "nodes");
364 LeafSchemaNode lengthLeaf = (LeafSchemaNode) testModule.getDataChildByName("length-leaf");
365 ExtendedType type = (ExtendedType) lengthLeaf.getType();
367 QName typeQName = type.getQName();
368 assertEquals("string-ext2", typeQName.getLocalName());
369 assertEquals("n", typeQName.getPrefix());
370 assertEquals(nodesNS, typeQName.getNamespace());
371 assertEquals(nodesRev, typeQName.getRevision());
372 assertNull(type.getUnits());
373 assertNull(type.getDefaultValue());
374 assertTrue(type.getPatterns().isEmpty());
375 List<LengthConstraint> typeLengths = type.getLengths();
376 assertEquals(1, typeLengths.size());
377 LengthConstraint length = typeLengths.get(0);
378 assertEquals(7L, length.getMin());
379 assertEquals(10L, length.getMax());
380 assertTrue(type.getRanges().isEmpty());
382 ExtendedType baseType1 = (ExtendedType) type.getBaseType();
383 QName baseType1QName = baseType1.getQName();
384 assertEquals("string-ext2", baseType1QName.getLocalName());
385 assertEquals("t", baseType1QName.getPrefix());
386 assertEquals(typesNS, baseType1QName.getNamespace());
387 assertEquals(typesRev, baseType1QName.getRevision());
388 assertNull(baseType1.getUnits());
389 assertNull(baseType1.getDefaultValue());
390 assertTrue(baseType1.getPatterns().isEmpty());
391 List<LengthConstraint> baseType2Lengths = baseType1.getLengths();
392 assertEquals(1, baseType2Lengths.size());
393 length = baseType2Lengths.get(0);
394 assertEquals(6L, length.getMin());
395 assertEquals(10L, length.getMax());
396 assertTrue(baseType1.getRanges().isEmpty());
398 ExtendedType baseType2 = (ExtendedType) baseType1.getBaseType();
399 QName baseType2QName = baseType2.getQName();
400 assertEquals("string-ext1", baseType2QName.getLocalName());
401 assertEquals("t", baseType2QName.getPrefix());
402 assertEquals(typesNS, baseType2QName.getNamespace());
403 assertEquals(typesRev, baseType2QName.getRevision());
404 assertNull(baseType2.getUnits());
405 assertNull(baseType2.getDefaultValue());
406 List<PatternConstraint> patterns = baseType2.getPatterns();
407 assertEquals(1, patterns.size());
408 PatternConstraint pattern = patterns.iterator().next();
409 assertEquals("[a-k]*", pattern.getRegularExpression());
410 List<LengthConstraint> baseType3Lengths = baseType2.getLengths();
411 assertEquals(1, baseType3Lengths.size());
412 length = baseType3Lengths.get(0);
413 assertEquals(5L, length.getMin());
414 assertEquals(11L, length.getMax());
415 assertTrue(baseType2.getRanges().isEmpty());
417 assertTrue(baseType2.getBaseType() instanceof StringType);
421 public void testTypedefDecimal1() {
422 Module testModule = TestUtils.findModule(modules, "nodes");
423 LeafSchemaNode testleaf = (LeafSchemaNode) testModule.getDataChildByName("decimal-leaf");
425 ExtendedType type = (ExtendedType) testleaf.getType();
426 QName typeQName = type.getQName();
427 assertEquals("my-decimal-type", typeQName.getLocalName());
428 assertEquals("n", typeQName.getPrefix());
429 assertEquals(nodesNS, typeQName.getNamespace());
430 assertEquals(nodesRev, typeQName.getRevision());
431 assertNull(type.getUnits());
432 assertNull(type.getDefaultValue());
433 assertEquals(4, (int) type.getFractionDigits());
434 assertTrue(type.getLengths().isEmpty());
435 assertTrue(type.getPatterns().isEmpty());
436 assertTrue(type.getRanges().isEmpty());
438 ExtendedType typeBase = (ExtendedType) type.getBaseType();
439 QName typeBaseQName = typeBase.getQName();
440 assertEquals("my-decimal-type", typeBaseQName.getLocalName());
441 assertEquals("t", typeBaseQName.getPrefix());
442 assertEquals(typesNS, typeBaseQName.getNamespace());
443 assertEquals(typesRev, typeBaseQName.getRevision());
444 assertNull(typeBase.getUnits());
445 assertNull(typeBase.getDefaultValue());
446 assertNull(typeBase.getFractionDigits());
447 assertTrue(typeBase.getLengths().isEmpty());
448 assertTrue(typeBase.getPatterns().isEmpty());
449 assertTrue(typeBase.getRanges().isEmpty());
451 Decimal64 decimal = (Decimal64) typeBase.getBaseType();
452 assertEquals(6, (int) decimal.getFractionDigits());
456 public void testTypedefDecimal2() {
457 Module testModule = TestUtils.findModule(modules, "nodes");
458 LeafSchemaNode testleaf = (LeafSchemaNode) testModule.getDataChildByName("decimal-leaf2");
460 ExtendedType type = (ExtendedType) testleaf.getType();
461 QName typeQName = type.getQName();
462 assertEquals("my-decimal-type", typeQName.getLocalName());
463 assertEquals("t", typeQName.getPrefix());
464 assertEquals(typesNS, typeQName.getNamespace());
465 assertEquals(typesRev, typeQName.getRevision());
466 assertNull(type.getUnits());
467 assertNull(type.getDefaultValue());
468 assertNull(type.getFractionDigits());
469 assertTrue(type.getLengths().isEmpty());
470 assertTrue(type.getPatterns().isEmpty());
471 assertTrue(type.getRanges().isEmpty());
473 Decimal64 baseTypeDecimal = (Decimal64) type.getBaseType();
474 assertEquals(6, (int) baseTypeDecimal.getFractionDigits());
478 public void testTypedefUnion() {
479 Module testModule = TestUtils.findModule(modules, "nodes");
480 LeafSchemaNode unionleaf = (LeafSchemaNode) testModule.getDataChildByName("union-leaf");
482 ExtendedType type = (ExtendedType) unionleaf.getType();
483 QName typeQName = type.getQName();
484 assertEquals("my-union-ext", typeQName.getLocalName());
485 assertEquals("t", typeQName.getPrefix());
486 assertEquals(typesNS, typeQName.getNamespace());
487 assertEquals(typesRev, typeQName.getRevision());
488 assertNull(type.getUnits());
489 assertNull(type.getDefaultValue());
490 assertNull(type.getFractionDigits());
491 assertTrue(type.getLengths().isEmpty());
492 assertTrue(type.getPatterns().isEmpty());
493 assertTrue(type.getRanges().isEmpty());
495 ExtendedType baseType = (ExtendedType) type.getBaseType();
496 QName baseTypeQName = baseType.getQName();
497 assertEquals("my-union", baseTypeQName.getLocalName());
498 assertEquals("t", baseTypeQName.getPrefix());
499 assertEquals(typesNS, baseTypeQName.getNamespace());
500 assertEquals(typesRev, baseTypeQName.getRevision());
501 assertNull(baseType.getUnits());
502 assertNull(baseType.getDefaultValue());
503 assertNull(baseType.getFractionDigits());
504 assertTrue(baseType.getLengths().isEmpty());
505 assertTrue(baseType.getPatterns().isEmpty());
506 assertTrue(baseType.getRanges().isEmpty());
508 UnionType unionType = (UnionType) baseType.getBaseType();
509 List<TypeDefinition<?>> unionTypes = unionType.getTypes();
510 assertEquals(2, unionTypes.size());
512 ExtendedType unionType1 = (ExtendedType) unionTypes.get(0);
513 QName unionType1QName = baseType.getQName();
514 assertEquals("my-union", unionType1QName.getLocalName());
515 assertEquals("t", unionType1QName.getPrefix());
516 assertEquals(typesNS, unionType1QName.getNamespace());
517 assertEquals(typesRev, unionType1QName.getRevision());
518 assertNull(unionType1.getUnits());
519 assertNull(unionType1.getDefaultValue());
520 assertNull(unionType1.getFractionDigits());
521 assertTrue(unionType1.getLengths().isEmpty());
522 assertTrue(unionType1.getPatterns().isEmpty());
523 List<RangeConstraint> ranges = unionType1.getRanges();
524 assertEquals(1, ranges.size());
525 RangeConstraint range = ranges.get(0);
526 assertEquals(1L, range.getMin());
527 assertEquals(100L, range.getMax());
528 assertTrue(unionType1.getBaseType() instanceof Int16);
530 assertTrue(unionTypes.get(1) instanceof Int32);
534 public void testNestedUnionResolving() {
535 Module testModule = TestUtils.findModule(modules, "nodes");
536 LeafSchemaNode testleaf = (LeafSchemaNode) testModule.getDataChildByName("custom-union-leaf");
538 ExtendedType type = (ExtendedType) testleaf.getType();
539 QName testleafTypeQName = type.getQName();
540 assertEquals(customNS, testleafTypeQName.getNamespace());
541 assertEquals(customRev, testleafTypeQName.getRevision());
542 assertEquals("c", testleafTypeQName.getPrefix());
543 assertEquals("union1", testleafTypeQName.getLocalName());
544 assertNull(type.getUnits());
545 assertNull(type.getDefaultValue());
546 assertNull(type.getFractionDigits());
547 assertTrue(type.getLengths().isEmpty());
548 assertTrue(type.getPatterns().isEmpty());
549 assertTrue(type.getRanges().isEmpty());
551 ExtendedType typeBase = (ExtendedType) type.getBaseType();
552 QName typeBaseQName = typeBase.getQName();
553 assertEquals(customNS, typeBaseQName.getNamespace());
554 assertEquals(customRev, typeBaseQName.getRevision());
555 assertEquals("c", typeBaseQName.getPrefix());
556 assertEquals("union2", typeBaseQName.getLocalName());
557 assertNull(typeBase.getUnits());
558 assertNull(typeBase.getDefaultValue());
559 assertNull(typeBase.getFractionDigits());
560 assertTrue(typeBase.getLengths().isEmpty());
561 assertTrue(typeBase.getPatterns().isEmpty());
562 assertTrue(typeBase.getRanges().isEmpty());
564 UnionType union = (UnionType) typeBase.getBaseType();
565 List<TypeDefinition<?>> unionTypes = union.getTypes();
566 assertEquals(2, unionTypes.size());
567 assertTrue(unionTypes.get(0) instanceof Int32);
568 assertTrue(unionTypes.get(1) instanceof ExtendedType);
570 ExtendedType unionType1 = (ExtendedType) unionTypes.get(1);
571 QName uniontType1QName = unionType1.getQName();
572 assertEquals(typesNS, uniontType1QName.getNamespace());
573 assertEquals(typesRev, uniontType1QName.getRevision());
574 assertEquals("t", uniontType1QName.getPrefix());
575 assertEquals("nested-union2", uniontType1QName.getLocalName());
576 assertNull(unionType1.getUnits());
577 assertNull(unionType1.getDefaultValue());
578 assertNull(unionType1.getFractionDigits());
579 assertTrue(unionType1.getLengths().isEmpty());
580 assertTrue(unionType1.getPatterns().isEmpty());
581 assertTrue(unionType1.getRanges().isEmpty());
583 UnionType nestedUnion = (UnionType) unionType1.getBaseType();
584 List<TypeDefinition<?>> nestedUnion2Types = nestedUnion.getTypes();
585 assertEquals(2, nestedUnion2Types.size());
586 assertTrue(nestedUnion2Types.get(0) instanceof StringType);
587 assertTrue(nestedUnion2Types.get(1) instanceof ExtendedType);
589 ExtendedType myUnionExt = (ExtendedType) nestedUnion2Types.get(1);
590 QName myUnionExtQName = myUnionExt.getQName();
591 assertEquals(typesNS, myUnionExtQName.getNamespace());
592 assertEquals(typesRev, myUnionExtQName.getRevision());
593 assertEquals("t", myUnionExtQName.getPrefix());
594 assertEquals("my-union-ext", myUnionExtQName.getLocalName());
595 assertNull(myUnionExt.getUnits());
596 assertNull(myUnionExt.getDefaultValue());
597 assertNull(myUnionExt.getFractionDigits());
598 assertTrue(myUnionExt.getLengths().isEmpty());
599 assertTrue(myUnionExt.getPatterns().isEmpty());
600 assertTrue(myUnionExt.getRanges().isEmpty());
602 ExtendedType myUnion = (ExtendedType) myUnionExt.getBaseType();
603 QName myUnionQName = myUnion.getQName();
604 assertEquals(typesNS, myUnionQName.getNamespace());
605 assertEquals(typesRev, myUnionQName.getRevision());
606 assertEquals("t", myUnionQName.getPrefix());
607 assertEquals("my-union", myUnionQName.getLocalName());
608 assertNull(myUnion.getUnits());
609 assertNull(myUnion.getDefaultValue());
610 assertNull(myUnion.getFractionDigits());
611 assertTrue(myUnion.getLengths().isEmpty());
612 assertTrue(myUnion.getPatterns().isEmpty());
613 assertTrue(myUnion.getRanges().isEmpty());
615 UnionType myUnionBase = (UnionType) myUnion.getBaseType();
616 List<TypeDefinition<?>> myUnionBaseTypes = myUnionBase.getTypes();
617 assertEquals(2, myUnionBaseTypes.size());
618 assertTrue(myUnionBaseTypes.get(0) instanceof ExtendedType);
619 assertTrue(myUnionBaseTypes.get(1) instanceof Int32);
621 ExtendedType int16Ext = (ExtendedType) myUnionBaseTypes.get(0);
622 QName int16ExtQName = int16Ext.getQName();
623 assertEquals(typesNS, int16ExtQName.getNamespace());
624 assertEquals(typesRev, int16ExtQName.getRevision());
625 assertEquals("t", int16ExtQName.getPrefix());
626 assertEquals("int16", int16ExtQName.getLocalName());
627 assertNull(int16Ext.getUnits());
628 assertNull(int16Ext.getDefaultValue());
629 assertNull(int16Ext.getFractionDigits());
630 assertTrue(int16Ext.getLengths().isEmpty());
631 assertTrue(int16Ext.getPatterns().isEmpty());
632 List<RangeConstraint> ranges = int16Ext.getRanges();
633 assertEquals(1, ranges.size());
634 RangeConstraint range = ranges.get(0);
635 assertEquals(1L, range.getMin());
636 assertEquals(100L, range.getMax());
638 assertTrue(int16Ext.getBaseType() instanceof Int16);
642 public void testChoice() {
643 Module testModule = TestUtils.findModule(modules, "nodes");
644 ContainerSchemaNode transfer = (ContainerSchemaNode) testModule.getDataChildByName("transfer");
645 ChoiceNode how = (ChoiceNode) transfer.getDataChildByName("how");
646 Set<ChoiceCaseNode> cases = how.getCases();
647 assertEquals(5, cases.size());
648 ChoiceCaseNode input = null;
649 ChoiceCaseNode output = null;
650 for (ChoiceCaseNode caseNode : cases) {
651 if ("input".equals(caseNode.getQName().getLocalName())) {
653 } else if ("output".equals(caseNode.getQName().getLocalName())) {
657 assertNotNull(input);
658 assertNotNull(input.getPath());
659 assertNotNull(output);
660 assertNotNull(output.getPath());
664 public void testDeviation() {
665 Module testModule = TestUtils.findModule(modules, "nodes");
666 Set<Deviation> deviations = testModule.getDeviations();
667 assertEquals(1, deviations.size());
668 Deviation dev = deviations.iterator().next();
670 assertEquals("system/user ref", dev.getReference());
672 List<QName> path = new ArrayList<QName>();
673 path.add(new QName(typesNS, typesRev, "t", "interfaces"));
674 path.add(new QName(typesNS, typesRev, "t", "ifEntry"));
675 SchemaPath expectedPath = new SchemaPath(path, true);
677 assertEquals(expectedPath, dev.getTargetPath());
678 assertEquals(Deviate.ADD, dev.getDeviate());
682 public void testUnknownNode() {
683 Module testModule = TestUtils.findModule(modules, "custom");
684 ContainerSchemaNode network = (ContainerSchemaNode) testModule.getDataChildByName("network");
685 List<UnknownSchemaNode> unknownNodes = network.getUnknownSchemaNodes();
686 assertEquals(1, unknownNodes.size());
687 UnknownSchemaNode unknownNode = unknownNodes.get(0);
688 assertNotNull(unknownNode.getNodeType());
689 assertEquals("point", unknownNode.getNodeParameter());
693 public void testFeature() {
694 Module testModule = TestUtils.findModule(modules, "custom");
695 Set<FeatureDefinition> features = testModule.getFeatures();
696 assertEquals(1, features.size());
700 public void testExtension() {
701 Module testModule = TestUtils.findModule(modules, "custom");
702 List<ExtensionDefinition> extensions = testModule.getExtensionSchemaNodes();
703 assertEquals(1, extensions.size());
704 ExtensionDefinition extension = extensions.get(0);
705 assertEquals("name", extension.getArgument());
706 assertTrue(extension.isYinElement());
710 public void testNotification() {
711 Module testModule = TestUtils.findModule(modules, "custom");
712 String expectedPrefix = "c";
714 Set<NotificationDefinition> notifications = testModule.getNotifications();
715 assertEquals(1, notifications.size());
717 NotificationDefinition notification = notifications.iterator().next();
718 // test SchemaNode args
719 QName expectedQName = new QName(customNS, customRev, expectedPrefix, "event");
720 assertEquals(expectedQName, notification.getQName());
721 SchemaPath expectedPath = TestUtils.createPath(true, customNS, customRev, expectedPrefix, "event");
722 assertEquals(expectedPath, notification.getPath());
723 assertNull(notification.getDescription());
724 assertNull(notification.getReference());
725 assertEquals(Status.CURRENT, notification.getStatus());
726 assertEquals(0, notification.getUnknownSchemaNodes().size());
727 // test DataNodeContainer args
728 assertEquals(0, notification.getTypeDefinitions().size());
729 assertEquals(3, notification.getChildNodes().size());
730 assertEquals(0, notification.getGroupings().size());
731 assertEquals(0, notification.getUses().size());
733 LeafSchemaNode eventClass = (LeafSchemaNode) notification.getDataChildByName("event-class");
734 assertTrue(eventClass.getType() instanceof StringType);
735 AnyXmlSchemaNode reportingEntity = (AnyXmlSchemaNode) notification.getDataChildByName("reporting-entity");
736 assertNotNull(reportingEntity);
737 LeafSchemaNode severity = (LeafSchemaNode) notification.getDataChildByName("severity");
738 assertTrue(severity.getType() instanceof StringType);
742 public void testRpc() {
743 Module testModule = TestUtils.findModule(modules, "custom");
745 Set<RpcDefinition> rpcs = testModule.getRpcs();
746 assertEquals(1, rpcs.size());
748 RpcDefinition rpc = rpcs.iterator().next();
749 assertEquals("Retrieve all or part of a specified configuration.", rpc.getDescription());
750 assertEquals("RFC 6241, Section 7.1", rpc.getReference());
752 ContainerSchemaNode input = rpc.getInput();
753 assertNotNull(input.getDataChildByName("source"));
754 assertNotNull(input.getDataChildByName("filter"));
755 ContainerSchemaNode output = rpc.getOutput();
756 assertNotNull(output.getDataChildByName("data"));
760 public void testTypePath() throws ParseException {
761 Module test = TestUtils.findModule(modules, "types");
762 Set<TypeDefinition<?>> types = test.getTypeDefinitions();
765 ExtendedType int32ext1 = (ExtendedType) TestUtils.findTypedef(types, "int32-ext1");
766 QName int32TypedefQName = int32ext1.getQName();
768 assertEquals(typesNS, int32TypedefQName.getNamespace());
769 assertEquals(typesRev, int32TypedefQName.getRevision());
770 assertEquals("t", int32TypedefQName.getPrefix());
771 assertEquals("int32-ext1", int32TypedefQName.getLocalName());
773 SchemaPath typeSchemaPath = int32ext1.getPath();
774 List<QName> typePath = typeSchemaPath.getPath();
775 assertEquals(1, typePath.size());
776 assertEquals(int32TypedefQName, typePath.get(0));
779 Int32 int32 = (Int32) int32ext1.getBaseType();
780 assertEquals(Int32.getInstance(), int32);
784 public void testTypePath2() throws ParseException {
785 Module test = TestUtils.findModule(modules, "types");
786 Set<TypeDefinition<?>> types = test.getTypeDefinitions();
789 ExtendedType myDecType = (ExtendedType) TestUtils.findTypedef(types, "my-decimal-type");
790 QName myDecTypeQName = myDecType.getQName();
792 assertEquals(typesNS, myDecTypeQName.getNamespace());
793 assertEquals(typesRev, myDecTypeQName.getRevision());
794 assertEquals("t", myDecTypeQName.getPrefix());
795 assertEquals("my-decimal-type", myDecTypeQName.getLocalName());
797 SchemaPath typeSchemaPath = myDecType.getPath();
798 List<QName> typePath = typeSchemaPath.getPath();
799 assertEquals(1, typePath.size());
800 assertEquals(myDecTypeQName, typePath.get(0));
802 // my-base-int32-type/int32
803 Decimal64 dec64 = (Decimal64) myDecType.getBaseType();
804 QName dec64QName = dec64.getQName();
806 assertEquals(URI.create("urn:ietf:params:xml:ns:yang:1"), dec64QName.getNamespace());
807 assertNull(dec64QName.getRevision());
808 assertEquals("", dec64QName.getPrefix());
809 assertEquals("decimal64", dec64QName.getLocalName());
811 SchemaPath dec64SchemaPath = dec64.getPath();
812 List<QName> dec64Path = dec64SchemaPath.getPath();
813 assertEquals(2, dec64Path.size());
814 assertEquals(myDecTypeQName, dec64Path.get(0));
815 assertEquals(dec64QName, dec64Path.get(1));