2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.yangtools.sal.java.api.generator.test;
10 import static org.junit.Assert.*;
11 import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.*;
14 import java.lang.reflect.Constructor;
15 import java.lang.reflect.Method;
17 import java.net.URLClassLoader;
18 import java.util.HashSet;
19 import java.util.List;
22 import org.junit.Test;
23 import org.opendaylight.yangtools.sal.binding.model.api.Type;
24 import org.opendaylight.yangtools.sal.java.api.generator.GeneratorJavaFile;
25 import org.opendaylight.yangtools.yang.model.api.Module;
26 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
28 public class CascadeUsesCompilationTest extends BaseCompilationTest {
31 public void testCascadeUsesCompilation() throws Exception {
32 final File sourcesOutputDir = new File(GENERATOR_OUTPUT_PATH + FS + "cascade-uses");
33 assertTrue("Failed to create test file '" + sourcesOutputDir + "'", sourcesOutputDir.mkdir());
34 final File compiledOutputDir = new File(COMPILER_OUTPUT_PATH + FS + "cascade-uses");
35 assertTrue("Failed to create test file '" + compiledOutputDir + "'", compiledOutputDir.mkdir());
37 final List<File> sourceFiles = getSourceFiles("/compilation/cascade-uses");
38 final Set<Module> modulesToBuild = parser.parseYangModels(sourceFiles);
39 final SchemaContext context = parser.resolveSchemaContext(modulesToBuild);
40 final List<Type> types = bindingGenerator.generateTypes(context);
41 final GeneratorJavaFile generator = new GeneratorJavaFile(new HashSet<>(types));
42 generator.generateToFile(sourcesOutputDir);
44 // Test if all sources are generated from module foo
45 File parent = new File(sourcesOutputDir, NS_FOO);
46 assertFilesCount(parent, 5);
47 File fooData = new File(parent, "FooData.java");
48 File foo_gr1 = new File(parent, "FooGr1.java");
49 File nodes = new File(parent, "Nodes.java");
50 File nodesBuilder = new File(parent, "NodesBuilder.java");
51 assertTrue(fooData.exists());
52 assertTrue(foo_gr1.exists());
53 assertTrue(nodes.exists());
54 assertTrue(nodesBuilder.exists());
56 // Test if all sources are generated from module bar
57 parent = new File(sourcesOutputDir, NS_BAR);
58 assertFilesCount(parent, 2);
59 File barGr1 = new File(parent, "BarGr1.java");
60 File barGr2 = new File(parent, "BarGr2.java");
61 assertTrue(barGr1.exists());
62 assertTrue(barGr2.exists());
64 // Test if all sources are generated from module baz
65 parent = new File(sourcesOutputDir, NS_BAZ);
66 assertFilesCount(parent, 1);
67 File bazGr1 = new File(parent, "BazGr1.java");
68 assertTrue(bazGr1.exists());
70 // Test if sources are compilable
71 testCompilation(sourcesOutputDir, compiledOutputDir);
73 ClassLoader loader = new URLClassLoader(new URL[] { compiledOutputDir.toURI().toURL() });
74 Class<?> nodesClass = Class.forName(BASE_PKG + ".urn.opendaylight.foo.rev131008.Nodes", true,
76 Class<?> nodesBuilderClass = Class.forName(BASE_PKG + ".urn.opendaylight.foo.rev131008.NodesBuilder", true,
78 Class<?> fooGr1Class = Class.forName(BASE_PKG + ".urn.opendaylight.foo.rev131008.FooGr1", true, loader);
79 Class<?> barGr2Class = Class.forName(BASE_PKG + ".urn.opendaylight.bar.rev131008.BarGr2", true, loader);
80 Class<?> barGr1Class = Class.forName(BASE_PKG + ".urn.opendaylight.bar.rev131008.BarGr1", true, loader);
81 Class<?> bazGr1Class = Class.forName(BASE_PKG + ".urn.opendaylight.baz.rev131008.BazGr1", true, loader);
83 // test generated interface from 'container nodes'
84 assertImplementsIfc(nodesClass, fooGr1Class);
85 assertImplementsIfc(nodesClass, barGr2Class);
87 // test generated builder for 'container nodes'
88 assertFalse(nodesBuilderClass.isInterface());
89 Constructor<?>[] nodesBuilderConstructors = nodesBuilderClass.getConstructors();
90 assertEquals(5, nodesBuilderConstructors.length);
92 // test generation of builder constructors from uses in 'container nodes'
93 Constructor<?> defaultConstructor = null;
94 Constructor<?> usesFooGr1 = null;
95 Constructor<?> usesBarGr2 = null;
96 Constructor<?> usesBarGr1 = null;
97 Constructor<?> usesBazGr1 = null;
98 for (Constructor<?> c : nodesBuilderConstructors) {
99 Class<?>[] params = c.getParameterTypes();
100 if (params.length == 0) {
101 defaultConstructor = c;
103 assertEquals(1, params.length);
104 if (params[0].equals(fooGr1Class)) {
106 } else if (params[0].equals(barGr2Class)) {
108 } else if (params[0].equals(barGr1Class)) {
110 } else if (params[0].equals(bazGr1Class)) {
115 assertNotNull(defaultConstructor);
116 assertNotNull(usesFooGr1);
117 assertNotNull(usesBarGr2);
118 assertNotNull(usesBarGr1);
119 assertNotNull(usesBazGr1);
121 Method fieldsFromMethod = null;
122 for (Method m : nodesBuilderClass.getDeclaredMethods()) {
123 String methodName = m.getName();
124 if ("fieldsFrom".equals(methodName)) {
125 fieldsFromMethod = m;
128 assertNotNull(fieldsFromMethod);
129 assertEquals(1, fieldsFromMethod.getParameterTypes().length);
131 cleanUp(sourcesOutputDir, compiledOutputDir);