Implemented use of ChildOf interface in generated classes.
[yangtools.git] / code-generator / binding-java-api-generator / src / test / java / org / opendaylight / yangtools / sal / java / api / generator / test / CascadeUsesCompilationTest.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.*;
11 import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.*;
12
13 import java.io.File;
14 import java.lang.reflect.Constructor;
15 import java.net.URL;
16 import java.net.URLClassLoader;
17 import java.util.HashSet;
18 import java.util.List;
19 import java.util.Set;
20
21 import org.junit.Test;
22 import org.opendaylight.yangtools.sal.binding.model.api.Type;
23 import org.opendaylight.yangtools.sal.java.api.generator.GeneratorJavaFile;
24 import org.opendaylight.yangtools.yang.model.api.Module;
25 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
26
27 public class CascadeUsesCompilationTest extends BaseCompilationTest {
28
29     @Test
30     public void testCascadeUsesCompilation() throws Exception {
31         final File sourcesOutputDir = new File(GENERATOR_OUTPUT_PATH + FS + "cascade-uses");
32         assertTrue("Failed to create test file '" + sourcesOutputDir + "'", sourcesOutputDir.mkdir());
33         final File compiledOutputDir = new File(COMPILER_OUTPUT_PATH + FS + "cascade-uses");
34         assertTrue("Failed to create test file '" + compiledOutputDir + "'", compiledOutputDir.mkdir());
35
36         final List<File> sourceFiles = getSourceFiles("/compilation/cascade-uses");
37         final Set<Module> modulesToBuild = parser.parseYangModels(sourceFiles);
38         final SchemaContext context = parser.resolveSchemaContext(modulesToBuild);
39         final List<Type> types = bindingGenerator.generateTypes(context);
40         final GeneratorJavaFile generator = new GeneratorJavaFile(new HashSet<>(types));
41         generator.generateToFile(sourcesOutputDir);
42
43         // Test if all sources are generated from module foo
44         File parent = new File(sourcesOutputDir, NS_FOO);
45         testFilesCount(parent, 5);
46         File fooData = new File(parent, "FooData.java");
47         File foo_gr1 = new File(parent, "FooGr1.java");
48         File nodes = new File(parent, "Nodes.java");
49         File nodesBuilder = new File(parent, "NodesBuilder.java");
50         assertTrue(fooData.exists());
51         assertTrue(foo_gr1.exists());
52         assertTrue(nodes.exists());
53         assertTrue(nodesBuilder.exists());
54
55         // Test if all sources are generated from module bar
56         parent = new File(sourcesOutputDir, NS_BAR);
57         testFilesCount(parent, 2);
58         File barGr1 = new File(parent, "BarGr1.java");
59         File barGr2 = new File(parent, "BarGr2.java");
60         assertTrue(barGr1.exists());
61         assertTrue(barGr2.exists());
62
63         // Test if all sources are generated from module baz
64         parent = new File(sourcesOutputDir, NS_BAZ);
65         testFilesCount(parent, 1);
66         File bazGr1 = new File(parent, "BazGr1.java");
67         assertTrue(bazGr1.exists());
68
69         // Test if sources are compilable
70         testCompilation(sourcesOutputDir, compiledOutputDir);
71
72         ClassLoader loader = new URLClassLoader(new URL[] { compiledOutputDir.toURI().toURL() });
73         Class<?> nodesClass = Class.forName(BASE_PKG + ".urn.opendaylight.foo.rev131008.Nodes", true,
74                 loader);
75         Class<?> nodesBuilderClass = Class.forName(BASE_PKG + ".urn.opendaylight.foo.rev131008.NodesBuilder", true,
76                 loader);
77         Class<?> fooGr1Class = Class.forName(BASE_PKG + ".urn.opendaylight.foo.rev131008.FooGr1", true, loader);
78         Class<?> barGr2Class = Class.forName(BASE_PKG + ".urn.opendaylight.bar.rev131008.BarGr2", true, loader);
79         Class<?> barGr1Class = Class.forName(BASE_PKG + ".urn.opendaylight.bar.rev131008.BarGr1", true, loader);
80         Class<?> bazGr1Class = Class.forName(BASE_PKG + ".urn.opendaylight.baz.rev131008.BazGr1", true, loader);
81
82         // test generated interface from 'container nodes'
83         testImplementsIfc(nodesClass, fooGr1Class);
84         testImplementsIfc(nodesClass, barGr2Class);
85
86         // test generated builder for 'container nodes'
87         assertFalse(nodesBuilderClass.isInterface());
88         Constructor<?>[] nodesBuilderConstructors = nodesBuilderClass.getConstructors();
89         assertEquals(5, nodesBuilderConstructors.length);
90
91         // test generation of builder constructors from uses in 'container nodes'
92         Constructor<?> defaultConstructor = null;
93         Constructor<?> usesFooGr1 = null;
94         Constructor<?> usesBarGr2 = null;
95         Constructor<?> usesBarGr1 = null;
96         Constructor<?> usesBazGr1 = null;
97         for (Constructor<?> c : nodesBuilderConstructors) {
98             Class<?>[] params = c.getParameterTypes();
99             if (params.length == 0) {
100                 defaultConstructor = c;
101             } else {
102                 assertEquals(1, params.length);
103                 if (params[0].equals(fooGr1Class)) {
104                     usesFooGr1 = c;
105                 } else if (params[0].equals(barGr2Class)) {
106                     usesBarGr2 = c;
107                 } else if (params[0].equals(barGr1Class)) {
108                     usesBarGr1 = c;
109                 } else if (params[0].equals(bazGr1Class)) {
110                     usesBazGr1 = c;
111                 }
112             }
113         }
114         assertNotNull(defaultConstructor);
115         assertNotNull(usesFooGr1);
116         assertNotNull(usesBarGr2);
117         assertNotNull(usesBarGr1);
118         assertNotNull(usesBazGr1);
119
120         cleanUp(sourcesOutputDir, compiledOutputDir);
121     }
122
123 }