Populate data/ hierarchy
[yangtools.git] / data / yang-data-impl / src / test / java / org / opendaylight / yangtools / yang / data / impl / schema / ImmutableNormalizedNodeStreamWriterTest.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
14 import com.google.common.collect.ImmutableSet;
15 import java.io.IOException;
16 import java.text.ParseException;
17 import java.util.ArrayList;
18 import java.util.HashMap;
19 import java.util.List;
20 import java.util.Map;
21 import javax.xml.transform.dom.DOMSource;
22 import org.junit.Before;
23 import org.junit.Test;
24 import org.opendaylight.yangtools.yang.common.QName;
25 import org.opendaylight.yangtools.yang.common.QNameModule;
26 import org.opendaylight.yangtools.yang.common.Revision;
27 import org.opendaylight.yangtools.yang.common.XMLNamespace;
28 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier;
29 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
30 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
31 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue;
32 import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode;
33 import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
34 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
35 import org.opendaylight.yangtools.yang.data.api.schema.DOMSourceAnyxmlNode;
36 import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
37 import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode;
38 import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
39 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
40 import org.opendaylight.yangtools.yang.data.api.schema.SystemMapNode;
41 import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode;
42 import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode;
43 import org.opendaylight.yangtools.yang.data.api.schema.UserMapNode;
44 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
45 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter;
46
47 public class ImmutableNormalizedNodeStreamWriterTest {
48
49     private QNameModule bazModule;
50
51     private QName outerContainer;
52
53     private QName myContainer1;
54     private QName myKeyedList;
55     private QName myKeyLeaf;
56     private QName myLeafInList1;
57     private QName myLeafInList2;
58     private QName myOrderedList;
59     private QName myKeyLeafInOrderedList;
60     private QName myLeafInOrderedList1;
61     private QName myLeafInOrderedList2;
62     private QName myUnkeyedList;
63     private QName myLeafInUnkeyedList;
64     private QName myLeaf1;
65     private QName myLeafList;
66     private QName myOrderedLeafList;
67
68     private QName myContainer2;
69     private QName innerContainer;
70     private QName myLeaf2;
71     private QName myLeaf3;
72     private QName myChoice;
73     private QName myLeafInCase2;
74     private QName myAnyxml;
75
76     private QName myContainer3;
77     private QName myDoublyKeyedList;
78     private QName myFirstKeyLeaf;
79     private QName mySecondKeyLeaf;
80     private QName myLeafInList3;
81
82     private DOMSource anyxmlDomSource;
83
84     @Before
85     public void setup() throws ParseException {
86         bazModule = QNameModule.create(XMLNamespace.of("baz-namespace"), Revision.of("1970-01-01"));
87
88         outerContainer = QName.create(bazModule, "outer-container");
89
90         myContainer1 = QName.create(bazModule, "my-container-1");
91         myKeyedList = QName.create(bazModule, "my-keyed-list");
92         myKeyLeaf = QName.create(bazModule, "my-key-leaf");
93         myLeafInList1 = QName.create(bazModule, "my-leaf-in-list-1");
94         myLeafInList2 = QName.create(bazModule, "my-leaf-in-list-2");
95         myOrderedList = QName.create(bazModule, "my-ordered-list");
96         myKeyLeafInOrderedList = QName.create(bazModule, "my-key-leaf-in-ordered-list");
97         myLeafInOrderedList1 = QName.create(bazModule, "my-leaf-in-ordered-list-1");
98         myLeafInOrderedList2 = QName.create(bazModule, "my-leaf-in-ordered-list-2");
99         myUnkeyedList = QName.create(bazModule, "my-unkeyed-list");
100         myLeafInUnkeyedList = QName.create(bazModule, "my-leaf-in-unkeyed-list");
101         myLeaf1 = QName.create(bazModule, "my-leaf-1");
102         myLeafList = QName.create(bazModule, "my-leaf-list");
103         myOrderedLeafList = QName.create(bazModule, "my-ordered-leaf-list");
104
105         myContainer2 = QName.create(bazModule, "my-container-2");
106         innerContainer = QName.create(bazModule, "inner-container");
107         myLeaf2 = QName.create(bazModule, "my-leaf-2");
108         myLeaf3 = QName.create(bazModule, "my-leaf-3");
109         myChoice = QName.create(bazModule, "my-choice");
110         myLeafInCase2 = QName.create(bazModule, "my-leaf-in-case-2");
111         myAnyxml = QName.create(bazModule, "my-anyxml");
112
113         myContainer3 = QName.create(bazModule, "my-container-3");
114         myDoublyKeyedList = QName.create(bazModule, "my-doubly-keyed-list");
115         myFirstKeyLeaf = QName.create(bazModule, "my-first-key-leaf");
116         mySecondKeyLeaf = QName.create(bazModule, "my-second-key-leaf");
117         myLeafInList3 = QName.create(bazModule, "my-leaf-in-list-3");
118
119         anyxmlDomSource = new DOMSource();
120     }
121
122     @Test
123     public void testImmutableNormalizedNodeStreamWriter() throws IOException {
124         final NormalizedNodeResult result = new NormalizedNodeResult();
125         final NormalizedNodeStreamWriter immutableNormalizedNodeStreamWriter = ImmutableNormalizedNodeStreamWriter
126                 .from(result);
127         final NormalizedNodeWriter normalizedNodeWriter = NormalizedNodeWriter
128                 .forStreamWriter(immutableNormalizedNodeStreamWriter);
129         normalizedNodeWriter.write(buildOuterContainerNode());
130
131         final NormalizedNode output = result.getResult();
132         assertNotNull(output);
133
134         final NormalizedNode expectedNormalizedNode = buildOuterContainerNode();
135         assertNotNull(expectedNormalizedNode);
136
137         assertEquals(expectedNormalizedNode, output);
138     }
139
140     private NormalizedNode buildOuterContainerNode() {
141         // my-container-1
142         SystemMapNode myKeyedListNode = Builders.mapBuilder()
143                 .withNodeIdentifier(new NodeIdentifier(myKeyedList))
144                 .withChild(Builders.mapEntryBuilder().withNodeIdentifier(
145                         NodeIdentifierWithPredicates.of(myKeyedList, myKeyLeaf, "listkeyvalue1"))
146                         .withChild(Builders.leafBuilder().withNodeIdentifier(new NodeIdentifier(myLeafInList1))
147                                 .withValue("listleafvalue1").build())
148                         .withChild(Builders.leafBuilder().withNodeIdentifier(new NodeIdentifier(myLeafInList2))
149                                 .withValue("listleafvalue2").build()).build())
150                 .withChild(Builders.mapEntryBuilder().withNodeIdentifier(
151                         NodeIdentifierWithPredicates.of(myKeyedList, myKeyLeaf, "listkeyvalue2"))
152                         .withChild(Builders.leafBuilder().withNodeIdentifier(new NodeIdentifier(myLeafInList1))
153                                 .withValue("listleafvalue12").build())
154                         .withChild(Builders.leafBuilder().withNodeIdentifier(new NodeIdentifier(myLeafInList2))
155                                 .withValue("listleafvalue22").build()).build()).build();
156
157         UserMapNode myOrderedListNode = Builders.orderedMapBuilder().withNodeIdentifier(
158             new NodeIdentifier(myOrderedList))
159                 .withChild(Builders.mapEntryBuilder().withNodeIdentifier(
160                         NodeIdentifierWithPredicates.of(myOrderedList, myKeyLeafInOrderedList, "olistkeyvalue1"))
161                         .withChild(Builders.leafBuilder().withNodeIdentifier(new NodeIdentifier(myLeafInOrderedList1))
162                                 .withValue("olistleafvalue1").build())
163                         .withChild(Builders.leafBuilder().withNodeIdentifier(new NodeIdentifier(myLeafInOrderedList2))
164                                 .withValue("olistleafvalue2").build()).build())
165                 .withChild(Builders.mapEntryBuilder().withNodeIdentifier(
166                         NodeIdentifierWithPredicates.of(myOrderedList, myKeyLeafInOrderedList, "olistkeyvalue2"))
167                         .withChild(Builders.leafBuilder().withNodeIdentifier(new NodeIdentifier(myLeafInOrderedList1))
168                                 .withValue("olistleafvalue12").build())
169                         .withChild(Builders.leafBuilder().withNodeIdentifier(new NodeIdentifier(myLeafInOrderedList2))
170                                 .withValue("olistleafvalue22").build()).build()).build();
171
172         final UnkeyedListEntryNode unkeyedListEntry = Builders.unkeyedListEntryBuilder()
173                 .withNodeIdentifier(new NodeIdentifier(myLeafInUnkeyedList))
174                 .withChild(ImmutableNodes.leafNode(myLeafInUnkeyedList, "foo")).build();
175
176         final List<UnkeyedListEntryNode> unkeyedListEntries = new ArrayList<>();
177         unkeyedListEntries.add(unkeyedListEntry);
178
179         UnkeyedListNode myUnkeyedListNode = Builders.unkeyedListBuilder().withNodeIdentifier(
180                 new NodeIdentifier(myUnkeyedList))
181                 .withValue(unkeyedListEntries).build();
182
183         LeafNode<?> myLeaf1Node = Builders.leafBuilder().withNodeIdentifier(new NodeIdentifier(myLeaf1))
184                 .withValue("value1").build();
185
186         LeafSetNode<?> myLeafListNode = Builders.leafSetBuilder()
187                 .withNodeIdentifier(new NodeIdentifier(myLeafList))
188                 .withChild(Builders.leafSetEntryBuilder().withNodeIdentifier(
189                         new NodeWithValue<>(myLeafList, "lflvalue1")).withValue("lflvalue1").build())
190                 .withChild(Builders.leafSetEntryBuilder().withNodeIdentifier(
191                         new NodeWithValue<>(myLeafList, "lflvalue2")).withValue("lflvalue2").build())
192                 .build();
193
194         LeafSetNode<?> myOrderedLeafListNode = Builders.orderedLeafSetBuilder()
195                 .withNodeIdentifier(new NodeIdentifier(myOrderedLeafList))
196                 .withChild(Builders.leafSetEntryBuilder().withNodeIdentifier(
197                         new NodeWithValue<>(myOrderedLeafList, "olflvalue1")).withValue("olflvalue1").build())
198                 .withChild(Builders.leafSetEntryBuilder().withNodeIdentifier(
199                         new NodeWithValue<>(myOrderedLeafList, "olflvalue2")).withValue("olflvalue2").build())
200                 .build();
201
202         ContainerNode myContainer1Node = Builders.containerBuilder()
203                 .withNodeIdentifier(new NodeIdentifier(myContainer1))
204                 .withChild(myKeyedListNode)
205                 .withChild(myOrderedListNode)
206                 .withChild(myUnkeyedListNode)
207                 .withChild(myLeaf1Node)
208                 .withChild(myLeafListNode)
209                 .withChild(myOrderedLeafListNode)
210                 .build();
211
212         // my-container-2
213         ContainerNode innerContainerNode = Builders.containerBuilder().withNodeIdentifier(
214                 new NodeIdentifier(innerContainer))
215                 .withChild(Builders.leafBuilder().withNodeIdentifier(new NodeIdentifier(myLeaf2))
216                         .withValue("value2").build()).build();
217
218         LeafNode<?> myLeaf3Node = Builders.leafBuilder().withNodeIdentifier(new NodeIdentifier(myLeaf3))
219                 .withValue("value3").build();
220
221         ChoiceNode myChoiceNode = Builders.choiceBuilder().withNodeIdentifier(new NodeIdentifier(myChoice))
222                 .withChild(Builders.leafBuilder().withNodeIdentifier(new NodeIdentifier(myLeafInCase2))
223                         .withValue("case2value").build()).build();
224
225         DOMSourceAnyxmlNode myAnyxmlNode = Builders.anyXmlBuilder().withNodeIdentifier(new NodeIdentifier(myAnyxml))
226                 .withValue(anyxmlDomSource).build();
227
228         ContainerNode myContainer2Node = Builders.containerBuilder().withNodeIdentifier(
229                 new NodeIdentifier(myContainer2))
230                 .withChild(innerContainerNode)
231                 .withChild(myLeaf3Node)
232                 .withChild(myChoiceNode)
233                 .withChild(myAnyxmlNode).build();
234
235         // my-container-3
236         Map<QName, Object> keys = new HashMap<>();
237         keys.put(myFirstKeyLeaf, "listkeyvalue1");
238         keys.put(mySecondKeyLeaf, "listkeyvalue2");
239
240         MapNode myDoublyKeyedListNode = Builders.mapBuilder().withNodeIdentifier(new NodeIdentifier(myDoublyKeyedList))
241                 .withChild(Builders.mapEntryBuilder().withNodeIdentifier(
242                         NodeIdentifierWithPredicates.of(myDoublyKeyedList, keys))
243                         .withChild(Builders.leafBuilder().withNodeIdentifier(
244                                 new NodeIdentifier(myLeafInList3)).withValue("listleafvalue1").build()).build())
245                 .build();
246
247         AugmentationNode myDoublyKeyedListAugNode = Builders.augmentationBuilder().withNodeIdentifier(
248                 new AugmentationIdentifier(ImmutableSet.of(myDoublyKeyedList)))
249                 .withChild(myDoublyKeyedListNode).build();
250
251         ContainerNode myContainer3Node = Builders.containerBuilder().withNodeIdentifier(
252                 new NodeIdentifier(myContainer3))
253                 .withChild(myDoublyKeyedListAugNode).build();
254
255         AugmentationNode myContainer3AugNode = Builders.augmentationBuilder().withNodeIdentifier(
256                 new AugmentationIdentifier(ImmutableSet.of(myContainer3)))
257                 .withChild(myContainer3Node).build();
258
259         ContainerNode outerContainerNode = Builders.containerBuilder().withNodeIdentifier(
260                 new NodeIdentifier(outerContainer))
261                 .withChild(myContainer1Node)
262                 .withChild(myContainer2Node)
263                 .withChild(myContainer3AugNode).build();
264
265         return outerContainerNode;
266     }
267 }