Refactored parsing of yang uses statement.
[yangtools.git] / yang-parser-impl / src / test / java / org / opendaylight / yangtools / yang / parser / impl / GroupingTest.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.util.List;
14 import java.util.Map;
15 import java.util.Set;
16
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;
33
34 public class GroupingTest {
35     private Set<Module> modules;
36
37     @Before
38     public void init() throws FileNotFoundException {
39         modules = TestUtils.loadModules(getClass().getResource("/model").getPath());
40         assertEquals(3, modules.size());
41     }
42
43     @Test
44     public void testRefine() {
45         Module testModule = TestUtils.findModule(modules, "nodes");
46
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());
54
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;
66             }
67         }
68
69         // leaf address
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());
80
81         // container port
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());
89
90         // list addresses
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());
97     }
98
99     @Test
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());
107     }
108
109     @Test
110     public void testUses() {
111         // suffix _u = added by uses
112         // suffix _g = defined in grouping
113
114         Module testModule = TestUtils.findModule(modules, "custom");
115
116         // get grouping
117         Set<GroupingDefinition> groupings = testModule.getGroupings();
118         assertEquals(1, groupings.size());
119         GroupingDefinition grouping = groupings.iterator().next();
120
121         testModule = TestUtils.findModule(modules, "nodes");
122
123         // get node containing uses
124         ContainerSchemaNode peer = (ContainerSchemaNode) testModule.getDataChildByName("peer");
125         ContainerSchemaNode destination = (ContainerSchemaNode) peer.getDataChildByName("destination");
126
127         // check uses
128         Set<UsesNode> uses = destination.getUses();
129         assertEquals(1, uses.size());
130
131         // check uses process
132         AnyXmlSchemaNode data_u = (AnyXmlSchemaNode) destination.getDataChildByName("data");
133         assertNotNull(data_u);
134         assertTrue(data_u.isAddedByUses());
135
136         AnyXmlSchemaNode data_g = (AnyXmlSchemaNode) grouping.getDataChildByName("data");
137         assertNotNull(data_g);
138         assertFalse(data_g.isAddedByUses());
139         assertFalse(data_u.equals(data_g));
140
141         ChoiceNode how_u = (ChoiceNode) destination.getDataChildByName("how");
142         assertNotNull(how_u);
143         assertTrue(how_u.isAddedByUses());
144
145         ChoiceNode how_g = (ChoiceNode) grouping.getDataChildByName("how");
146         assertNotNull(how_g);
147         assertFalse(how_g.isAddedByUses());
148         assertFalse(how_u.equals(how_g));
149
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());
158
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());
168
169         ContainerSchemaNode port_u = (ContainerSchemaNode) destination.getDataChildByName("port");
170         assertNotNull(port_u);
171         assertTrue(port_u.isAddedByUses());
172
173         ContainerSchemaNode port_g = (ContainerSchemaNode) grouping.getDataChildByName("port");
174         assertNotNull(port_g);
175         assertFalse(port_g.isAddedByUses());
176         assertFalse(port_u.equals(port_g));
177
178         ListSchemaNode addresses_u = (ListSchemaNode) destination.getDataChildByName("addresses");
179         assertNotNull(addresses_u);
180         assertTrue(addresses_u.isAddedByUses());
181
182         ListSchemaNode addresses_g = (ListSchemaNode) grouping.getDataChildByName("addresses");
183         assertNotNull(addresses_g);
184         assertFalse(addresses_g.isAddedByUses());
185         assertFalse(addresses_u.equals(addresses_g));
186
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());
192
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));
199
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());
204
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));
210     }
211
212     @Test
213     public void testUsesUnderModule() {
214         // suffix _u = added by uses
215         // suffix _g = defined in grouping
216
217         Module testModule = TestUtils.findModule(modules, "custom");
218
219         // get grouping
220         Set<GroupingDefinition> groupings = testModule.getGroupings();
221         assertEquals(1, groupings.size());
222         GroupingDefinition grouping = groupings.iterator().next();
223
224         // get node containing uses
225         Module destination = TestUtils.findModule(modules, "nodes");
226
227         // check uses
228         Set<UsesNode> uses = destination.getUses();
229         assertEquals(1, uses.size());
230
231         // check uses process
232         AnyXmlSchemaNode data_u = (AnyXmlSchemaNode) destination.getDataChildByName("data");
233         assertNotNull(data_u);
234         assertTrue(data_u.isAddedByUses());
235
236         AnyXmlSchemaNode data_g = (AnyXmlSchemaNode) grouping.getDataChildByName("data");
237         assertNotNull(data_g);
238         assertFalse(data_g.isAddedByUses());
239         assertFalse(data_u.equals(data_g));
240
241         ChoiceNode how_u = (ChoiceNode) destination.getDataChildByName("how");
242         assertNotNull(how_u);
243         assertTrue(how_u.isAddedByUses());
244
245         ChoiceNode how_g = (ChoiceNode) grouping.getDataChildByName("how");
246         assertNotNull(how_g);
247         assertFalse(how_g.isAddedByUses());
248         assertFalse(how_u.equals(how_g));
249
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());
257
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));
266
267         ContainerSchemaNode port_u = (ContainerSchemaNode) destination.getDataChildByName("port");
268         assertNotNull(port_u);
269         assertTrue(port_u.isAddedByUses());
270
271         ContainerSchemaNode port_g = (ContainerSchemaNode) grouping.getDataChildByName("port");
272         assertNotNull(port_g);
273         assertFalse(port_g.isAddedByUses());
274         assertFalse(port_u.equals(port_g));
275
276         ListSchemaNode addresses_u = (ListSchemaNode) destination.getDataChildByName("addresses");
277         assertNotNull(addresses_u);
278         assertTrue(addresses_u.isAddedByUses());
279
280         ListSchemaNode addresses_g = (ListSchemaNode) grouping.getDataChildByName("addresses");
281         assertNotNull(addresses_g);
282         assertFalse(addresses_g.isAddedByUses());
283         assertFalse(addresses_u.equals(addresses_g));
284
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());
290
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));
297
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());
302
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));
308
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());
319     }
320
321     @Test
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();
326
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()))
335                 gu = gd;
336             if ("grouping-V".equals(gd.getQName().getLocalName()))
337                 gv = gd;
338             if ("grouping-X".equals(gd.getQName().getLocalName()))
339                 gx = gd;
340             if ("grouping-Y".equals(gd.getQName().getLocalName()))
341                 gy = gd;
342             if ("grouping-Z".equals(gd.getQName().getLocalName()))
343                 gz = gd;
344             if ("grouping-ZZ".equals(gd.getQName().getLocalName()))
345                 gzz = gd;
346         }
347         assertNotNull(gu);
348         assertNotNull(gv);
349         assertNotNull(gx);
350         assertNotNull(gy);
351         assertNotNull(gz);
352         assertNotNull(gzz);
353
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());
360     }
361
362 }