2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.yangtools.yang.parser.impl;
10 import static org.junit.Assert.*;
12 import java.io.FileNotFoundException;
14 import java.text.ParseException;
15 import java.util.Date;
16 import java.util.List;
20 import org.junit.Before;
21 import org.junit.Test;
22 import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode;
23 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
24 import org.opendaylight.yangtools.yang.model.api.ChoiceNode;
25 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
26 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
27 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
28 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
29 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
30 import org.opendaylight.yangtools.yang.model.api.Module;
31 import org.opendaylight.yangtools.yang.model.api.MustDefinition;
32 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
33 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
34 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
35 import org.opendaylight.yangtools.yang.model.api.UsesNode;
37 public class GroupingTest {
38 private Set<Module> modules;
41 public void init() throws FileNotFoundException {
42 modules = TestUtils.loadModules(getClass().getResource("/model").getPath());
43 assertEquals(3, modules.size());
47 public void testRefine() {
48 Module testModule = TestUtils.findModule(modules, "nodes");
50 ContainerSchemaNode peer = (ContainerSchemaNode) testModule.getDataChildByName("peer");
51 ContainerSchemaNode destination = (ContainerSchemaNode) peer.getDataChildByName("destination");
52 Set<UsesNode> usesNodes = destination.getUses();
53 assertEquals(1, usesNodes.size());
54 UsesNode usesNode = usesNodes.iterator().next();
55 Map<SchemaPath, SchemaNode> refines = usesNode.getRefines();
56 assertEquals(3, refines.size());
58 LeafSchemaNode refineLeaf = null;
59 ContainerSchemaNode refineContainer = null;
60 ListSchemaNode refineList = null;
61 for (Map.Entry<SchemaPath, SchemaNode> entry : refines.entrySet()) {
62 SchemaNode value = entry.getValue();
63 if (value instanceof LeafSchemaNode) {
64 refineLeaf = (LeafSchemaNode) value;
65 } else if (value instanceof ContainerSchemaNode) {
66 refineContainer = (ContainerSchemaNode) value;
67 } else if (value instanceof ListSchemaNode) {
68 refineList = (ListSchemaNode) value;
73 assertNotNull(refineLeaf);
74 assertEquals("address", refineLeaf.getQName().getLocalName());
75 assertEquals("IP address of target node", refineLeaf.getDescription());
76 assertEquals("address reference added by refine", refineLeaf.getReference());
77 assertFalse(refineLeaf.isConfiguration());
78 assertFalse(refineLeaf.getConstraints().isMandatory());
79 Set<MustDefinition> leafMustConstraints = refineLeaf.getConstraints().getMustConstraints();
80 assertEquals(1, leafMustConstraints.size());
81 MustDefinition leafMust = leafMustConstraints.iterator().next();
82 assertEquals("\"ifType != 'ethernet' or (ifType = 'ethernet' and ifMTU = 1500)\"", leafMust.toString());
85 assertNotNull(refineContainer);
86 Set<MustDefinition> mustConstraints = refineContainer.getConstraints().getMustConstraints();
87 assertTrue(mustConstraints.isEmpty());
88 assertEquals("description of port defined by refine", refineContainer.getDescription());
89 assertEquals("port reference added by refine", refineContainer.getReference());
90 assertFalse(refineContainer.isConfiguration());
91 assertTrue(refineContainer.isPresenceContainer());
94 assertNotNull(refineList);
95 assertEquals("description of addresses defined by refine", refineList.getDescription());
96 assertEquals("addresses reference added by refine", refineList.getReference());
97 assertFalse(refineList.isConfiguration());
98 assertEquals(2, (int) refineList.getConstraints().getMinElements());
99 assertEquals(12, (int) refineList.getConstraints().getMaxElements());
103 public void testGrouping() {
104 Module testModule = TestUtils.findModule(modules, "custom");
105 Set<GroupingDefinition> groupings = testModule.getGroupings();
106 assertEquals(1, groupings.size());
107 GroupingDefinition grouping = groupings.iterator().next();
108 Set<DataSchemaNode> children = grouping.getChildNodes();
109 assertEquals(5, children.size());
113 public void testUses() {
114 // suffix _u = added by uses
115 // suffix _g = defined in grouping
117 Module testModule = TestUtils.findModule(modules, "custom");
120 Set<GroupingDefinition> groupings = testModule.getGroupings();
121 assertEquals(1, groupings.size());
122 GroupingDefinition grouping = groupings.iterator().next();
124 testModule = TestUtils.findModule(modules, "nodes");
126 // get node containing uses
127 ContainerSchemaNode peer = (ContainerSchemaNode) testModule.getDataChildByName("peer");
128 ContainerSchemaNode destination = (ContainerSchemaNode) peer.getDataChildByName("destination");
131 Set<UsesNode> uses = destination.getUses();
132 assertEquals(1, uses.size());
134 // check uses process
135 AnyXmlSchemaNode data_u = (AnyXmlSchemaNode) destination.getDataChildByName("data");
136 assertNotNull(data_u);
137 assertTrue(data_u.isAddedByUses());
139 AnyXmlSchemaNode data_g = (AnyXmlSchemaNode) grouping.getDataChildByName("data");
140 assertNotNull(data_g);
141 assertFalse(data_g.isAddedByUses());
142 assertFalse(data_u.equals(data_g));
144 ChoiceNode how_u = (ChoiceNode) destination.getDataChildByName("how");
145 assertNotNull(how_u);
146 assertTrue(how_u.isAddedByUses());
148 ChoiceNode how_g = (ChoiceNode) grouping.getDataChildByName("how");
149 assertNotNull(how_g);
150 assertFalse(how_g.isAddedByUses());
151 assertFalse(how_u.equals(how_g));
153 LeafSchemaNode address_u = (LeafSchemaNode) destination.getDataChildByName("address");
154 assertNotNull(address_u);
155 assertEquals("1.2.3.4", address_u.getDefault());
156 assertEquals("IP address of target node", address_u.getDescription());
157 assertEquals("address reference added by refine", address_u.getReference());
158 assertFalse(address_u.isConfiguration());
159 assertTrue(address_u.isAddedByUses());
160 assertFalse(address_u.getConstraints().isMandatory());
162 LeafSchemaNode address_g = (LeafSchemaNode) grouping.getDataChildByName("address");
163 assertNotNull(address_g);
164 assertFalse(address_g.isAddedByUses());
165 assertNull(address_g.getDefault());
166 assertEquals("Target IP address", address_g.getDescription());
167 assertNull(address_g.getReference());
168 assertTrue(address_g.isConfiguration());
169 assertFalse(address_u.equals(address_g));
170 assertTrue(address_g.getConstraints().isMandatory());
172 ContainerSchemaNode port_u = (ContainerSchemaNode) destination.getDataChildByName("port");
173 assertNotNull(port_u);
174 assertTrue(port_u.isAddedByUses());
176 ContainerSchemaNode port_g = (ContainerSchemaNode) grouping.getDataChildByName("port");
177 assertNotNull(port_g);
178 assertFalse(port_g.isAddedByUses());
179 assertFalse(port_u.equals(port_g));
181 ListSchemaNode addresses_u = (ListSchemaNode) destination.getDataChildByName("addresses");
182 assertNotNull(addresses_u);
183 assertTrue(addresses_u.isAddedByUses());
185 ListSchemaNode addresses_g = (ListSchemaNode) grouping.getDataChildByName("addresses");
186 assertNotNull(addresses_g);
187 assertFalse(addresses_g.isAddedByUses());
188 assertFalse(addresses_u.equals(addresses_g));
190 // grouping defined by 'uses'
191 Set<GroupingDefinition> groupings_u = destination.getGroupings();
192 assertEquals(1, groupings_u.size());
193 GroupingDefinition grouping_u = groupings_u.iterator().next();
194 assertTrue(grouping_u.isAddedByUses());
196 // grouping defined in 'grouping' node
197 Set<GroupingDefinition> groupings_g = grouping.getGroupings();
198 assertEquals(1, groupings_g.size());
199 GroupingDefinition grouping_g = groupings_g.iterator().next();
200 assertFalse(grouping_g.isAddedByUses());
201 assertFalse(grouping_u.equals(grouping_g));
203 List<UnknownSchemaNode> nodes_u = destination.getUnknownSchemaNodes();
204 assertEquals(1, nodes_u.size());
205 UnknownSchemaNode node_u = nodes_u.get(0);
206 assertTrue(node_u.isAddedByUses());
208 List<UnknownSchemaNode> nodes_g = grouping.getUnknownSchemaNodes();
209 assertEquals(1, nodes_g.size());
210 UnknownSchemaNode node_g = nodes_g.get(0);
211 assertFalse(node_g.isAddedByUses());
212 assertFalse(node_u.equals(node_g));
216 public void testUsesUnderModule() {
217 // suffix _u = added by uses
218 // suffix _g = defined in grouping
220 Module testModule = TestUtils.findModule(modules, "custom");
223 Set<GroupingDefinition> groupings = testModule.getGroupings();
224 assertEquals(1, groupings.size());
225 GroupingDefinition grouping = groupings.iterator().next();
227 // get node containing uses
228 Module destination = TestUtils.findModule(modules, "nodes");
231 Set<UsesNode> uses = destination.getUses();
232 assertEquals(1, uses.size());
234 // check uses process
235 AnyXmlSchemaNode data_u = (AnyXmlSchemaNode) destination.getDataChildByName("data");
236 assertNotNull(data_u);
237 assertTrue(data_u.isAddedByUses());
239 AnyXmlSchemaNode data_g = (AnyXmlSchemaNode) grouping.getDataChildByName("data");
240 assertNotNull(data_g);
241 assertFalse(data_g.isAddedByUses());
242 assertFalse(data_u.equals(data_g));
244 ChoiceNode how_u = (ChoiceNode) destination.getDataChildByName("how");
245 assertNotNull(how_u);
246 assertTrue(how_u.isAddedByUses());
248 ChoiceNode how_g = (ChoiceNode) grouping.getDataChildByName("how");
249 assertNotNull(how_g);
250 assertFalse(how_g.isAddedByUses());
251 assertFalse(how_u.equals(how_g));
253 LeafSchemaNode address_u = (LeafSchemaNode) destination.getDataChildByName("address");
254 assertNotNull(address_u);
255 assertNull(address_u.getDefault());
256 assertEquals("Target IP address", address_u.getDescription());
257 assertNull(address_u.getReference());
258 assertTrue(address_u.isConfiguration());
259 assertTrue(address_u.isAddedByUses());
261 LeafSchemaNode address_g = (LeafSchemaNode) grouping.getDataChildByName("address");
262 assertNotNull(address_g);
263 assertFalse(address_g.isAddedByUses());
264 assertNull(address_g.getDefault());
265 assertEquals("Target IP address", address_g.getDescription());
266 assertNull(address_g.getReference());
267 assertTrue(address_g.isConfiguration());
268 assertFalse(address_u.equals(address_g));
270 ContainerSchemaNode port_u = (ContainerSchemaNode) destination.getDataChildByName("port");
271 assertNotNull(port_u);
272 assertTrue(port_u.isAddedByUses());
274 ContainerSchemaNode port_g = (ContainerSchemaNode) grouping.getDataChildByName("port");
275 assertNotNull(port_g);
276 assertFalse(port_g.isAddedByUses());
277 assertFalse(port_u.equals(port_g));
279 ListSchemaNode addresses_u = (ListSchemaNode) destination.getDataChildByName("addresses");
280 assertNotNull(addresses_u);
281 assertTrue(addresses_u.isAddedByUses());
283 ListSchemaNode addresses_g = (ListSchemaNode) grouping.getDataChildByName("addresses");
284 assertNotNull(addresses_g);
285 assertFalse(addresses_g.isAddedByUses());
286 assertFalse(addresses_u.equals(addresses_g));
288 // grouping defined by 'uses'
289 Set<GroupingDefinition> groupings_u = destination.getGroupings();
290 assertEquals(1, groupings_u.size());
291 GroupingDefinition grouping_u = groupings_u.iterator().next();
292 assertTrue(grouping_u.isAddedByUses());
294 // grouping defined in 'grouping' node
295 Set<GroupingDefinition> groupings_g = grouping.getGroupings();
296 assertEquals(1, groupings_g.size());
297 GroupingDefinition grouping_g = groupings_g.iterator().next();
298 assertFalse(grouping_g.isAddedByUses());
299 assertFalse(grouping_u.equals(grouping_g));
301 List<UnknownSchemaNode> nodes_u = destination.getUnknownSchemaNodes();
302 assertEquals(1, nodes_u.size());
303 UnknownSchemaNode node_u = nodes_u.get(0);
304 assertTrue(node_u.isAddedByUses());
306 List<UnknownSchemaNode> nodes_g = grouping.getUnknownSchemaNodes();
307 assertEquals(1, nodes_g.size());
308 UnknownSchemaNode node_g = nodes_g.get(0);
309 assertFalse(node_g.isAddedByUses());
310 assertFalse(node_u.equals(node_g));
312 UsesNode un = uses.iterator().next();
313 Set<AugmentationSchema> usesAugments = un.getAugmentations();
314 assertEquals(1, usesAugments.size());
315 AugmentationSchema augment = usesAugments.iterator().next();
316 assertEquals("inner augment", augment.getDescription());
317 Set<DataSchemaNode> children = augment.getChildNodes();
318 assertEquals(1, children.size());
319 DataSchemaNode leaf = children.iterator().next();
320 assertTrue(leaf instanceof LeafSchemaNode);
321 assertEquals("name", leaf.getQName().getLocalName());
325 public void testCascadeUses() throws FileNotFoundException, ParseException {
326 modules = TestUtils.loadModules(getClass().getResource("/grouping-test").getPath());
327 Module testModule = TestUtils.findModule(modules, "cascade-uses");
328 Set<GroupingDefinition> groupings = testModule.getGroupings();
330 GroupingDefinition gu = null;
331 GroupingDefinition gv = null;
332 GroupingDefinition gx = null;
333 GroupingDefinition gy = null;
334 GroupingDefinition gz = null;
335 GroupingDefinition gzz = null;
336 for (GroupingDefinition gd : groupings) {
337 if ("grouping-U".equals(gd.getQName().getLocalName()))
339 if ("grouping-V".equals(gd.getQName().getLocalName()))
341 if ("grouping-X".equals(gd.getQName().getLocalName()))
343 if ("grouping-Y".equals(gd.getQName().getLocalName()))
345 if ("grouping-Z".equals(gd.getQName().getLocalName()))
347 if ("grouping-ZZ".equals(gd.getQName().getLocalName()))
357 assertEquals(7, gu.getChildNodes().size());
358 assertEquals(4, gv.getChildNodes().size());
359 assertEquals(2, gx.getChildNodes().size());
360 assertEquals(1, gy.getChildNodes().size());
361 assertEquals(1, gz.getChildNodes().size());
362 assertEquals(1, gzz.getChildNodes().size());
364 URI expectedNS = URI.create("urn:grouping:cascade-uses");
365 Date expectedRev = TestUtils.simpleDateFormat.parse("2013-07-18");
366 String expectedPref = "cu";
367 SchemaPath expectedPath;
369 // grouping-V/container-grouping-V
370 ContainerSchemaNode containerV = (ContainerSchemaNode)gv.getDataChildByName("container-grouping-V");
371 assertNotNull(containerV);
372 expectedPath = TestUtils.createPath(true, expectedNS, expectedRev, expectedPref, "grouping-V", "container-grouping-V");
373 assertEquals(2, containerV.getChildNodes().size());
374 // grouping-V/container-grouping-V/leaf-grouping-X
375 LeafSchemaNode leafXinContainerV = (LeafSchemaNode)containerV.getDataChildByName("leaf-grouping-X");
376 assertNotNull(leafXinContainerV);
377 expectedPath = TestUtils.createPath(true, expectedNS, expectedRev, expectedPref, "grouping-V", "container-grouping-V", "leaf-grouping-X");
378 assertEquals(expectedPath, leafXinContainerV.getPath());
379 // grouping-V/container-grouping-V/leaf-grouping-Y
380 LeafSchemaNode leafYinContainerV = (LeafSchemaNode)containerV.getDataChildByName("leaf-grouping-Y");
381 assertNotNull(leafYinContainerV);
382 expectedPath = TestUtils.createPath(true, expectedNS, expectedRev, expectedPref, "grouping-V", "container-grouping-V", "leaf-grouping-Y");
383 assertEquals(expectedPath, leafYinContainerV.getPath());
385 // grouping-X/leaf-grouping-X
386 LeafSchemaNode leafXinGX = (LeafSchemaNode)gx.getDataChildByName("leaf-grouping-X");
387 assertNotNull(leafXinGX);
388 expectedPath = TestUtils.createPath(true, expectedNS, expectedRev, expectedPref, "grouping-X", "leaf-grouping-X");
389 assertEquals(expectedPath, leafXinGX.getPath());
390 // grouping-X/leaf-grouping-Y
391 LeafSchemaNode leafYinGY = (LeafSchemaNode)gx.getDataChildByName("leaf-grouping-Y");
392 assertNotNull(leafYinGY);
393 expectedPath = TestUtils.createPath(true, expectedNS, expectedRev, expectedPref, "grouping-X", "leaf-grouping-Y");
394 assertEquals(expectedPath, leafYinGY.getPath());