e06edd2c646e030e613ba769a026a727349665a7
[mdsal.git] / binding2 / mdsal-binding2-generator-impl / src / test / java / org / opendaylight / mdsal / binding / javav2 / generator / impl / BindingGeneratorImplTest.java
1 /*
2  * Copyright (c) 2017 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.mdsal.binding.javav2.generator.impl;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertNotNull;
12 import static org.junit.Assert.assertTrue;
13 import static org.junit.Assert.fail;
14
15 import java.io.File;
16 import java.net.URISyntaxException;
17 import java.util.ArrayList;
18 import java.util.List;
19 import org.junit.Test;
20 import org.opendaylight.mdsal.binding.javav2.generator.api.BindingGenerator;
21 import org.opendaylight.mdsal.binding.javav2.model.api.Enumeration;
22 import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedProperty;
23 import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedTransferObject;
24 import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedType;
25 import org.opendaylight.mdsal.binding.javav2.model.api.MethodSignature;
26 import org.opendaylight.mdsal.binding.javav2.model.api.Type;
27 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
28 import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
29
30 public class BindingGeneratorImplTest {
31
32     @Test
33     public void genTypesTypeDefTest() throws Exception {
34         final BindingGeneratorImpl bg = new BindingGeneratorImpl(false);
35         final SchemaContext schemaContext = YangParserTestUtils
36                 .parseYangFiles(new File(getClass().getResource("/generator/test-typedef.yang").toURI()));
37         final List<Type> generateTypes = bg.generateTypes(schemaContext);
38         assertNotNull(generateTypes);
39         for (final Type genType : generateTypes) {
40             if (genType.getName().equals("MyInnerCont") && genType.getPackageName()
41                     .equals("org.opendaylight.mdsal.gen.javav2.urn.test.simple.test.rev170206.data.asteriskmy_cont")) {
42                 final GeneratedType gt = (GeneratedType) genType;
43                 for (final MethodSignature methodSignature : gt.getMethodDefinitions()) {
44                     if (methodSignature.getName().equals("getMyLeaf2")) {
45                         assertEquals(methodSignature.getReturnType().getName(), "MyType");
46                     }
47                 }
48             }
49         }
50     }
51
52     @Test
53     public void generatedTypesEnumTest() throws Exception {
54         final BindingGenerator bg = new BindingGeneratorImpl(false);
55         final SchemaContext context = YangParserTestUtils
56                 .parseYangFiles(new File(getClass().getResource("/generator/apple-test.yang").toURI()));
57         final List<Type> generateTypes = bg.generateTypes(context);
58         assertNotNull(generateTypes);
59         assertTrue(!generateTypes.isEmpty());
60         for (final Type type : generateTypes) {
61             if (type.getName().equals("Apple") && type.getPackageName()
62                     .equals("org.opendaylight.mdsal.gen.javav2.urn.test.simple.apple.rev170503.data")) {
63                 final GeneratedType gt = (GeneratedType) type;
64                 final Enumeration enumeration = gt.getEnumerations().get(0);
65                 assertEquals("Apple1", enumeration.getName());
66                 assertEquals("org.opendaylight.mdsal.gen.javav2.urn.test.simple.apple.rev170503.data.Apple",
67                         enumeration.getPackageName());
68                 assertEquals("apple", enumeration.getValues().get(0).getName());
69                 assertEquals("APPLE", enumeration.getValues().get(0).getMappedName());
70                 assertEquals("apple1", enumeration.getValues().get(1).getName());
71                 assertEquals("APPLE1", enumeration.getValues().get(1).getMappedName());
72             }
73         }
74     }
75
76     @Test
77     public void generatedTypesUsesEnumLeafTest() throws Exception {
78         final BindingGenerator bg = new BindingGeneratorImpl(false);
79         final List<File> sources = new ArrayList<>();
80         sources.add(new File(getClass().getResource("/uses-statement/test-uses-leaf-innertype-base.yang").toURI()));
81         sources.add(new File(getClass().getResource("/uses-statement/test-uses-leaf-innertype.yang").toURI()));
82         final SchemaContext context = YangParserTestUtils.parseYangFiles(sources);
83         final List<Type> generateTypes = bg.generateTypes(context);
84         assertNotNull(generateTypes);
85         assertTrue(!generateTypes.isEmpty());
86         for (final Type type : generateTypes) {
87             if (type.getName().equals("MyCont") && type.getPackageName()
88                     .equals("org.opendaylight.mdsal.gen.javav2.urn.test.uses.leaf.innertype.base.rev170809.data")) {
89                 final GeneratedType gt = (GeneratedType) type;
90                 final MethodSignature methodSignature = gt.getMethodDefinitions().get(0);
91                 assertEquals("ErrorType", methodSignature.getReturnType().getName());
92             }
93
94             if (type.getName().equals("MyCont") && type.getPackageName()
95                     .equals("org.opendaylight.mdsal.gen.javav2.urn.test.uses.leaf.innertype.rev170809.data")) {
96                 final GeneratedType gt = (GeneratedType) type;
97                 final MethodSignature methodSignature = gt.getMethodDefinitions().get(0);
98                 assertEquals("ErrorType", methodSignature.getReturnType().getName());
99             }
100         }
101     }
102
103     @Test
104     public void generatedTypesUsesBitsLeafTest() throws Exception {
105         final BindingGenerator bg = new BindingGeneratorImpl(false);
106         final List<File> sources = new ArrayList<>();
107         sources.add(new File(getClass().getResource("/uses-statement/test-uses-leaf-innertype2-base.yang").toURI()));
108         sources.add(new File(getClass().getResource("/uses-statement/test-uses-leaf-innertype2.yang").toURI()));
109         final SchemaContext context = YangParserTestUtils.parseYangFiles(sources);
110         final List<Type> generateTypes = bg.generateTypes(context);
111         assertNotNull(generateTypes);
112         assertTrue(!generateTypes.isEmpty());
113         for (final Type type : generateTypes) {
114             if (type.getName().equals("MyCont") && type.getPackageName()
115                     .equals("org.opendaylight.mdsal.gen.javav2.urn.test.uses.leaf.innertype2.base.rev170809.data")) {
116                 final GeneratedType gt = (GeneratedType) type;
117                 for (final MethodSignature methodSignature : gt.getMethodDefinitions()) {
118                     if (methodSignature.getName().equals("getLeafBits")) {
119                         assertEquals("LeafBits", methodSignature.getReturnType().getName());
120                     }
121                 }
122
123             }
124
125             if (type.getName().equals("MyCont") && type.getPackageName()
126                     .equals("org.opendaylight.mdsal.gen.javav2.urn.test.uses.leaf.innertype2.rev170809.data")) {
127                 final GeneratedType gt = (GeneratedType) type;
128                 for (final MethodSignature methodSignature : gt.getMethodDefinitions()) {
129                     if (methodSignature.getName().equals("getLeafBits")) {
130                         assertEquals("LeafBits", methodSignature.getReturnType().getName());
131                     }
132                 }
133             }
134         }
135     }
136
137     @Test
138     public void generatedTypesUsesUnionLeafTest() throws Exception {
139         final BindingGenerator bg = new BindingGeneratorImpl(false);
140         final List<File> sources = new ArrayList<>();
141         sources.add(new File(getClass().getResource("/uses-statement/test-uses-leaf-innertype2-base.yang").toURI()));
142         sources.add(new File(getClass().getResource("/uses-statement/test-uses-leaf-innertype2.yang").toURI()));
143         final SchemaContext context = YangParserTestUtils.parseYangFiles(sources);
144         final List<Type> generateTypes = bg.generateTypes(context);
145         assertNotNull(generateTypes);
146         assertTrue(!generateTypes.isEmpty());
147         for (final Type type : generateTypes) {
148             if (type.getName().equals("MyCont") && type.getPackageName()
149                     .equals("org.opendaylight.mdsal.gen.javav2.urn.test.uses.leaf.innertype2.base.rev170809.data")) {
150                 final GeneratedType gt = (GeneratedType) type;
151                 for (final MethodSignature methodSignature : gt.getMethodDefinitions()) {
152                     if (methodSignature.getName().equals("getLeafUnion")) {
153                         assertEquals("LeafUnion", methodSignature.getReturnType().getName());
154                     }
155                 }
156
157             }
158
159             if (type.getName().equals("MyCont") && type.getPackageName()
160                     .equals("org.opendaylight.mdsal.gen.javav2.urn.test.uses.leaf.innertype2.rev170809.data")) {
161                 final GeneratedType gt = (GeneratedType) type;
162                 for (final MethodSignature methodSignature : gt.getMethodDefinitions()) {
163                     if (methodSignature.getName().equals("getLeafUnion")) {
164                         assertEquals("LeafUnion", methodSignature.getReturnType().getName());
165                     }
166                 }
167             }
168         }
169     }
170
171     @Test
172     public void generatedTypesUsesLeafTest() throws Exception {
173         final BindingGenerator bg = new BindingGeneratorImpl(false);
174         final List<File> sources = new ArrayList<>();
175         sources.add(new File(getClass().getResource("/uses-statement/test-uses-leaf-innertype2-base.yang").toURI()));
176         sources.add(new File(getClass().getResource("/uses-statement/test-uses-leaf-innertype2.yang").toURI()));
177         final SchemaContext context = YangParserTestUtils.parseYangFiles(sources);
178         final List<Type> generateTypes = bg.generateTypes(context);
179         assertNotNull(generateTypes);
180         assertTrue(!generateTypes.isEmpty());
181         for (final Type type : generateTypes) {
182             if (type.getName().equals("MyCont") && type.getPackageName()
183                     .equals("org.opendaylight.mdsal.gen.javav2.urn.test.uses.leaf.innertype2.base.rev170809.data")) {
184                 final GeneratedType gt = (GeneratedType) type;
185                 for (final MethodSignature methodSignature : gt.getMethodDefinitions()) {
186                     if (methodSignature.getName().equals("getLeafDecimal64")) {
187                         assertEquals("BigDecimal", methodSignature.getReturnType().getName());
188                     }
189                 }
190
191             }
192
193             if (type.getName().equals("MyCont") && type.getPackageName()
194                     .equals("org.opendaylight.mdsal.gen.javav2.urn.test.uses.leaf.innertype2.rev170809.data")) {
195                 final GeneratedType gt = (GeneratedType) type;
196                 for (final MethodSignature methodSignature : gt.getMethodDefinitions()) {
197                     if (methodSignature.getName().equals("getLeafDecimal64")) {
198                         assertEquals("BigDecimal", methodSignature.getReturnType().getName());
199                     }
200                 }
201             }
202         }
203     }
204
205     @Test
206     public void generatedTypesUsesLeafInnertype3Test() throws Exception {
207         final BindingGenerator bg = new BindingGeneratorImpl(false);
208         final List<File> sources = new ArrayList<>();
209         sources.add(new File(getClass().getResource("/uses-statement/test-uses-leaf-innertype3-base.yang").toURI()));
210         sources.add(new File(getClass().getResource("/uses-statement/test-uses-leaf-innertype3.yang").toURI()));
211         final SchemaContext context = YangParserTestUtils.parseYangFiles(sources);
212         final List<Type> generateTypes = bg.generateTypes(context);
213         assertNotNull(generateTypes);
214         assertTrue(!generateTypes.isEmpty());
215         for (final Type type : generateTypes) {
216             if (type.getName().equals("MyCont") && type.getPackageName()
217                     .equals("org.opendaylight.mdsal.gen.javav2.urn.test.uses.leaf.innertype3.rev170809.data")) {
218                 final GeneratedType gt = (GeneratedType) type;
219                 for (final MethodSignature methodSignature : gt.getMethodDefinitions()) {
220                     if (methodSignature.getName().equals("getBandwidth")) {
221                         assertEquals("Bandwidth", methodSignature.getReturnType().getName());
222                     }
223                 }
224
225             }
226
227             if (type.getName().equals("Open") && type.getPackageName()
228                     .equals("org.opendaylight.mdsal.gen.javav2.urn.test.uses.leaf.innertype3.rev170809.data")) {
229                 final GeneratedType gt = (GeneratedType) type;
230                 for (final MethodSignature methodSignature : gt.getMethodDefinitions()) {
231                     if (methodSignature.getName().equals("getVersion")) {
232                         assertEquals("ProtocolVersion", methodSignature.getReturnType().getName());
233                     }
234
235                     if (methodSignature.getName().equals("getLeafUnion")) {
236                         assertEquals("LeafUnion", methodSignature.getReturnType().getName());
237                     }
238                 }
239
240             }
241         }
242     }
243
244     @Test
245     public void generatedTypesTest() throws Exception {
246         final BindingGenerator bg = new BindingGeneratorImpl(false);
247         final SchemaContext context = YangParserTestUtils
248                 .parseYangFiles(new File(getClass().getResource("/generator/test-list.yang").toURI()));
249         final List<Type> generateTypes = bg.generateTypes(context);
250
251         assertNotNull(generateTypes);
252         assertTrue(!generateTypes.isEmpty());
253         assertEquals(3, generateTypes.size());
254         final int[] test_i = { 0 };
255         for (final Type t : generateTypes) {
256             if (t instanceof GeneratedTransferObject) {
257                 final GeneratedTransferObject genTransferObj = (GeneratedTransferObject) t;
258                 assertBaseGeneratedType(genTransferObj, "MyListKey",
259                         "org.opendaylight.mdsal.gen.javav2.urn.test.simple.test.list.rev170314.key.my_list");
260                 assertEquals(3, genTransferObj.getProperties().size());
261                 int test_j = 0;
262                 for (final GeneratedProperty generatedProperty : genTransferObj.getProperties()) {
263                     switch (generatedProperty.getName()) {
264                         case "keyReservedWord":
265                             assertEquals("String", generatedProperty.getReturnType().getName());
266                             test_j++;
267                             break;
268                         case "key1":
269                             assertEquals("String", generatedProperty.getReturnType().getName());
270                             test_j++;
271                             break;
272                         case "key2":
273                             assertEquals("String", generatedProperty.getReturnType().getName());
274                             test_j++;
275                             break;
276                         default:
277                             fail();
278                     }
279                 }
280                 assertEquals(3, test_j);
281                 test_i[0] += 1;
282             } else {
283                 testActualType((GeneratedType) t, test_i);
284             }
285         }
286         assertEquals(3, test_i[0]);
287     }
288
289     @Test
290     public void generateTypesDescriptionsTest() throws Exception {
291         final BindingGenerator bg = new BindingGeneratorImpl(true);
292         final SchemaContext context = YangParserTestUtils.parseYangFiles(getFiles("/base/with_import/"));
293         assertNotNull(context);
294
295         final List<Type> generateTypes = bg.generateTypes(context, context.getModules());
296         assertNotNull(generateTypes);
297         assertTrue(!generateTypes.isEmpty());
298
299         for (final Type type : generateTypes) {
300             if (type.getName().equals("TestData")) {
301                 final String description = ((GeneratedType) type).getDescription().get();
302                 description
303                         .contains("    import test-import { prefix \"imported-test\"; revision-date 2017-04-21; }\n\n");
304                 description.contains("    revision 2017-02-06;\n\n");
305                 description.contains("    typedef my-type {\n        type int8;\n    }");
306                 description.contains("    container *my-cont {\n    }\n");
307             }
308         }
309     }
310
311     @Test
312     public void generateTypesIdentityTest() throws Exception {
313         final BindingGenerator bg = new BindingGeneratorImpl(true);
314         final SchemaContext context = YangParserTestUtils.parseYangFiles(getFiles("/identity/"));
315         assertNotNull(context);
316
317         final List<Type> generateTypes = bg.generateTypes(context, context.getModules());
318         assertNotNull(generateTypes);
319         assertTrue(!generateTypes.isEmpty());
320         for (final Type type : generateTypes) {
321             if (type.getFullyQualifiedName()
322                     .equals("org.opendaylight.mdsal.gen.javav2.identity3.module.rev170708.ident.Iden1")) {
323                 final GeneratedTransferObject genTO = (GeneratedTransferObject)type;
324                 assertEquals("org.opendaylight.mdsal.gen.javav2.identity3.module.rev170708.ident.Iden2",
325                         genTO.getSuperType().getFullyQualifiedName());
326
327             }
328             if (type.getFullyQualifiedName()
329                     .equals("org.opendaylight.mdsal.gen.javav2.identity3.module.rev170708.ident.Iden2")) {
330                 final GeneratedTransferObject genTO = (GeneratedTransferObject)type;
331                 assertEquals("org.opendaylight.mdsal.gen.javav2.identity.import_.rev170602.ident.Iden1",
332                         genTO.getSuperType().getFullyQualifiedName());
333
334             }
335             if (type.getFullyQualifiedName()
336                     .equals("org.opendaylight.mdsal.gen.javav2.identity3.module.rev170708.ident.Iden3")) {
337                 final GeneratedTransferObject genTO = (GeneratedTransferObject)type;
338                 assertEquals("org.opendaylight.mdsal.gen.javav2.identity3.module.rev170708.ident.Iden1",
339                         genTO.getSuperType().getFullyQualifiedName());
340
341             }
342         }
343     }
344
345     private File[] getFiles(final String path) throws URISyntaxException {
346         return new File(getClass().getResource(path).toURI()).listFiles();
347     }
348
349     private void testActualType(final GeneratedType t, final int[] test_i) {
350         MethodSignature methodSignature = null;
351         switch (t.getName()) {
352             case "TestListData":
353                 assertEquals("org.opendaylight.mdsal.gen.javav2.urn.test.simple.test.list.rev170314",
354                         t.getPackageName());
355                 methodSignature = t.getMethodDefinitions().get(0);
356                 assertMethod(t, "getMyList", "List", "java.util", methodSignature);
357                 test_i[0] += 1;
358                 break;
359             case "MyListKey":
360                 assertEquals("org.opendaylight.mdsal.gen.javav2.urn.test.simple.test.list.rev170314.key.my_list",
361                         t.getPackageName());
362                 methodSignature = t.getMethodDefinitions().get(0);
363                 assertMethod(t, "getKey", "String", "java.lang", methodSignature);
364                 test_i[0] += 1;
365                 break;
366             case "MyListKey1":
367                 assertEquals("org.opendaylight.mdsal.gen.javav2.urn.test.simple.test.list.rev170314.key.my_list",
368                         t.getPackageName());
369                 methodSignature = t.getMethodDefinitions().get(0);
370                 assertMethod(t, "getKey1", "String", "java.lang", methodSignature);
371                 test_i[0] += 1;
372                 break;
373             case "MyListKey2":
374                 assertEquals("org.opendaylight.mdsal.gen.javav2.urn.test.simple.test.list.rev170314.key.my_list",
375                         t.getPackageName());
376                 methodSignature = t.getMethodDefinitions().get(0);
377                 assertMethod(t, "getKey2", "String", "java.lang", methodSignature);
378                 test_i[0] += 1;
379                 break;
380             case "MyListFoo":
381                 assertEquals("org.opendaylight.mdsal.gen.javav2.urn.test.simple.test.list.rev170314.data.my_list",
382                         t.getPackageName());
383                 methodSignature = t.getMethodDefinitions().get(0);
384                 assertMethod(t, "getFoo", "String", "java.lang", methodSignature);
385                 test_i[0] += 1;
386                 break;
387             case "MyList":
388                 assertEquals("org.opendaylight.mdsal.gen.javav2.urn.test.simple.test.list.rev170314.data",
389                         t.getPackageName());
390                 assertEquals(5, t.getMethodDefinitions().size());
391                 int test_j = 0;
392                 for (final MethodSignature m : t.getMethodDefinitions()) {
393                     switch (m.getName()) {
394                         case "getKey":
395                                 assertMethod(t, "getKey", "MyListKey",
396                                         "org.opendaylight.mdsal.gen.javav2.urn.test.simple.test.list.rev170314.key.my_list",
397                                         m);
398                             test_j++;
399                             break;
400                         case "getKey1":
401                             assertMethod(t, "getKey1", "String","java.lang", m);
402                             test_j++;
403                             break;
404                         case "getKey2":
405                             assertMethod(t, "getKey2", "String","java.lang", m);
406                             test_j++;
407                             break;
408                         case "getFoo":
409                             assertMethod(t, "getFoo", "String","java.lang", m);
410                             test_j++;
411                             break;
412                         case "getKeyReservedWord":
413                             assertMethod(t, "getKeyReservedWord", "String","java.lang", m);
414                             test_j++;
415                             break;
416                         default:
417                             fail();
418                     }
419                 }
420                 assertEquals(5, test_j);
421                 test_i[0] += 1;
422                 break;
423             default:
424                 fail();
425         }
426     }
427
428     private void assertBaseGeneratedType(final GeneratedType genType, final String name, final String packageName) {
429         assertEquals(name, genType.getName());
430
431     }
432
433     private void assertMethod(final GeneratedType definingTypeExpected, final String nameExpected,
434             final String typeNameExpected, final String typePackageNameExpected,
435             final MethodSignature methodSignature) {
436         assertEquals(definingTypeExpected, methodSignature.getDefiningType());
437         assertEquals(nameExpected, methodSignature.getName());
438         assertEquals(typeNameExpected, methodSignature.getReturnType().getName());
439         assertEquals(typePackageNameExpected, methodSignature.getReturnType().getPackageName());
440     }
441
442 }