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;
13 import java.util.List;
17 import org.junit.Before;
18 import org.junit.Test;
19 import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode;
20 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
21 import org.opendaylight.yangtools.yang.model.api.ChoiceNode;
22 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
23 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
24 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
25 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
26 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
27 import org.opendaylight.yangtools.yang.model.api.Module;
28 import org.opendaylight.yangtools.yang.model.api.MustDefinition;
29 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
30 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
31 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
32 import org.opendaylight.yangtools.yang.model.api.UsesNode;
34 public class GroupingTest {
35 private Set<Module> modules;
38 public void init() throws FileNotFoundException {
39 modules = TestUtils.loadModules(getClass().getResource("/model").getPath());
40 assertEquals(3, modules.size());
44 public void testRefine() {
45 Module testModule = TestUtils.findModule(modules, "nodes");
47 ContainerSchemaNode peer = (ContainerSchemaNode) testModule.getDataChildByName("peer");
48 ContainerSchemaNode destination = (ContainerSchemaNode) peer.getDataChildByName("destination");
49 Set<UsesNode> usesNodes = destination.getUses();
50 assertEquals(1, usesNodes.size());
51 UsesNode usesNode = usesNodes.iterator().next();
52 Map<SchemaPath, SchemaNode> refines = usesNode.getRefines();
53 assertEquals(3, refines.size());
55 LeafSchemaNode refineLeaf = null;
56 ContainerSchemaNode refineContainer = null;
57 ListSchemaNode refineList = null;
58 for (Map.Entry<SchemaPath, SchemaNode> entry : refines.entrySet()) {
59 SchemaNode value = entry.getValue();
60 if (value instanceof LeafSchemaNode) {
61 refineLeaf = (LeafSchemaNode) value;
62 } else if (value instanceof ContainerSchemaNode) {
63 refineContainer = (ContainerSchemaNode) value;
64 } else if (value instanceof ListSchemaNode) {
65 refineList = (ListSchemaNode) value;
70 assertNotNull(refineLeaf);
71 assertEquals("address", refineLeaf.getQName().getLocalName());
72 assertEquals("IP address of target node", refineLeaf.getDescription());
73 assertEquals("address reference added by refine", refineLeaf.getReference());
74 assertFalse(refineLeaf.isConfiguration());
75 assertFalse(refineLeaf.getConstraints().isMandatory());
76 Set<MustDefinition> leafMustConstraints = refineLeaf.getConstraints().getMustConstraints();
77 assertEquals(1, leafMustConstraints.size());
78 MustDefinition leafMust = leafMustConstraints.iterator().next();
79 assertEquals("\"ifType != 'ethernet' or (ifType = 'ethernet' and ifMTU = 1500)\"", leafMust.toString());
82 assertNotNull(refineContainer);
83 Set<MustDefinition> mustConstraints = refineContainer.getConstraints().getMustConstraints();
84 assertTrue(mustConstraints.isEmpty());
85 assertEquals("description of port defined by refine", refineContainer.getDescription());
86 assertEquals("port reference added by refine", refineContainer.getReference());
87 assertFalse(refineContainer.isConfiguration());
88 assertTrue(refineContainer.isPresenceContainer());
91 assertNotNull(refineList);
92 assertEquals("description of addresses defined by refine", refineList.getDescription());
93 assertEquals("addresses reference added by refine", refineList.getReference());
94 assertFalse(refineList.isConfiguration());
95 assertEquals(2, (int) refineList.getConstraints().getMinElements());
96 assertEquals(12, (int) refineList.getConstraints().getMaxElements());
100 public void testGrouping() {
101 Module testModule = TestUtils.findModule(modules, "custom");
102 Set<GroupingDefinition> groupings = testModule.getGroupings();
103 assertEquals(1, groupings.size());
104 GroupingDefinition grouping = groupings.iterator().next();
105 Set<DataSchemaNode> children = grouping.getChildNodes();
106 assertEquals(5, children.size());
110 public void testUses() {
111 // suffix _u = added by uses
112 // suffix _g = defined in grouping
114 Module testModule = TestUtils.findModule(modules, "custom");
117 Set<GroupingDefinition> groupings = testModule.getGroupings();
118 assertEquals(1, groupings.size());
119 GroupingDefinition grouping = groupings.iterator().next();
121 testModule = TestUtils.findModule(modules, "nodes");
123 // get node containing uses
124 ContainerSchemaNode peer = (ContainerSchemaNode) testModule.getDataChildByName("peer");
125 ContainerSchemaNode destination = (ContainerSchemaNode) peer.getDataChildByName("destination");
128 Set<UsesNode> uses = destination.getUses();
129 assertEquals(1, uses.size());
131 // check uses process
132 AnyXmlSchemaNode data_u = (AnyXmlSchemaNode) destination.getDataChildByName("data");
133 assertNotNull(data_u);
134 assertTrue(data_u.isAddedByUses());
136 AnyXmlSchemaNode data_g = (AnyXmlSchemaNode) grouping.getDataChildByName("data");
137 assertNotNull(data_g);
138 assertFalse(data_g.isAddedByUses());
139 assertFalse(data_u.equals(data_g));
141 ChoiceNode how_u = (ChoiceNode) destination.getDataChildByName("how");
142 assertNotNull(how_u);
143 assertTrue(how_u.isAddedByUses());
145 ChoiceNode how_g = (ChoiceNode) grouping.getDataChildByName("how");
146 assertNotNull(how_g);
147 assertFalse(how_g.isAddedByUses());
148 assertFalse(how_u.equals(how_g));
150 LeafSchemaNode address_u = (LeafSchemaNode) destination.getDataChildByName("address");
151 assertNotNull(address_u);
152 assertEquals("1.2.3.4", address_u.getDefault());
153 assertEquals("IP address of target node", address_u.getDescription());
154 assertEquals("address reference added by refine", address_u.getReference());
155 assertFalse(address_u.isConfiguration());
156 assertTrue(address_u.isAddedByUses());
157 assertFalse(address_u.getConstraints().isMandatory());
159 LeafSchemaNode address_g = (LeafSchemaNode) grouping.getDataChildByName("address");
160 assertNotNull(address_g);
161 assertFalse(address_g.isAddedByUses());
162 assertNull(address_g.getDefault());
163 assertEquals("Target IP address", address_g.getDescription());
164 assertNull(address_g.getReference());
165 assertTrue(address_g.isConfiguration());
166 assertFalse(address_u.equals(address_g));
167 assertTrue(address_g.getConstraints().isMandatory());
169 ContainerSchemaNode port_u = (ContainerSchemaNode) destination.getDataChildByName("port");
170 assertNotNull(port_u);
171 assertTrue(port_u.isAddedByUses());
173 ContainerSchemaNode port_g = (ContainerSchemaNode) grouping.getDataChildByName("port");
174 assertNotNull(port_g);
175 assertFalse(port_g.isAddedByUses());
176 assertFalse(port_u.equals(port_g));
178 ListSchemaNode addresses_u = (ListSchemaNode) destination.getDataChildByName("addresses");
179 assertNotNull(addresses_u);
180 assertTrue(addresses_u.isAddedByUses());
182 ListSchemaNode addresses_g = (ListSchemaNode) grouping.getDataChildByName("addresses");
183 assertNotNull(addresses_g);
184 assertFalse(addresses_g.isAddedByUses());
185 assertFalse(addresses_u.equals(addresses_g));
187 // grouping defined by 'uses'
188 Set<GroupingDefinition> groupings_u = destination.getGroupings();
189 assertEquals(1, groupings_u.size());
190 GroupingDefinition grouping_u = groupings_u.iterator().next();
191 assertTrue(grouping_u.isAddedByUses());
193 // grouping defined in 'grouping' node
194 Set<GroupingDefinition> groupings_g = grouping.getGroupings();
195 assertEquals(1, groupings_g.size());
196 GroupingDefinition grouping_g = groupings_g.iterator().next();
197 assertFalse(grouping_g.isAddedByUses());
198 assertFalse(grouping_u.equals(grouping_g));
200 List<UnknownSchemaNode> nodes_u = destination.getUnknownSchemaNodes();
201 assertEquals(1, nodes_u.size());
202 UnknownSchemaNode node_u = nodes_u.get(0);
203 assertTrue(node_u.isAddedByUses());
205 List<UnknownSchemaNode> nodes_g = grouping.getUnknownSchemaNodes();
206 assertEquals(1, nodes_g.size());
207 UnknownSchemaNode node_g = nodes_g.get(0);
208 assertFalse(node_g.isAddedByUses());
209 assertFalse(node_u.equals(node_g));
213 public void testUsesUnderModule() {
214 // suffix _u = added by uses
215 // suffix _g = defined in grouping
217 Module testModule = TestUtils.findModule(modules, "custom");
220 Set<GroupingDefinition> groupings = testModule.getGroupings();
221 assertEquals(1, groupings.size());
222 GroupingDefinition grouping = groupings.iterator().next();
224 // get node containing uses
225 Module destination = TestUtils.findModule(modules, "nodes");
228 Set<UsesNode> uses = destination.getUses();
229 assertEquals(1, uses.size());
231 // check uses process
232 AnyXmlSchemaNode data_u = (AnyXmlSchemaNode) destination.getDataChildByName("data");
233 assertNotNull(data_u);
234 assertTrue(data_u.isAddedByUses());
236 AnyXmlSchemaNode data_g = (AnyXmlSchemaNode) grouping.getDataChildByName("data");
237 assertNotNull(data_g);
238 assertFalse(data_g.isAddedByUses());
239 assertFalse(data_u.equals(data_g));
241 ChoiceNode how_u = (ChoiceNode) destination.getDataChildByName("how");
242 assertNotNull(how_u);
243 assertTrue(how_u.isAddedByUses());
245 ChoiceNode how_g = (ChoiceNode) grouping.getDataChildByName("how");
246 assertNotNull(how_g);
247 assertFalse(how_g.isAddedByUses());
248 assertFalse(how_u.equals(how_g));
250 LeafSchemaNode address_u = (LeafSchemaNode) destination.getDataChildByName("address");
251 assertNotNull(address_u);
252 assertNull(address_u.getDefault());
253 assertEquals("Target IP address", address_u.getDescription());
254 assertNull(address_u.getReference());
255 assertTrue(address_u.isConfiguration());
256 assertTrue(address_u.isAddedByUses());
258 LeafSchemaNode address_g = (LeafSchemaNode) grouping.getDataChildByName("address");
259 assertNotNull(address_g);
260 assertFalse(address_g.isAddedByUses());
261 assertNull(address_g.getDefault());
262 assertEquals("Target IP address", address_g.getDescription());
263 assertNull(address_g.getReference());
264 assertTrue(address_g.isConfiguration());
265 assertFalse(address_u.equals(address_g));
267 ContainerSchemaNode port_u = (ContainerSchemaNode) destination.getDataChildByName("port");
268 assertNotNull(port_u);
269 assertTrue(port_u.isAddedByUses());
271 ContainerSchemaNode port_g = (ContainerSchemaNode) grouping.getDataChildByName("port");
272 assertNotNull(port_g);
273 assertFalse(port_g.isAddedByUses());
274 assertFalse(port_u.equals(port_g));
276 ListSchemaNode addresses_u = (ListSchemaNode) destination.getDataChildByName("addresses");
277 assertNotNull(addresses_u);
278 assertTrue(addresses_u.isAddedByUses());
280 ListSchemaNode addresses_g = (ListSchemaNode) grouping.getDataChildByName("addresses");
281 assertNotNull(addresses_g);
282 assertFalse(addresses_g.isAddedByUses());
283 assertFalse(addresses_u.equals(addresses_g));
285 // grouping defined by 'uses'
286 Set<GroupingDefinition> groupings_u = destination.getGroupings();
287 assertEquals(1, groupings_u.size());
288 GroupingDefinition grouping_u = groupings_u.iterator().next();
289 assertTrue(grouping_u.isAddedByUses());
291 // grouping defined in 'grouping' node
292 Set<GroupingDefinition> groupings_g = grouping.getGroupings();
293 assertEquals(1, groupings_g.size());
294 GroupingDefinition grouping_g = groupings_g.iterator().next();
295 assertFalse(grouping_g.isAddedByUses());
296 assertFalse(grouping_u.equals(grouping_g));
298 List<UnknownSchemaNode> nodes_u = destination.getUnknownSchemaNodes();
299 assertEquals(1, nodes_u.size());
300 UnknownSchemaNode node_u = nodes_u.get(0);
301 assertTrue(node_u.isAddedByUses());
303 List<UnknownSchemaNode> nodes_g = grouping.getUnknownSchemaNodes();
304 assertEquals(1, nodes_g.size());
305 UnknownSchemaNode node_g = nodes_g.get(0);
306 assertFalse(node_g.isAddedByUses());
307 assertFalse(node_u.equals(node_g));
309 UsesNode un = uses.iterator().next();
310 Set<AugmentationSchema> usesAugments = un.getAugmentations();
311 assertEquals(1, usesAugments.size());
312 AugmentationSchema augment = usesAugments.iterator().next();
313 assertEquals("inner augment", augment.getDescription());
314 Set<DataSchemaNode> children = augment.getChildNodes();
315 assertEquals(1, children.size());
316 DataSchemaNode leaf = children.iterator().next();
317 assertTrue(leaf instanceof LeafSchemaNode);
318 assertEquals("name", leaf.getQName().getLocalName());
322 public void testCascadeUses() throws FileNotFoundException {
323 modules = TestUtils.loadModules(getClass().getResource("/simple-test").getPath());
324 Module testModule = TestUtils.findModule(modules, "cascade-uses");
325 Set<GroupingDefinition> groupings = testModule.getGroupings();
327 GroupingDefinition gu = null;
328 GroupingDefinition gv = null;
329 GroupingDefinition gx = null;
330 GroupingDefinition gy = null;
331 GroupingDefinition gz = null;
332 GroupingDefinition gzz = null;
333 for (GroupingDefinition gd : groupings) {
334 if ("grouping-U".equals(gd.getQName().getLocalName()))
336 if ("grouping-V".equals(gd.getQName().getLocalName()))
338 if ("grouping-X".equals(gd.getQName().getLocalName()))
340 if ("grouping-Y".equals(gd.getQName().getLocalName()))
342 if ("grouping-Z".equals(gd.getQName().getLocalName()))
344 if ("grouping-ZZ".equals(gd.getQName().getLocalName()))
354 assertEquals(6, gu.getChildNodes().size());
355 assertEquals(3, gv.getChildNodes().size());
356 assertEquals(2, gx.getChildNodes().size());
357 assertEquals(1, gy.getChildNodes().size());
358 assertEquals(1, gz.getChildNodes().size());
359 assertEquals(1, gzz.getChildNodes().size());