2ae8fbc606a838af73d5da8a954e23a00e24b51b
[smo/teiv.git] /
1 /*
2  *  ============LICENSE_START=======================================================
3  *  Copyright (C) 2024 Ericsson
4  *  Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe
5  *  ================================================================================
6  *  Licensed under the Apache License, Version 2.0 (the "License");
7  *  you may not use this file except in compliance with the License.
8  *  You may obtain a copy of the License at
9  *
10  *        http://www.apache.org/licenses/LICENSE-2.0
11  *
12  *  Unless required by applicable law or agreed to in writing, software
13  *  distributed under the License is distributed on an "AS IS" BASIS,
14  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  *  See the License for the specific language governing permissions and
16  *  limitations under the License.
17  *
18  *  SPDX-License-Identifier: Apache-2.0
19  *  ============LICENSE_END=========================================================
20  */
21 package org.oran.smo.yangtools.parser.util.test;
22
23 import static org.junit.Assert.assertEquals;
24 import static org.junit.Assert.assertFalse;
25 import static org.junit.Assert.assertNotNull;
26 import static org.junit.Assert.assertNull;
27 import static org.junit.Assert.assertTrue;
28 import static org.junit.Assert.fail;
29
30 import java.util.Map;
31
32 import org.junit.Test;
33
34 import org.oran.smo.yangtools.parser.PrefixResolver;
35 import org.oran.smo.yangtools.parser.model.schema.ModuleAndNamespaceResolver;
36 import org.oran.smo.yangtools.parser.util.InstanceIdentifier;
37 import org.oran.smo.yangtools.parser.util.InstanceIdentifier.Step;
38 import org.oran.smo.yangtools.parser.util.NamespaceModuleIdentifier;
39
40 public class InstanceIdentifierTest {
41
42     @Test
43     public void test___xml___ok() {
44
45         final PrefixResolver prefixResolver = new PrefixResolver();
46         prefixResolver.addMapping("ns1", "namespace1");
47         prefixResolver.addMapping("ns2", "namespace2");
48         prefixResolver.addMapping("ns3", "namespace3");
49
50         final InstanceIdentifier ii0 = InstanceIdentifier.parseXmlEncodedString("", prefixResolver);
51         assertTrue(ii0.getSteps().isEmpty());
52
53         // - - - - - - - - - - - -
54
55         final InstanceIdentifier ii1 = InstanceIdentifier.parseXmlEncodedString(" \t", prefixResolver);
56         assertTrue(ii1.getSteps().isEmpty());
57
58         // - - - - - - - - - - - -
59
60         final InstanceIdentifier ii2 = InstanceIdentifier.parseXmlEncodedString("/ns1:node1", prefixResolver);
61         assertEquals(1, ii2.getSteps().size());
62
63         assertEquals("node1", ii2.getSteps().get(0).getDataNodeNsai().getIdentifier());
64         assertEquals("namespace1", ii2.getSteps().get(0).getDataNodeNsai().getNamespace());
65         assertNull(ii2.getSteps().get(0).getDataNodeNsai().getModuleName());
66         assertNull(ii2.getSteps().get(0).getPredicateKeyValues());
67         assertNull(ii2.getSteps().get(0).getPredicateLeafListMemberValue());
68         assertNull(ii2.getSteps().get(0).getPredicateListEntryOrLeafListMemberIndex());
69
70         // - - - - - - - - - - - -
71
72         final InstanceIdentifier ii3 = InstanceIdentifier.parseXmlEncodedString("/ns1:node1/ns2 : node2", prefixResolver);
73         assertEquals(2, ii3.getSteps().size());
74
75         assertEquals("node1", ii3.getSteps().get(0).getDataNodeNsai().getIdentifier());
76         assertEquals("namespace1", ii3.getSteps().get(0).getDataNodeNsai().getNamespace());
77         assertNull(ii3.getSteps().get(0).getDataNodeNsai().getModuleName());
78         assertNull(ii3.getSteps().get(0).getPredicateKeyValues());
79         assertNull(ii3.getSteps().get(0).getPredicateLeafListMemberValue());
80         assertNull(ii3.getSteps().get(0).getPredicateListEntryOrLeafListMemberIndex());
81
82         assertEquals("node2", ii3.getSteps().get(1).getDataNodeNsai().getIdentifier());
83         assertEquals("namespace2", ii3.getSteps().get(1).getDataNodeNsai().getNamespace());
84         assertNull(ii3.getSteps().get(1).getDataNodeNsai().getModuleName());
85         assertNull(ii3.getSteps().get(1).getPredicateKeyValues());
86         assertNull(ii3.getSteps().get(1).getPredicateLeafListMemberValue());
87         assertNull(ii3.getSteps().get(1).getPredicateListEntryOrLeafListMemberIndex());
88
89         // - - - - - - - - - - - -
90
91         final InstanceIdentifier ii4 = InstanceIdentifier.parseXmlEncodedString("/ns1:node1/node2", prefixResolver);            // technically that's illegal syntax, but we will encounter it in the wild.
92         assertEquals(2, ii4.getSteps().size());
93
94         assertEquals("node1", ii4.getSteps().get(0).getDataNodeNsai().getIdentifier());
95         assertEquals("namespace1", ii4.getSteps().get(0).getDataNodeNsai().getNamespace());
96         assertNull(ii4.getSteps().get(0).getDataNodeNsai().getModuleName());
97         assertNull(ii4.getSteps().get(0).getPredicateKeyValues());
98         assertNull(ii4.getSteps().get(0).getPredicateLeafListMemberValue());
99         assertNull(ii4.getSteps().get(0).getPredicateListEntryOrLeafListMemberIndex());
100
101         assertEquals("node2", ii4.getSteps().get(1).getDataNodeNsai().getIdentifier());
102         assertEquals("namespace1", ii4.getSteps().get(1).getDataNodeNsai().getNamespace());
103         assertNull(ii4.getSteps().get(1).getDataNodeNsai().getModuleName());
104         assertNull(ii4.getSteps().get(1).getPredicateKeyValues());
105         assertNull(ii4.getSteps().get(1).getPredicateLeafListMemberValue());
106         assertNull(ii4.getSteps().get(1).getPredicateListEntryOrLeafListMemberIndex());
107
108         // - - - - - - - - - - - -
109
110         final InstanceIdentifier ii5 = InstanceIdentifier.parseXmlEncodedString("/ns1:node1[ns2:leaf = 'A.BC']",
111                 prefixResolver);
112         assertEquals(1, ii5.getSteps().size());
113
114         assertEquals("node1", ii5.getSteps().get(0).getDataNodeNsai().getIdentifier());
115         assertEquals("namespace1", ii5.getSteps().get(0).getDataNodeNsai().getNamespace());
116         assertNull(ii5.getSteps().get(0).getDataNodeNsai().getModuleName());
117         assertNull(ii5.getSteps().get(0).getPredicateLeafListMemberValue());
118         assertNull(ii5.getSteps().get(0).getPredicateListEntryOrLeafListMemberIndex());
119
120         final Map<NamespaceModuleIdentifier, String> ii5KeyValues0 = ii5.getSteps().get(0).getPredicateKeyValues();
121         assertNotNull(ii5KeyValues0);
122         assertEquals(1, ii5KeyValues0.size());
123
124         assertTrue(ii5KeyValues0.containsKey(new NamespaceModuleIdentifier("namespace2", null, "leaf")));
125         assertEquals("A.BC", ii5KeyValues0.get(new NamespaceModuleIdentifier("namespace2", null, "leaf")));
126
127         // - - - - - - - - - - - -
128
129         final InstanceIdentifier ii6 = InstanceIdentifier.parseXmlEncodedString("/ns1:node1[leaf=\"'AB.C'\"]",
130                 prefixResolver);                // technically that's illegal syntax, but we will encounter it in the wild.
131         assertEquals(1, ii6.getSteps().size());
132
133         assertEquals("node1", ii6.getSteps().get(0).getDataNodeNsai().getIdentifier());
134         assertEquals("namespace1", ii6.getSteps().get(0).getDataNodeNsai().getNamespace());
135
136         final Map<NamespaceModuleIdentifier, String> ii6KeyValues0 = ii6.getSteps().get(0).getPredicateKeyValues();
137         assertNotNull(ii6KeyValues0);
138         assertEquals(1, ii6KeyValues0.size());
139
140         assertTrue(ii6KeyValues0.containsKey(new NamespaceModuleIdentifier("namespace1", null, "leaf")));
141         assertEquals("'AB.C'", ii6KeyValues0.get(new NamespaceModuleIdentifier("namespace1", null, "leaf")));
142
143         // - - - - - - - - - - - -
144
145         final InstanceIdentifier ii7 = InstanceIdentifier.parseXmlEncodedString(
146                 "/ns1:node1[ns2:leaf=\"ABC\"][ns3:other-leaf=''] ", prefixResolver);
147         assertEquals(1, ii7.getSteps().size());
148
149         assertEquals("node1", ii7.getSteps().get(0).getDataNodeNsai().getIdentifier());
150         assertEquals("namespace1", ii7.getSteps().get(0).getDataNodeNsai().getNamespace());
151
152         final Map<NamespaceModuleIdentifier, String> ii7KeyValues0 = ii7.getSteps().get(0).getPredicateKeyValues();
153         assertNotNull(ii7KeyValues0);
154         assertEquals(2, ii7KeyValues0.size());
155
156         assertTrue(ii7KeyValues0.containsKey(new NamespaceModuleIdentifier("namespace2", null, "leaf")));
157         assertEquals("ABC", ii7KeyValues0.get(new NamespaceModuleIdentifier("namespace2", null, "leaf")));
158         assertTrue(ii7KeyValues0.containsKey(new NamespaceModuleIdentifier("namespace3", null, "other-leaf")));
159         assertEquals("", ii7KeyValues0.get(new NamespaceModuleIdentifier("namespace3", null, "other-leaf")));
160
161         // - - - - - - - - - - - -
162
163         final InstanceIdentifier ii8 = InstanceIdentifier.parseXmlEncodedString(
164                 "/ns1:node1[ns2:leaf='ABC'] [other-leaf=XYZ]", prefixResolver);         // technically that's illegal syntax, but we will encounter it in the wild.
165         assertEquals(1, ii8.getSteps().size());
166
167         assertEquals("node1", ii8.getSteps().get(0).getDataNodeNsai().getIdentifier());
168         assertEquals("namespace1", ii8.getSteps().get(0).getDataNodeNsai().getNamespace());
169         assertNull(ii8.getSteps().get(0).getDataNodeNsai().getModuleName());
170
171         final Map<NamespaceModuleIdentifier, String> ii8KeyValues0 = ii8.getSteps().get(0).getPredicateKeyValues();
172         assertNotNull(ii8KeyValues0);
173         assertEquals(2, ii8KeyValues0.size());
174
175         assertTrue(ii8KeyValues0.containsKey(new NamespaceModuleIdentifier("namespace2", null, "leaf")));
176         assertEquals("ABC", ii8KeyValues0.get(new NamespaceModuleIdentifier("namespace2", null, "leaf")));
177         assertTrue(ii8KeyValues0.containsKey(new NamespaceModuleIdentifier("namespace1", null, "other-leaf")));
178         assertEquals("XYZ", ii8KeyValues0.get(new NamespaceModuleIdentifier("namespace1", null, "other-leaf")));
179
180         // - - - - - - - - - - - -
181
182         final InstanceIdentifier ii9 = InstanceIdentifier.parseXmlEncodedString("/ns1:node1[4]", prefixResolver);
183         assertEquals(1, ii9.getSteps().size());
184
185         assertEquals("node1", ii9.getSteps().get(0).getDataNodeNsai().getIdentifier());
186         assertEquals("namespace1", ii9.getSteps().get(0).getDataNodeNsai().getNamespace());
187         assertNull(ii9.getSteps().get(0).getPredicateKeyValues());
188         assertNull(ii9.getSteps().get(0).getPredicateLeafListMemberValue());
189
190         assertNotNull(ii9.getSteps().get(0).getPredicateListEntryOrLeafListMemberIndex());
191         assertEquals(new Integer(4), ii9.getSteps().get(0).getPredicateListEntryOrLeafListMemberIndex());
192
193         // - - - - - - - - - - - -
194
195         final InstanceIdentifier ii10 = InstanceIdentifier.parseXmlEncodedString("/ns1:node1[.='A B C']", prefixResolver);
196         assertEquals(1, ii10.getSteps().size());
197
198         assertEquals("node1", ii10.getSteps().get(0).getDataNodeNsai().getIdentifier());
199         assertEquals("namespace1", ii10.getSteps().get(0).getDataNodeNsai().getNamespace());
200         assertNull(ii10.getSteps().get(0).getPredicateKeyValues());
201         assertNull(ii10.getSteps().get(0).getPredicateListEntryOrLeafListMemberIndex());
202
203         assertNotNull(ii10.getSteps().get(0).getPredicateLeafListMemberValue());
204         assertEquals("A B C", ii10.getSteps().get(0).getPredicateLeafListMemberValue());
205
206         // - - - - - - - - - - - -
207
208         final InstanceIdentifier ii11 = InstanceIdentifier.parseXmlEncodedString(
209                 "/ns1:node1/ns2:node2[5]/ns3:node3[.='ABC']/ns1:node1[ns2:leaf2='XYZ']/ns3:node3[ns1:leaf1='EFG'][ns2:leaf2='RST']",
210                 prefixResolver);
211         assertEquals(5, ii11.getSteps().size());
212
213         assertEquals("node1", ii11.getSteps().get(0).getDataNodeNsai().getIdentifier());
214         assertEquals("namespace1", ii11.getSteps().get(0).getDataNodeNsai().getNamespace());
215         assertNull(ii11.getSteps().get(0).getPredicateKeyValues());
216         assertNull(ii11.getSteps().get(0).getPredicateListEntryOrLeafListMemberIndex());
217         assertNull(ii11.getSteps().get(0).getPredicateLeafListMemberValue());
218
219         assertEquals("node2", ii11.getSteps().get(1).getDataNodeNsai().getIdentifier());
220         assertEquals("namespace2", ii11.getSteps().get(1).getDataNodeNsai().getNamespace());
221         assertNull(ii11.getSteps().get(1).getPredicateKeyValues());
222         assertNull(ii11.getSteps().get(1).getPredicateLeafListMemberValue());
223         assertEquals(new Integer(5), ii11.getSteps().get(1).getPredicateListEntryOrLeafListMemberIndex());
224
225         assertEquals("node3", ii11.getSteps().get(2).getDataNodeNsai().getIdentifier());
226         assertEquals("namespace3", ii11.getSteps().get(2).getDataNodeNsai().getNamespace());
227         assertNull(ii11.getSteps().get(2).getPredicateKeyValues());
228         assertNull(ii11.getSteps().get(0).getPredicateLeafListMemberValue());
229         assertEquals("ABC", ii11.getSteps().get(2).getPredicateLeafListMemberValue());
230
231         assertEquals("node1", ii11.getSteps().get(3).getDataNodeNsai().getIdentifier());
232         assertEquals("namespace1", ii11.getSteps().get(3).getDataNodeNsai().getNamespace());
233         assertNull(ii11.getSteps().get(3).getPredicateListEntryOrLeafListMemberIndex());
234         assertNull(ii11.getSteps().get(3).getPredicateLeafListMemberValue());
235         assertEquals("XYZ", ii11.getSteps().get(3).getPredicateKeyValues().get(new NamespaceModuleIdentifier("namespace2",
236                 null, "leaf2")));
237
238         assertEquals("node3", ii11.getSteps().get(4).getDataNodeNsai().getIdentifier());
239         assertEquals("namespace3", ii11.getSteps().get(4).getDataNodeNsai().getNamespace());
240         assertNull(ii11.getSteps().get(4).getPredicateListEntryOrLeafListMemberIndex());
241         assertNull(ii11.getSteps().get(4).getPredicateLeafListMemberValue());
242         assertEquals("EFG", ii11.getSteps().get(4).getPredicateKeyValues().get(new NamespaceModuleIdentifier("namespace1",
243                 null, "leaf1")));
244         assertEquals("RST", ii11.getSteps().get(4).getPredicateKeyValues().get(new NamespaceModuleIdentifier("namespace2",
245                 null, "leaf2")));
246
247         // - - - - - - - - - - - -
248
249         final InstanceIdentifier ii12 = InstanceIdentifier.parseXmlEncodedString("/ns1:node1[ns2:leaf='\\\"[]=./']",
250                 prefixResolver);
251         assertEquals(1, ii12.getSteps().size());
252
253         final Map<NamespaceModuleIdentifier, String> ii12KeyValues0 = ii12.getSteps().get(0).getPredicateKeyValues();
254         assertTrue(ii12KeyValues0.containsKey(new NamespaceModuleIdentifier("namespace2", null, "leaf")));
255         assertEquals("\\\"[]=./", ii12KeyValues0.get(new NamespaceModuleIdentifier("namespace2", null, "leaf")));
256     }
257
258     @Test
259     public void test___xml___resolver___ok() {
260
261         final PrefixResolver prefixResolver = new PrefixResolver();
262         prefixResolver.addMapping("ns1", "namespace1");
263         prefixResolver.addMapping("ns2", "namespace2");
264
265         final ModuleAndNamespaceResolver namespaceResolver = new ModuleAndNamespaceResolver();
266         namespaceResolver.recordNamespaceMapping("namespace1", "module1");
267         namespaceResolver.recordNamespaceMapping("namespace2", "module2");
268         namespaceResolver.recordModuleMapping("module1", "namespace1");
269         namespaceResolver.recordModuleMapping("module2", "namespace2");
270
271         // - - - - - - - - - - - -
272
273         final InstanceIdentifier ii1 = InstanceIdentifier.parseXmlEncodedString("/ns1:node1", prefixResolver);
274         ii1.resolveModuleOrNamespace(namespaceResolver);
275
276         assertEquals(1, ii1.getSteps().size());
277
278         assertEquals("node1", ii1.getSteps().get(0).getDataNodeNsai().getIdentifier());
279         assertEquals("namespace1", ii1.getSteps().get(0).getDataNodeNsai().getNamespace());
280         assertEquals("module1", ii1.getSteps().get(0).getDataNodeNsai().getModuleName());
281
282         // - - - - - - - - - - - -
283
284         final InstanceIdentifier ii2 = InstanceIdentifier.parseXmlEncodedString("/ns1:node1[ns2:leaf='ABC']",
285                 prefixResolver);
286         ii2.resolveModuleOrNamespace(namespaceResolver);
287
288         assertEquals(1, ii2.getSteps().size());
289
290         assertEquals("node1", ii2.getSteps().get(0).getDataNodeNsai().getIdentifier());
291         assertEquals("namespace1", ii2.getSteps().get(0).getDataNodeNsai().getNamespace());
292         assertEquals("module1", ii2.getSteps().get(0).getDataNodeNsai().getModuleName());
293
294         final Map<NamespaceModuleIdentifier, String> ii2KeyValues0 = ii2.getSteps().get(0).getPredicateKeyValues();
295         assertTrue(ii2KeyValues0.containsKey(new NamespaceModuleIdentifier("namespace2", null, "leaf")));
296         assertEquals("ABC", ii2KeyValues0.get(new NamespaceModuleIdentifier("namespace2", null, "leaf")));
297         assertTrue(ii2KeyValues0.containsKey(new NamespaceModuleIdentifier(null, "module2", "leaf")));
298         assertEquals("ABC", ii2KeyValues0.get(new NamespaceModuleIdentifier(null, "module2", "leaf")));
299     }
300
301     @Test
302     public void test___json___ok() {
303
304         final InstanceIdentifier ii1 = InstanceIdentifier.parseJsonEncodedString("");
305         assertTrue(ii1.getSteps().isEmpty());
306
307         // - - - - - - - - - - - -
308
309         final InstanceIdentifier ii2 = InstanceIdentifier.parseJsonEncodedString("/module1:node1");
310         assertEquals(1, ii2.getSteps().size());
311
312         assertEquals("node1", ii2.getSteps().get(0).getDataNodeNsai().getIdentifier());
313         assertEquals("module1", ii2.getSteps().get(0).getDataNodeNsai().getModuleName());
314         assertNull(ii2.getSteps().get(0).getDataNodeNsai().getNamespace());
315         assertNull(ii2.getSteps().get(0).getPredicateKeyValues());
316         assertNull(ii2.getSteps().get(0).getPredicateLeafListMemberValue());
317         assertNull(ii2.getSteps().get(0).getPredicateListEntryOrLeafListMemberIndex());
318
319         // - - - - - - - - - - - -
320
321         final InstanceIdentifier ii3 = InstanceIdentifier.parseJsonEncodedString("/module1:node1/module2:node2");
322         assertEquals(2, ii3.getSteps().size());
323
324         assertEquals("node1", ii3.getSteps().get(0).getDataNodeNsai().getIdentifier());
325         assertEquals("module1", ii3.getSteps().get(0).getDataNodeNsai().getModuleName());
326         assertNull(ii3.getSteps().get(0).getDataNodeNsai().getNamespace());
327         assertNull(ii3.getSteps().get(0).getPredicateKeyValues());
328         assertNull(ii3.getSteps().get(0).getPredicateLeafListMemberValue());
329         assertNull(ii3.getSteps().get(0).getPredicateListEntryOrLeafListMemberIndex());
330
331         assertEquals("node2", ii3.getSteps().get(1).getDataNodeNsai().getIdentifier());
332         assertEquals("module2", ii3.getSteps().get(1).getDataNodeNsai().getModuleName());
333         assertNull(ii3.getSteps().get(1).getDataNodeNsai().getNamespace());
334         assertNull(ii3.getSteps().get(1).getPredicateKeyValues());
335         assertNull(ii3.getSteps().get(1).getPredicateLeafListMemberValue());
336         assertNull(ii3.getSteps().get(1).getPredicateListEntryOrLeafListMemberIndex());
337
338         // - - - - - - - - - - - -
339
340         final InstanceIdentifier ii4 = InstanceIdentifier.parseJsonEncodedString("/module1:node1/node2");
341         assertEquals(2, ii4.getSteps().size());
342
343         assertEquals("node1", ii4.getSteps().get(0).getDataNodeNsai().getIdentifier());
344         assertEquals("module1", ii4.getSteps().get(0).getDataNodeNsai().getModuleName());
345         assertNull(ii4.getSteps().get(0).getDataNodeNsai().getNamespace());
346         assertNull(ii4.getSteps().get(0).getPredicateKeyValues());
347         assertNull(ii4.getSteps().get(0).getPredicateLeafListMemberValue());
348         assertNull(ii4.getSteps().get(0).getPredicateListEntryOrLeafListMemberIndex());
349
350         assertEquals("node2", ii4.getSteps().get(1).getDataNodeNsai().getIdentifier());
351         assertEquals("module1", ii4.getSteps().get(1).getDataNodeNsai().getModuleName());
352         assertNull(ii4.getSteps().get(1).getDataNodeNsai().getNamespace());
353         assertNull(ii4.getSteps().get(1).getPredicateKeyValues());
354         assertNull(ii4.getSteps().get(1).getPredicateLeafListMemberValue());
355         assertNull(ii4.getSteps().get(1).getPredicateListEntryOrLeafListMemberIndex());
356
357         // - - - - - - - - - - - -
358
359         final InstanceIdentifier ii8 = InstanceIdentifier.parseJsonEncodedString(
360                 "/module1:node1[module2:leaf='ABC'][other-leaf=XYZ]");
361         assertEquals(1, ii8.getSteps().size());
362
363         assertEquals("node1", ii8.getSteps().get(0).getDataNodeNsai().getIdentifier());
364         assertEquals("module1", ii8.getSteps().get(0).getDataNodeNsai().getModuleName());
365         assertNull(ii8.getSteps().get(0).getDataNodeNsai().getNamespace());
366
367         final Map<NamespaceModuleIdentifier, String> ii8KeyValues0 = ii8.getSteps().get(0).getPredicateKeyValues();
368         assertNotNull(ii8KeyValues0);
369         assertEquals(2, ii8KeyValues0.size());
370
371         assertTrue(ii8KeyValues0.containsKey(new NamespaceModuleIdentifier(null, "module2", "leaf")));
372         assertEquals("ABC", ii8KeyValues0.get(new NamespaceModuleIdentifier(null, "module2", "leaf")));
373         assertTrue(ii8KeyValues0.containsKey(new NamespaceModuleIdentifier(null, "module1", "other-leaf")));
374         assertEquals("XYZ", ii8KeyValues0.get(new NamespaceModuleIdentifier(null, "module1", "other-leaf")));
375     }
376
377     @Test
378     public void test___json___resolver___ok() {
379
380         final ModuleAndNamespaceResolver namespaceResolver = new ModuleAndNamespaceResolver();
381         namespaceResolver.recordNamespaceMapping("namespace1", "module1");
382         namespaceResolver.recordNamespaceMapping("namespace2", "module2");
383         namespaceResolver.recordModuleMapping("module1", "namespace1");
384         namespaceResolver.recordModuleMapping("module2", "namespace2");
385
386         // - - - - - - - - - - - -
387
388         final InstanceIdentifier ii1 = InstanceIdentifier.parseJsonEncodedString("/module1:node1");
389         ii1.resolveModuleOrNamespace(namespaceResolver);
390
391         assertEquals(1, ii1.getSteps().size());
392
393         assertEquals("node1", ii1.getSteps().get(0).getDataNodeNsai().getIdentifier());
394         assertEquals("namespace1", ii1.getSteps().get(0).getDataNodeNsai().getNamespace());
395         assertEquals("module1", ii1.getSteps().get(0).getDataNodeNsai().getModuleName());
396
397         // - - - - - - - - - - - -
398
399         final InstanceIdentifier ii2 = InstanceIdentifier.parseJsonEncodedString("/module1:node1[module2:leaf='ABC']");
400         ii2.resolveModuleOrNamespace(namespaceResolver);
401
402         assertEquals(1, ii2.getSteps().size());
403
404         assertEquals("node1", ii2.getSteps().get(0).getDataNodeNsai().getIdentifier());
405         assertEquals("namespace1", ii2.getSteps().get(0).getDataNodeNsai().getNamespace());
406         assertEquals("module1", ii2.getSteps().get(0).getDataNodeNsai().getModuleName());
407
408         final Map<NamespaceModuleIdentifier, String> ii2KeyValues0 = ii2.getSteps().get(0).getPredicateKeyValues();
409         assertTrue(ii2KeyValues0.containsKey(new NamespaceModuleIdentifier("namespace2", null, "leaf")));
410         assertEquals("ABC", ii2KeyValues0.get(new NamespaceModuleIdentifier("namespace2", null, "leaf")));
411         assertTrue(ii2KeyValues0.containsKey(new NamespaceModuleIdentifier(null, "module2", "leaf")));
412         assertEquals("ABC", ii2KeyValues0.get(new NamespaceModuleIdentifier(null, "module2", "leaf")));
413     }
414
415     @Test
416     public void test___errors___npe() {
417
418         final PrefixResolver prefixResolver = new PrefixResolver();
419
420         try {
421             InstanceIdentifier.parseXmlEncodedString(null, prefixResolver);
422             fail("Expected NullPointerException");
423         } catch (final NullPointerException ex) {
424         } catch (final Exception ex) {
425             fail("Expected NullPointerException");
426         }
427
428         try {
429             InstanceIdentifier.parseXmlEncodedString("", null);
430             fail("Expected NullPointerException");
431         } catch (final NullPointerException ex) {
432         } catch (final Exception ex) {
433             fail("Expected NullPointerException");
434         }
435
436         try {
437             InstanceIdentifier.parseXmlEncodedString(null, null);
438             fail("Expected NullPointerException");
439         } catch (final NullPointerException ex) {
440         } catch (final Exception ex) {
441             fail("Expected NullPointerException");
442         }
443
444         try {
445             InstanceIdentifier.parseJsonEncodedString(null);
446             fail("Expected NullPointerException");
447         } catch (final NullPointerException ex) {
448         } catch (final Exception ex) {
449             fail("Expected NullPointerException");
450         }
451     }
452
453     @Test
454     public void test___xml___errors() {
455
456         final PrefixResolver prefixResolver = new PrefixResolver();
457         prefixResolver.addMapping("ns1", "namespace1");
458         prefixResolver.addMapping("ns2", "namespace2");
459         prefixResolver.addMapping("ns3", "namespace3");
460
461         expectException("=", prefixResolver, "slash");
462         expectException("leaf1", prefixResolver, "slash");
463         expectException("ns1:leaf1", prefixResolver, "slash");
464         expectException(".", prefixResolver, "slash");
465         expectException("[]", prefixResolver, "slash");
466
467         expectException("/", prefixResolver, "syntax");
468         expectException("/ns1:", prefixResolver, "syntax");
469
470         expectException("/=", prefixResolver, "data node");
471         expectException("/ns1::", prefixResolver, "data node");
472         expectException("/ns1:leaf1/:", prefixResolver, "data node");
473         expectException("/ns1:leaf1/ns2==", prefixResolver, "data node");
474
475         expectException("/leaf1", prefixResolver, "first step");
476
477         expectException("/nsX:leaf1", prefixResolver, "prefix");
478
479         expectException("/ns1:list1[a]", prefixResolver, "not parseable");
480         expectException("/ns1:list1[-1]", prefixResolver, "larger/equal to 1");
481         expectException("/ns1:list1[0]", prefixResolver, "larger/equal to 1");
482
483         expectException("/ns1:list1[ns2:leaf2:'abc']", prefixResolver, "data node");
484         expectException("/ns1:list1[ns2:leaf2=='abc']", prefixResolver, "single- or double-quoted string");
485         expectException("/ns1:list1[ns2:leaf2='abc'[", prefixResolver, "closing square brace");
486
487         expectException("/ns1:list1[ns2:leaf2=ab'c]", prefixResolver, "quote");
488         expectException("/ns1:list1[ns2:leaf2=ab\"c]", prefixResolver, "quote");
489
490         expectException("/ns1:list1[ns2:leaf2='abc", prefixResolver, "terminated");
491         expectException("/ns1:list1[ns2:leaf2=\"abc", prefixResolver, "terminated");
492
493         expectException("/ns1:list1[ns2:leaf2", prefixResolver, "syntax");
494         expectException("/ns1:list1[ns2:leaf2=", prefixResolver, "syntax");
495         expectException("/ns1:list1[ns2:leaf2=''", prefixResolver, "syntax");
496     }
497
498     private void expectException(final String xPath, final PrefixResolver prefixResolver, final String expectedString) {
499         try {
500             InstanceIdentifier.parseXmlEncodedString(xPath, prefixResolver);
501             fail("Expected exception.");
502         } catch (final Exception ex) {
503             if (!ex.getMessage().contains(expectedString)) {
504                 fail("Expected exception to contain string '" + expectedString + "'; exception message is: " + ex
505                         .getMessage());
506             }
507         }
508     }
509
510     @SuppressWarnings("unlikely-arg-type")
511     @Test
512     public void test___instance_identifier___equals() {
513
514         final PrefixResolver prefixResolver = new PrefixResolver();
515         prefixResolver.addMapping("ns1", "namespace1");
516         prefixResolver.addMapping("ns2", "namespace2");
517         prefixResolver.addMapping("ns9", "namespace1");
518
519         final ModuleAndNamespaceResolver namespaceResolver = new ModuleAndNamespaceResolver();
520         namespaceResolver.recordNamespaceMapping("namespace1", "module1");
521         namespaceResolver.recordNamespaceMapping("namespace2", "module2");
522         namespaceResolver.recordModuleMapping("module1", "namespace1");
523         namespaceResolver.recordModuleMapping("module2", "namespace2");
524
525         // - - - - - - - - - - - -
526
527         final InstanceIdentifier ii1 = InstanceIdentifier.parseXmlEncodedString("/ns1:node1", prefixResolver);
528
529         assertTrue(ii1.equals(ii1));
530         assertFalse(ii1.equals(null));
531         assertFalse(ii1.equals(""));
532
533         assertTrue(ii1.equals(InstanceIdentifier.parseXmlEncodedString("/ns1:node1", prefixResolver)));
534         assertTrue(ii1.equals(InstanceIdentifier.parseXmlEncodedString("/ns9:node1", prefixResolver)));
535
536         // - - - - - - - - - - - -
537
538         final InstanceIdentifier ii2 = InstanceIdentifier.parseXmlEncodedString("/ns1:node1/ns2:node2/node3",
539                 prefixResolver);
540
541         assertTrue(ii2.equals(InstanceIdentifier.parseXmlEncodedString("/ns1:node1/ns2:node2/ns2:node3", prefixResolver)));
542         assertTrue(ii2.equals(InstanceIdentifier.parseXmlEncodedString("/ns9:node1/ns2:node2/node3", prefixResolver)));
543
544         // - - - - - - - - - - - -
545
546         final InstanceIdentifier ii3 = InstanceIdentifier.parseXmlEncodedString("/ns1:node1/ns2:node2/node3",
547                 prefixResolver);
548         assertFalse(ii3.equals(InstanceIdentifier.parseJsonEncodedString("/module1:node1/module2:node2/module2:node3")));
549         ii3.resolveModuleOrNamespace(namespaceResolver);
550         assertTrue(ii3.equals(InstanceIdentifier.parseJsonEncodedString("/module1:node1/module2:node2/module2:node3")));
551     }
552
553     @SuppressWarnings("unlikely-arg-type")
554     @Test
555     public void test___step___equals() {
556
557         final ModuleAndNamespaceResolver namespaceResolver = new ModuleAndNamespaceResolver();
558         namespaceResolver.recordNamespaceMapping("namespace1", "module1");
559         namespaceResolver.recordNamespaceMapping("namespace2", "module2");
560         namespaceResolver.recordNamespaceMapping("namespace3", "module3");
561         namespaceResolver.recordModuleMapping("module1", "namespace1");
562         namespaceResolver.recordModuleMapping("module2", "namespace2");
563         namespaceResolver.recordModuleMapping("module3", "namespace3");
564
565         final NamespaceModuleIdentifier nsaiNs = new NamespaceModuleIdentifier("namespace1", null, "node1");
566
567         final Step step1 = new Step(nsaiNs);
568
569         assertTrue(step1.equals(step1));
570         assertTrue(step1.equals(new Step(nsaiNs)));
571         assertTrue(step1.equals(new Step(new NamespaceModuleIdentifier("namespace1", null, "node1"))));
572         assertFalse(step1.equals(null));
573         assertFalse(step1.equals(""));
574         assertFalse(step1.equals(new Step(new NamespaceModuleIdentifier(null, "module1", "node1"))));
575
576         step1.resolveModuleOrNamespace(namespaceResolver);
577         assertTrue(step1.equals(new Step(new NamespaceModuleIdentifier(null, "module1", "node1"))));
578
579         // - - - - - - - - - - -
580
581         final NamespaceModuleIdentifier nsaiPred2 = new NamespaceModuleIdentifier("namespace2", null, "leaf2");
582
583         final Step step2 = new Step(nsaiNs);
584         step2.addPredicateKeyValue(nsaiPred2, "Hello");
585
586         assertTrue(step2.equals(step2));
587         assertTrue(step2.equals(new Step(new NamespaceModuleIdentifier("namespace1", null, "node1")).addPredicateKeyValue(
588                 nsaiPred2, "Hello")));
589         assertTrue(step2.equals(new Step(new NamespaceModuleIdentifier("namespace1", null, "node1")).addPredicateKeyValue(
590                 new NamespaceModuleIdentifier("namespace2", null, "leaf2"), "Hello")));
591         assertFalse(step2.equals(new Step(new NamespaceModuleIdentifier("namespace1", null, "node1"))));
592         assertFalse(step2.equals(new Step(new NamespaceModuleIdentifier("namespace1", null, "node1")).addPredicateKeyValue(
593                 nsaiPred2, "hello")));
594         assertFalse(step2.equals(new Step(new NamespaceModuleIdentifier("namespace1", null, "node1")).addPredicateKeyValue(
595                 nsaiPred2, "XXX")));
596
597         assertFalse(step2.equals(new Step(new NamespaceModuleIdentifier("namespace1", null, "node1")).addPredicateKeyValue(
598                 new NamespaceModuleIdentifier(null, "module2", "leaf2"), "Hello")));
599         step2.resolveModuleOrNamespace(namespaceResolver);
600         assertTrue(step2.equals(new Step(new NamespaceModuleIdentifier("namespace1", null, "node1")).addPredicateKeyValue(
601                 new NamespaceModuleIdentifier(null, "module2", "leaf2"), "Hello")));
602
603         // - - - - - - - - - - -
604
605         final NamespaceModuleIdentifier nsaiPred3 = new NamespaceModuleIdentifier("namespace3", null, "leaf3");
606
607         final Step step3 = new Step(nsaiNs);
608         step3.addPredicateKeyValue(nsaiPred2, "Hello");
609         step3.addPredicateKeyValue(nsaiPred3, "World");
610
611         assertTrue(step3.equals(step3));
612         assertTrue(step3.equals(new Step(new NamespaceModuleIdentifier("namespace1", null, "node1")).addPredicateKeyValue(
613                 nsaiPred2, "Hello").addPredicateKeyValue(nsaiPred3, "World")));
614         assertTrue(step3.equals(new Step(new NamespaceModuleIdentifier("namespace1", null, "node1")).addPredicateKeyValue(
615                 nsaiPred3, "World").addPredicateKeyValue(nsaiPred2, "Hello")));
616
617         // - - - - - - - - - - -
618
619         final Step step4 = new Step(nsaiNs);
620         step4.setPredicateLeafListMemberValue("value1");
621
622         assertTrue(step4.equals(step4));
623         assertTrue(step4.equals(new Step(nsaiNs).setPredicateLeafListMemberValue("value1")));
624         assertFalse(step4.equals(new Step(nsaiNs)));
625         assertFalse(step4.equals(new Step(nsaiNs).setPredicateLeafListMemberValue("valueXxxx")));
626         assertFalse(step4.equals(new Step(nsaiNs).addPredicateKeyValue(nsaiPred2, "Hello")));
627
628         // - - - - - - - - - - -
629
630         final Step step5 = new Step(nsaiNs);
631         step5.setPredicateListEntryOrLeafListMemberIndex(1);
632
633         assertTrue(step5.equals(step5));
634         assertTrue(step5.equals(new Step(nsaiNs).setPredicateListEntryOrLeafListMemberIndex(1)));
635         assertFalse(step5.equals(new Step(nsaiNs)));
636         assertFalse(step5.equals(new Step(nsaiNs).setPredicateListEntryOrLeafListMemberIndex(2)));
637         assertFalse(step5.equals(new Step(nsaiNs).addPredicateKeyValue(nsaiPred2, "Hello")));
638         assertFalse(step5.equals(new Step(nsaiNs).setPredicateLeafListMemberValue("value1")));
639     }
640
641     @Test
642     public void test___step___exceptions() {
643
644         try {
645             new Step(null);
646             fail("Expected exception.");
647         } catch (final Exception expected) {
648         }
649
650         final NamespaceModuleIdentifier nsai = new NamespaceModuleIdentifier("namespace1", null, "node1");
651
652         try {
653             new Step(nsai).addPredicateKeyValue(null, "value1");
654             fail("Expected exception.");
655         } catch (final Exception expected) {
656         }
657
658         try {
659             new Step(nsai).addPredicateKeyValue(nsai, null);
660             fail("Expected exception.");
661         } catch (final Exception expected) {
662         }
663
664         try {
665             new Step(nsai).addPredicateKeyValue(null, null);
666             fail("Expected exception.");
667         } catch (final Exception expected) {
668         }
669
670         try {
671             new Step(nsai).setPredicateLeafListMemberValue(null);
672             fail("Expected exception.");
673         } catch (final Exception expected) {
674         }
675
676         try {
677             new Step(nsai).setPredicateListEntryOrLeafListMemberIndex(0);
678             fail("Expected exception.");
679         } catch (final Exception expected) {
680         }
681
682         try {
683             new Step(nsai).addPredicateKeyValue(nsai, "value1").setPredicateLeafListMemberValue("value1");
684             fail("Expected exception.");
685         } catch (final Exception expected) {
686         }
687
688         try {
689             new Step(nsai).setPredicateLeafListMemberValue("value1").addPredicateKeyValue(nsai, "value1");
690             fail("Expected exception.");
691         } catch (final Exception expected) {
692         }
693
694         try {
695             new Step(nsai).setPredicateListEntryOrLeafListMemberIndex(10).addPredicateKeyValue(nsai, "value1");
696             fail("Expected exception.");
697         } catch (final Exception expected) {
698         }
699
700         try {
701             new Step(nsai).setPredicateListEntryOrLeafListMemberIndex(10).setPredicateLeafListMemberValue("value1");
702             fail("Expected exception.");
703         } catch (final Exception expected) {
704         }
705
706         try {
707             new Step(nsai).setPredicateLeafListMemberValue("value1").setPredicateListEntryOrLeafListMemberIndex(10);
708             fail("Expected exception.");
709         } catch (final Exception expected) {
710         }
711     }
712 }