summaryrefslogtreecommitdiffstats
path: root/test/junit/com/jogamp/gluegen
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2010-11-07 04:35:47 +0100
committerSven Gothel <[email protected]>2010-11-07 04:35:47 +0100
commited83567444bd803918b8904eb71b155d4eff2de4 (patch)
tree715069bef306f409e5030b1a90871b55c1c41a7f /test/junit/com/jogamp/gluegen
parent5aadf241bb46a66a57c6c5b6776aa6a0da1633f6 (diff)
com.sun -> com.jogamp
Diffstat (limited to 'test/junit/com/jogamp/gluegen')
-rw-r--r--test/junit/com/jogamp/gluegen/BasicProcAddressEmitterTest.java96
-rw-r--r--test/junit/com/jogamp/gluegen/BasicTest.java143
-rw-r--r--test/junit/com/jogamp/gluegen/BuildUtil.java179
-rw-r--r--test/junit/com/jogamp/gluegen/PCPPTest.java76
-rw-r--r--test/junit/com/jogamp/gluegen/StructAccessorTest.java126
-rw-r--r--test/junit/com/jogamp/gluegen/StructValidator.java105
-rw-r--r--test/junit/com/jogamp/gluegen/build.xml95
-rw-r--r--test/junit/com/jogamp/gluegen/dyntest.cfg25
-rw-r--r--test/junit/com/jogamp/gluegen/pcpptest.h6
-rw-r--r--test/junit/com/jogamp/gluegen/struct.cfg7
-rw-r--r--test/junit/com/jogamp/gluegen/struct.h21
-rw-r--r--test/junit/com/jogamp/gluegen/test.c24
-rw-r--r--test/junit/com/jogamp/gluegen/test.cfg9
-rw-r--r--test/junit/com/jogamp/gluegen/test.h17
14 files changed, 929 insertions, 0 deletions
diff --git a/test/junit/com/jogamp/gluegen/BasicProcAddressEmitterTest.java b/test/junit/com/jogamp/gluegen/BasicProcAddressEmitterTest.java
new file mode 100644
index 0000000..10156f9
--- /dev/null
+++ b/test/junit/com/jogamp/gluegen/BasicProcAddressEmitterTest.java
@@ -0,0 +1,96 @@
+/**
+ * Copyright 2010 JogAmp Community. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of JogAmp Community.
+ */
+
+package com.jogamp.gluegen;
+
+import com.jogamp.gluegen.procaddress.ProcAddressEmitter;
+import java.lang.reflect.Field;
+import java.util.HashSet;
+import java.util.Set;
+import org.junit.AfterClass;
+import org.junit.Test;
+import static java.util.Arrays.*;
+import static com.jogamp.gluegen.BuildUtil.*;
+import static org.junit.Assert.*;
+
+/**
+ * Basic test using ProcAddressEmitter.
+ * @author Michael Bien
+ */
+public class BasicProcAddressEmitterTest {
+
+ @Test
+ public void generateBindingTest() {
+ generate("dyntest", "test", ProcAddressEmitter.class.getName());
+ }
+
+ /**
+ * fails if ant script fails (which is a good thing).
+ * executeTarget throws RuntimeException on failure
+ */
+ @Test
+ public void compileJavaTest() {
+ compileJava();
+ }
+
+ /*
+ * fails if ant script fails (which is a good thing)
+ * executeTarget throws RuntimeException on failure
+ */
+ @Test
+ public void compileNativesTest() {
+ compileNatives();
+ }
+
+ @Test
+ public void renameTest() throws Exception {
+
+ Class<?> binding = Class.forName("test.DynBindingTest");
+ Class<?> table = Class.forName("test.Table");
+
+ Field[] fields = table.getDeclaredFields();
+
+
+ Set<String> expected = new HashSet<String>(
+ asList("arrayTest", "bufferTest", "pbTest", "manyBuffersTest", "mixedTest", "doubleTest"));
+
+ for (Field field : fields) {
+ System.out.println("address field: "+field);
+
+ String function = field.getName().substring("_addressoff_".length()-1);
+ assertTrue("unexpected field: '"+function+"'",expected.contains(function));
+ }
+
+ }
+
+ @AfterClass
+ public static void tearDown() {
+// cleanGeneratedFiles();
+ }
+
+}
diff --git a/test/junit/com/jogamp/gluegen/BasicTest.java b/test/junit/com/jogamp/gluegen/BasicTest.java
new file mode 100644
index 0000000..38bb7f9
--- /dev/null
+++ b/test/junit/com/jogamp/gluegen/BasicTest.java
@@ -0,0 +1,143 @@
+/**
+ * Copyright 2010 JogAmp Community. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of JogAmp Community.
+ */
+
+package com.jogamp.gluegen;
+
+import com.jogamp.common.nio.Buffers;
+import com.jogamp.common.nio.PointerBuffer;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import org.junit.AfterClass;
+import org.junit.Test;
+import static org.junit.Assert.*;
+import static java.lang.System.*;
+import static com.jogamp.gluegen.BuildUtil.*;
+
+/**
+ *
+ * @author Michael Bien
+ */
+public class BasicTest {
+
+ @Test
+ public void generateBindingTest() {
+ generate("test");
+ }
+
+ /**
+ * fails if ant script fails (which is a good thing).
+ * executeTarget throws RuntimeException on failure
+ */
+ @Test
+ public void compileJavaTest() {
+ compileJava();
+ }
+
+ /*
+ * fails if ant script fails (which is a good thing)
+ * executeTarget throws RuntimeException on failure
+ */
+ @Test
+ public void compileNativesTest() {
+ compileNatives();
+ }
+
+ @Test
+ public void bindingTest() throws Exception {
+
+ // String nativesPath = testOutput + "/build/natives";
+ // System.load(nativesPath + "/librofl.so");
+ System.loadLibrary("rofl");
+
+ Class<?> clazz = Class.forName("test.BindingTest");
+
+ assertEquals((long)0xFFFFFFFF, clazz.getDeclaredField("GL_INVALID_INDEX").get(null));
+ assertEquals(-0.5f, clazz.getDeclaredField("AL_FLANGER_DEFAULT_FEEDBACK").get(null));
+
+ // TODO fix Exception: ...Caused by: java.lang.UnsatisfiedLinkError: test.BindingTest.arrayTest0(JLjava/lang/Object;I)I
+ /*
+ // test values
+ ByteBuffer dbb = Buffers.newDirectByteBuffer(32);
+ ByteBuffer bb = ByteBuffer.allocate(32).order(ByteOrder.nativeOrder());
+
+ PointerBuffer dpb = PointerBuffer.allocateDirect(32);
+ PointerBuffer pb = PointerBuffer.allocate(32);
+
+ long[] array = new long[] {1,2,3,4,5,6,7,8,9};
+ int offset = 0;
+ long id = 42;
+
+
+ // invoke everything public
+ Object bindingTest = clazz.newInstance();
+ Method[] methods = clazz.getDeclaredMethods();
+
+ for (Method method : methods) {
+
+ // prepare method parameters
+ Class<?>[] paramTypes = method.getParameterTypes();
+ Object[] paramInstances = new Object[paramTypes.length];
+
+ for (int i = 0; i < paramTypes.length; i++) {
+ Class<?> paramType = paramTypes[i];
+ if(paramType.isInstance(dbb)) {
+ paramInstances[i] = dbb;
+ }else if(paramType.isInstance(bb)) {
+ paramInstances[i] = bb;
+ }else if(paramType.isInstance(dpb)) {
+ paramInstances[i] = dpb;
+ }else if(paramType.isInstance(pb)) {
+ paramInstances[i] = pb;
+ }else if(paramType.isPrimitive()) { // TODO primitive types
+ paramInstances[i] = offset;
+ }else if(paramType.isArray()) { // TODO array types
+ paramInstances[i] = array;
+ }
+ }
+
+ out.println("invoking: "+method);
+ out.println("with params: ");
+ for (Object param : paramInstances)
+ out.print(param+", ");
+ out.println();
+
+ Object result = method.invoke(bindingTest, paramInstances);
+ out.println("result: "+result);
+ out.println("success");
+ }
+ */
+ }
+
+ @AfterClass
+ public static void tearDown() {
+// cleanGeneratedFiles();
+ }
+
+}
diff --git a/test/junit/com/jogamp/gluegen/BuildUtil.java b/test/junit/com/jogamp/gluegen/BuildUtil.java
new file mode 100644
index 0000000..ce88ba2
--- /dev/null
+++ b/test/junit/com/jogamp/gluegen/BuildUtil.java
@@ -0,0 +1,179 @@
+/**
+ * Copyright 2010 JogAmp Community. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of JogAmp Community.
+ */
+
+package com.jogamp.gluegen;
+
+import com.jogamp.gluegen.JavaEmitter;
+import com.jogamp.gluegen.GlueGen;
+import java.io.File;
+import java.net.URISyntaxException;
+import org.apache.tools.ant.DefaultLogger;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.ProjectHelper;
+
+import static java.lang.System.*;
+
+/**
+ * @author Michael Bien
+ */
+public final class BuildUtil {
+
+ private static final Project project;
+
+ public static final String gluegenRoot;
+ public static final String path;
+ public static final String testOutput;
+ public static final String rootrel_build;
+
+ static {
+
+ out.println(" - - - System info - - - ");
+ out.println("OS: " + System.getProperty("os.name"));
+ out.println("VM: " + System.getProperty("java.vm.name"));
+
+ String rootrel_build_tmp = System.getProperty("rootrel.build");
+ if(null==rootrel_build_tmp || rootrel_build_tmp.length()==0) {
+ rootrel_build_tmp = "build" ;
+ }
+ rootrel_build = rootrel_build_tmp;
+ out.println("rootrel.build: " + rootrel_build);
+
+ // setup paths
+ try {
+ File executionRoot = new File(BuildUtil.class.getProtectionDomain().getCodeSource().getLocation().toURI());
+ out.println("execution root: " + executionRoot);
+ gluegenRoot = executionRoot.getParentFile().getParentFile().getParentFile().getParentFile().toString();
+ out.println("gluegen project root: " + gluegenRoot);
+ } catch (URISyntaxException ex) {
+ throw new RuntimeException("can not determine gluegen root", ex);
+ }
+
+ path = gluegenRoot + "/test/junit/com/jogamp/gluegen";
+ testOutput = gluegenRoot + "/" + rootrel_build + "/test";
+
+ out.println("path: "+path);
+ out.println("testOutput: "+testOutput);
+ out.println(" - - - - - - - - - - - - ");
+
+ cleanGeneratedFiles();
+
+ //setup ant build file
+ project = new Project();
+ project.setProperty("rootrel.build", rootrel_build);
+ passSystemProperty(project, "gluegen-cpptasks.file");
+ passSystemProperty(project, "os.arch");
+
+ DefaultLogger logger = new DefaultLogger();
+ logger.setErrorPrintStream(out);
+ logger.setOutputPrintStream(out);
+ logger.setMessageOutputLevel(Project.MSG_WARN);
+ project.addBuildListener(logger);
+
+ project.init();
+
+ File buildFile = new File(path, "build.xml");
+ if(!buildFile.exists()) {
+ throw new RuntimeException("buildfile "+buildFile+" does not exist");
+ }
+
+ ProjectHelper.configureProject(project, buildFile);
+ }
+
+ public static Project passSystemProperty(Project p, String name) {
+ String tmp = System.getProperty(name);
+ if(null!=tmp && tmp.length()>0) {
+ p.setProperty(name, tmp);
+ }
+ return p;
+ }
+
+ public static void cleanGeneratedFiles() {
+ out.println("cleaning generated files");
+ deleteDirectory(new File(testOutput+"/gensrc"));
+ out.println("done");
+ }
+
+ /**
+ * fails if ant script fails (which is a good thing).
+ * executeTarget throws RuntimeException on failure
+ */
+ public static void compileJava() {
+ out.println("compiling java files");
+ project.executeTarget("compile.java");
+ out.println("done");
+ }
+
+ /**
+ * fails if ant script fails (which is a good thing)
+ * executeTarget throws RuntimeException on failure
+ */
+ public static void compileNatives() {
+ out.println("compiling native files");
+ project.executeTarget("compile.native");
+ out.println("done");
+ }
+
+ public static void generate(String bindingName) {
+ generate(bindingName, JavaEmitter.class.getName());
+// generate(bindingName, DebugEmitter.class.getName());
+ }
+
+ public static void generate(String bindingName, String emitter) {
+ generate(bindingName, bindingName, emitter);
+ }
+ public static void generate(String bindingName, String header, String emitter) {
+
+ out.println("generate binding to '" + bindingName+"' using '"+emitter+"'");
+
+ GlueGen.main( "-I"+path,
+ "-O"+testOutput+"/gensrc",
+ "-E"+emitter,
+ "-C"+path+"/"+bindingName+".cfg",
+ path+"/"+header+".h" );
+
+ out.println("done");
+ }
+
+ public static void deleteDirectory(File path) {
+ if(path.exists()) {
+
+ File[] files = path.listFiles();
+ for (int i = 0; i < files.length; i++) {
+ if (files[i].isDirectory()) {
+ deleteDirectory(files[i]);
+ } else {
+ files[i].delete();
+ }
+ }
+
+ path.delete();
+ }
+ }
+
+
+}
diff --git a/test/junit/com/jogamp/gluegen/PCPPTest.java b/test/junit/com/jogamp/gluegen/PCPPTest.java
new file mode 100644
index 0000000..c1f12ab
--- /dev/null
+++ b/test/junit/com/jogamp/gluegen/PCPPTest.java
@@ -0,0 +1,76 @@
+/**
+ * Copyright 2010 JogAmp Community. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of JogAmp Community.
+ */
+
+package com.jogamp.gluegen;
+
+import com.jogamp.gluegen.pcpp.PCPP;
+import java.io.BufferedReader;
+import java.io.ByteArrayOutputStream;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.Collections;
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+/**
+ * serves mainly as entry point for debugging purposes.
+ * @author Michael Bien
+ */
+public class PCPPTest {
+
+ @Test
+ public void pcppMacroDefinitionTest() throws FileNotFoundException, IOException {
+
+ PCPP pp = new PCPP(Collections.<String>emptyList());
+ ByteArrayOutputStream output = new ByteArrayOutputStream();
+ pp.setOut(output);
+
+ String filename = "pcpptest.h";
+ String filepath = BuildUtil.path + "/" + filename;
+
+ pp.run(new BufferedReader(new FileReader(filepath)), filename);
+
+ String expected = "# 1 \"pcpptest.h\""+
+ "# define CL_SCHAR_MIN (-127-1)"+
+ " cl_char __attribute__(( aligned(2))) s[ 2];"+
+ "# 7 \"pcpptest.h\"";
+ output.flush();
+ String result = output.toString();
+ output.close();
+
+ assertEquals(killWhitespace(expected), killWhitespace(result));
+
+ }
+
+ private String killWhitespace(String a) {
+ return a.replaceAll("\\p{javaWhitespace}+", "");
+ }
+
+
+}
diff --git a/test/junit/com/jogamp/gluegen/StructAccessorTest.java b/test/junit/com/jogamp/gluegen/StructAccessorTest.java
new file mode 100644
index 0000000..4d1bffd
--- /dev/null
+++ b/test/junit/com/jogamp/gluegen/StructAccessorTest.java
@@ -0,0 +1,126 @@
+/**
+ * Copyright 2010 JogAmp Community. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of JogAmp Community.
+ */
+
+package com.jogamp.gluegen;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.lang.reflect.InvocationTargetException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Locale;
+import javax.tools.Diagnostic;
+import javax.tools.DiagnosticCollector;
+import javax.tools.JavaCompiler;
+import javax.tools.JavaFileObject;
+import javax.tools.StandardJavaFileManager;
+import javax.tools.ToolProvider;
+import junit.framework.Assert;
+import org.junit.AfterClass;
+import org.junit.Test;
+import static java.lang.System.*;
+import static com.jogamp.gluegen.BuildUtil.*;
+
+/**
+ *
+ * @author Michael Bien
+ */
+public class StructAccessorTest {
+
+ @Test
+ public void generateStruct() {
+ generate("struct");
+ }
+
+ @Test
+ public void compileStructJava() {
+ compileJava();
+ }
+
+ @Test
+ public void compileStructNatives() {
+ // this will only copy gluegen-rt to the right place
+ compileNatives();
+ }
+
+ @Test
+ public void validateGeneratedStructs() throws IOException, NoSuchMethodException, ClassNotFoundException, IllegalAccessException, InvocationTargetException {
+
+ // compile testcase
+ String source = gluegenRoot + "/test/junit/com/jogamp/gluegen/StructValidator.java";
+ compile(new File(source), testOutput + "/build/classes");
+
+ // invoke test
+ Class<?> test = Class.forName("com.jogamp.gluegen.StructValidator");
+ test.getDeclaredMethod("validate").invoke(null);
+ }
+
+ private void compile(File file, String dest) throws IOException {
+ compile(new File[] {file}, dest);
+ }
+
+ // yeah, java 6 has even a compiler api...
+ private void compile(File[] files, String destination) throws IOException {
+
+ out.println("compiling files:\n " + Arrays.asList(files));
+
+ JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
+ DiagnosticCollector<JavaFileObject> collector = new DiagnosticCollector<JavaFileObject>();
+ StandardJavaFileManager fileManager = compiler.getStandardFileManager(collector, null, null);
+
+ Iterable<? extends JavaFileObject> fileObj = fileManager.getJavaFileObjects(files);
+
+ boolean success = compiler.getTask( new OutputStreamWriter(out),
+ fileManager,
+ collector,
+ Arrays.asList("-d", destination/*, "-verbose"*/),
+ null,
+ fileObj ).call();
+
+ fileManager.close();
+
+ List<Diagnostic<? extends JavaFileObject>> list = collector.getDiagnostics();
+ if(!list.isEmpty() || !success) {
+ for (Diagnostic<? extends JavaFileObject> d : list) {
+ out.println("Error on line "+ d.getLineNumber());
+ out.println("Compiler Message:\n"+d.getMessage(Locale.ENGLISH));
+ }
+ Assert.fail("compilation failed");
+ }
+
+ out.println("done");
+
+ }
+
+ @AfterClass
+ public static void tearDown() {
+// cleanGeneratedFiles();
+ }
+
+}
diff --git a/test/junit/com/jogamp/gluegen/StructValidator.java b/test/junit/com/jogamp/gluegen/StructValidator.java
new file mode 100644
index 0000000..b6eb426
--- /dev/null
+++ b/test/junit/com/jogamp/gluegen/StructValidator.java
@@ -0,0 +1,105 @@
+/**
+ * Copyright 2010 JogAmp Community. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of JogAmp Community.
+ */
+
+package com.jogamp.gluegen;
+
+import java.lang.reflect.InvocationTargetException;
+import org.junit.Ignore;
+
+import static org.junit.Assert.*;
+
+/**
+ * this file will not compile unless {@link com.jogamp.gluegen.StructAccessorTest} has been run.
+ * @author Michael Bien
+ */
+@Ignore
+public class StructValidator {
+
+ // invoked via reflection from StructAccessorTest1
+ public static void validate() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, ClassNotFoundException {
+
+ System.out.println("validating struct accessors...");
+
+ float[] mu = new float[] {1, 2, 3, 4};
+ float[] light = new float[] {5, 6, 7};
+ int fastRendering = 1;
+ int shadow = 42;
+ int iterations = 512;
+ int sss = 12;
+ float epsilon = (float) Math.PI;
+ int height = 640;
+ int width = 480;
+
+ structtest.RenderingConfig config = structtest.RenderingConfig.create();
+
+ //set
+ config.setLight(light);
+ config.setMu(mu);
+ config.setActvateFastRendering(fastRendering);
+ config.setEnableShadow(shadow);
+ config.setMaxIterations(iterations);
+ config.setEpsilon(epsilon);
+ config.setSuperSamplingSize(sss);
+ config.setWidth(width);
+ config.setHeight(height);
+
+ structtest.Camera camera = config.getCamera();
+ camera.getOrig().setX(1001).setY(1002).setZ(1003);
+ camera.getDir().setX(2001).setY(2002).setZ(2003);
+
+ //get and validate
+ assertArrayEquals(mu, config.getMu());
+ assertArrayEquals(light, config.getLight());
+
+ assertEquals(fastRendering, config.getActvateFastRendering());
+ assertEquals(shadow, config.getEnableShadow());
+ assertEquals(iterations, config.getMaxIterations());
+ assertEquals(epsilon, config.getEpsilon(), 0.01f);
+ assertEquals(sss, config.getSuperSamplingSize());
+ assertEquals(width, config.getWidth());
+ assertEquals(height, config.getHeight());
+
+ assertEquals(camera.getOrig().getX(), 1001, 0.001);
+ assertEquals(camera.getOrig().getY(), 1002, 0.001);
+ assertEquals(camera.getOrig().getZ(), 1003, 0.001);
+
+ assertEquals(camera.getDir().getX(), 2001, 0.001);
+ assertEquals(camera.getDir().getY(), 2002, 0.001);
+ assertEquals(camera.getDir().getZ(), 2003, 0.001);
+
+ System.out.println("done");
+
+ }
+
+ private static final void assertArrayEquals(float[] a, float[] b) {
+ for (int i = 0; i < b.length; i++) {
+ assertEquals(a[i], b[i], 0.0001f);
+ }
+ }
+
+}
diff --git a/test/junit/com/jogamp/gluegen/build.xml b/test/junit/com/jogamp/gluegen/build.xml
new file mode 100644
index 0000000..95617be
--- /dev/null
+++ b/test/junit/com/jogamp/gluegen/build.xml
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<project name="GlueGenTest" default="default" basedir=".">
+
+ <description>Tests GlueGen</description>
+
+ <condition property="rootrel.build" value="build">
+ <not>
+ <isset property="rootrel.build"/>
+ </not>
+ </condition>
+
+ <property name="gluegen.root" value="../../../../.." />
+ <property name="src.dir" value="${gluegen.root}/${rootrel.build}/test/gensrc/java" />
+ <property name="build.dir" value="${gluegen.root}/${rootrel.build}/test/build" />
+
+ <!-- Pull in GlueGen cpptasks build file -->
+ <import file="${gluegen.root}/make/gluegen-cpptasks.xml" />
+
+ <target name="compile.java">
+
+ <echo message=" - - - compiling java files - - - "/>
+
+ <property name="build.dir.java" value="${build.dir}/classes"/>
+ <property name="tools.jar" value="${java.home}/../lib/tools.jar"/>
+
+ <echo message="src: ${src.dir} "/>
+ <echo message="build: ${build.dir.java} "/>
+
+ <mkdir dir="${build.dir.java}"/>
+
+ <javac destdir="${build.dir.java}" source="1.5" failonerror="true" debug="true" debuglevel="lines,vars,source">
+ <src path="${src.dir}"/>
+ <classpath path="${gluegen.root}/${rootrel.build}/classes:${src.dir}:${gluegen.root}/${rootrel.build}/antlr-3.2.jar:${gluegen.root}/make/lib/junit.jar:${tools.jar}:${ant.core.lib}"/>
+ </javac>
+
+ <echo message=" - - - java files compiled - - - "/>
+
+ </target>
+
+ <target name="compile.native" depends="c.configure">
+
+ <echo message=" - - - compiling natives - - - "/>
+
+ <property name="obj.dir" value="${build.dir}/obj"/>
+ <property name="natives.dir" value="${build.dir}/natives"/>
+
+ <property name="output.lib.name" value="rofl"/>
+ <property name="obj.dir" value="${obj.dir}/${output.lib.name}"/>
+
+ <property name="c.compiler.optimise" value="none"/>
+ <property name="c.compiler.debug" value="false"/>
+
+ <mkdir dir="${obj.dir}" />
+ <mkdir dir="${natives.dir}" />
+
+ <cc outtype="shared"
+ objdir="${obj.dir}"
+ outfile="${natives.dir}/${output.lib.name}"
+ optimize="${c.compiler.optimise}"
+ debug="${c.compiler.debug}"
+ multithreaded="true"
+ exceptions="false"
+ rtti="false"
+ failonerror="true">
+
+ <fileset dir="${gluegen.root}/test/junit/com/jogamp/gluegen" includes="*.c"/>
+
+ <compiler extends="${compiler.cfg.id}" >
+ <includepath path="${java.includes.dir}"/>
+ <includepath path="${java.includes.dir.platform}"/>
+ <includepath path="${gluegen.root}/test/junit/com/jogamp/gluegen"/>
+ </compiler>
+
+ <linker extends="${linker.cfg.id}">
+
+ </linker>
+ </cc>
+
+ <echo message=" - - - natives compiled - - - "/>
+
+ <copy todir="${natives.dir}">
+ <fileset dir="${gluegen.root}/${rootrel.build}/obj">
+ <include name="*.so"/>
+ </fileset>
+ </copy>
+
+ </target>
+
+ <target name="c.configure" depends="gluegen.cpptasks.detect.os,gluegen.cpptasks.setup.compiler">
+ <property name="compiler.cfg.id" value="${compiler.cfg.id.base}" />
+ <property name="linker.cfg.id" value="${linker.cfg.id.base}" />
+ </target>
+
+</project>
diff --git a/test/junit/com/jogamp/gluegen/dyntest.cfg b/test/junit/com/jogamp/gluegen/dyntest.cfg
new file mode 100644
index 0000000..60b8764
--- /dev/null
+++ b/test/junit/com/jogamp/gluegen/dyntest.cfg
@@ -0,0 +1,25 @@
+Package test
+Style AllStatic
+JavaClass DynBindingTest
+JavaOutputDir java
+NativeOutputDir native
+
+CustomCCode #include "test.h"
+
+Import com.jogamp.common.nio.*
+
+
+EmitProcAddressTable true
+ProcAddressTableClassName Table
+GetProcAddressTableExpr table
+ProcAddressNameExpr $UpperCase(arg)
+
+ForceProcAddressGen __ALL__
+
+CustomJavaCode DynBindingTest private final static Table table;
+CustomJavaCode DynBindingTest static {
+CustomJavaCode DynBindingTest table = new Table();
+CustomJavaCode DynBindingTest //table.reset();
+CustomJavaCode DynBindingTest }
+
+RenameJavaMethod arrayTest fancyArrayTest \ No newline at end of file
diff --git a/test/junit/com/jogamp/gluegen/pcpptest.h b/test/junit/com/jogamp/gluegen/pcpptest.h
new file mode 100644
index 0000000..58b8935
--- /dev/null
+++ b/test/junit/com/jogamp/gluegen/pcpptest.h
@@ -0,0 +1,6 @@
+
+#define CL_SCHAR_MIN (-127-1)
+#define CL_ALIGNED(_x) __attribute__ ((aligned(_x)))
+
+cl_char CL_ALIGNED(2) s[2];
+
diff --git a/test/junit/com/jogamp/gluegen/struct.cfg b/test/junit/com/jogamp/gluegen/struct.cfg
new file mode 100644
index 0000000..a1e1138
--- /dev/null
+++ b/test/junit/com/jogamp/gluegen/struct.cfg
@@ -0,0 +1,7 @@
+Package structtest
+
+JavaOutputDir java
+
+EmitStruct Vec
+EmitStruct Camera
+EmitStruct RenderingConfig
diff --git a/test/junit/com/jogamp/gluegen/struct.h b/test/junit/com/jogamp/gluegen/struct.h
new file mode 100644
index 0000000..2819d5c
--- /dev/null
+++ b/test/junit/com/jogamp/gluegen/struct.h
@@ -0,0 +1,21 @@
+
+typedef struct {
+ float x, y, z;
+} Vec;
+
+typedef struct {
+ Vec orig, dir;
+} Camera;
+
+typedef struct {
+ unsigned int width, height;
+ int superSamplingSize;
+ int actvateFastRendering;
+ int enableShadow;
+
+ unsigned int maxIterations;
+ float epsilon;
+ float mu[4];
+ float light[3];
+ Camera camera;
+} RenderingConfig;
diff --git a/test/junit/com/jogamp/gluegen/test.c b/test/junit/com/jogamp/gluegen/test.c
new file mode 100644
index 0000000..c511a53
--- /dev/null
+++ b/test/junit/com/jogamp/gluegen/test.c
@@ -0,0 +1,24 @@
+#include "test.h"
+
+int arrayTest(long context, foo * array) {
+ return 42;
+}
+
+int bufferTest(void * object) {
+ return 42;
+}
+
+void pbTest(size_t * object) {
+}
+
+int manyBuffersTest(void * object1, void * object2, void * object3, void * object4, void * object5) {
+ return 42;
+}
+
+int mixedTest(long context, void * object, foo * array){
+ return 42;
+}
+
+int doubleTest(long context, void * object1, foo * array1, void * object2, foo * array2) {
+ return 42;
+}
diff --git a/test/junit/com/jogamp/gluegen/test.cfg b/test/junit/com/jogamp/gluegen/test.cfg
new file mode 100644
index 0000000..a2ac567
--- /dev/null
+++ b/test/junit/com/jogamp/gluegen/test.cfg
@@ -0,0 +1,9 @@
+Package test
+Style AllStatic
+JavaClass BindingTest
+JavaOutputDir java
+NativeOutputDir native
+
+CustomCCode #include "test.h"
+
+Import com.jogamp.common.nio.* \ No newline at end of file
diff --git a/test/junit/com/jogamp/gluegen/test.h b/test/junit/com/jogamp/gluegen/test.h
new file mode 100644
index 0000000..cef2b7e
--- /dev/null
+++ b/test/junit/com/jogamp/gluegen/test.h
@@ -0,0 +1,17 @@
+#define GL_INVALID_INDEX 0xFFFFFFFFu
+#define AL_FLANGER_DEFAULT_FEEDBACK (-0.5f)
+
+typedef unsigned long foo;
+typedef unsigned long size_t;
+
+int arrayTest(long context, foo * array );
+
+int bufferTest(void * object);
+
+void pbTest(size_t * object);
+
+int manyBuffersTest(void * object1, void * object2, void * object3, void * object4, void * object5);
+
+int mixedTest(long context, void * object, foo * array );
+
+int doubleTest(long context, void * object1, foo * array1, void * object2, foo * array2 );