ad258004f02a5b617a2079ba0222e00440c0f15b
[yangtools.git] / parser / yang-parser-rfc7950 / src / test / java / org / opendaylight / yangtools / yang / stmt / EffectiveUsesRefineAndConstraintsTest.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.assertTrue;
14
15 import com.google.common.collect.Iterables;
16 import java.util.Optional;
17 import org.junit.Test;
18 import org.opendaylight.yangtools.yang.common.QName;
19 import org.opendaylight.yangtools.yang.common.QNameModule;
20 import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
21 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
22 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
23 import org.opendaylight.yangtools.yang.model.api.ElementCountConstraint;
24 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
25 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
26 import org.opendaylight.yangtools.yang.model.api.stmt.GroupingEffectiveStatement;
27 import org.opendaylight.yangtools.yang.model.api.stmt.ModuleEffectiveStatement;
28
29 public class EffectiveUsesRefineAndConstraintsTest {
30     @Test
31     public void refineTest() throws Exception {
32         final EffectiveModelContext result = StmtTestUtils.parseYangSource("/stmt-test/uses/refine-test.yang");
33
34         final ModuleEffectiveStatement module = Iterables.getOnlyElement(result.getModuleStatements().values());
35         final QNameModule qnameModule = module.localQNameModule();
36         final QName rootContainer = QName.create(qnameModule, "root-container");
37
38         final QName containerFromGrouping = QName.create(qnameModule, "container-from-grouping");
39         final QName listInContainer = QName.create(qnameModule, "list-in-container");
40         final QName choiceFromGrp = QName.create(qnameModule, "choice-from-grp");
41
42         final QName containerFromGrouping2 = QName.create(qnameModule, "container-from-grouping2");
43         final QName presenceContainer = QName.create(qnameModule, "presence-container");
44
45         checkRefinedList(module, rootContainer, containerFromGrouping, listInContainer);
46         checkRefinedChoice(module, rootContainer, containerFromGrouping, choiceFromGrp);
47         checkRefinedContainer(module, rootContainer, containerFromGrouping2, presenceContainer);
48
49         final GroupingEffectiveStatement grp = module.findFirstEffectiveSubstatement(GroupingEffectiveStatement.class)
50             .orElseThrow();
51         assertEquals(QName.create(qnameModule, "grp-1"), grp.argument());
52
53         checkOriginalList(grp, containerFromGrouping, listInContainer);
54         checkOriginalChoice(grp, containerFromGrouping, choiceFromGrp);
55         checkOriginalContainer(grp, containerFromGrouping2, presenceContainer);
56     }
57
58     private static void checkOriginalContainer(final GroupingEffectiveStatement grp, final QName... qnames) {
59         SchemaNode containerInContainerNode = (SchemaNode) grp.findSchemaTreeNode(qnames).orElse(null);
60         assertNotNull(containerInContainerNode);
61
62         ContainerSchemaNode containerSchemaNode = (ContainerSchemaNode) containerInContainerNode;
63         assertFalse(containerSchemaNode.getReference().isPresent());
64         assertFalse(containerSchemaNode.getDescription().isPresent());
65         assertEquals(Optional.empty(), containerSchemaNode.effectiveConfig());
66         assertFalse(containerSchemaNode.isPresenceContainer());
67
68         assertEquals(0, containerSchemaNode.getMustConstraints().size());
69     }
70
71     private static void checkOriginalChoice(final GroupingEffectiveStatement grp, final QName... qnames) {
72         SchemaNode choiceInContainerNode = (SchemaNode) grp.findSchemaTreeNode(qnames).orElse(null);
73         assertNotNull(choiceInContainerNode);
74
75         ChoiceSchemaNode choiceSchemaNode = (ChoiceSchemaNode) choiceInContainerNode;
76         assertFalse(choiceSchemaNode.isMandatory());
77     }
78
79     private static void checkOriginalList(final GroupingEffectiveStatement grp, final QName... qnames) {
80         SchemaNode listInContainerNode = (SchemaNode) grp.findSchemaTreeNode(qnames).orElse(null);
81         assertNotNull(listInContainerNode);
82
83         ListSchemaNode listSchemaNode = (ListSchemaNode) listInContainerNode;
84         assertEquals(Optional.of("original reference"), listSchemaNode.getReference());
85         assertEquals(Optional.of("original description"), listSchemaNode.getDescription());
86         assertEquals(Optional.of(Boolean.FALSE), listSchemaNode.effectiveConfig());
87
88         ElementCountConstraint listConstraints = listSchemaNode.getElementCountConstraint().get();
89         assertEquals((Object) 10, listConstraints.getMinElements());
90         assertEquals((Object) 20, listConstraints.getMaxElements());
91         assertEquals(1, listSchemaNode.getMustConstraints().size());
92     }
93
94     private static void checkRefinedContainer(final ModuleEffectiveStatement module, final QName... qnames) {
95         final SchemaNode containerInContainerNode = (SchemaNode) module.findSchemaTreeNode(qnames).orElse(null);
96         assertNotNull(containerInContainerNode);
97
98         ContainerSchemaNode containerSchemaNode = (ContainerSchemaNode) containerInContainerNode;
99         assertEquals(Optional.of("new reference"), containerSchemaNode.getReference());
100         assertEquals(Optional.of("new description"), containerSchemaNode.getDescription());
101         assertEquals(Optional.of(Boolean.TRUE), containerSchemaNode.effectiveConfig());
102         assertTrue(containerSchemaNode.isPresenceContainer());
103         assertEquals(1, containerSchemaNode.getMustConstraints().size());
104     }
105
106     private static void checkRefinedChoice(final ModuleEffectiveStatement module, final QName... qnames) {
107         final SchemaNode choiceInContainerNode = (SchemaNode) module.findSchemaTreeNode(qnames).orElse(null);
108         assertNotNull(choiceInContainerNode);
109
110         ChoiceSchemaNode choiceSchemaNode = (ChoiceSchemaNode) choiceInContainerNode;
111         assertTrue(choiceSchemaNode.isMandatory());
112     }
113
114     private static void checkRefinedList(final ModuleEffectiveStatement module, final QName... qnames) {
115         final SchemaNode listInContainerNode = (SchemaNode) module.findSchemaTreeNode(qnames).orElse(null);
116         assertNotNull(listInContainerNode);
117
118         final ListSchemaNode listSchemaNode = (ListSchemaNode) listInContainerNode;
119         assertEquals(Optional.of("new reference"), listSchemaNode.getReference());
120         assertEquals(Optional.of("new description"), listSchemaNode.getDescription());
121         assertEquals(Optional.of(Boolean.TRUE), listSchemaNode.effectiveConfig());
122
123         final ElementCountConstraint listConstraints = listSchemaNode.getElementCountConstraint().get();
124         assertEquals((Object) 5, listConstraints.getMinElements());
125         assertEquals((Object) 7, listConstraints.getMaxElements());
126         assertEquals(2, listSchemaNode.getMustConstraints().size());
127     }
128 }