2 * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
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
9 package org.opendaylight.yangtools.yang.data.impl.schema;
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertNotNull;
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;
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;
47 public class ImmutableNormalizedNodeStreamWriterTest {
49 private QNameModule bazModule;
51 private QName outerContainer;
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;
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;
76 private QName myContainer3;
77 private QName myDoublyKeyedList;
78 private QName myFirstKeyLeaf;
79 private QName mySecondKeyLeaf;
80 private QName myLeafInList3;
82 private DOMSource anyxmlDomSource;
85 public void setup() throws ParseException {
86 bazModule = QNameModule.create(XMLNamespace.of("baz-namespace"), Revision.of("1970-01-01"));
88 outerContainer = QName.create(bazModule, "outer-container");
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");
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");
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");
119 anyxmlDomSource = new DOMSource();
123 public void testImmutableNormalizedNodeStreamWriter() throws IOException {
124 final NormalizedNodeResult result = new NormalizedNodeResult();
125 final NormalizedNodeStreamWriter immutableNormalizedNodeStreamWriter = ImmutableNormalizedNodeStreamWriter
127 final NormalizedNodeWriter normalizedNodeWriter = NormalizedNodeWriter
128 .forStreamWriter(immutableNormalizedNodeStreamWriter);
129 normalizedNodeWriter.write(buildOuterContainerNode());
131 final NormalizedNode output = result.getResult();
132 assertNotNull(output);
134 final NormalizedNode expectedNormalizedNode = buildOuterContainerNode();
135 assertNotNull(expectedNormalizedNode);
137 assertEquals(expectedNormalizedNode, output);
140 private NormalizedNode buildOuterContainerNode() {
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();
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();
172 final UnkeyedListEntryNode unkeyedListEntry = Builders.unkeyedListEntryBuilder()
173 .withNodeIdentifier(new NodeIdentifier(myLeafInUnkeyedList))
174 .withChild(ImmutableNodes.leafNode(myLeafInUnkeyedList, "foo")).build();
176 final List<UnkeyedListEntryNode> unkeyedListEntries = new ArrayList<>();
177 unkeyedListEntries.add(unkeyedListEntry);
179 UnkeyedListNode myUnkeyedListNode = Builders.unkeyedListBuilder().withNodeIdentifier(
180 new NodeIdentifier(myUnkeyedList))
181 .withValue(unkeyedListEntries).build();
183 LeafNode<?> myLeaf1Node = Builders.leafBuilder().withNodeIdentifier(new NodeIdentifier(myLeaf1))
184 .withValue("value1").build();
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())
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())
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)
213 ContainerNode innerContainerNode = Builders.containerBuilder().withNodeIdentifier(
214 new NodeIdentifier(innerContainer))
215 .withChild(Builders.leafBuilder().withNodeIdentifier(new NodeIdentifier(myLeaf2))
216 .withValue("value2").build()).build();
218 LeafNode<?> myLeaf3Node = Builders.leafBuilder().withNodeIdentifier(new NodeIdentifier(myLeaf3))
219 .withValue("value3").build();
221 ChoiceNode myChoiceNode = Builders.choiceBuilder().withNodeIdentifier(new NodeIdentifier(myChoice))
222 .withChild(Builders.leafBuilder().withNodeIdentifier(new NodeIdentifier(myLeafInCase2))
223 .withValue("case2value").build()).build();
225 DOMSourceAnyxmlNode myAnyxmlNode = Builders.anyXmlBuilder().withNodeIdentifier(new NodeIdentifier(myAnyxml))
226 .withValue(anyxmlDomSource).build();
228 ContainerNode myContainer2Node = Builders.containerBuilder().withNodeIdentifier(
229 new NodeIdentifier(myContainer2))
230 .withChild(innerContainerNode)
231 .withChild(myLeaf3Node)
232 .withChild(myChoiceNode)
233 .withChild(myAnyxmlNode).build();
236 Map<QName, Object> keys = new HashMap<>();
237 keys.put(myFirstKeyLeaf, "listkeyvalue1");
238 keys.put(mySecondKeyLeaf, "listkeyvalue2");
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())
247 AugmentationNode myDoublyKeyedListAugNode = Builders.augmentationBuilder().withNodeIdentifier(
248 new AugmentationIdentifier(ImmutableSet.of(myDoublyKeyedList)))
249 .withChild(myDoublyKeyedListNode).build();
251 ContainerNode myContainer3Node = Builders.containerBuilder().withNodeIdentifier(
252 new NodeIdentifier(myContainer3))
253 .withChild(myDoublyKeyedListAugNode).build();
255 AugmentationNode myContainer3AugNode = Builders.augmentationBuilder().withNodeIdentifier(
256 new AugmentationIdentifier(ImmutableSet.of(myContainer3)))
257 .withChild(myContainer3Node).build();
259 ContainerNode outerContainerNode = Builders.containerBuilder().withNodeIdentifier(
260 new NodeIdentifier(outerContainer))
261 .withChild(myContainer1Node)
262 .withChild(myContainer2Node)
263 .withChild(myContainer3AugNode).build();
265 return outerContainerNode;