Implemented typedef units statement in generated code.
[yangtools.git] / code-generator / binding-java-api-generator / src / test / java / org / opendaylight / yangtools / sal / java / api / generator / test / CompilationTest.java
1 /*
2  * Copyright (c) 2013 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.sal.java.api.generator.test;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertTrue;
12 import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.*;
13
14 import java.io.File;
15 import java.lang.annotation.Annotation;
16 import java.lang.reflect.Field;
17 import java.lang.reflect.Method;
18 import java.lang.reflect.ParameterizedType;
19 import java.lang.reflect.WildcardType;
20 import java.math.BigDecimal;
21 import java.math.BigInteger;
22 import java.net.URL;
23 import java.net.URLClassLoader;
24 import java.util.HashSet;
25 import java.util.List;
26 import java.util.Set;
27
28 import org.junit.Test;
29 import org.opendaylight.yangtools.sal.binding.model.api.Type;
30 import org.opendaylight.yangtools.sal.java.api.generator.GeneratorJavaFile;
31 import org.opendaylight.yangtools.yang.binding.annotations.RoutingContext;
32 import org.opendaylight.yangtools.yang.model.api.Module;
33 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
34
35 /**
36  * Test correct code generation.
37  *
38  */
39 public class CompilationTest extends BaseCompilationTest {
40
41     @Test
42     public void testListGeneration() throws Exception {
43         final File sourcesOutputDir = new File(GENERATOR_OUTPUT_PATH + FS + "list-gen");
44         assertTrue("Failed to create test file '" + sourcesOutputDir + "'", sourcesOutputDir.mkdir());
45         final File compiledOutputDir = new File(COMPILER_OUTPUT_PATH + FS + "list-gen");
46         assertTrue("Failed to create test file '" + compiledOutputDir + "'", compiledOutputDir.mkdir());
47
48         final List<File> sourceFiles = getSourceFiles("/compilation/list-gen");
49         final Set<Module> modulesToBuild = parser.parseYangModels(sourceFiles);
50         final SchemaContext context = parser.resolveSchemaContext(modulesToBuild);
51         final List<Type> types = bindingGenerator.generateTypes(context);
52         final GeneratorJavaFile generator = new GeneratorJavaFile(new HashSet<>(types));
53         generator.generateToFile(sourcesOutputDir);
54
55         // Test if all sources are generated
56         File parent = new File(sourcesOutputDir, NS_TEST);
57         File keyArgs = new File(parent, "KeyArgs.java");
58         File links = new File(parent, "Links.java");
59         File linksBuilder = new File(parent, "LinksBuilder.java");
60         File linksKey = new File(parent, "LinksKey.java");
61         File testData = new File(parent, "TestData.java");
62         assertTrue(keyArgs.exists());
63         assertTrue(links.exists());
64         assertTrue(linksBuilder.exists());
65         assertTrue(linksKey.exists());
66         assertTrue(testData.exists());
67         assertFilesCount(parent, 6);
68
69         parent = new File(sourcesOutputDir, NS_TEST + FS + "links");
70         File level = new File(parent, "Level.java");
71         File linkGroup = new File(parent, "LinkGroup.java");
72         File node = new File(parent, "Node.java");
73         File nodeBuilder = new File(parent, "NodeBuilder.java");
74         File nodeList = new File(parent, "NodeList.java");
75         File nodeListBuilder = new File(parent, "NodeListBuilder.java");
76         File nodesType = new File(parent, "NodesType.java");
77         assertTrue(level.exists());
78         assertTrue(linkGroup.exists());
79         assertTrue(node.exists());
80         assertTrue(nodeBuilder.exists());
81         assertTrue(nodeList.exists());
82         assertTrue(nodeListBuilder.exists());
83         assertTrue(nodesType.exists());
84         assertFilesCount(parent, 7);
85
86         // Test if sources are compilable
87         testCompilation(sourcesOutputDir, compiledOutputDir);
88
89         ClassLoader loader = new URLClassLoader(new URL[] { compiledOutputDir.toURI().toURL() });
90         Class<?> keyArgsClass = Class.forName(BASE_PKG + ".urn.opendaylight.test.rev131008.KeyArgs", true, loader);
91         Class<?> linksClass = Class.forName(BASE_PKG + ".urn.opendaylight.test.rev131008.Links", true, loader);
92         Class<?> linksKeyClass = Class.forName(BASE_PKG + ".urn.opendaylight.test.rev131008.LinksKey", true, loader);
93
94         // Test generated 'grouping key-args'
95         assertTrue(keyArgsClass.isInterface());
96         assertEquals(2, keyArgsClass.getDeclaredMethods().length);
97         assertContainsMethod(keyArgsClass, String.class, "getName");
98         assertContainsMethod(keyArgsClass, Integer.class, "getSize");
99
100         // Test generated 'list links'
101         assertTrue(linksClass.isInterface());
102         // TODO: anyxml
103         assertEquals(6, linksClass.getDeclaredMethods().length);
104         assertImplementsIfc(linksClass, keyArgsClass);
105
106         // Test list key constructor arguments ordering
107         assertContainsConstructor(linksKeyClass, Byte.class, String.class, Integer.class);
108         // Test serialVersionUID generation
109         Field suid = assertContainsField(linksKeyClass, "serialVersionUID", Long.TYPE);
110         suid.setAccessible(true);
111         assertEquals(-8829501012356283881L, suid.getLong(null));
112
113         cleanUp(sourcesOutputDir, compiledOutputDir);
114     }
115
116     @Test
117     public void testAugmentUnderUsesGeneration() throws Exception {
118         final File sourcesOutputDir = new File(GENERATOR_OUTPUT_PATH + FS + "augment-under-uses");
119         assertTrue("Failed to create test file '" + sourcesOutputDir + "'", sourcesOutputDir.mkdir());
120         final File compiledOutputDir = new File(COMPILER_OUTPUT_PATH + FS + "augment-under-uses");
121         assertTrue("Failed to create test file '" + compiledOutputDir + "'", compiledOutputDir.mkdir());
122
123         final List<File> sourceFiles = getSourceFiles("/compilation/augment-under-uses");
124         final Set<Module> modulesToBuild = parser.parseYangModels(sourceFiles);
125         final SchemaContext context = parser.resolveSchemaContext(modulesToBuild);
126         final List<Type> types = bindingGenerator.generateTypes(context);
127         final GeneratorJavaFile generator = new GeneratorJavaFile(new HashSet<>(types));
128         generator.generateToFile(sourcesOutputDir);
129
130         // Test if all sources were generated from 'module foo'
131         File parent = new File(sourcesOutputDir, NS_FOO);
132         assertTrue(new File(parent, "Object.java").exists());
133         assertTrue(new File(parent, "OpenObject.java").exists());
134         assertTrue(new File(parent, "ExplicitRouteObject.java").exists());
135         assertTrue(new File(parent, "PathKeySubobject.java").exists());
136         assertFilesCount(parent, 7);
137
138         parent = new File(parent, "object");
139         assertTrue(new File(parent, "Nodes.java").exists());
140         assertTrue(new File(parent, "NodesBuilder.java").exists());
141         assertFilesCount(parent, 2);
142
143         parent = new File(sourcesOutputDir, NS_FOO + FS + "open");
144         assertFilesCount(parent, 1);
145
146         parent = new File(parent, "object");
147         assertTrue(new File(parent, "Nodes1.java").exists());
148         assertTrue(new File(parent, "Nodes1Builder.java").exists());
149         assertFilesCount(parent, 3);
150
151         parent = new File(parent, "nodes");
152         assertTrue(new File(parent, "Links.java").exists());
153         assertTrue(new File(parent, "LinksBuilder.java").exists());
154         assertFilesCount(parent, 2);
155
156         parent = new File(sourcesOutputDir, NS_FOO + FS + "explicit");
157         assertFilesCount(parent, 1);
158         parent = new File(parent, "route");
159         assertFilesCount(parent, 1);
160         parent = new File(parent, "object");
161         assertTrue(new File(parent, "Subobjects.java").exists());
162         assertTrue(new File(parent, "SubobjectsBuilder.java").exists());
163         assertFilesCount(parent, 3);
164
165         parent = new File(parent, "subobjects");
166         assertFilesCount(parent, 1);
167         parent = new File(parent, "subobject");
168         assertFilesCount(parent, 1);
169         parent = new File(parent, "type");
170         assertTrue(new File(parent, "PathKey.java").exists());
171         assertTrue(new File(parent, "PathKeyBuilder.java").exists());
172         assertFilesCount(parent, 3);
173
174         parent = new File(parent, "path");
175         assertFilesCount(parent, 1);
176         parent = new File(parent, "key");
177         assertTrue(new File(parent, "PathKey.java").exists());
178         assertTrue(new File(parent, "PathKeyBuilder.java").exists());
179         assertFilesCount(parent, 2);
180
181         // Test if all sources were generated from 'module bar'
182         parent = new File(sourcesOutputDir, NS_BAR);
183         assertTrue(new File(parent, "BasicExplicitRouteSubobjects.java").exists());
184         assertTrue(new File(parent, "ExplicitRouteSubobjects.java").exists());
185         assertFilesCount(parent, 3);
186
187         parent = new File(parent, "basic");
188         assertFilesCount(parent, 1);
189         parent = new File(parent, "explicit");
190         assertFilesCount(parent, 1);
191         parent = new File(parent, "route");
192         assertFilesCount(parent, 1);
193
194         parent = new File(parent, "subobjects");
195         assertFilesCount(parent, 2);
196         assertTrue(new File(parent, "SubobjectType.java").exists());
197
198         parent = new File(parent, "subobject");
199         assertFilesCount(parent, 1);
200
201         parent = new File(parent, "type");
202         assertTrue(new File(parent, "IpPrefix.java").exists());
203         assertTrue(new File(parent, "IpPrefixBuilder.java").exists());
204         assertTrue(new File(parent, "Label.java").exists());
205         assertTrue(new File(parent, "LabelBuilder.java").exists());
206         assertFilesCount(parent, 4);
207
208         // Test if sources are compilable
209         testCompilation(sourcesOutputDir, compiledOutputDir);
210
211         cleanUp(sourcesOutputDir, compiledOutputDir);
212     }
213
214     @Test
215     public void testAugmentOfAugmentGeneration() throws Exception {
216         final File sourcesOutputDir = new File(GENERATOR_OUTPUT_PATH + FS + "aug-of-aug");
217         assertTrue("Failed to create test file '" + sourcesOutputDir + "'", sourcesOutputDir.mkdir());
218         final File compiledOutputDir = new File(COMPILER_OUTPUT_PATH + FS + "aug-of-aug");
219         assertTrue("Failed to create test file '" + compiledOutputDir + "'", compiledOutputDir.mkdir());
220
221         final List<File> sourceFiles = getSourceFiles("/compilation/augment-of-augment");
222         final Set<Module> modulesToBuild = parser.parseYangModels(sourceFiles);
223         final SchemaContext context = parser.resolveSchemaContext(modulesToBuild);
224         final List<Type> types = bindingGenerator.generateTypes(context);
225         final GeneratorJavaFile generator = new GeneratorJavaFile(new HashSet<>(types));
226         generator.generateToFile(sourcesOutputDir);
227
228         // Test if all sources were generated from 'module foo'
229         File parent = new File(sourcesOutputDir, NS_FOO);
230         File fooListener = new File(parent, "FooListener.java");
231         File pathAttributes = new File(parent, "PathAttributes.java");
232         File update = new File(parent, "Update.java");
233         File updateBuilder = new File(parent, "UpdateBuilder.java");
234         assertTrue(fooListener.exists());
235         assertTrue(pathAttributes.exists());
236         assertTrue(update.exists());
237         assertTrue(updateBuilder.exists());
238         assertFilesCount(parent, 6);
239
240         parent = new File(sourcesOutputDir, NS_FOO + FS + "path");
241         assertFilesCount(parent, 1);
242         parent = new File(parent, "attributes");
243         assertFilesCount(parent, 2);
244         File origin = new File(parent, "Origin.java");
245         File originBuilder = new File(parent, "OriginBuilder.java");
246         assertTrue(origin.exists());
247         assertTrue(originBuilder.exists());
248
249         parent = new File(sourcesOutputDir, NS_FOO + FS + "update");
250         assertFilesCount(parent, 2);
251         pathAttributes = new File(parent, "PathAttributes.java");
252         File pathAttributesBuilder = new File(parent, "PathAttributesBuilder.java");
253         assertTrue(pathAttributes.exists());
254         assertTrue(pathAttributesBuilder.exists());
255
256         // Test if all sources were generated from 'module bar'
257         parent = new File(sourcesOutputDir, NS_BAR);
258         File destination = new File(parent, "Destination.java");
259         File pathAttributes1 = new File(parent, "PathAttributes1.java");
260         File pathAttributes1Builder = new File(parent, "PathAttributes1Builder.java");
261         assertTrue(destination.exists());
262         assertTrue(pathAttributes1.exists());
263         assertTrue(pathAttributes1Builder.exists());
264         assertFilesCount(parent, 5);
265
266         parent = new File(sourcesOutputDir, NS_BAR + FS + "destination");
267         assertFilesCount(parent, 2);
268         File destinationType = new File(parent, "DestinationType.java");
269         assertTrue(destinationType.exists());
270
271         parent = new File(parent, "destination");
272         assertFilesCount(parent, 1);
273         parent = new File(parent, "type");
274         assertFilesCount(parent, 2);
275         File destinationIpv4 = new File(parent, "DestinationIp.java");
276         File destinationIpv4Builder = new File(parent, "DestinationIpBuilder.java");
277         assertTrue(destinationIpv4.exists());
278         assertTrue(destinationIpv4Builder.exists());
279
280         parent = new File(sourcesOutputDir, NS_BAR + FS + "update");
281         assertFilesCount(parent, 1);
282         parent = new File(parent, "path");
283         assertFilesCount(parent, 1);
284         parent = new File(parent, "attributes");
285         File mpUnreachNlri = new File(parent, "MpUnreachNlri.java");
286         File mpUnreachNlriBuilder = new File(parent, "MpUnreachNlriBuilder.java");
287         assertTrue(mpUnreachNlri.exists());
288         assertTrue(mpUnreachNlriBuilder.exists());
289         assertFilesCount(parent, 3);
290
291         parent = new File(parent, "mp");
292         assertFilesCount(parent, 1);
293         parent = new File(parent, "unreach");
294         assertFilesCount(parent, 1);
295         parent = new File(parent, "nlri");
296         File withdrawnRoutes = new File(parent, "WithdrawnRoutes.java");
297         File withdrawnRoutesBuilder = new File(parent, "WithdrawnRoutesBuilder.java");
298         assertTrue(withdrawnRoutes.exists());
299         assertTrue(withdrawnRoutesBuilder.exists());
300         assertFilesCount(parent, 2);
301
302         // Test if all sources were generated from 'module baz'
303         parent = new File(sourcesOutputDir, NS_BAZ);
304         assertFilesCount(parent, 2);
305         File linkstateDestination = new File(parent, "LinkstateDestination.java");
306         assertTrue(linkstateDestination.exists());
307
308         parent = new File(sourcesOutputDir, NS_BAZ + FS + "update");
309         assertFilesCount(parent, 1);
310         parent = new File(parent, "path");
311         assertFilesCount(parent, 1);
312         parent = new File(parent, "attributes");
313         assertFilesCount(parent, 1);
314         parent = new File(parent, "mp");
315         assertFilesCount(parent, 1);
316         parent = new File(parent, "unreach");
317         assertFilesCount(parent, 1);
318         parent = new File(parent, "nlri");
319         assertFilesCount(parent, 1);
320         parent = new File(parent, "withdrawn");
321         assertFilesCount(parent, 1);
322         parent = new File(parent, "routes");
323         assertFilesCount(parent, 1);
324         parent = new File(parent, "destination");
325         assertFilesCount(parent, 1);
326         parent = new File(parent, "type");
327         File destinationLinkstate = new File(parent, "DestinationLinkstate.java");
328         File destinationLinkstateBuilder = new File(parent, "DestinationLinkstateBuilder.java");
329         assertTrue(destinationLinkstate.exists());
330         assertTrue(destinationLinkstateBuilder.exists());
331         assertFilesCount(parent, 3);
332         parent = new File(parent, "destination");
333         assertFilesCount(parent, 1);
334         parent = new File(parent, "linkstate");
335         File links = new File(parent, "Links.java");
336         File linksBuilder = new File(parent, "LinksBuilder.java");
337         assertTrue(links.exists());
338         assertTrue(linksBuilder.exists());
339         assertFilesCount(parent, 3);
340         parent = new File(parent, "links");
341         File source = new File(parent, "Source.java");
342         File sourceBuilder = new File(parent, "SourceBuilder.java");
343         assertTrue(source.exists());
344         assertTrue(sourceBuilder.exists());
345         assertFilesCount(parent, 3);
346         parent = new File(parent, "source");
347         File address = new File(parent, "Address.java");
348         File addressBuilder = new File(parent, "AddressBuilder.java");
349         assertTrue(address.exists());
350         assertTrue(addressBuilder.exists());
351         assertFilesCount(parent, 2);
352
353         // Test if sources are compilable
354         testCompilation(sourcesOutputDir, compiledOutputDir);
355
356         cleanUp(sourcesOutputDir, compiledOutputDir);
357     }
358
359     @Test
360     public void testLeafReturnTypes() throws Exception {
361         final File sourcesOutputDir = new File(GENERATOR_OUTPUT_PATH + FS + "leaf-return-types");
362         assertTrue("Failed to create test file '" + sourcesOutputDir + "'", sourcesOutputDir.mkdir());
363         final File compiledOutputDir = new File(COMPILER_OUTPUT_PATH + FS + "leaf-return-types");
364         assertTrue("Failed to create test file '" + compiledOutputDir + "'", compiledOutputDir.mkdir());
365
366         final List<File> sourceFiles = getSourceFiles("/compilation/leaf-return-types");
367         final Set<Module> modulesToBuild = parser.parseYangModels(sourceFiles);
368         final SchemaContext context = parser.resolveSchemaContext(modulesToBuild);
369         final List<Type> types = bindingGenerator.generateTypes(context);
370         final GeneratorJavaFile generator = new GeneratorJavaFile(new HashSet<>(types));
371         generator.generateToFile(sourcesOutputDir);
372
373         File parent = new File(sourcesOutputDir, NS_TEST);
374         assertFilesCount(parent, 4);
375         assertTrue(new File(parent, "TestData.java").exists());
376         assertTrue(new File(parent, "Nodes.java").exists());
377         assertTrue(new File(parent, "NodesBuilder.java").exists());
378         assertTrue(new File(parent, "Alg.java").exists());
379
380         // Test if sources are compilable
381         testCompilation(sourcesOutputDir, compiledOutputDir);
382
383         String pkg = BASE_PKG + ".urn.opendaylight.test.rev131008";
384         ClassLoader loader = new URLClassLoader(new URL[] { compiledOutputDir.toURI().toURL() });
385         Class<?> nodesClass = Class.forName(pkg + ".Nodes", true, loader);
386
387         // Test methods return type
388         byte[] b = new byte[] {};
389         assertContainsMethod(nodesClass, b.getClass(), "getIdBinary");
390         assertContainsMethod(nodesClass, pkg + ".Nodes$IdBits", "getIdBits", loader);
391         assertContainsMethod(nodesClass, Boolean.class, "isIdBoolean");
392         assertContainsMethod(nodesClass, BigDecimal.class, "getIdDecimal64");
393         assertContainsMethod(nodesClass, Boolean.class, "isIdEmpty");
394         assertContainsMethod(nodesClass, pkg + ".Nodes$IdEnumeration", "getIdEnumeration", loader);
395         testReturnTypeIdentityref(nodesClass, "getIdIdentityref", pkg + ".Alg");
396         testReturnTypeInstanceIdentitifer(loader, nodesClass, "getIdInstanceIdentifier");
397         assertContainsMethod(nodesClass, Byte.class, "getId8");
398         assertContainsMethod(nodesClass, Short.class, "getId16");
399         assertContainsMethod(nodesClass, Integer.class, "getId32");
400         assertContainsMethod(nodesClass, Long.class, "getId64");
401         assertContainsMethod(nodesClass, Long.class, "getIdLeafref");
402         assertContainsMethod(nodesClass, String.class, "getIdString");
403         assertContainsMethod(nodesClass, Short.class, "getIdU8");
404         assertContainsMethod(nodesClass, Integer.class, "getIdU16");
405         assertContainsMethod(nodesClass, Long.class, "getIdU32");
406         assertContainsMethod(nodesClass, BigInteger.class, "getIdU64");
407         assertContainsMethod(nodesClass, pkg + ".Nodes$IdUnion", "getIdUnion", loader);
408
409         cleanUp(sourcesOutputDir, compiledOutputDir);
410     }
411
412     @Test
413     public void testGenerationContextReferenceExtension() throws Exception {
414         final File sourcesOutputDir = new File(GENERATOR_OUTPUT_PATH + FS + "context-reference");
415         assertTrue("Failed to create test file '" + sourcesOutputDir + "'", sourcesOutputDir.mkdir());
416         final File compiledOutputDir = new File(COMPILER_OUTPUT_PATH + FS + "context-reference");
417         assertTrue("Failed to create test file '" + compiledOutputDir + "'", compiledOutputDir.mkdir());
418
419         final List<File> sourceFiles = getSourceFiles("/compilation/context-reference");
420         final Set<Module> modulesToBuild = parser.parseYangModels(sourceFiles);
421         final SchemaContext context = parser.resolveSchemaContext(modulesToBuild);
422         final List<Type> types = bindingGenerator.generateTypes(context);
423         final GeneratorJavaFile generator = new GeneratorJavaFile(new HashSet<>(types));
424         generator.generateToFile(sourcesOutputDir);
425
426         // Test if all sources are generated
427         File fooParent = new File(sourcesOutputDir, NS_FOO);
428         assertFilesCount(fooParent, 3);
429         assertTrue(new File(fooParent, "FooData.java").exists());
430         assertTrue(new File(fooParent, "Nodes.java").exists());
431         assertTrue(new File(fooParent, "NodesBuilder.java").exists());
432
433         File barParent = new File(sourcesOutputDir, NS_BAR);
434         assertFilesCount(barParent, 1);
435         assertTrue(new File(barParent, "IdentityClass.java").exists());
436
437         // Test if sources are compilable
438         testCompilation(sourcesOutputDir, compiledOutputDir);
439
440         ClassLoader loader = new URLClassLoader(new URL[] { compiledOutputDir.toURI().toURL() });
441         Class<?> nodesClass = Class.forName(BASE_PKG + ".urn.opendaylight.foo.rev131008.Nodes", true, loader);
442         Class<?> identityClass = Class
443                 .forName(BASE_PKG + ".urn.opendaylight.bar.rev131008.IdentityClass", true, loader);
444
445         // test identity
446         try {
447             identityClass.getConstructor();
448             Class<?> baseIdentity = Class.forName("org.opendaylight.yangtools.yang.binding.BaseIdentity", true, loader);
449             assertEquals(baseIdentity, identityClass.getSuperclass());
450         } catch (NoSuchMethodException e) {
451             throw new AssertionError("IdentityClass must have no-arg constructor");
452         }
453
454         // Test annotation
455         try {
456             Method getId = nodesClass.getMethod("getId");
457             Annotation[] annotations = getId.getAnnotations();
458             assertEquals(1, annotations.length);
459             Annotation routingContext = annotations[0];
460             assertEquals(RoutingContext.class, routingContext.annotationType());
461         } catch (NoSuchMethodException e) {
462             throw new AssertionError("Method getId() not found");
463         }
464
465         cleanUp(sourcesOutputDir, compiledOutputDir);
466     }
467
468     @Test
469     public void compilationTest() throws Exception {
470         final File sourcesOutputDir = new File(GENERATOR_OUTPUT_PATH + FS + "yang");
471         assertTrue("Failed to create test file '" + sourcesOutputDir + "'", sourcesOutputDir.mkdir());
472         final File compiledOutputDir = new File(COMPILER_OUTPUT_PATH + FS + "yang");
473         assertTrue("Failed to create test file '" + compiledOutputDir + "'", compiledOutputDir.mkdir());
474
475         final List<File> sourceFiles = getSourceFiles("/yang");
476         final Set<Module> modulesToBuild = parser.parseYangModels(sourceFiles);
477         final SchemaContext context = parser.resolveSchemaContext(modulesToBuild);
478         final List<Type> types = bindingGenerator.generateTypes(context);
479         final GeneratorJavaFile generator = new GeneratorJavaFile(new HashSet<>(types));
480         generator.generateToFile(sourcesOutputDir);
481
482         // Test if sources are compilable
483         testCompilation(sourcesOutputDir, compiledOutputDir);
484
485         cleanUp(sourcesOutputDir, compiledOutputDir);
486     }
487
488
489     private void testReturnTypeIdentityref(Class<?> clazz, String methodName, String returnTypeStr) throws Exception {
490         Method method;
491         java.lang.reflect.Type returnType;
492         try {
493             method = clazz.getMethod(methodName);
494             assertEquals(java.lang.Class.class, method.getReturnType());
495             returnType = method.getGenericReturnType();
496             assertTrue(returnType instanceof ParameterizedType);
497             ParameterizedType pt = (ParameterizedType) returnType;
498             java.lang.reflect.Type[] parameters = pt.getActualTypeArguments();
499             assertEquals(1, parameters.length);
500             java.lang.reflect.Type parameter = parameters[0];
501             assertTrue(parameter instanceof WildcardType);
502             WildcardType wildcardType = (WildcardType) parameter;
503             assertEquals("? extends " + returnTypeStr, wildcardType.toString());
504         } catch (NoSuchMethodException e) {
505             throw new AssertionError("Method '" + methodName + "' not found");
506         }
507     }
508
509     private void testReturnTypeInstanceIdentitifer(ClassLoader loader, Class<?> clazz, String methodName)
510             throws Exception {
511         Method method;
512         Class<?> rawReturnType;
513         java.lang.reflect.Type returnType;
514         try {
515             method = clazz.getMethod(methodName);
516             rawReturnType = Class.forName("org.opendaylight.yangtools.yang.binding.InstanceIdentifier", true, loader);
517             assertEquals(rawReturnType, method.getReturnType());
518             returnType = method.getGenericReturnType();
519             assertTrue(returnType instanceof ParameterizedType);
520             ParameterizedType pt = (ParameterizedType) returnType;
521             java.lang.reflect.Type[] parameters = pt.getActualTypeArguments();
522             assertEquals(1, parameters.length);
523             java.lang.reflect.Type parameter = parameters[0];
524             assertTrue(parameter instanceof WildcardType);
525             WildcardType wildcardType = (WildcardType) parameter;
526             assertEquals("?", wildcardType.toString());
527         } catch (NoSuchMethodException e) {
528             throw new AssertionError("Method '" + methodName + "' not found");
529         }
530     }
531
532 }