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.Ignore;
15 import org.junit.Test;
16 import org.opendaylight.yangtools.yang.common.QName;
17 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
18 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
19 import org.opendaylight.yangtools.yang.model.api.Status;
20 import org.opendaylight.yangtools.yang.model.util.Uint16;
21 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder;
22 import org.opendaylight.yangtools.yang.parser.builder.api.Builder;
23 import org.opendaylight.yangtools.yang.parser.builder.api.ConstraintsBuilder;
24 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
25 import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder;
26 import org.opendaylight.yangtools.yang.parser.builder.api.SchemaNodeBuilder;
27 import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder;
28 import org.opendaylight.yangtools.yang.parser.builder.api.UnknownSchemaNodeBuilder;
29 import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder;
30 import org.opendaylight.yangtools.yang.parser.util.YangParseException;
33 * Test suite for increasing of test coverage of CopyUtils implementation.
35 * @see org.opendaylight.yangtools.yang.parser.builder.impl.CopyUtils
37 * @author Lukas Sedlak <lsedlak@cisco.com>
39 public class CopyUtilsTest extends AbstractBuilderTest {
41 @Test(expected = YangParseException.class)
42 public void testCopyOfUnknownTypeOfDataSchemaNode() {
43 final String leafLocalName = "leaf-to-refine";
44 final QName leafName = QName.create(module.getNamespace(), module.getRevision(), leafLocalName);
45 final SchemaPath leafPath = SchemaPath.create(true, leafName);
46 final LeafSchemaNodeBuilder leafBuilder = new LeafSchemaNodeBuilder(module.getModuleName(), 22, leafName, leafPath);
48 CopyUtils.copy(new InvalidDataSchemaNodeBuilder(), leafBuilder, false);
52 public void testCopyAnyxmlWithAnyxmlOriginalNodeAndUnknownNodes() {
53 final String parentAnyxmlLocalName = "original-anyxml";
54 final QName parentAnyxmlName = QName.create(module.getNamespace(), module.getRevision(), parentAnyxmlLocalName);
55 final SchemaPath parentAnyxmlPath = SchemaPath.create(true, parentAnyxmlName);
56 final AnyXmlBuilder parentAnyXmlBuilder = new AnyXmlBuilder(module.getModuleName(), 22, parentAnyxmlName, parentAnyxmlPath);
58 final String anyxmlLocalName = "anyxml";
59 final QName anyxmlName = QName.create(module.getNamespace(), module.getRevision(), anyxmlLocalName);
60 final SchemaPath anyxmlPath = SchemaPath.create(true, anyxmlName);
61 final AnyXmlBuilder anyXmlBuilder = new AnyXmlBuilder(module.getModuleName(), 22, anyxmlName, anyxmlPath);
63 anyXmlBuilder.setOriginal(parentAnyXmlBuilder);
65 final UnknownSchemaNodeBuilder unknownSchemaNodeBuilder = provideUnknownNodeBuilder(anyxmlName);
66 anyXmlBuilder.addUnknownNodeBuilder(unknownSchemaNodeBuilder);
68 final AnyXmlBuilder copy = (AnyXmlBuilder) CopyUtils.copy(anyXmlBuilder, anyXmlBuilder, false);
69 assertFalse(copy.getUnknownNodes().isEmpty());
70 assertNotNull(copy.getOriginal());
71 assertEquals(copy.getOriginal(), parentAnyXmlBuilder);
75 public void testCopyChoiceBuilderWithUnknownNodesAndAugmentation() {
76 final String originalChoiceLocalName = "original-choice-to-copy";
77 final ChoiceBuilder originalChoiceBuilder = provideChoiceBuilder(originalChoiceLocalName);
79 final String choiceLocalName = "choice-to-copy";
80 final ChoiceBuilder choiceBuilder = provideChoiceBuilder(choiceLocalName);
81 choiceBuilder.setOriginal(originalChoiceBuilder);
83 final UnknownSchemaNodeBuilder unknownSchemaNodeBuilder = provideUnknownNodeBuilder(choiceBuilder.getQName());
84 final SchemaPath augPath = SchemaPath.create(true, choiceBuilder.getQName());
86 final AugmentationSchemaBuilder augBuilder = new AugmentationSchemaBuilderImpl(module.getModuleName(), 22,
87 "/imaginary/path", augPath, 0);
89 final UsesNodeBuilder usesNodeBuilder = provideUsesNodeBuilder("test-grouping-use");
90 augBuilder.addUsesNode(usesNodeBuilder);
91 augBuilder.addUnknownNodeBuilder(unknownSchemaNodeBuilder);
93 choiceBuilder.addUnknownNodeBuilder(unknownSchemaNodeBuilder);
94 choiceBuilder.addAugmentation(augBuilder);
96 final ChoiceBuilder copy = (ChoiceBuilder)CopyUtils.copy(choiceBuilder, module, false);
97 List<AugmentationSchemaBuilder> augmentations = copy.getAugmentationBuilders();
99 assertFalse(copy.getUnknownNodes().isEmpty());
101 final UnknownSchemaNodeBuilder copyUnknownNode = copy.getUnknownNodes().get(0);
102 assertEquals(copyUnknownNode, unknownSchemaNodeBuilder);
104 assertFalse(augmentations.isEmpty());
105 final AugmentationSchemaBuilder copyAugBuilder = augmentations.get(0);
107 assertEquals(copyAugBuilder, augBuilder);
108 assertEquals(copyAugBuilder.getUnknownNodes().get(0), augBuilder.getUnknownNodes().get(0));
109 assertNotEquals(copyAugBuilder.getUsesNodeBuilders().get(0), augBuilder.getUsesNodeBuilders().get(0));
113 public void testCopyChoiceCaseBuilder() {
114 final String originalChoiceCaseLocalName = "original-choice-case";
115 final QName originalChoiceCaseQName = QName.create(module.getNamespace(), module.getRevision(),
116 originalChoiceCaseLocalName);
117 final SchemaPath originalChoiceCasePath = SchemaPath.create(true, originalChoiceCaseQName);
118 final ChoiceCaseBuilder originalChoiceCaseBuilder = new ChoiceCaseBuilder(module.getModuleName(), 10,
119 originalChoiceCaseQName, originalChoiceCasePath);
121 final String choiceCaseLocalName = "test-choice-case";
122 final QName choiceCaseQName = QName.create(module.getNamespace(), module.getRevision(), choiceCaseLocalName);
123 final SchemaPath choiceCasePath = SchemaPath.create(true, choiceCaseQName);
124 final ChoiceCaseBuilder choiceCaseBuilder = new ChoiceCaseBuilder(module.getModuleName(), 10, choiceCaseQName,
127 choiceCaseBuilder.setOriginal(originalChoiceCaseBuilder);
129 final UsesNodeBuilder usesNodeBuilder = provideUsesNodeBuilder("test-grouping-use");
131 UnknownSchemaNodeBuilder unknownSchemaNodeBuilder = provideUnknownNodeBuilder(choiceCaseQName);
133 choiceCaseBuilder.addUsesNode(usesNodeBuilder);
134 choiceCaseBuilder.addUnknownNodeBuilder(unknownSchemaNodeBuilder);
136 ChoiceCaseBuilder copy = (ChoiceCaseBuilder) CopyUtils.copy(choiceCaseBuilder, module, true);
139 assertEquals(copy.getUnknownNodes().get(0), choiceCaseBuilder.getUnknownNodes().get(0));
140 assertFalse(copy.getUsesNodeBuilders().isEmpty());
141 assertNotEquals(copy.getUsesNodeBuilders().get(0), choiceCaseBuilder.getUsesNodeBuilders().get(0));
144 @Test(expected = YangParseException.class)
145 public void testAddGroupingIntoChoiceCaseBuilder() {
146 final String choiceCaseLocalName = "test-choice-case";
147 final QName choiceCaseQName = QName.create(module.getNamespace(), module.getRevision(), choiceCaseLocalName);
148 final SchemaPath choiceCasePath = SchemaPath.create(true, choiceCaseQName);
149 final ChoiceCaseBuilder choiceCaseBuilder = new ChoiceCaseBuilder(module.getModuleName(), 10, choiceCaseQName,
152 final String groupLocalName = "test-group";
153 final QName testGroup = QName.create(module.getNamespace(), module.getRevision(), groupLocalName);
154 final SchemaPath groupPath = SchemaPath.create(true, choiceCaseQName, testGroup);
155 final GroupingBuilder grouping = module.addGrouping(12, testGroup, groupPath);
156 choiceCaseBuilder.addGrouping(grouping);
160 public void testCopyContainerSchemaNodeBuilder() {
161 final ContainerSchemaNodeBuilder containerBuilder = provideContainerBuilder("parent-container");
163 final String groupLocalName = "test-group";
164 final GroupingBuilder grouping = provideNestedGroupingDefinition(containerBuilder.getQName(), groupLocalName);
166 final String typedefLocalName = "test-type-definition";
167 final TypeDefinitionBuilder typedefBuilder = provideNestedTypedef(containerBuilder.getQName(), typedefLocalName);
169 final UnknownSchemaNodeBuilder unknownNodeBuilder = provideUnknownNodeBuilder(containerBuilder.getQName());
171 containerBuilder.addGrouping(grouping);
172 containerBuilder.addTypedef(typedefBuilder);
173 containerBuilder.addUnknownNodeBuilder(unknownNodeBuilder);
175 final ContainerSchemaNodeBuilder copy = (ContainerSchemaNodeBuilder) CopyUtils.copy(containerBuilder, module, true);
179 assertFalse(copy.getGroupingBuilders().isEmpty());
180 assertFalse(copy.getTypeDefinitionBuilders().isEmpty());
181 assertFalse(copy.getUnknownNodes().isEmpty());
184 private GroupingBuilder provideNestedGroupingDefinition(final QName parentName, final String groupLocalName) {
185 final QName testGroup = QName.create(module.getNamespace(), module.getRevision(), groupLocalName);
186 final SchemaPath groupPath = SchemaPath.create(true, parentName, testGroup);
187 final GroupingBuilder grouping = module.addGrouping(12, testGroup, groupPath);
192 private TypeDefinitionBuilder provideNestedTypedef(final QName parentName, final String typedefLocalName) {
193 final QName typedefQname = QName.create(module.getNamespace(), module.getRevision(), typedefLocalName);
194 final SchemaPath typedefPath = SchemaPath.create(true, parentName, typedefQname);
195 final TypeDefinitionBuilder typedefBuilder = new TypeDefinitionBuilderImpl(module.getModuleName(), 12,
196 typedefQname, typedefPath);
197 typedefBuilder.setType(Uint16.getInstance());
199 return typedefBuilder;
203 public void testCopyLeafSchemaNodeBuilder() {
204 final String leafLocalName = "original-leaf";
205 final QName leafName = QName.create(module.getNamespace(), module.getRevision(), leafLocalName);
206 final SchemaPath leafPath = SchemaPath.create(true, leafName);
207 final LeafSchemaNodeBuilder leafBuilder = new LeafSchemaNodeBuilder(module.getModuleName(), 22, leafName, leafPath);
208 leafBuilder.setType(Uint16.getInstance());
210 final UnknownSchemaNodeBuilder unknownNodeBuilder = provideUnknownNodeBuilder(leafName);
211 leafBuilder.addUnknownNodeBuilder(unknownNodeBuilder);
213 final LeafSchemaNodeBuilder copy = (LeafSchemaNodeBuilder)CopyUtils.copy(leafBuilder, module, true);
216 assertFalse(leafBuilder.getUnknownNodes().isEmpty());
220 public void testCopyLeafListSchemaNodeBuilder() {
221 final String origLeafListLocalName = "original-list-to";
222 final QName origLeafListQName = QName.create(module.getNamespace(), module.getRevision(), origLeafListLocalName );
223 final SchemaPath origLeafListPath = SchemaPath.create(true, origLeafListQName);
224 final LeafListSchemaNodeBuilder origLeafListBuilder = new LeafListSchemaNodeBuilder(module.getModuleName(),
225 10, origLeafListQName, origLeafListPath);
226 origLeafListBuilder.setType(Uint16.getInstance());
228 final String leafListLocalName = "leaflist-copy";
229 final QName leafListQName = QName.create(module.getNamespace(), module.getRevision(), leafListLocalName);
230 final SchemaPath leafListPath = SchemaPath.create(true, leafListQName);
231 final LeafListSchemaNodeBuilder leafListBuilder = new LeafListSchemaNodeBuilder(module.getModuleName(),
232 20, leafListQName, leafListPath);
233 leafListBuilder.setType(Uint16.getInstance());
235 leafListBuilder.setOriginal(origLeafListBuilder);
236 final UnknownSchemaNodeBuilder unknownNodeBuilder = provideUnknownNodeBuilder(leafListQName);
237 leafListBuilder.addUnknownNodeBuilder(unknownNodeBuilder);
239 final LeafListSchemaNodeBuilder copy = (LeafListSchemaNodeBuilder)CopyUtils.copy(leafListBuilder, module, true);
242 assertFalse(copy.getUnknownNodes().isEmpty());
243 assertNotNull(copy.getUnknownNodes().get(0));
247 public void testCopyListSchemaNodeBuilder() {
248 final String origListLocalName = "original-list";
249 final QName origListQName = QName.create(module.getNamespace(), module.getRevision(), origListLocalName);
250 final SchemaPath origListPath = SchemaPath.create(true, origListQName);
251 final ListSchemaNodeBuilder origListBuilder = new ListSchemaNodeBuilder(module.getModuleName(),
252 10, origListQName, origListPath);
254 final String listLocalName = "copy-of-list";
255 final QName listQName = QName.create(module.getNamespace(), module.getRevision(), listLocalName);
256 final SchemaPath listPath = SchemaPath.create(true, listQName);
257 final ListSchemaNodeBuilder listBuilder = new ListSchemaNodeBuilder(module.getModuleName(),
258 20, listQName, listPath);
260 listBuilder.setOriginal(origListBuilder);
262 final String groupLocalName = "test-group";
263 final GroupingBuilder grouping = provideNestedGroupingDefinition(listBuilder.getQName(), groupLocalName);
264 listBuilder.addGrouping(grouping);
266 final String typedefLocalName = "test-type-definition";
267 final TypeDefinitionBuilder typedefBuilder = provideNestedTypedef(listBuilder.getQName(), typedefLocalName);
268 listBuilder.addTypedef(typedefBuilder);
270 final UnknownSchemaNodeBuilder unknownNodeBuilder = provideUnknownNodeBuilder(listBuilder.getQName());
271 listBuilder.addUnknownNodeBuilder(unknownNodeBuilder);
273 final UsesNodeBuilder usesNodeBuilder = provideUsesNodeBuilder("test-grouping-use");
274 listBuilder.addUsesNode(usesNodeBuilder);
276 final SchemaPath augPath = SchemaPath.create(true, listBuilder.getQName());
277 final AugmentationSchemaBuilder augBuilder = new AugmentationSchemaBuilderImpl(module.getModuleName(), 22,
278 "/imaginary/path", augPath, 0);
279 listBuilder.addAugmentation(augBuilder);
281 ListSchemaNodeBuilder copy = (ListSchemaNodeBuilder) CopyUtils.copy(listBuilder, module, true);
283 assertFalse(copy.getGroupingBuilders().isEmpty());
284 assertFalse(copy.getTypeDefinitionBuilders().isEmpty());
285 assertFalse(copy.getUnknownNodes().isEmpty());
286 assertFalse(copy.getUsesNodeBuilders().isEmpty());
287 assertFalse(copy.getAugmentationBuilders().isEmpty());
291 public void testCopyGroupingBuilder() {
292 final String groupLocalName = "test-group";
293 final QName testGroup = QName.create(module.getNamespace(), module.getRevision(), groupLocalName);
294 final SchemaPath groupPath = SchemaPath.create(true, testGroup);
295 final GroupingBuilder grouping = module.addGrouping(12, testGroup, groupPath);
297 final String innerGroupLocalName = "inner-group";
298 final QName innerGroup = QName.create(module.getNamespace(), module.getRevision(), innerGroupLocalName);
299 final SchemaPath innerGroupPath = SchemaPath.create(true, testGroup, innerGroup);
300 final GroupingBuilder innerGrouping = module.addGrouping(12, innerGroup, innerGroupPath);
302 grouping.addGrouping(innerGrouping);
304 final String typedefLocalName = "test-type-definition";
305 final TypeDefinitionBuilder typedefBuilder = provideNestedTypedef(grouping.getQName(), typedefLocalName);
306 grouping.addTypedef(typedefBuilder);
308 final UsesNodeBuilder usesNodeBuilder = provideUsesNodeBuilder(innerGroupLocalName);
309 grouping.addUsesNode(usesNodeBuilder);
311 final UnknownSchemaNodeBuilder unknownNodeBuilder = provideUnknownNodeBuilder(grouping.getQName());
312 grouping.addUnknownNodeBuilder(unknownNodeBuilder);
314 final GroupingBuilder copy = CopyUtils.copy(grouping, module, true);
316 assertFalse(copy.getGroupingBuilders().isEmpty());
317 assertFalse(copy.getTypeDefinitionBuilders().isEmpty());
318 assertFalse(copy.getUsesNodeBuilders().isEmpty());
319 assertFalse(copy.getUnknownNodes().isEmpty());
324 public void testCopyIdentityrefTypeBuilder() {
325 final String typedefLocalName = "identity-ref-test-type";
326 final QName typedefQname = QName.create(module.getNamespace(), module.getRevision(), typedefLocalName);
327 final SchemaPath typedefPath = SchemaPath.create(true, typedefQname);
328 final IdentityrefTypeBuilder typeBuilder = new IdentityrefTypeBuilder(module.getModuleName(), 12,
329 "base:parent-identity", typedefPath);
331 //FIXME remove Ignore annotation once fix for bug 2219 will be resolved and merged
332 final TypeDefinitionBuilder copy = CopyUtils.copy(typeBuilder, module, true);
335 //TODO: add additional asserts
340 public void testCopyTypeDefinitionBuilderWithUnknownNodes() {
341 final String typedefLocalName = "test-typedef-with-ext";
342 final QName typedefQname = QName.create(module.getNamespace(), module.getRevision(), typedefLocalName);
343 final SchemaPath typedefPath = SchemaPath.create(true, typedefQname);
344 final TypeDefinitionBuilder typedefBuilder = new TypeDefinitionBuilderImpl(module.getModuleName(), 12,
345 typedefQname, typedefPath);
346 typedefBuilder.setType(Uint16.getInstance());
348 typedefBuilder.addUnknownNodeBuilder(provideUnknownNodeBuilder());
350 TypeDefinitionBuilder copy = CopyUtils.copy(typedefBuilder, module, true);
351 //FIXME: remove @Ignore annotation once bug 2220 will be resolved and merged
353 assertFalse(copy.getUnknownNodes().isEmpty());
356 private static final class InvalidDataSchemaNodeBuilder implements DataSchemaNodeBuilder {
358 @Override public SchemaNodeBuilder getOriginal() {
362 @Override public void setOriginal(final SchemaNodeBuilder original) {
366 @Override public boolean isAugmenting() {
370 @Override public void setAugmenting(final boolean augmenting) {
374 @Override public boolean isConfiguration() {
378 @Override public void setConfiguration(final boolean config) {
382 @Override public ConstraintsBuilder getConstraints() {
386 @Override public QName getQName() {
390 @Override public SchemaPath getPath() {
394 @Override public void setPath(final SchemaPath path) {
398 @Override public String getModuleName() {
402 @Override public void setModuleName(final String moduleName) {
406 @Override public int getLine() {
410 @Override public Builder getParent() {
414 @Override public void setParent(final Builder parent) {
418 @Override public void addUnknownNodeBuilder(final UnknownSchemaNodeBuilder unknownNode) {
422 @Override public List<UnknownSchemaNodeBuilder> getUnknownNodes() {
426 @Override public DataSchemaNode build() {
430 @Override public String getDescription() {
434 @Override public void setDescription(final String description) {
438 @Override public String getReference() {
442 @Override public void setReference(final String reference) {
446 @Override public Status getStatus() {
450 @Override public void setStatus(final Status status) {
454 @Override public boolean isAddedByUses() {
458 @Override public void setAddedByUses(final boolean addedByUses) {