Add XMLNamespace
[yangtools.git] / yang / yang-parser-rfc7950 / src / test / java / org / opendaylight / yangtools / yang / stmt / GroupingTest.java
1 /*
2  * Copyright (c) 2016 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.stmt;
9
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.assertPathEquals;
16
17 import java.io.IOException;
18 import java.text.ParseException;
19 import java.util.Collection;
20 import java.util.Map;
21 import java.util.Optional;
22 import org.junit.Before;
23 import org.junit.Test;
24 import org.opendaylight.yangtools.yang.common.QName;
25 import org.opendaylight.yangtools.yang.common.QNameModule;
26 import org.opendaylight.yangtools.yang.common.Revision;
27 import org.opendaylight.yangtools.yang.common.XMLNamespace;
28 import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode;
29 import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
30 import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode;
31 import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
32 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
33 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
34 import org.opendaylight.yangtools.yang.model.api.ElementCountConstraint;
35 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
36 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
37 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
38 import org.opendaylight.yangtools.yang.model.api.Module;
39 import org.opendaylight.yangtools.yang.model.api.MustDefinition;
40 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
41 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
42 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
43 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
44 import org.opendaylight.yangtools.yang.model.api.UsesNode;
45 import org.opendaylight.yangtools.yang.model.api.stmt.RefineEffectiveStatement;
46 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Descendant;
47 import org.opendaylight.yangtools.yang.model.api.stmt.UnrecognizedStatement;
48 import org.opendaylight.yangtools.yang.model.parser.api.YangSyntaxErrorException;
49 import org.opendaylight.yangtools.yang.model.util.SchemaNodeUtils;
50 import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
51
52 public class GroupingTest {
53     private SchemaContext ctx;
54     private Module foo;
55     private Module baz;
56
57     @Before
58     public void init() throws Exception {
59         ctx = TestUtils.loadModules(getClass().getResource("/model").toURI());
60         foo = TestUtils.findModule(ctx, "foo").get();
61         baz = TestUtils.findModule(ctx, "baz").get();
62         assertEquals(3, ctx.getModules().size());
63     }
64
65     @Test
66     public void testRefine() {
67         final Module testModule = TestUtils.findModule(ctx, "foo").get();
68         final ContainerSchemaNode peer = (ContainerSchemaNode) testModule.getDataChildByName(QName.create(
69                 testModule.getQNameModule(), "peer"));
70         final ContainerSchemaNode destination = (ContainerSchemaNode) peer.getDataChildByName(QName.create(
71                 testModule.getQNameModule(), "destination"));
72
73         final Collection<? extends UsesNode> usesNodes = destination.getUses();
74         assertEquals(1, usesNodes.size());
75         final UsesNode usesNode = usesNodes.iterator().next();
76         final Map<Descendant, SchemaNode> refines = usesNode.getRefines();
77         assertEquals(4, refines.size());
78
79         LeafSchemaNode refineLeaf = null;
80         ContainerSchemaNode refineContainer = null;
81         ListSchemaNode refineList = null;
82         LeafSchemaNode refineInnerLeaf = null;
83         for (final Map.Entry<Descendant, SchemaNode> entry : refines.entrySet()) {
84             final SchemaNode value = entry.getValue();
85             if ("address".equals(value.getQName().getLocalName())) {
86                 refineLeaf = (LeafSchemaNode) destination.getDataChildByName(value.getQName());
87             } else if ("port".equals(value.getQName().getLocalName())) {
88                 refineContainer = (ContainerSchemaNode) destination.getDataChildByName(value.getQName());
89             } else if ("addresses".equals(value.getQName().getLocalName())) {
90                 refineList = (ListSchemaNode) destination.getDataChildByName(value.getQName());
91             }
92         }
93
94         assertNotNull(refineList);
95         for (final Map.Entry<Descendant, SchemaNode> entry : refines.entrySet()) {
96             final SchemaNode value = entry.getValue();
97             if ("id".equals(value.getQName().getLocalName())) {
98                 refineInnerLeaf = (LeafSchemaNode) refineList.getDataChildByName(value.getQName());
99             }
100         }
101
102         // leaf address
103         assertNotNull(refineLeaf);
104         assertEquals(Optional.of("IP address of target node"), refineLeaf.getDescription());
105         assertEquals(Optional.of("address reference added by refine"), refineLeaf.getReference());
106         assertEquals(Optional.of(Boolean.FALSE), refineLeaf.effectiveConfig());
107         assertFalse(refineLeaf.isMandatory());
108         final Collection<? extends MustDefinition> leafMustConstraints = refineLeaf.getMustConstraints();
109         assertEquals(1, leafMustConstraints.size());
110         final MustDefinition leafMust = leafMustConstraints.iterator().next();
111         assertEquals("ifType != 'ethernet' or (ifType = 'ethernet' and ifMTU = 1500)", leafMust.getXpath().toString());
112         assertEquals(0, refineLeaf.getUnknownSchemaNodes().size());
113         assertEquals(1, usesNode.asEffectiveStatement()
114             .findFirstEffectiveSubstatement(RefineEffectiveStatement.class).orElseThrow().getDeclared()
115             .declaredSubstatements(UnrecognizedStatement.class).size());
116
117         // container port
118         assertNotNull(refineContainer);
119         final Collection<? extends MustDefinition> mustConstraints = refineContainer.getMustConstraints();
120         assertTrue(mustConstraints.isEmpty());
121         assertEquals(Optional.of("description of port defined by refine"), refineContainer.getDescription());
122         assertEquals(Optional.of("port reference added by refine"), refineContainer.getReference());
123         assertEquals(Optional.of(Boolean.FALSE), refineContainer.effectiveConfig());
124         assertTrue(refineContainer.isPresenceContainer());
125
126         // list addresses
127         assertEquals(Optional.of("description of addresses defined by refine"), refineList.getDescription());
128         assertEquals(Optional.of("addresses reference added by refine"), refineList.getReference());
129         assertEquals(Optional.of(Boolean.FALSE), refineList.effectiveConfig());
130
131         final ElementCountConstraint constraint = refineList.getElementCountConstraint().get();
132         assertEquals((Object) 2, constraint.getMinElements());
133         assertNull(constraint.getMaxElements());
134
135         // leaf id
136         assertNotNull(refineInnerLeaf);
137         assertEquals(Optional.of("id of address"), refineInnerLeaf.getDescription());
138     }
139
140     @Test
141     public void testGrouping() {
142         final Module testModule = TestUtils.findModule(ctx, "baz").get();
143         final Collection<? extends GroupingDefinition> groupings = testModule.getGroupings();
144         assertEquals(1, groupings.size());
145         final GroupingDefinition grouping = groupings.iterator().next();
146         final Collection<? extends DataSchemaNode> children = grouping.getChildNodes();
147         assertEquals(5, children.size());
148     }
149
150     @Test
151     public void testUses() {
152         // suffix _u = added by uses
153         // suffix _g = defined in grouping
154
155
156         // get grouping
157         final Collection<? extends GroupingDefinition> groupings = baz.getGroupings();
158         assertEquals(1, groupings.size());
159         final GroupingDefinition grouping = groupings.iterator().next();
160
161         // get node containing uses
162         final ContainerSchemaNode peer = (ContainerSchemaNode) foo.getDataChildByName(QName.create(
163                 foo.getQNameModule(), "peer"));
164         final ContainerSchemaNode destination = (ContainerSchemaNode) peer.getDataChildByName(QName.create(
165                 foo.getQNameModule(), "destination"));
166
167         // check uses
168         final Collection<? extends UsesNode> uses = destination.getUses();
169         assertEquals(1, uses.size());
170
171         // check uses process
172         final AnyxmlSchemaNode data_u = (AnyxmlSchemaNode) destination.getDataChildByName(QName.create(
173                 foo.getQNameModule(), "data"));
174         assertNotNull(data_u);
175         assertTrue(data_u.isAddedByUses());
176
177         final AnyxmlSchemaNode data_g = (AnyxmlSchemaNode) grouping.getDataChildByName(QName.create(
178                 baz.getQNameModule(), "data"));
179         assertNotNull(data_g);
180         assertFalse(data_g.isAddedByUses());
181         assertFalse(data_u.equals(data_g));
182         assertEquals(data_g, SchemaNodeUtils.getRootOriginalIfPossible(data_u));
183
184         final ChoiceSchemaNode how_u = (ChoiceSchemaNode) destination.getDataChildByName(QName.create(
185                 foo.getQNameModule(), "how"));
186         assertNotNull(how_u);
187         TestUtils.checkIsAddedByUses(how_u, true);
188         assertEquals(2, how_u.getCases().size());
189
190         final ChoiceSchemaNode how_g = (ChoiceSchemaNode) grouping.getDataChildByName(QName.create(
191                 baz.getQNameModule(), "how"));
192         assertNotNull(how_g);
193         TestUtils.checkIsAddedByUses(how_g, false);
194         assertEquals(2, how_g.getCases().size());
195         assertFalse(how_u.equals(how_g));
196         assertEquals(how_g, SchemaNodeUtils.getRootOriginalIfPossible(how_u));
197
198         final LeafSchemaNode address_u = (LeafSchemaNode) destination.getDataChildByName(QName.create(
199                 foo.getQNameModule(), "address"));
200         assertNotNull(address_u);
201         assertEquals(Optional.of("1.2.3.4"), address_u.getType().getDefaultValue());
202         assertEquals(Optional.of("IP address of target node"), address_u.getDescription());
203         assertEquals(Optional.of("address reference added by refine"), address_u.getReference());
204         assertEquals(Optional.of(Boolean.FALSE), address_u.effectiveConfig());
205         assertTrue(address_u.isAddedByUses());
206         assertFalse(address_u.isMandatory());
207
208         final LeafSchemaNode address_g = (LeafSchemaNode) grouping.getDataChildByName(QName.create(
209                 baz.getQNameModule(), "address"));
210         assertNotNull(address_g);
211         assertFalse(address_g.isAddedByUses());
212         assertEquals(Optional.empty(), address_g.getType().getDefaultValue());
213         assertEquals(Optional.of("Target IP address"), address_g.getDescription());
214         assertFalse(address_g.getReference().isPresent());
215         assertEquals(Optional.empty(), address_g.effectiveConfig());
216         assertFalse(address_u.equals(address_g));
217         assertTrue(address_g.isMandatory());
218         assertEquals(address_g, SchemaNodeUtils.getRootOriginalIfPossible(address_u));
219
220         final ContainerSchemaNode port_u = (ContainerSchemaNode) destination.getDataChildByName(QName.create(
221                 foo.getQNameModule(), "port"));
222         assertNotNull(port_u);
223         TestUtils.checkIsAddedByUses(port_u, true);
224
225         final ContainerSchemaNode port_g = (ContainerSchemaNode) grouping.getDataChildByName(QName.create(
226                 baz.getQNameModule(), "port"));
227         assertNotNull(port_g);
228         TestUtils.checkIsAddedByUses(port_g, false);
229         assertFalse(port_u.equals(port_g));
230         assertEquals(port_g, SchemaNodeUtils.getRootOriginalIfPossible(port_u));
231
232         final ListSchemaNode addresses_u = (ListSchemaNode) destination.getDataChildByName(QName.create(
233                 foo.getQNameModule(), "addresses"));
234         assertNotNull(addresses_u);
235         TestUtils.checkIsAddedByUses(addresses_u, true);
236
237         final ListSchemaNode addresses_g = (ListSchemaNode) grouping.getDataChildByName(QName.create(
238                 baz.getQNameModule(), "addresses"));
239         assertNotNull(addresses_g);
240         TestUtils.checkIsAddedByUses(addresses_g, false);
241         assertFalse(addresses_u.equals(addresses_g));
242         assertEquals(addresses_g, SchemaNodeUtils.getRootOriginalIfPossible(addresses_u));
243
244         // grouping defined by 'uses'
245         final Collection<? extends GroupingDefinition> groupings_u = destination.getGroupings();
246         assertEquals(0, groupings_u.size());
247
248         // grouping defined in 'grouping' node
249         final Collection<? extends GroupingDefinition> groupings_g = grouping.getGroupings();
250         assertEquals(1, groupings_g.size());
251         final GroupingDefinition grouping_g = groupings_g.iterator().next();
252         TestUtils.checkIsAddedByUses(grouping_g, false);
253
254         assertEquals(0, destination.getUnknownSchemaNodes().size());
255         assertEquals(1,
256             grouping.asEffectiveStatement().getDeclared().declaredSubstatements(UnrecognizedStatement.class).size());
257     }
258
259     @Test
260     public void testUsesUnderModule() {
261         // suffix _u = added by uses
262         // suffix _g = defined in grouping
263
264         // get grouping
265         final Collection<? extends GroupingDefinition> groupings = baz.getGroupings();
266         assertEquals(1, groupings.size());
267         final GroupingDefinition grouping = groupings.iterator().next();
268
269         // check uses
270         final Collection<? extends UsesNode> uses = foo.getUses();
271         assertEquals(1, uses.size());
272
273         // check uses process
274         final AnyxmlSchemaNode data_u = (AnyxmlSchemaNode) foo.getDataChildByName(QName.create(foo.getQNameModule(),
275                 "data"));
276         assertNotNull(data_u);
277         assertTrue(data_u.isAddedByUses());
278
279         final AnyxmlSchemaNode data_g = (AnyxmlSchemaNode) grouping.getDataChildByName(QName.create(
280             baz.getQNameModule(), "data"));
281         assertNotNull(data_g);
282         assertFalse(data_g.isAddedByUses());
283         assertFalse(data_u.equals(data_g));
284         assertEquals(data_g, SchemaNodeUtils.getRootOriginalIfPossible(data_u));
285
286         final ChoiceSchemaNode how_u = (ChoiceSchemaNode) foo.getDataChildByName(QName.create(foo.getQNameModule(),
287                 "how"));
288         assertNotNull(how_u);
289         TestUtils.checkIsAddedByUses(how_u, true);
290         assertFalse(how_u.isAugmenting());
291         final Collection<? extends CaseSchemaNode> cases_u = how_u.getCases();
292         assertEquals(2, cases_u.size());
293         final CaseSchemaNode interval = how_u.findCaseNodes("interval").iterator().next();
294         assertFalse(interval.isAugmenting());
295         final LeafSchemaNode name = (LeafSchemaNode) interval.getDataChildByName(QName.create(foo.getQNameModule(),
296                 "name"));
297         assertTrue(name.isAugmenting());
298         final LeafSchemaNode intervalLeaf = (LeafSchemaNode) interval.getDataChildByName(QName.create(
299                 foo.getQNameModule(), "interval"));
300         assertFalse(intervalLeaf.isAugmenting());
301
302         final ChoiceSchemaNode how_g = (ChoiceSchemaNode) grouping.getDataChildByName(QName.create(
303                 baz.getQNameModule(), "how"));
304         assertNotNull(how_g);
305         TestUtils.checkIsAddedByUses(how_g, false);
306         assertFalse(how_u.equals(how_g));
307         assertEquals(how_g, SchemaNodeUtils.getRootOriginalIfPossible(how_u));
308
309         final LeafSchemaNode address_u = (LeafSchemaNode) foo.getDataChildByName(QName.create(foo.getQNameModule(),
310                 "address"));
311         assertNotNull(address_u);
312         assertEquals(Optional.empty(), address_u.getType().getDefaultValue());
313         assertEquals(Optional.of("Target IP address"), address_u.getDescription());
314         assertFalse(address_u.getReference().isPresent());
315         assertEquals(Optional.empty(), address_u.effectiveConfig());
316         assertTrue(address_u.isAddedByUses());
317
318         final LeafSchemaNode address_g = (LeafSchemaNode) grouping.getDataChildByName(QName.create(
319                 baz.getQNameModule(), "address"));
320         assertNotNull(address_g);
321         assertFalse(address_g.isAddedByUses());
322         assertEquals(Optional.empty(), address_g.getType().getDefaultValue());
323         assertEquals(Optional.of("Target IP address"), address_g.getDescription());
324         assertFalse(address_g.getReference().isPresent());
325         assertEquals(Optional.empty(), address_g.effectiveConfig());
326         assertFalse(address_u.equals(address_g));
327         assertEquals(address_g, SchemaNodeUtils.getRootOriginalIfPossible(address_u));
328
329         final ContainerSchemaNode port_u = (ContainerSchemaNode) foo.getDataChildByName(QName.create(
330                 foo.getQNameModule(), "port"));
331         assertNotNull(port_u);
332         TestUtils.checkIsAddedByUses(port_u, true);
333
334         final ContainerSchemaNode port_g = (ContainerSchemaNode) grouping.getDataChildByName(QName.create(
335                 baz.getQNameModule(), "port"));
336         assertNotNull(port_g);
337         TestUtils.checkIsAddedByUses(port_g, false);
338         assertFalse(port_u.equals(port_g));
339         assertEquals(port_g, SchemaNodeUtils.getRootOriginalIfPossible(port_u));
340
341         final ListSchemaNode addresses_u = (ListSchemaNode) foo.getDataChildByName(QName.create(foo.getQNameModule(),
342                 "addresses"));
343         assertNotNull(addresses_u);
344         TestUtils.checkIsAddedByUses(addresses_u, true);
345
346         final ListSchemaNode addresses_g = (ListSchemaNode) grouping.getDataChildByName(QName.create(
347                 baz.getQNameModule(), "addresses"));
348         assertNotNull(addresses_g);
349         TestUtils.checkIsAddedByUses(addresses_g, false);
350         assertFalse(addresses_u.equals(addresses_g));
351         assertEquals(addresses_g, SchemaNodeUtils.getRootOriginalIfPossible(addresses_u));
352
353         // grouping defined by 'uses'
354         final Collection<? extends GroupingDefinition> groupings_u = foo.getGroupings();
355         assertEquals(0, groupings_u.size());
356
357         // grouping defined in 'grouping' node
358         final Collection<? extends GroupingDefinition> groupings_g = grouping.getGroupings();
359         assertEquals(1, groupings_g.size());
360         final GroupingDefinition grouping_g = groupings_g.iterator().next();
361         TestUtils.checkIsAddedByUses(grouping_g, false);
362
363         assertEquals(0, grouping.getUnknownSchemaNodes().size());
364         assertEquals(1, grouping.asEffectiveStatement().getDeclared().declaredSubstatements(UnrecognizedStatement.class)
365             .size());
366
367         final UsesNode un = uses.iterator().next();
368         final Collection<? extends AugmentationSchemaNode> usesAugments = un.getAugmentations();
369         assertEquals(1, usesAugments.size());
370         final AugmentationSchemaNode augment = usesAugments.iterator().next();
371         assertEquals(Optional.of("inner augment"), augment.getDescription());
372         final Collection<? extends DataSchemaNode> children = augment.getChildNodes();
373         assertEquals(1, children.size());
374         final DataSchemaNode leaf = children.iterator().next();
375         assertTrue(leaf instanceof LeafSchemaNode);
376         assertEquals("name", leaf.getQName().getLocalName());
377     }
378
379     @Test
380     public void testCascadeUses() throws ReactorException, ParseException, IOException, YangSyntaxErrorException {
381         ctx = TestUtils.loadModuleResources(getClass(), "/grouping-test/cascade-uses.yang");
382         assertEquals(1, ctx.getModules().size());
383
384         final Module testModule = TestUtils.findModule(ctx, "cascade-uses").get();
385         final Collection<? extends GroupingDefinition> groupings = testModule.getGroupings();
386
387         GroupingDefinition gu = null;
388         GroupingDefinition gv = null;
389         GroupingDefinition gx = null;
390         GroupingDefinition gy = null;
391         GroupingDefinition gz = null;
392         GroupingDefinition gzz = null;
393         for (final GroupingDefinition gd : groupings) {
394             final String name = gd.getQName().getLocalName();
395             switch (name) {
396                 case "grouping-U":
397                     gu = gd;
398                     break;
399                 case "grouping-V":
400                     gv = gd;
401                     break;
402                 case "grouping-X":
403                     gx = gd;
404                     break;
405                 case "grouping-Y":
406                     gy = gd;
407                     break;
408                 case "grouping-Z":
409                     gz = gd;
410                     break;
411                 case "grouping-ZZ":
412                     gzz = gd;
413                     break;
414                 default:
415                     break;
416             }
417         }
418         assertNotNull(gu);
419         assertNotNull(gv);
420         assertNotNull(gx);
421         assertNotNull(gy);
422         assertNotNull(gz);
423         assertNotNull(gzz);
424
425         final QNameModule expectedModule = QNameModule.create(XMLNamespace.of("urn:grouping:cascade-uses"),
426             Revision.of("2013-07-18"));
427
428         // grouping-U
429         Collection<? extends DataSchemaNode> childNodes = gu.getChildNodes();
430         assertEquals(7, childNodes.size());
431
432         final LeafSchemaNode leafGroupingU = (LeafSchemaNode) gu.getDataChildByName(QName.create(
433                 testModule.getQNameModule(), "leaf-grouping-U"));
434         assertNotNull(leafGroupingU);
435         assertFalse(leafGroupingU.isAddedByUses());
436         assertFalse(SchemaNodeUtils.getOriginalIfPossible(leafGroupingU).isPresent());
437
438         for (final DataSchemaNode childNode : childNodes) {
439             if (!childNode.getQName().equals(leafGroupingU.getQName())) {
440                 TestUtils.checkIsAddedByUses(childNode, true);
441             }
442         }
443
444         // grouping-V
445         childNodes = gv.getChildNodes();
446         assertEquals(4, childNodes.size());
447         LeafSchemaNode leafGroupingV = null;
448         ContainerSchemaNode containerGroupingV = null;
449         for (final DataSchemaNode childNode : childNodes) {
450             if ("leaf-grouping-V".equals(childNode.getQName().getLocalName())) {
451                 leafGroupingV = (LeafSchemaNode) childNode;
452             } else if ("container-grouping-V".equals(childNode.getQName().getLocalName())) {
453                 containerGroupingV = (ContainerSchemaNode) childNode;
454             } else {
455                 TestUtils.checkIsAddedByUses(childNode, true);
456             }
457         }
458         assertNotNull(leafGroupingV);
459         assertFalse(leafGroupingV.isAddedByUses());
460
461         // grouping-V/container-grouping-V
462         assertNotNull(containerGroupingV);
463         assertFalse(containerGroupingV.isAddedByUses());
464         SchemaPath expectedPath = TestUtils.createPath(true, expectedModule, "grouping-V", "container-grouping-V");
465         assertPathEquals(expectedPath, containerGroupingV);
466         childNodes = containerGroupingV.getChildNodes();
467         assertEquals(2, childNodes.size());
468         for (final DataSchemaNode childNode : childNodes) {
469             TestUtils.checkIsAddedByUses(childNode, true);
470         }
471
472         // grouping-V/container-grouping-V/leaf-grouping-X
473         final LeafSchemaNode leafXinContainerV = (LeafSchemaNode) containerGroupingV.getDataChildByName(QName.create(
474                 testModule.getQNameModule(), "leaf-grouping-X"));
475         assertNotNull(leafXinContainerV);
476         expectedPath = TestUtils.createPath(true, expectedModule, "grouping-V", "container-grouping-V",
477             "leaf-grouping-X");
478         assertPathEquals(expectedPath, leafXinContainerV);
479         // grouping-V/container-grouping-V/leaf-grouping-Y
480         final LeafSchemaNode leafYinContainerV = (LeafSchemaNode) containerGroupingV.getDataChildByName(QName.create(
481                 testModule.getQNameModule(), "leaf-grouping-Y"));
482         assertNotNull(leafYinContainerV);
483         expectedPath = TestUtils.createPath(true, expectedModule, "grouping-V", "container-grouping-V",
484             "leaf-grouping-Y");
485         assertPathEquals(expectedPath, leafYinContainerV);
486
487         // grouping-X
488         childNodes = gx.getChildNodes();
489         assertEquals(2, childNodes.size());
490
491         // grouping-X/leaf-grouping-X
492         final LeafSchemaNode leafXinGX = (LeafSchemaNode) gx.getDataChildByName(QName.create(
493                 testModule.getQNameModule(), "leaf-grouping-X"));
494         assertNotNull(leafXinGX);
495         assertFalse(leafXinGX.isAddedByUses());
496         expectedPath = TestUtils.createPath(true, expectedModule, "grouping-X", "leaf-grouping-X");
497         assertPathEquals(expectedPath, leafXinGX);
498
499         // grouping-X/leaf-grouping-Y
500         final LeafSchemaNode leafYinGX = (LeafSchemaNode) gx.getDataChildByName(QName.create(
501                 testModule.getQNameModule(), "leaf-grouping-Y"));
502         assertNotNull(leafYinGX);
503         assertTrue(leafYinGX.isAddedByUses());
504         expectedPath = TestUtils.createPath(true, expectedModule, "grouping-X", "leaf-grouping-Y");
505         assertPathEquals(expectedPath, leafYinGX);
506
507         // grouping-Y
508         childNodes = gy.getChildNodes();
509         assertEquals(1, childNodes.size());
510
511         // grouping-Y/leaf-grouping-Y
512         final LeafSchemaNode leafYinGY = (LeafSchemaNode) gy.getDataChildByName(QName.create(
513                 testModule.getQNameModule(), "leaf-grouping-Y"));
514         assertNotNull(leafYinGY);
515         assertFalse(leafYinGY.isAddedByUses());
516         expectedPath = TestUtils.createPath(true, expectedModule, "grouping-Y", "leaf-grouping-Y");
517         assertPathEquals(expectedPath, leafYinGY);
518
519         // grouping-Z
520         childNodes = gz.getChildNodes();
521         assertEquals(1, childNodes.size());
522
523         // grouping-Z/leaf-grouping-Z
524         final LeafSchemaNode leafZinGZ = (LeafSchemaNode) gz.getDataChildByName(QName.create(
525                 testModule.getQNameModule(), "leaf-grouping-Z"));
526         assertNotNull(leafZinGZ);
527         assertFalse(leafZinGZ.isAddedByUses());
528         expectedPath = TestUtils.createPath(true, expectedModule, "grouping-Z", "leaf-grouping-Z");
529         assertPathEquals(expectedPath, leafZinGZ);
530
531         // grouping-ZZ
532         childNodes = gzz.getChildNodes();
533         assertEquals(1, childNodes.size());
534
535         // grouping-ZZ/leaf-grouping-ZZ
536         final LeafSchemaNode leafZZinGZZ = (LeafSchemaNode) gzz.getDataChildByName(QName.create(
537                 testModule.getQNameModule(), "leaf-grouping-ZZ"));
538         assertNotNull(leafZZinGZZ);
539         assertFalse(leafZZinGZZ.isAddedByUses());
540         expectedPath = TestUtils.createPath(true, expectedModule, "grouping-ZZ", "leaf-grouping-ZZ");
541         assertPathEquals(expectedPath, leafZZinGZZ);
542
543         // TEST getOriginal from grouping-U
544         assertEquals(
545                 gv.getDataChildByName(QName.create(testModule.getQNameModule(), "leaf-grouping-V")),
546                 SchemaNodeUtils.getRootOriginalIfPossible(gu.getDataChildByName(QName.create(
547                         testModule.getQNameModule(), "leaf-grouping-V"))));
548         containerGroupingV = (ContainerSchemaNode) gu.getDataChildByName(QName.create(testModule.getQNameModule(),
549                 "container-grouping-V"));
550         assertEquals(gv.getDataChildByName(QName.create(testModule.getQNameModule(), "container-grouping-V")),
551                 SchemaNodeUtils.getRootOriginalIfPossible(containerGroupingV));
552         assertEquals(
553                 gx.getDataChildByName(QName.create(testModule.getQNameModule(), "leaf-grouping-X")),
554                 SchemaNodeUtils.getRootOriginalIfPossible(containerGroupingV.getDataChildByName(QName.create(
555                         testModule.getQNameModule(), "leaf-grouping-X"))));
556         assertEquals(
557                 gy.getDataChildByName(QName.create(testModule.getQNameModule(), "leaf-grouping-Y")),
558                 SchemaNodeUtils.getRootOriginalIfPossible(containerGroupingV.getDataChildByName(QName.create(
559                         testModule.getQNameModule(), "leaf-grouping-Y"))));
560
561         assertEquals(
562                 gz.getDataChildByName(QName.create(testModule.getQNameModule(), "leaf-grouping-Z")),
563                 SchemaNodeUtils.getRootOriginalIfPossible(gu.getDataChildByName(QName.create(
564                         testModule.getQNameModule(), "leaf-grouping-Z"))));
565         assertEquals(
566                 gzz.getDataChildByName(QName.create(testModule.getQNameModule(), "leaf-grouping-ZZ")),
567                 SchemaNodeUtils.getRootOriginalIfPossible(gu.getDataChildByName(QName.create(
568                         testModule.getQNameModule(), "leaf-grouping-ZZ"))));
569
570         // TEST getOriginal from grouping-V
571         assertEquals(
572                 gz.getDataChildByName(QName.create(testModule.getQNameModule(), "leaf-grouping-Z")),
573                 SchemaNodeUtils.getRootOriginalIfPossible(gv.getDataChildByName(QName.create(
574                         testModule.getQNameModule(), "leaf-grouping-Z"))));
575         assertEquals(
576                 gzz.getDataChildByName(QName.create(testModule.getQNameModule(), "leaf-grouping-ZZ")),
577                 SchemaNodeUtils.getRootOriginalIfPossible(gv.getDataChildByName(QName.create(
578                         testModule.getQNameModule(), "leaf-grouping-ZZ"))));
579
580         // TEST getOriginal from grouping-X
581         assertEquals(
582                 gy.getDataChildByName(QName.create(testModule.getQNameModule(), "leaf-grouping-Y")),
583                 SchemaNodeUtils.getRootOriginalIfPossible(gx.getDataChildByName(QName.create(
584                         testModule.getQNameModule(), "leaf-grouping-Y"))));
585     }
586
587     @Test
588     public void testAddedByUsesLeafTypeQName() throws Exception {
589         final SchemaContext loadModules = TestUtils.loadModules(getClass().getResource("/added-by-uses-leaf-test")
590                 .toURI());
591         assertEquals(2, loadModules.getModules().size());
592         foo = TestUtils.findModule(loadModules, "foo").get();
593         final Module imp = TestUtils.findModule(loadModules, "import-module").get();
594
595         final LeafSchemaNode leaf = (LeafSchemaNode) ((ContainerSchemaNode) foo.getDataChildByName(QName.create(
596                 foo.getQNameModule(), "my-container")))
597                 .getDataChildByName(QName.create(foo.getQNameModule(), "my-leaf"));
598
599         TypeDefinition<?> impType = null;
600         for (final TypeDefinition<?> typeDefinition : imp.getTypeDefinitions()) {
601             if (typeDefinition.getQName().getLocalName().equals("imp-type")) {
602                 impType = typeDefinition;
603                 break;
604             }
605         }
606
607         assertNotNull(impType);
608         assertEquals(leaf.getType().getQName(), impType.getQName());
609     }
610 }