Implemented refine statement parsing.
[controller.git] / opendaylight / sal / yang-prototype / code-generator / binding-java-api-generator / src / test / java / org / opendaylight / controller / sal / java / api / generator / test / GeneratorJavaFileTest.java
index 9df281fcd3229c3cc3625871f577704fced5d3b7..4ab054d66345b40e2eab3385272d725228e4ccf4 100644 (file)
@@ -10,34 +10,55 @@ package org.opendaylight.controller.sal.java.api.generator.test;
 import static org.junit.Assert.*;\r
 \r
 import java.io.File;\r
+import java.util.ArrayList;\r
 import java.util.Arrays;\r
 import java.util.HashSet;\r
 import java.util.List;\r
 import java.util.Set;\r
 \r
+import javax.tools.JavaCompiler;\r
+import javax.tools.JavaFileObject;\r
+import javax.tools.StandardJavaFileManager;\r
+import javax.tools.ToolProvider;\r
+\r
 import org.junit.After;\r
 import org.junit.Before;\r
 import org.junit.Test;\r
+import org.opendaylight.controller.sal.binding.generator.api.BindingGenerator;\r
+import org.opendaylight.controller.sal.binding.generator.impl.BindingGeneratorImpl;\r
 import org.opendaylight.controller.sal.binding.generator.impl.GeneratedTypeBuilderImpl;\r
+import org.opendaylight.controller.sal.binding.model.api.GeneratedTransferObject;\r
 import org.opendaylight.controller.sal.binding.model.api.GeneratedType;\r
+import org.opendaylight.controller.sal.binding.model.api.Type;\r
 import org.opendaylight.controller.sal.binding.model.api.type.builder.GeneratedTypeBuilder;\r
 import org.opendaylight.controller.sal.java.api.generator.GeneratorJavaFile;\r
 import org.opendaylight.controller.sal.java.api.generator.InterfaceGenerator;\r
+import org.opendaylight.controller.yang.model.api.Module;\r
+import org.opendaylight.controller.yang.model.api.SchemaContext;\r
+import org.opendaylight.controller.yang.model.parser.impl.YangModelParserImpl;\r
 \r
 public class GeneratorJavaFileTest {\r
-\r
     private static final String FS = File.separator;\r
     private static final String PATH = "test-dir";\r
     private final File testDir = new File(PATH);\r
 \r
+    private static final String GENERATOR_OUTPUT_PATH = "src/test/resources/src";\r
+    private static final File GENERATOR_OUTPUT = new File(GENERATOR_OUTPUT_PATH);\r
+    private static final String COMPILER_OUTPUT_PATH = "src/test/resources/bin";\r
+    private static final File COMPILER_OUTPUT = new File(COMPILER_OUTPUT_PATH);\r
+\r
     @Before\r
     public void init() {\r
         assertTrue(testDir.mkdir());\r
+        assertTrue(COMPILER_OUTPUT.mkdirs());\r
+        assertTrue(GENERATOR_OUTPUT.mkdirs());\r
     }\r
 \r
     @After\r
     public void cleanUp() {\r
         deleteTestDir(testDir);\r
+        deleteTestDir(COMPILER_OUTPUT);\r
+        deleteTestDir(GENERATOR_OUTPUT);\r
     }\r
 \r
     @Test\r
@@ -66,6 +87,54 @@ public class GeneratorJavaFileTest {
         assertTrue(filesList.contains("Type3.java"));\r
     }\r
 \r
+    @Test\r
+    public void compilationTest() throws Exception {\r
+        final YangModelParserImpl parser = new YangModelParserImpl();\r
+        final BindingGenerator bindingGenerator = new BindingGeneratorImpl();\r
+\r
+        File sourcesDir = new File("src/test/resources/yang");\r
+        File[] sourceFiles = sourcesDir.listFiles();\r
+        String[] sourcesDirPaths = new String[sourceFiles.length];\r
+        for (int i = 0; i < sourceFiles.length; i++) {\r
+            sourcesDirPaths[i] = sourceFiles[i].getAbsolutePath();\r
+        }\r
+        final Set<Module> modulesToBuild = parser\r
+                .parseYangModels(sourcesDirPaths);\r
+\r
+        final SchemaContext context = parser\r
+                .resolveSchemaContext(modulesToBuild);\r
+        final List<Type> types = bindingGenerator.generateTypes(context);\r
+        final Set<GeneratedType> typesToGenerate = new HashSet<GeneratedType>();\r
+        final Set<GeneratedTransferObject> tosToGenerate = new HashSet<GeneratedTransferObject>();\r
+        for (Type type : types) {\r
+            if (type instanceof GeneratedType) {\r
+                typesToGenerate.add((GeneratedType) type);\r
+            }\r
+\r
+            if (type instanceof GeneratedTransferObject) {\r
+                tosToGenerate.add((GeneratedTransferObject) type);\r
+            }\r
+        }\r
+\r
+        final GeneratorJavaFile generator = new GeneratorJavaFile(\r
+                typesToGenerate, tosToGenerate);\r
+        generator.generateToFile(GENERATOR_OUTPUT_PATH);\r
+\r
+        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();\r
+        StandardJavaFileManager fileManager = compiler.getStandardFileManager(\r
+                null, null, null);\r
+\r
+        List<File> filesList = getJavaFiles(new File(GENERATOR_OUTPUT_PATH));\r
+\r
+        Iterable<? extends JavaFileObject> compilationUnits = fileManager\r
+                .getJavaFileObjectsFromFiles(filesList);\r
+        Iterable<String> options = Arrays.asList(new String[] { "-d",\r
+                COMPILER_OUTPUT_PATH });\r
+        boolean compiled = compiler.getTask(null, null, null, options, null,\r
+                compilationUnits).call();\r
+        assertTrue(compiled);\r
+    }\r
+\r
     private GeneratedType createGeneratedType(String pkgName, String name) {\r
         GeneratedTypeBuilder builder = new GeneratedTypeBuilderImpl(pkgName,\r
                 name);\r
@@ -83,4 +152,26 @@ public class GeneratorJavaFileTest {
         }\r
     }\r
 \r
+    /**\r
+     * Search recursively given directory for *.java files.\r
+     *\r
+     * @param directory\r
+     *            directory to search\r
+     * @return List of java files found\r
+     */\r
+    private List<File> getJavaFiles(File directory) {\r
+        List<File> result = new ArrayList<File>();\r
+        for (File file : directory.listFiles()) {\r
+            if (file.isDirectory()) {\r
+                result.addAll(getJavaFiles(file));\r
+            } else {\r
+                String absPath = file.getAbsolutePath();\r
+                if (absPath.endsWith(".java")) {\r
+                    result.add(file);\r
+                }\r
+            }\r
+        }\r
+        return result;\r
+    }\r
+\r
 }\r