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