Merge "Bug 2363, Bug 2205. Beta version of LeafRefContext tree computation"
[yangtools.git] / yang / yang-data-impl / src / test / java / org / opendaylight / yangtools / yang / data / impl / schema / InstanceIdToNodesTest.java
1 /*
2  * Copyright (c) 2015 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 package org.opendaylight.yangtools.yang.data.impl.schema;
9
10 import static org.junit.Assert.assertEquals;
11
12 import com.google.common.base.Function;
13 import com.google.common.collect.Collections2;
14 import com.google.common.io.ByteSource;
15 import java.io.IOException;
16 import java.io.InputStream;
17 import java.util.Collections;
18 import org.junit.Before;
19 import org.junit.Test;
20 import org.opendaylight.yangtools.yang.common.QName;
21 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
22 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
23 import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
24 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
25 import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
26 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
27 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
28 import org.opendaylight.yangtools.yang.model.parser.api.YangSyntaxErrorException;
29 import org.opendaylight.yangtools.yang.parser.impl.YangParserImpl;
30
31 public class InstanceIdToNodesTest {
32
33     private static final String NS = "urn:opendaylight:params:xml:ns:yang:controller:md:sal:normalization:test";
34     private static final String REVISION = "2014-03-13";
35     private static final QName ID = QName.create(NS, REVISION, "id");
36     private SchemaContext ctx;
37
38     private final YangInstanceIdentifier.NodeIdentifier rootContainer = new YangInstanceIdentifier.NodeIdentifier(QName.create(NS, REVISION, "test"));
39     private final YangInstanceIdentifier.NodeIdentifier outerContainer = new YangInstanceIdentifier.NodeIdentifier(QName.create(NS, REVISION, "outer-container"));
40     private final YangInstanceIdentifier.NodeIdentifier augmentedLeaf = new YangInstanceIdentifier.NodeIdentifier(QName.create(NS, REVISION, "augmented-leaf"));
41     private final YangInstanceIdentifier.AugmentationIdentifier augmentation = new YangInstanceIdentifier.AugmentationIdentifier(Collections.singleton(augmentedLeaf.getNodeType()));
42
43     private final YangInstanceIdentifier.NodeIdentifier outerList = new YangInstanceIdentifier.NodeIdentifier(QName.create(NS, REVISION, "outer-list"));
44     private final YangInstanceIdentifier.NodeIdentifierWithPredicates outerListWithKey = new YangInstanceIdentifier.NodeIdentifierWithPredicates(QName.create(NS, REVISION, "outer-list"), ID, 1);
45     private final YangInstanceIdentifier.NodeIdentifier choice = new YangInstanceIdentifier.NodeIdentifier(QName.create(NS, REVISION, "outer-choice"));
46     private final YangInstanceIdentifier.NodeIdentifier leafFromCase = new YangInstanceIdentifier.NodeIdentifier(QName.create(NS, REVISION, "one"));
47
48     private final YangInstanceIdentifier.NodeIdentifier leafList = new YangInstanceIdentifier.NodeIdentifier(QName.create(NS, REVISION, "ordered-leaf-list"));
49     private final YangInstanceIdentifier.NodeWithValue leafListWithValue = new YangInstanceIdentifier.NodeWithValue(leafList.getNodeType(), "abcd");
50
51     static SchemaContext createTestContext() throws IOException, YangSyntaxErrorException {
52         final YangParserImpl parser = new YangParserImpl();
53         return parser.parseSources(Collections2.transform(Collections.singletonList("/filter-test.yang"), new Function<String, ByteSource>() {
54             @Override
55             public ByteSource apply(final String input) {
56                 return new ByteSource() {
57                     @Override
58                     public InputStream openStream() throws IOException {
59                         return InstanceIdToNodesTest.class.getResourceAsStream(input);
60                     }
61                 };
62             }
63         }));
64     }
65
66     @Before
67     public void setUp() throws Exception {
68         ctx = createTestContext();
69
70     }
71
72     @Test
73     public void testInAugment() throws Exception {
74         final ContainerNode expectedFilter = Builders.containerBuilder().withNodeIdentifier(rootContainer).withChild(
75                 Builders.containerBuilder().withNodeIdentifier(outerContainer).withChild(
76                         Builders.augmentationBuilder().withNodeIdentifier(augmentation).withChild(
77                                 Builders.leafBuilder().withNodeIdentifier(augmentedLeaf).build()
78                         ).build()
79                 ).build()
80         ).build();
81
82         final NormalizedNode<?, ?> filter = ImmutableNodes.fromInstanceId(ctx, YangInstanceIdentifier.create(rootContainer, outerContainer, augmentation, augmentedLeaf));
83         assertEquals(expectedFilter, filter);
84     }
85
86     @Test
87     public void testInAugmentLeafOverride() throws Exception {
88         final LeafNode<Object> lastLeaf = Builders.leafBuilder().withNodeIdentifier(augmentedLeaf).withValue("randomValue").build();
89
90         final ContainerNode expectedFilter = Builders.containerBuilder().withNodeIdentifier(rootContainer).withChild(
91                 Builders.containerBuilder().withNodeIdentifier(outerContainer).withChild(
92                         Builders.augmentationBuilder().withNodeIdentifier(augmentation).withChild(
93                                 lastLeaf
94                         ).build()
95                 ).build()
96         ).build();
97
98         final NormalizedNode<?, ?> filter = ImmutableNodes.fromInstanceId(ctx, YangInstanceIdentifier.create(rootContainer, outerContainer, augmentation, augmentedLeaf), lastLeaf);
99         assertEquals(expectedFilter, filter);
100     }
101
102     @Test
103     public void testListChoice() throws Exception {
104         final ContainerNode expectedFilter = Builders.containerBuilder().withNodeIdentifier(rootContainer).withChild(
105                 Builders.mapBuilder().withNodeIdentifier(outerList).withChild(
106                         Builders.mapEntryBuilder().withNodeIdentifier(outerListWithKey).withChild(
107                                 Builders.leafBuilder().withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(ID)).withValue(1).build()
108                         ).withChild(
109                                 Builders.choiceBuilder().withNodeIdentifier(choice).withChild(
110                                         Builders.leafBuilder().withNodeIdentifier(leafFromCase).build()
111                                 ).build()
112                         ).build()
113                 ).build()
114         ).build();
115
116         final NormalizedNode<?, ?> filter = ImmutableNodes.fromInstanceId(ctx, YangInstanceIdentifier.create(rootContainer, outerList, outerListWithKey, choice, leafFromCase));
117         assertEquals(expectedFilter, filter);
118     }
119
120     @Test
121     public void testTopContainerLastChildOverride() throws Exception {
122         final ContainerNode expectedStructure = Builders.containerBuilder().withNodeIdentifier(rootContainer).withChild(
123                 Builders.mapBuilder().withNodeIdentifier(outerList).withChild(
124                         Builders.mapEntryBuilder().withNodeIdentifier(outerListWithKey).withChild(
125                                 Builders.leafBuilder().withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(ID)).withValue(1).build()
126                         ).withChild(
127                                 Builders.choiceBuilder().withNodeIdentifier(choice).withChild(
128                                         Builders.leafBuilder().withNodeIdentifier(leafFromCase).build()
129                                 ).build()
130                         ).build()
131                 ).build()
132         ).build();
133
134         final NormalizedNode<?, ?> filter = ImmutableNodes.fromInstanceId(ctx, YangInstanceIdentifier.create(rootContainer), expectedStructure);
135         assertEquals(expectedStructure, filter);
136     }
137
138     @Test
139     public void testListLastChildOverride() throws Exception {
140         final MapEntryNode outerListEntry = Builders.mapEntryBuilder().withNodeIdentifier(outerListWithKey).withChild(
141                 Builders.leafBuilder().withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(ID)).withValue(1).build()
142         ).build();
143         final MapNode lastChild = Builders.mapBuilder().withNodeIdentifier(this.outerList).withChild(
144                 outerListEntry
145         ).build();
146         final ContainerNode expectedStructure = Builders.containerBuilder().withNodeIdentifier(rootContainer).withChild(
147                 lastChild
148         ).build();
149
150         NormalizedNode<?, ?> filter = ImmutableNodes.fromInstanceId(ctx, YangInstanceIdentifier.create(rootContainer, outerList, outerListWithKey), outerListEntry);
151         assertEquals(expectedStructure, filter);
152         filter = ImmutableNodes.fromInstanceId(ctx, YangInstanceIdentifier.create(rootContainer, outerList, outerListWithKey));
153         assertEquals(expectedStructure, filter);
154     }
155
156     @Test
157     public void testLeafList() throws Exception {
158         final ContainerNode expectedFilter = Builders.containerBuilder().withNodeIdentifier(rootContainer).withChild(
159                 Builders.orderedLeafSetBuilder().withNodeIdentifier(leafList).withChild(
160                         Builders.leafSetEntryBuilder().withNodeIdentifier(leafListWithValue).withValue(leafListWithValue.getValue()).build()
161                 ).build()
162         ).build();
163
164         final NormalizedNode<?, ?> filter = ImmutableNodes.fromInstanceId(ctx, YangInstanceIdentifier.create(rootContainer, leafList, leafListWithValue));
165         assertEquals(expectedFilter, filter);
166     }
167 }