package org.codehaus.groovy.classgen

import org.codehaus.groovy.control.CompilerConfiguration
import org.codehaus.groovy.tools.FileSystemCompiler

class InterfaceTest extends GroovyTestCase{

    void testCompile () {
        try {
            Class.forName("java.lang.annotation.Annotation");
        }
        catch(Exception ex) {
            return
        }


        File dir = createTempDir("src-", "-src")
        assertNotNull dir

        def fileList =  [
          "GClass.groovy" : """
         package test;

         class GClass {}
    """,

         "GInterface.groovy" : """
         package test;

         interface GInterface {
            GClass [] get ();
         }
    """,

          "JClass.java" : """
         package test;

         public class JClass implements GInterface {
            public GClass [] get () { return new GClass [0]; };
         }
    """,
                ].collect {
            name, text ->
              File file = new File(dir, name)
              file.write text
              file
        }

        CompilerConfiguration config = new CompilerConfiguration()
         config.targetDirectory = createTempDir("target-", "-target")
         config.jointCompilationOptions = [
			"stubDir" : createTempDir("stub-", "-stub"),
//			"namedValues" : ["target","1.5","source","1.5"] as String[]
		 ]
         config.classpath = "target/classes"
        FileSystemCompiler compiler = new FileSystemCompiler(config)
        compiler.compile (fileList.toArray(new File [fileList.size()]) )
    }

    private File createTempDir (prefix, suffix) {
        File tempFile = File.createTempFile(prefix, suffix);
        tempFile.delete();
        tempFile.mkdirs();
        tempFile.deleteOnExit()
        return tempFile;
    }
}