2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
3 * This program and the accompanying materials are made available under the
4 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
5 * and is available at http://www.eclipse.org/legal/epl-v10.html
7 package org.opendaylight.yangtools.yang.parser.builder.impl;
9 import static org.junit.Assert.assertEquals;
10 import static org.junit.Assert.assertFalse;
11 import static org.junit.Assert.assertNotEquals;
12 import static org.junit.Assert.assertNotNull;
13 import java.util.List;
14 import org.junit.Test;
15 import org.opendaylight.yangtools.yang.common.QName;
16 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
17 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
18 import org.opendaylight.yangtools.yang.model.api.Status;
19 import org.opendaylight.yangtools.yang.model.util.Uint16;
20 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder;
21 import org.opendaylight.yangtools.yang.parser.builder.api.Builder;
22 import org.opendaylight.yangtools.yang.parser.builder.api.ConstraintsBuilder;
23 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
24 import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder;
25 import org.opendaylight.yangtools.yang.parser.builder.api.SchemaNodeBuilder;
26 import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder;
27 import org.opendaylight.yangtools.yang.parser.builder.api.UnknownSchemaNodeBuilder;
28 import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder;
29 import org.opendaylight.yangtools.yang.parser.util.YangParseException;
32 * Test suite for increasing of test coverage of CopyUtils implementation.
34 * @see org.opendaylight.yangtools.yang.parser.builder.impl.CopyUtils
36 * @author Lukas Sedlak <lsedlak@cisco.com>
38 public class CopyUtilsTest extends AbstractBuilderTest {
40 @Test(expected = YangParseException.class)
41 public void testCopyOfUnknownTypeOfDataSchemaNode() {
42 final String leafLocalName = "leaf-to-refine";
43 final QName leafName = QName.create(module.getNamespace(), module.getRevision(), leafLocalName);
44 final SchemaPath leafPath = SchemaPath.create(true, leafName);
45 final LeafSchemaNodeBuilder leafBuilder = new LeafSchemaNodeBuilder(module.getModuleName(), 22, leafName, leafPath);
47 CopyUtils.copy(new InvalidDataSchemaNodeBuilder(), leafBuilder, false);
51 public void testCopyAnyxmlWithAnyxmlOriginalNodeAndUnknownNodes() {
52 final String parentAnyxmlLocalName = "original-anyxml";
53 final QName parentAnyxmlName = QName.create(module.getNamespace(), module.getRevision(), parentAnyxmlLocalName);
54 final SchemaPath parentAnyxmlPath = SchemaPath.create(true, parentAnyxmlName);
55 final AnyXmlBuilder parentAnyXmlBuilder = new AnyXmlBuilder(module.getModuleName(), 22, parentAnyxmlName, parentAnyxmlPath);
57 final String anyxmlLocalName = "anyxml";
58 final QName anyxmlName = QName.create(module.getNamespace(), module.getRevision(), anyxmlLocalName);
59 final SchemaPath anyxmlPath = SchemaPath.create(true, anyxmlName);
60 final AnyXmlBuilder anyXmlBuilder = new AnyXmlBuilder(module.getModuleName(), 22, anyxmlName, anyxmlPath);
62 anyXmlBuilder.setOriginal(parentAnyXmlBuilder);
64 final UnknownSchemaNodeBuilder unknownSchemaNodeBuilder = provideUnknownNodeBuilder(anyxmlName);
65 anyXmlBuilder.addUnknownNodeBuilder(unknownSchemaNodeBuilder);
67 final AnyXmlBuilder copy = (AnyXmlBuilder) CopyUtils.copy(anyXmlBuilder, anyXmlBuilder, false);
68 assertFalse(copy.getUnknownNodes().isEmpty());
69 assertNotNull(copy.getOriginal());
70 assertEquals(copy.getOriginal(), parentAnyXmlBuilder);
74 public void testCopyChoiceBuilderWithUnknownNodesAndAugmentation() {
75 final String originalChoiceLocalName = "original-choice-to-copy";
76 final ChoiceBuilder originalChoiceBuilder = provideChoiceBuilder(originalChoiceLocalName);
78 final String choiceLocalName = "choice-to-copy";
79 final ChoiceBuilder choiceBuilder = provideChoiceBuilder(choiceLocalName);
80 choiceBuilder.setOriginal(originalChoiceBuilder);
82 final UnknownSchemaNodeBuilder unknownSchemaNodeBuilder = provideUnknownNodeBuilder(choiceBuilder.getQName());
83 final SchemaPath augPath = SchemaPath.create(true, choiceBuilder.getQName());
85 final AugmentationSchemaBuilder augBuilder = new AugmentationSchemaBuilderImpl(module.getModuleName(), 22,
86 "/imaginary/path", augPath, 0);
88 final UsesNodeBuilder usesNodeBuilder = provideUsesNodeBuilder("test-grouping-use");
89 augBuilder.addUsesNode(usesNodeBuilder);
90 augBuilder.addUnknownNodeBuilder(unknownSchemaNodeBuilder);
92 choiceBuilder.addUnknownNodeBuilder(unknownSchemaNodeBuilder);
93 choiceBuilder.addAugmentation(augBuilder);
95 final ChoiceBuilder copy = (ChoiceBuilder)CopyUtils.copy(choiceBuilder, module, false);
96 List<AugmentationSchemaBuilder> augmentations = copy.getAugmentationBuilders();
98 assertFalse(copy.getUnknownNodes().isEmpty());
100 final UnknownSchemaNodeBuilder copyUnknownNode = copy.getUnknownNodes().get(0);
101 assertEquals(copyUnknownNode, unknownSchemaNodeBuilder);
103 assertFalse(augmentations.isEmpty());
104 final AugmentationSchemaBuilder copyAugBuilder = augmentations.get(0);
106 assertEquals(copyAugBuilder, augBuilder);
107 assertEquals(copyAugBuilder.getUnknownNodes().get(0), augBuilder.getUnknownNodes().get(0));
108 assertNotEquals(copyAugBuilder.getUsesNodeBuilders().get(0), augBuilder.getUsesNodeBuilders().get(0));
112 public void testCopyChoiceCaseBuilder() {
113 final String originalChoiceCaseLocalName = "original-choice-case";
114 final QName originalChoiceCaseQName = QName.create(module.getNamespace(), module.getRevision(),
115 originalChoiceCaseLocalName);
116 final SchemaPath originalChoiceCasePath = SchemaPath.create(true, originalChoiceCaseQName);
117 final ChoiceCaseBuilder originalChoiceCaseBuilder = new ChoiceCaseBuilder(module.getModuleName(), 10,
118 originalChoiceCaseQName, originalChoiceCasePath);
120 final String choiceCaseLocalName = "test-choice-case";
121 final QName choiceCaseQName = QName.create(module.getNamespace(), module.getRevision(), choiceCaseLocalName);
122 final SchemaPath choiceCasePath = SchemaPath.create(true, choiceCaseQName);
123 final ChoiceCaseBuilder choiceCaseBuilder = new ChoiceCaseBuilder(module.getModuleName(), 10, choiceCaseQName,
126 choiceCaseBuilder.setOriginal(originalChoiceCaseBuilder);
128 final UsesNodeBuilder usesNodeBuilder = provideUsesNodeBuilder("test-grouping-use");
130 UnknownSchemaNodeBuilder unknownSchemaNodeBuilder = provideUnknownNodeBuilder(choiceCaseQName);
132 choiceCaseBuilder.addUsesNode(usesNodeBuilder);
133 choiceCaseBuilder.addUnknownNodeBuilder(unknownSchemaNodeBuilder);
135 ChoiceCaseBuilder copy = (ChoiceCaseBuilder) CopyUtils.copy(choiceCaseBuilder, module, true);
138 assertEquals(copy.getUnknownNodes().get(0), choiceCaseBuilder.getUnknownNodes().get(0));
139 assertFalse(copy.getUsesNodeBuilders().isEmpty());
140 assertNotEquals(copy.getUsesNodeBuilders().get(0), choiceCaseBuilder.getUsesNodeBuilders().get(0));
143 @Test(expected = YangParseException.class)
144 public void testAddGroupingIntoChoiceCaseBuilder() {
145 final String choiceCaseLocalName = "test-choice-case";
146 final QName choiceCaseQName = QName.create(module.getNamespace(), module.getRevision(), choiceCaseLocalName);
147 final SchemaPath choiceCasePath = SchemaPath.create(true, choiceCaseQName);
148 final ChoiceCaseBuilder choiceCaseBuilder = new ChoiceCaseBuilder(module.getModuleName(), 10, choiceCaseQName,
151 final String groupLocalName = "test-group";
152 final QName testGroup = QName.create(module.getNamespace(), module.getRevision(), groupLocalName);
153 final SchemaPath groupPath = SchemaPath.create(true, choiceCaseQName, testGroup);
154 final GroupingBuilder grouping = module.addGrouping(12, testGroup, groupPath);
155 choiceCaseBuilder.addGrouping(grouping);
159 public void testCopyContainerSchemaNodeBuilder() {
160 final ContainerSchemaNodeBuilder containerBuilder = provideContainerBuilder("parent-container");
162 final String groupLocalName = "test-group";
163 final GroupingBuilder grouping = provideNestedGroupingDefinition(containerBuilder.getQName(), groupLocalName);
165 final String typedefLocalName = "test-type-definition";
166 final TypeDefinitionBuilder typedefBuilder = provideNestedTypedef(containerBuilder.getQName(), typedefLocalName);
168 final UnknownSchemaNodeBuilder unknownNodeBuilder = provideUnknownNodeBuilder(containerBuilder.getQName());
170 containerBuilder.addGrouping(grouping);
171 containerBuilder.addTypedef(typedefBuilder);
172 containerBuilder.addUnknownNodeBuilder(unknownNodeBuilder);
174 final ContainerSchemaNodeBuilder copy = (ContainerSchemaNodeBuilder) CopyUtils.copy(containerBuilder, module, true);
178 assertFalse(copy.getGroupingBuilders().isEmpty());
179 assertFalse(copy.getTypeDefinitionBuilders().isEmpty());
180 assertFalse(copy.getUnknownNodes().isEmpty());
183 private GroupingBuilder provideNestedGroupingDefinition(final QName parentName, final String groupLocalName) {
184 final QName testGroup = QName.create(module.getNamespace(), module.getRevision(), groupLocalName);
185 final SchemaPath groupPath = SchemaPath.create(true, parentName, testGroup);
186 final GroupingBuilder grouping = module.addGrouping(12, testGroup, groupPath);
191 private TypeDefinitionBuilder provideNestedTypedef(final QName parentName, final String typedefLocalName) {
192 final QName typedefQname = QName.create(module.getNamespace(), module.getRevision(), typedefLocalName);
193 final SchemaPath typedefPath = SchemaPath.create(true, parentName, typedefQname);
194 final TypeDefinitionBuilder typedefBuilder = new TypeDefinitionBuilderImpl(module.getModuleName(), 12,
195 typedefQname, typedefPath);
196 typedefBuilder.setType(Uint16.getInstance());
198 return typedefBuilder;
202 public void testCopyLeafSchemaNodeBuilder() {
203 final String leafLocalName = "original-leaf";
204 final QName leafName = QName.create(module.getNamespace(), module.getRevision(), leafLocalName);
205 final SchemaPath leafPath = SchemaPath.create(true, leafName);
206 final LeafSchemaNodeBuilder leafBuilder = new LeafSchemaNodeBuilder(module.getModuleName(), 22, leafName, leafPath);
207 leafBuilder.setType(Uint16.getInstance());
209 final UnknownSchemaNodeBuilder unknownNodeBuilder = provideUnknownNodeBuilder(leafName);
210 leafBuilder.addUnknownNodeBuilder(unknownNodeBuilder);
212 final LeafSchemaNodeBuilder copy = (LeafSchemaNodeBuilder)CopyUtils.copy(leafBuilder, module, true);
215 assertFalse(leafBuilder.getUnknownNodes().isEmpty());
219 public void testCopyLeafListSchemaNodeBuilder() {
220 final String origLeafListLocalName = "original-list-to";
221 final QName origLeafListQName = QName.create(module.getNamespace(), module.getRevision(), origLeafListLocalName );
222 final SchemaPath origLeafListPath = SchemaPath.create(true, origLeafListQName);
223 final LeafListSchemaNodeBuilder origLeafListBuilder = new LeafListSchemaNodeBuilder(module.getModuleName(),
224 10, origLeafListQName, origLeafListPath);
225 origLeafListBuilder.setType(Uint16.getInstance());
227 final String leafListLocalName = "leaflist-copy";
228 final QName leafListQName = QName.create(module.getNamespace(), module.getRevision(), leafListLocalName);
229 final SchemaPath leafListPath = SchemaPath.create(true, leafListQName);
230 final LeafListSchemaNodeBuilder leafListBuilder = new LeafListSchemaNodeBuilder(module.getModuleName(),
231 20, leafListQName, leafListPath);
232 leafListBuilder.setType(Uint16.getInstance());
234 leafListBuilder.setOriginal(origLeafListBuilder);
235 final UnknownSchemaNodeBuilder unknownNodeBuilder = provideUnknownNodeBuilder(leafListQName);
236 leafListBuilder.addUnknownNodeBuilder(unknownNodeBuilder);
238 final LeafListSchemaNodeBuilder copy = (LeafListSchemaNodeBuilder)CopyUtils.copy(leafListBuilder, module, true);
241 assertFalse(copy.getUnknownNodes().isEmpty());
242 assertNotNull(copy.getUnknownNodes().get(0));
246 public void testCopyListSchemaNodeBuilder() {
247 final String origListLocalName = "original-list";
248 final QName origListQName = QName.create(module.getNamespace(), module.getRevision(), origListLocalName);
249 final SchemaPath origListPath = SchemaPath.create(true, origListQName);
250 final ListSchemaNodeBuilder origListBuilder = new ListSchemaNodeBuilder(module.getModuleName(),
251 10, origListQName, origListPath);
253 final String listLocalName = "copy-of-list";
254 final QName listQName = QName.create(module.getNamespace(), module.getRevision(), listLocalName);
255 final SchemaPath listPath = SchemaPath.create(true, listQName);
256 final ListSchemaNodeBuilder listBuilder = new ListSchemaNodeBuilder(module.getModuleName(),
257 20, listQName, listPath);
259 listBuilder.setOriginal(origListBuilder);
261 final String groupLocalName = "test-group";
262 final GroupingBuilder grouping = provideNestedGroupingDefinition(listBuilder.getQName(), groupLocalName);
263 listBuilder.addGrouping(grouping);
265 final String typedefLocalName = "test-type-definition";
266 final TypeDefinitionBuilder typedefBuilder = provideNestedTypedef(listBuilder.getQName(), typedefLocalName);
267 listBuilder.addTypedef(typedefBuilder);
269 final UnknownSchemaNodeBuilder unknownNodeBuilder = provideUnknownNodeBuilder(listBuilder.getQName());
270 listBuilder.addUnknownNodeBuilder(unknownNodeBuilder);
272 final UsesNodeBuilder usesNodeBuilder = provideUsesNodeBuilder("test-grouping-use");
273 listBuilder.addUsesNode(usesNodeBuilder);
275 final SchemaPath augPath = SchemaPath.create(true, listBuilder.getQName());
276 final AugmentationSchemaBuilder augBuilder = new AugmentationSchemaBuilderImpl(module.getModuleName(), 22,
277 "/imaginary/path", augPath, 0);
278 listBuilder.addAugmentation(augBuilder);
280 ListSchemaNodeBuilder copy = (ListSchemaNodeBuilder) CopyUtils.copy(listBuilder, module, true);
282 assertFalse(copy.getGroupingBuilders().isEmpty());
283 assertFalse(copy.getTypeDefinitionBuilders().isEmpty());
284 assertFalse(copy.getUnknownNodes().isEmpty());
285 assertFalse(copy.getUsesNodeBuilders().isEmpty());
286 assertFalse(copy.getAugmentationBuilders().isEmpty());
290 public void testCopyGroupingBuilder() {
291 final String groupLocalName = "test-group";
292 final QName testGroup = QName.create(module.getNamespace(), module.getRevision(), groupLocalName);
293 final SchemaPath groupPath = SchemaPath.create(true, testGroup);
294 final GroupingBuilder grouping = module.addGrouping(12, testGroup, groupPath);
296 final String innerGroupLocalName = "inner-group";
297 final QName innerGroup = QName.create(module.getNamespace(), module.getRevision(), innerGroupLocalName);
298 final SchemaPath innerGroupPath = SchemaPath.create(true, testGroup, innerGroup);
299 final GroupingBuilder innerGrouping = module.addGrouping(12, innerGroup, innerGroupPath);
301 grouping.addGrouping(innerGrouping);
303 final String typedefLocalName = "test-type-definition";
304 final TypeDefinitionBuilder typedefBuilder = provideNestedTypedef(grouping.getQName(), typedefLocalName);
305 grouping.addTypedef(typedefBuilder);
307 final UsesNodeBuilder usesNodeBuilder = provideUsesNodeBuilder(innerGroupLocalName);
308 grouping.addUsesNode(usesNodeBuilder);
310 final UnknownSchemaNodeBuilder unknownNodeBuilder = provideUnknownNodeBuilder(grouping.getQName());
311 grouping.addUnknownNodeBuilder(unknownNodeBuilder);
313 final GroupingBuilder copy = CopyUtils.copy(grouping, module, true);
315 assertFalse(copy.getGroupingBuilders().isEmpty());
316 assertFalse(copy.getTypeDefinitionBuilders().isEmpty());
317 assertFalse(copy.getUsesNodeBuilders().isEmpty());
318 assertFalse(copy.getUnknownNodes().isEmpty());
322 public void testCopyIdentityrefTypeBuilder() {
323 final String typedefLocalName = "identity-ref-test-type";
324 final QName typedefQname = QName.create(module.getNamespace(), module.getRevision(), typedefLocalName);
325 final SchemaPath typedefPath = SchemaPath.create(true, typedefQname);
326 final IdentityrefTypeBuilder typeBuilder = new IdentityrefTypeBuilder(module.getModuleName(), 12,
327 "base:parent-identity", typedefPath);
329 final TypeDefinitionBuilder copy = CopyUtils.copy(typeBuilder, module, true);
332 //TODO: add additional asserts
336 public void testCopyTypeDefinitionBuilderWithUnknownNodes() {
337 final String typedefLocalName = "test-typedef-with-ext";
338 final QName typedefQname = QName.create(module.getNamespace(), module.getRevision(), typedefLocalName);
339 final SchemaPath typedefPath = SchemaPath.create(true, typedefQname);
340 final TypeDefinitionBuilder typedefBuilder = new TypeDefinitionBuilderImpl(module.getModuleName(), 12,
341 typedefQname, typedefPath);
342 typedefBuilder.setType(Uint16.getInstance());
344 typedefBuilder.addUnknownNodeBuilder(provideUnknownNodeBuilder());
346 TypeDefinitionBuilder copy = CopyUtils.copy(typedefBuilder, module, true);
348 assertFalse(copy.getUnknownNodes().isEmpty());
351 // FIXME: Use Mockito instead of this monstrosity
352 private static final class InvalidDataSchemaNodeBuilder implements DataSchemaNodeBuilder {
355 public SchemaNodeBuilder getOriginal() {
360 public void setOriginal(final SchemaNodeBuilder original) {
365 public boolean isAugmenting() {
370 public void setAugmenting(final boolean augmenting) {
375 public boolean isConfiguration() {
380 public void setConfiguration(final boolean config) {
385 public ConstraintsBuilder getConstraints() {
390 public QName getQName() {
395 public SchemaPath getPath() {
400 public void setPath(final SchemaPath path) {
405 public String getModuleName() {
410 public int getLine() {
415 public Builder getParent() {
420 public void setParent(final Builder parent) {
425 public void addUnknownNodeBuilder(final UnknownSchemaNodeBuilder unknownNode) {
430 public List<UnknownSchemaNodeBuilder> getUnknownNodes() {
435 public DataSchemaNode build() {
440 public String getDescription() {
445 public void setDescription(final String description) {
450 public String getReference() {
455 public void setReference(final String reference) {
460 public Status getStatus() {
465 public void setStatus(final Status status) {
470 public boolean isAddedByUses() {
475 public void setAddedByUses(final boolean addedByUses) {