Refactor yang-model-api child traversal return types
[yangtools.git] / yang / yang-parser-rfc7950 / src / test / java / org / opendaylight / yangtools / yang / stmt / GroupingAndUsesStmtTest.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.hamcrest.CoreMatchers.anyOf;
11 import static org.hamcrest.CoreMatchers.is;
12 import static org.hamcrest.MatcherAssert.assertThat;
13 import static org.junit.Assert.assertEquals;
14 import static org.junit.Assert.assertNotNull;
15 import static org.opendaylight.yangtools.yang.stmt.StmtTestUtils.sourceForResource;
16
17 import java.util.Collection;
18 import java.util.Iterator;
19 import java.util.Map;
20 import org.junit.Test;
21 import org.opendaylight.yangtools.yang.common.QName;
22 import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode;
23 import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
24 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
25 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
26 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
27 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
28 import org.opendaylight.yangtools.yang.model.api.Module;
29 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
30 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
31 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
32 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
33 import org.opendaylight.yangtools.yang.model.api.UsesNode;
34 import org.opendaylight.yangtools.yang.parser.rfc7950.reactor.RFC7950Reactors;
35 import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
36 import org.opendaylight.yangtools.yang.parser.spi.source.StatementStreamSource;
37
38 public class GroupingAndUsesStmtTest {
39
40     private static final StatementStreamSource MODULE = sourceForResource("/model/bar.yang");
41     private static final StatementStreamSource SUBMODULE = sourceForResource("/model/subfoo.yang");
42     private static final StatementStreamSource GROUPING_MODULE = sourceForResource("/model/baz.yang");
43     private static final StatementStreamSource USES_MODULE = sourceForResource("/model/foo.yang");
44
45     @Test
46     public void groupingTest() throws ReactorException {
47         final SchemaContext result = RFC7950Reactors.defaultReactor().newBuild()
48                 .addSources(MODULE, GROUPING_MODULE)
49                 .buildEffective();
50         assertNotNull(result);
51
52         final Module testModule = result.findModules("baz").iterator().next();
53         assertNotNull(testModule);
54
55         final Collection<? extends GroupingDefinition> groupings = testModule.getGroupings();
56         assertEquals(1, groupings.size());
57
58         final Iterator<? extends GroupingDefinition> groupingsIterator = groupings.iterator();
59         final GroupingDefinition grouping = groupingsIterator.next();
60         assertEquals("target", grouping.getQName().getLocalName());
61         assertEquals(5, grouping.getChildNodes().size());
62
63         final AnyxmlSchemaNode anyXmlNode = (AnyxmlSchemaNode) grouping.getDataChildByName(
64             QName.create(testModule.getQNameModule(), "data"));
65         assertNotNull(anyXmlNode);
66         final ChoiceSchemaNode choiceNode = (ChoiceSchemaNode) grouping.getDataChildByName(
67             QName.create(testModule.getQNameModule(), "how"));
68         assertNotNull(choiceNode);
69         final LeafSchemaNode leafNode = (LeafSchemaNode) grouping.getDataChildByName(
70             QName.create(testModule.getQNameModule(), "address"));
71         assertNotNull(leafNode);
72         final ContainerSchemaNode containerNode = (ContainerSchemaNode) grouping.getDataChildByName(
73             QName.create(testModule.getQNameModule(), "port"));
74         assertNotNull(containerNode);
75         final ListSchemaNode listNode = (ListSchemaNode) grouping.getDataChildByName(
76             QName.create(testModule.getQNameModule(), "addresses"));
77         assertNotNull(listNode);
78
79         assertEquals(1, grouping.getGroupings().size());
80         assertEquals("target-inner", grouping.getGroupings().iterator().next().getQName().getLocalName());
81
82         assertEquals(1, grouping.getTypeDefinitions().size());
83         assertEquals("group-type", grouping.getTypeDefinitions().iterator().next().getQName().getLocalName());
84
85         final Collection<? extends UnknownSchemaNode> unknownSchemaNodes = grouping.getUnknownSchemaNodes();
86         assertEquals(1, unknownSchemaNodes.size());
87         final UnknownSchemaNode extensionUse = unknownSchemaNodes.iterator().next();
88         assertEquals("opendaylight", extensionUse.getExtensionDefinition().getQName().getLocalName());
89     }
90
91     @Test
92     public void usesAndRefinesTest() throws ReactorException {
93         final SchemaContext result = RFC7950Reactors.defaultReactor().newBuild()
94                 .addSources(MODULE, SUBMODULE, GROUPING_MODULE, USES_MODULE)
95                 .buildEffective();
96         assertNotNull(result);
97
98         final Module testModule = result.findModules("foo").iterator().next();
99         assertNotNull(testModule);
100
101         final Collection<? extends UsesNode> usesNodes = testModule.getUses();
102         assertEquals(1, usesNodes.size());
103
104         UsesNode usesNode = usesNodes.iterator().next();
105         assertEquals("target", usesNode.getGroupingPath().getLastComponent().getLocalName());
106         assertEquals(1, usesNode.getAugmentations().size());
107
108         ContainerSchemaNode container = (ContainerSchemaNode) testModule.getDataChildByName(
109             QName.create(testModule.getQNameModule(), "peer"));
110         assertNotNull(container);
111         container = (ContainerSchemaNode) container.getDataChildByName(QName.create(testModule.getQNameModule(),
112             "destination"));
113         assertEquals(1, container.getUses().size());
114
115         usesNode = container.getUses().iterator().next();
116         assertEquals("target", usesNode.getGroupingPath().getLastComponent().getLocalName());
117
118         final Map<SchemaPath, SchemaNode> refines = usesNode.getRefines();
119         assertEquals(4, refines.size());
120
121         final Iterator<SchemaPath> refinesKeysIterator = refines.keySet().iterator();
122         SchemaPath path = refinesKeysIterator.next();
123         assertThat(path.getLastComponent().getLocalName(), anyOf(is("port"), is("address"), is("addresses"), is("id")));
124         path = refinesKeysIterator.next();
125         assertThat(path.getLastComponent().getLocalName(), anyOf(is("port"), is("address"), is("addresses"), is("id")));
126         path = refinesKeysIterator.next();
127         assertThat(path.getLastComponent().getLocalName(), anyOf(is("port"), is("address"), is("addresses"), is("id")));
128         path = refinesKeysIterator.next();
129         assertThat(path.getLastComponent().getLocalName(), anyOf(is("port"), is("address"), is("addresses"), is("id")));
130     }
131 }