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