3d241537bd114493820e472cd25a36dfe591da48
[mdsal.git] / binding / yang-binding / src / test / java / org / opendaylight / yangtools / yang / binding / contract / NamingTest.java
1 /*
2  * Copyright (c) 2016 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.binding.contract;
9
10 import static org.junit.Assert.assertEquals;
11
12 import java.util.HashMap;
13 import java.util.List;
14 import org.junit.Test;
15 import org.opendaylight.yangtools.yang.common.QName;
16 import org.opendaylight.yangtools.yang.common.QNameModule;
17 import org.opendaylight.yangtools.yang.common.Revision;
18 import org.opendaylight.yangtools.yang.common.XMLNamespace;
19 import org.opendaylight.yangtools.yang.common.YangDataName;
20
21 public class NamingTest {
22
23     @Test
24     public void testGetModelRootPackageName() {
25         assertEquals("org.opendaylight.yang.gen.v1.test.rev990939",
26             Naming.getModelRootPackageName("org.opendaylight.yang.gen.v1.test.rev990939"));
27     }
28
29     @Test
30     public void testGetMethodName() {
31         assertEquals("testLocalName", Naming.getMethodName(QName.create("testNS", "testLocalName")));
32         assertEquals("testYangIdentifier", Naming.getMethodName("TestYangIdentifier"));
33     }
34
35     @Test
36     public void testGetClassName() {
37         assertEquals("TestClass", Naming.getClassName(QName.create("testNS", "testClass")));
38         assertEquals("TestClass", Naming.getClassName("testClass"));
39         assertEquals("", Naming.getClassName(""));
40         assertEquals("SomeTestingClassName", Naming.getClassName("  some-testing_class name   "));
41         assertEquals("_0SomeTestingClassName", Naming.getClassName("  0 some-testing_class name   "));
42     }
43
44     @Test
45     public void testGetPropertyName() {
46         assertEquals("test", Naming.getPropertyName("Test"));
47         assertEquals("test", Naming.getPropertyName("test"));
48         assertEquals("xmlClass", Naming.getPropertyName("Class"));
49         assertEquals("_5", Naming.getPropertyName("5"));
50         assertEquals("", Naming.getPropertyName(""));
51         assertEquals("someTestingParameterName", Naming.getPropertyName("  some-testing_parameter   name   "));
52         assertEquals("_0someTestingParameterName", Naming.getPropertyName("  0some-testing_parameter   name   "));
53     }
54
55     @Test
56     public void basicTest() {
57         assertEquals("org.opendaylight.yang.gen.v1.test.uri.rev171026",
58             Naming.getRootPackageName(QName.create("test:URI", "2017-10-26", "test")));
59         assertEquals("org.opendaylight.yang.gen.v1.urn.m.o.d.u.l.e.n.a.m.e.t.e.s.t._case._1digit.rev130910",
60             Naming.getRootPackageName(QNameModule.create(
61                 XMLNamespace.of("urn:m*o+d,u;l=e.n/a-m@e.t$e#s't.case.1digit"), Revision.of("2013-09-10"))));
62         assertEquals("_1testpublic", Naming.normalizePackageName("1testpublic"));
63         assertEquals("Test", Naming.getGetterSuffix(QName.create("test", "test")));
64         assertEquals("XmlClass", Naming.getGetterSuffix(QName.create("test", "class")));
65     }
66
67     @Test
68     public void mapEnumAssignedNamesTest() {
69         // Okay identifier
70         assertEqualMapping("__", "__");
71         assertEqualMapping("True", "true");
72         assertEqualMapping("ĽaľahoPapľuhu", "ľaľaho papľuhu");
73
74         // Contains a '$', but that's okay
75         assertEqualMapping("$", "$");
76         assertEqualMapping("$abc", "$abc");
77         assertEqualMapping("A$bc", "a$bc");
78         assertEqualMapping("Ab$c", "ab$c");
79         assertEqualMapping("Abc$", "abc$");
80
81         // Mostly okay, but numbers need to be prefixed
82         assertEqualMapping(List.of("AZ", "_09"), List.of("a-z", "0-9"));
83
84         // Invalid identifier (conflicts with a Java 9 keyword)
85         assertEqualMapping("$_", "_");
86
87         // Invalid characters, fall back to bijection
88         assertEqualMapping("$$2A$", "*");
89         assertEqualMapping("$$2E$", ".");
90         assertEqualMapping("$$2F$", "/");
91         assertEqualMapping("$$3F$", "?");
92         assertEqualMapping("$a$2A$a", "a*a");
93
94         // Conflict, fallback to bijection
95         assertEqualMapping(List.of("_09", "$0$2D$9"), List.of("_09", "0-9"));
96         assertEqualMapping(List.of("$09", "$0$2D$9"), List.of("09", "0-9"));
97         assertEqualMapping(List.of("aZ", "$a$2D$z"), List.of("aZ", "a-z"));
98         assertEqualMapping(List.of("$a2$2E$5", "a25"), List.of("a2.5", "a25"));
99         assertEqualMapping(List.of("$a2$2E$5", "$a2$2D$5"), List.of("a2.5", "a2-5"));
100         assertEqualMapping(List.of("$ľaľaho$20$papľuhu", "$ľaľaho$20$$20$papľuhu"),
101             List.of("ľaľaho papľuhu", "ľaľaho  papľuhu"));
102     }
103
104     private static void assertEqualMapping(final String mapped, final String yang) {
105         assertEqualMapping(List.of(mapped), List.of(yang));
106     }
107
108     private static void assertEqualMapping(final List<String> mapped, final List<String> yang) {
109         assertEquals(mapped.size(), yang.size());
110         final var expected = new HashMap<String, String>();
111         for (int i = 0; i < mapped.size(); ++i) {
112             expected.put(yang.get(i), mapped.get(i));
113         }
114
115         assertEquals(expected, Naming.mapEnumAssignedNames(yang));
116     }
117
118     @Test
119     public void yangDataMapping() {
120         final var ns = QNameModule.create(XMLNamespace.of("unused"));
121
122         // single ascii compliant non-conflicting word - remain as is
123         assertEquals("single", Naming.mapYangDataName(new YangDataName(ns, "single")));
124         // ascii compliant - non-compliany chars only encoded
125         assertEquals("$abc$20$cde", Naming.mapYangDataName(new YangDataName(ns, "abc cde")));
126         // latin1 compliant -> latin chars normalized, non-compliant chars are encoded
127         assertEquals("$ľaľaho$20$papľuhu", Naming.mapYangDataName(new YangDataName(ns, "ľaľaho papľuhu")));
128         // latin1 non-compliant - all non-compliant characters encoded
129         assertEquals("$привет$20$papľuhu", Naming.mapYangDataName(new YangDataName(ns, "привет papľuhu")));
130     }
131 }