699d0b66177f5b4a01eb5f0392ee8588bc3b6378
[yangtools.git] / yang / yang-data-impl / src / test / java / org / opendaylight / yangtools / yang / data / impl / schema / BuilderTest.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
9 package org.opendaylight.yangtools.yang.data.impl.schema;
10
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertNotNull;
13 import static org.junit.Assert.assertNull;
14 import static org.junit.Assert.assertThrows;
15 import static org.mockito.Mockito.mock;
16
17 import java.io.File;
18 import java.net.URISyntaxException;
19 import java.util.HashMap;
20 import java.util.LinkedList;
21 import java.util.Map;
22 import org.junit.Before;
23 import org.junit.Test;
24 import org.opendaylight.yangtools.util.UnmodifiableCollection;
25 import org.opendaylight.yangtools.yang.common.QName;
26 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
27 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
28 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue;
29 import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
30 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
31 import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode;
32 import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode;
33 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
34 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
35 import org.opendaylight.yangtools.yang.data.api.schema.SystemLeafSetNode;
36 import org.opendaylight.yangtools.yang.data.api.schema.SystemMapNode;
37 import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode;
38 import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode;
39 import org.opendaylight.yangtools.yang.data.api.schema.UserLeafSetNode;
40 import org.opendaylight.yangtools.yang.data.api.schema.UserMapNode;
41 import org.opendaylight.yangtools.yang.data.api.schema.builder.CollectionNodeBuilder;
42 import org.opendaylight.yangtools.yang.data.api.schema.builder.ListNodeBuilder;
43 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableAugmentationNodeBuilder;
44 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableChoiceNodeBuilder;
45 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder;
46 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeSchemaAwareBuilder;
47 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafSetEntryNodeBuilder;
48 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafSetEntryNodeSchemaAwareBuilder;
49 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafSetNodeBuilder;
50 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafSetNodeSchemaAwareBuilder;
51 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableMapEntryNodeBuilder;
52 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableMapNodeBuilder;
53 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableMapNodeSchemaAwareBuilder;
54 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableUnkeyedListEntryNodeBuilder;
55 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableUnkeyedListNodeBuilder;
56 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableUserLeafSetNodeBuilder;
57 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableUserLeafSetNodeSchemaAwareBuilder;
58 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableUserMapNodeBuilder;
59 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableUserMapNodeSchemaAwareBuilder;
60 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
61 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
62 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
63 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
64 import org.opendaylight.yangtools.yang.model.api.Module;
65 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
66 import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
67
68 public class BuilderTest {
69     private static final QName ROOT_CONTAINER = QName.create("test.namespace.builder.test", "2016-01-01",
70         "root-container");
71     private static final QName LIST_MAIN = QName.create(ROOT_CONTAINER, "list-ordered-by-user-with-key");
72     private static final QName LEAF_LIST_MAIN = QName.create(ROOT_CONTAINER, "leaf-list-ordered-by-user");
73     private static final QName LIST_MAIN_CHILD_QNAME_1 = QName.create(ROOT_CONTAINER, "leaf-a");
74     private static final NodeIdentifier NODE_IDENTIFIER_LIST = NodeIdentifier.create(LIST_MAIN);
75     private static final NodeIdentifier NODE_IDENTIFIER_LEAF_LIST = NodeIdentifier.create(LEAF_LIST_MAIN);
76     private static final NodeIdentifier NODE_IDENTIFIER_LEAF = NodeIdentifier.create(LIST_MAIN_CHILD_QNAME_1);
77     private static final MapEntryNode LIST_MAIN_CHILD_1 = ImmutableNodes.mapEntry(LIST_MAIN, LIST_MAIN_CHILD_QNAME_1,
78             1);
79     private static final MapEntryNode LIST_MAIN_CHILD_2 = ImmutableNodes.mapEntry(LIST_MAIN, LIST_MAIN_CHILD_QNAME_1,
80             2);
81     private static final MapEntryNode LIST_MAIN_CHILD_3 = ImmutableNodes.mapEntry(LIST_MAIN, LIST_MAIN_CHILD_QNAME_1,
82             3);
83     private static final int SIZE = 3;
84     private static final NodeWithValue<String> BAR_PATH = new NodeWithValue<>(LEAF_LIST_MAIN, "bar");
85     private static final LeafSetEntryNode<String> LEAF_SET_ENTRY_NODE =
86             ImmutableLeafSetEntryNodeBuilder.<String>create()
87             .withNodeIdentifier(BAR_PATH)
88             .withValue("bar")
89             .build();
90     private ListSchemaNode list;
91     private LeafListSchemaNode leafList;
92
93     @Before
94     public void setup() throws URISyntaxException {
95         final File leafRefTestYang = new File(getClass().getResource("/builder-test/immutable-ordered-map-node.yang")
96                 .toURI());
97         final SchemaContext schema = YangParserTestUtils.parseYangFiles(leafRefTestYang);
98         final Module module = schema.getModules().iterator().next();
99         final DataSchemaNode root = module.findDataChildByName(ROOT_CONTAINER).get();
100         list = (ListSchemaNode)((ContainerSchemaNode) root).findDataChildByName(LIST_MAIN).get();
101         leafList = (LeafListSchemaNode)((ContainerSchemaNode) root).findDataChildByName(LEAF_LIST_MAIN).get();
102     }
103
104     @Test
105     public void immutableOrderedMapBuilderTest() {
106         final LinkedList<MapEntryNode> mapEntryNodeColl = new LinkedList<>();
107         mapEntryNodeColl.add(LIST_MAIN_CHILD_3);
108         final Map<QName, Object> keys = new HashMap<>();
109         keys.put(LIST_MAIN_CHILD_QNAME_1, 1);
110         final NodeIdentifierWithPredicates mapEntryPath = NodeIdentifierWithPredicates.of(LIST_MAIN, keys);
111         final UserMapNode orderedMapNodeCreateNull = ImmutableUserMapNodeBuilder.create()
112                 .withNodeIdentifier(NODE_IDENTIFIER_LIST)
113                 .withChild(LIST_MAIN_CHILD_1)
114                 .addChild(LIST_MAIN_CHILD_2)
115                 .withValue(mapEntryNodeColl)
116                 .build();
117         final UserMapNode orderedMapNodeCreateSize = ImmutableUserMapNodeBuilder.create(SIZE)
118                 .withNodeIdentifier(NODE_IDENTIFIER_LIST)
119                 .build();
120         final UserMapNode orderedMapNodeCreateNode = ImmutableUserMapNodeBuilder.create(orderedMapNodeCreateNull)
121                 .removeChild(mapEntryPath)
122                 .build();
123         final UserMapNode orderedMapNodeSchemaAware = ImmutableUserMapNodeSchemaAwareBuilder.create(list)
124                 .withChild(LIST_MAIN_CHILD_1)
125                 .build();
126         final UserMapNode orderedMapNodeSchemaAwareMapNodeConst = ImmutableUserMapNodeSchemaAwareBuilder.create(
127                 list, getImmutableUserMapNode())
128                 .build();
129
130         assertNotNull(Builders.orderedMapBuilder(list));
131         assertEquals(SIZE, orderedMapNodeCreateNull.size());
132         assertEquals(orderedMapNodeCreateNode.size(), orderedMapNodeCreateNull.size() - 1);
133         assertEquals(NODE_IDENTIFIER_LIST, orderedMapNodeCreateSize.getIdentifier());
134         assertEquals(LIST_MAIN_CHILD_1, orderedMapNodeCreateNull.childAt(0));
135         assertEquals(SIZE, orderedMapNodeCreateNull.size());
136         assertEquals(orderedMapNodeSchemaAware.childAt(0), orderedMapNodeSchemaAwareMapNodeConst.childAt(0));
137     }
138
139     @Test
140     public void immutableUserLeafSetNodeBuilderTest() {
141         final UserLeafSetNode<String> orderedLeafSet = ImmutableUserLeafSetNodeBuilder.<String>create()
142                 .withNodeIdentifier(NODE_IDENTIFIER_LEAF_LIST)
143                 .withChild(LEAF_SET_ENTRY_NODE)
144                 .withChildValue("baz")
145                 .removeChild(BAR_PATH)
146                 .build();
147         final LinkedList<LeafSetNode<?>> mapEntryNodeColl = new LinkedList<>();
148         mapEntryNodeColl.add(orderedLeafSet);
149         final UnmodifiableCollection<?> leafSetCollection = (UnmodifiableCollection<?>)orderedLeafSet.body();
150         final NormalizedNode orderedMapNodeSchemaAware = ImmutableUserLeafSetNodeSchemaAwareBuilder.create(
151             leafList).withChildValue("baz").build();
152         final UnmodifiableCollection<?> SchemaAwareleafSetCollection =
153                 (UnmodifiableCollection<?>) orderedMapNodeSchemaAware.body();
154         final NormalizedNode orderedLeafSetShemaAware = ImmutableUserLeafSetNodeSchemaAwareBuilder.create(
155             leafList, (UserLeafSetNode<?>) orderedLeafSet).build();
156
157         assertNotNull(Builders.orderedLeafSetBuilder(leafList));
158         assertNotNull(Builders.anyXmlBuilder());
159         assertNotNull(orderedLeafSetShemaAware);
160         assertEquals(1, ((UserLeafSetNode<?>)orderedLeafSet).size());
161         assertEquals("baz", orderedLeafSet.childAt(0).body());
162         assertNull(orderedLeafSet.childByArg(BAR_PATH));
163         assertEquals(1, leafSetCollection.size());
164         assertEquals(1, SchemaAwareleafSetCollection.size());
165     }
166
167     @Test
168     public void immutableMapNodeBuilderTest() {
169         final LinkedList<MapEntryNode> mapEntryNodeColl = new LinkedList<>();
170         mapEntryNodeColl.add(LIST_MAIN_CHILD_3);
171         final CollectionNodeBuilder<MapEntryNode, SystemMapNode> collectionNodeBuilder =
172             ImmutableMapNodeBuilder.create(1);
173         assertNotNull(collectionNodeBuilder);
174         collectionNodeBuilder.withNodeIdentifier(NODE_IDENTIFIER_LEAF_LIST);
175         collectionNodeBuilder.withValue(mapEntryNodeColl);
176         final SystemMapNode mapNode = collectionNodeBuilder.build();
177         final SystemMapNode mapNodeSchemaAware = ImmutableMapNodeSchemaAwareBuilder.create(list,
178             getImmutableMapNode()).build();
179         assertNotNull(mapNodeSchemaAware);
180         assertNotNull(Builders.mapBuilder(mapNode));
181     }
182
183     @Test
184     public void immutableUnkeyedListEntryNodeBuilderTest() {
185         final UnkeyedListEntryNode unkeyedListEntryNode = ImmutableUnkeyedListEntryNodeBuilder.create()
186                 .withNodeIdentifier(NODE_IDENTIFIER_LIST)
187                 .build();
188         final UnkeyedListEntryNode unkeyedListEntryNodeSize = ImmutableUnkeyedListEntryNodeBuilder.create(1)
189                 .withNodeIdentifier(NODE_IDENTIFIER_LIST)
190                 .build();
191         final UnkeyedListEntryNode unkeyedListEntryNodeNode = ImmutableUnkeyedListEntryNodeBuilder
192                 .create(unkeyedListEntryNode).build();
193         assertEquals(unkeyedListEntryNode.getNodeType().getLocalName(), unkeyedListEntryNodeSize.getNodeType()
194                 .getLocalName());
195         assertEquals(unkeyedListEntryNodeSize.getNodeType().getLocalName(), unkeyedListEntryNodeNode.getNodeType()
196                 .getLocalName());
197     }
198
199     @Test
200     public void immutableUnkeyedListNodeBuilderTest() {
201         final UnkeyedListEntryNode unkeyedListEntryNode = ImmutableUnkeyedListEntryNodeBuilder.create()
202                 .withNodeIdentifier(NODE_IDENTIFIER_LEAF)
203                 .build();
204         final ImmutableUnkeyedListNodeBuilder immutableUnkeyedListNodeBuilder = (ImmutableUnkeyedListNodeBuilder)
205                 ImmutableUnkeyedListNodeBuilder.create();
206         final UnkeyedListNode unkeyedListNode = immutableUnkeyedListNodeBuilder
207                 .withNodeIdentifier(NODE_IDENTIFIER_LEAF_LIST)
208                 .addChild(unkeyedListEntryNode)
209                 .build();
210         final UnkeyedListNode unkeyedListNodeSize = ImmutableUnkeyedListNodeBuilder.create(1)
211                 .withNodeIdentifier(NODE_IDENTIFIER_LEAF_LIST)
212                 .build();
213         final UnkeyedListNode unkeyedListNodeCreated = ImmutableUnkeyedListNodeBuilder.create(unkeyedListNode)
214                 .build();
215
216         assertThrows(IndexOutOfBoundsException.class, () -> unkeyedListNodeSize.childAt(1));
217
218         assertNotNull(unkeyedListNodeSize.body());
219         assertEquals(unkeyedListEntryNode, unkeyedListNodeCreated.childAt(0));
220         assertEquals(unkeyedListNode.getNodeType().getLocalName(), unkeyedListNodeSize.getNodeType().getLocalName());
221         assertNotNull(unkeyedListNodeCreated);
222     }
223
224     @Test
225     public void immutableChoiceNodeBuilderTest() {
226         final ChoiceNode choiceNode = ImmutableChoiceNodeBuilder.create(1).withNodeIdentifier(NODE_IDENTIFIER_LIST)
227                 .build();
228         final ChoiceNode choiceNodeCreated = ImmutableChoiceNodeBuilder.create(choiceNode).build();
229         assertEquals(choiceNodeCreated.getIdentifier(), choiceNode.getIdentifier());
230     }
231
232
233     @Test(expected = NullPointerException.class)
234     public void immutableAugmentationNodeBuilderExceptionTest() {
235         ImmutableAugmentationNodeBuilder.create(1).build();
236     }
237
238     @Test(expected = NullPointerException.class)
239     public void immutableContainerNodeBuilderExceptionTest() {
240         final ContainerNode immutableContainerNode = ImmutableContainerNodeBuilder.create(1)
241                 .withNodeIdentifier(NODE_IDENTIFIER_LIST)
242                 .build();
243         assertNotNull(immutableContainerNode);
244         final ContainerSchemaNode containerSchemaNode = mock(ContainerSchemaNode.class);
245         ImmutableContainerNodeSchemaAwareBuilder.create(containerSchemaNode, immutableContainerNode)
246                 .withNodeIdentifier(NODE_IDENTIFIER_LIST)
247                 .build();
248     }
249
250     @Test(expected = NullPointerException.class)
251     public void immutableLeafSetNodeBuilderExceptionTest() {
252         final SystemLeafSetNode<Object> leafSetNode = ImmutableLeafSetNodeBuilder.create(1)
253                 .withNodeIdentifier(NODE_IDENTIFIER_LEAF_LIST).build();
254         assertNotNull(leafSetNode);
255         ImmutableLeafSetNodeSchemaAwareBuilder.create(mock(LeafListSchemaNode.class), leafSetNode).build();
256     }
257
258     @Test(expected = UnsupportedOperationException.class)
259     public void immutableLeafSetEntryNodeSchemaAwareBuilderExceptionTest() {
260         final LeafListSchemaNode leafListSchemaNode = mock(LeafListSchemaNode.class);
261         ImmutableLeafSetEntryNodeSchemaAwareBuilder.create(leafListSchemaNode).withNodeIdentifier(BAR_PATH).build();
262     }
263
264     @Test(expected = NullPointerException.class)
265     public void immutableMapEntryNodeBuilderExceptionTest() {
266         ImmutableMapEntryNodeBuilder.create(1).build();
267     }
268
269     @Test(expected = UnsupportedOperationException.class)
270     public void immutableUnkeyedListNodeBuilderExceptionTest() {
271         ImmutableUnkeyedListNodeBuilder.create().withNodeIdentifier(NODE_IDENTIFIER_LEAF)
272                 .removeChild(NODE_IDENTIFIER_LIST).build();
273     }
274
275     @Test(expected = UnsupportedOperationException.class)
276     public void immutableMapNodeSchemaAwareExceptionTest() {
277         ImmutableMapNodeSchemaAwareBuilder.create(list, getImmutableMapNode()).withNodeIdentifier(NODE_IDENTIFIER_LIST)
278         .build();
279     }
280
281     @Test(expected = UnsupportedOperationException.class)
282     public void immutableOrderedMapSchemaAwareExceptionTest1() {
283         ImmutableUserMapNodeSchemaAwareBuilder.create(list).withNodeIdentifier(NODE_IDENTIFIER_LIST).build();
284     }
285
286     @Test(expected = UnsupportedOperationException.class)
287     public void immutableUserLeafSetNodeSchemaAwareExceptionTest1() {
288         ImmutableUserLeafSetNodeSchemaAwareBuilder.create(leafList).withNodeIdentifier(NODE_IDENTIFIER_LEAF_LIST)
289         .build();
290     }
291
292     private static SystemLeafSetNode<String> getImmutableLeafSetNode() {
293         final ListNodeBuilder<String, SystemLeafSetNode<String>> leafSetBuilder = Builders.leafSetBuilder();
294         leafSetBuilder.withNodeIdentifier(NODE_IDENTIFIER_LEAF_LIST);
295         leafSetBuilder.addChild(LEAF_SET_ENTRY_NODE);
296         return leafSetBuilder.build();
297     }
298
299     private static SystemMapNode getImmutableMapNode() {
300         return ImmutableMapNodeBuilder.create().withNodeIdentifier(NODE_IDENTIFIER_LIST).withChild(LIST_MAIN_CHILD_1)
301                 .build();
302     }
303
304     private static UserMapNode getImmutableUserMapNode() {
305         return ImmutableUserMapNodeBuilder.create().withNodeIdentifier(NODE_IDENTIFIER_LIST)
306                 .withChild(LIST_MAIN_CHILD_1).build();
307     }
308 }