Skip to content

Commit

Permalink
Add minimal tests for Java bindings (#345)
Browse files Browse the repository at this point in the history
All source is in one file for now and derived classes are created with factory methods.

Unsupported:
* Multiple base classes in a TU.
* Base class and ffig-module with a different name.
* Return of subobjects.

All of the above can be addressed in later PRs.

Expected output tests have been disabled as they become platform-dependent.
Platform handling does not belong in a jinja2 template long-term.
  • Loading branch information
jbcoe committed Feb 24, 2018
1 parent eca348b commit 9c8080f
Show file tree
Hide file tree
Showing 7 changed files with 128 additions and 173 deletions.
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,6 @@
[submodule "externals/catch2"]
path = externals/catch2
url = https://github.com/catchorg/Catch2.git
[submodule "externals/ffig-jars"]
path = externals/ffig-jars
url = https://github.com/FFIG/ffig-jars.git
135 changes: 90 additions & 45 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,8 @@ find_package(Java COMPONENTS Development)
if(NOT Java_FOUND)
message(STATUS "Java tests disabled: Java SDK not found.")
else()
list(APPEND all_ffig_bindings "JAVA")
include(UseJava)
# FIXME: append JAVA to all_ffig_bindings once we have a test.
endif()

# Look for Lua
Expand Down Expand Up @@ -137,29 +138,15 @@ ffig_add_library(NAME Tree
ffig_add_library(NAME Asset
INPUTS tests/input/Asset.h
LUA
PYTHON)
PYTHON
JAVA)

ffig_add_library(NAME Animal
INPUTS tests/input/Animal.h
PYTHON)

if(dotnet_FOUND)
include(dotnet)
set(CMAKE_DOTNET_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/generated)
add_dotnet_library(NAME ffig.net
DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/generated
SOURCES
${CMAKE_CURRENT_LIST_DIR}/tests/dotnet/TestShape.cs
${CMAKE_SOURCE_DIR}/tests/dotnet/TestTree.cs
${CMAKE_CURRENT_BINARY_DIR}/generated/Tree.cs
${CMAKE_CURRENT_BINARY_DIR}/generated/Tree.cs
${CMAKE_CURRENT_BINARY_DIR}/generated/Shape.cs
)
endif()

add_subdirectory(tests/src)

enable_testing()
add_subdirectory(tests/src)

# FIXME: Run custom clang tests until clang 5 is commonly available.
# clang 5 has our changes to cindex.py that enable Python3 support.
Expand Down Expand Up @@ -206,33 +193,19 @@ add_test(
set_property(TEST test_cpp_tree
PROPERTY LABELS CPP)

add_test(
NAME test_d_tree_output
COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_LIST_DIR}/scripts/pydiff.py
${CMAKE_CURRENT_LIST_DIR}/tests/expected_output/Tree.d.expected
${CMAKE_CURRENT_BINARY_DIR}/generated/Tree.d)
set_property(TEST test_d_tree_output
PROPERTY LABELS D TEXT)

add_test(
NAME test_swift_tree_output
COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_LIST_DIR}/scripts/pydiff.py
${CMAKE_CURRENT_LIST_DIR}/tests/expected_output/Tree.swift.expected
${CMAKE_CURRENT_BINARY_DIR}/generated/Tree.swift)
set_property(TEST test_swift_tree_output
PROPERTY LABELS SWIFT TEXT)

if(java_FOUND)
add_test(
NAME test_java_shape_output
COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_LIST_DIR}/scripts/pydiff.py
${CMAKE_CURRENT_LIST_DIR}/tests/expected_output/Shape.java.expected
${CMAKE_CURRENT_BINARY_DIR}/generated/Shape.java)
set_property(TEST test_java_shape_output
PROPERTY LABELS JAVA TEXT)
endif()

if(dotnet_FOUND)
include(dotnet)
set(CMAKE_DOTNET_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/generated)
add_dotnet_library(NAME ffig.net
DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/generated
SOURCES
${CMAKE_CURRENT_LIST_DIR}/tests/dotnet/TestShape.cs
${CMAKE_SOURCE_DIR}/tests/dotnet/TestTree.cs
${CMAKE_CURRENT_BINARY_DIR}/generated/Tree.cs
${CMAKE_CURRENT_BINARY_DIR}/generated/Tree.cs
${CMAKE_CURRENT_BINARY_DIR}/generated/Shape.cs
)

add_test(
NAME test_dotnet_shape_output
COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_LIST_DIR}/scripts/pydiff.py
Expand All @@ -259,6 +232,79 @@ if(dotnet_FOUND)
PROPERTY ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_CURRENT_BINARY_DIR}/generated")
endif()

if(Java_FOUND)
set(FFIG_JAR_PATH ${CMAKE_CURRENT_SOURCE_DIR}/externals/ffig-jars)

find_jar(JNA_JAR NAMES jna jna-4.5.1 PATHS ${FFIG_JAR_PATH})
if(NOT JNA_JAR)
message(FATAL_ERROR
"Could NOT find JNA library. "
"Run git submodules update --init to get JARs")
endif()

find_jar(JUNIT_JAR NAMES junit junit-4.12 PATHS ${FFIG_JAR_PATH})
if(NOT JUNIT_JAR)
message(FATAL_ERROR
"Could NOT find JUnit library. "
"Run git submodules update --init to get JARs")
endif()

find_jar(HAMCREST_JAR NAMES hamcrest hamcrest-all-1.3 PATHS ${FFIG_JAR_PATH})
if(NOT HAMCREST_JAR)
message(FATAL_ERROR
"Could NOT find Hamcrest library. "
"Run git submodules update --init to get JARs")
endif()

# FIXME: Move JAR creation to ffig.cmake - requires passing JAR_PATH.
add_jar(Asset
${CMAKE_CURRENT_BINARY_DIR}/generated/Asset.java
OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated
INCLUDE_JARS ${JNA_JAR})

add_jar(TestAsset
tests/java/TestAsset.java
OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated
INCLUDE_JARS
${JNA_JAR}
${JUNIT_JAR}
${CMAKE_CURRENT_BINARY_DIR}/generated/Asset.jar)

if(WIN32)
set(SEPARATOR ";")
else()
set(SEPARATOR ":")
endif()

add_test(
NAME test_java_asset
COMMAND echo ${Java_JAVA_EXECUTABLE}
-classpath ${JNA_JAR}${SEPARATOR}${JUNIT_JAR}${SEPARATOR}${HAMCREST_JAR}${SEPARATOR}${CMAKE_CURRENT_BINARY_DIR}/generated/Asset.jar${SEPARATOR}${CMAKE_CURRENT_BINARY_DIR}/generated/TestAsset.jar
org.junit.runner.JUnitCore TestAsset
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/generated)
set_property(TEST test_java_asset
PROPERTY LABELS JAVA)
set_property(TEST test_java_asset
PROPERTY ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_CURRENT_BINARY_DIR}/generated")
endif()

add_test(
NAME test_d_tree_output
COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_LIST_DIR}/scripts/pydiff.py
${CMAKE_CURRENT_LIST_DIR}/tests/expected_output/Tree.d.expected
${CMAKE_CURRENT_BINARY_DIR}/generated/Tree.d)
set_property(TEST test_d_tree_output
PROPERTY LABELS D TEXT)

add_test(
NAME test_swift_tree_output
COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_LIST_DIR}/scripts/pydiff.py
${CMAKE_CURRENT_LIST_DIR}/tests/expected_output/Tree.swift.expected
${CMAKE_CURRENT_BINARY_DIR}/generated/Tree.swift)
set_property(TEST test_swift_tree_output
PROPERTY LABELS SWIFT TEXT)


if(LuaJIT_FOUND)
# FIXME: The relative paths here (and in the lua test file) are very brittle.
add_test(
Expand All @@ -282,4 +328,3 @@ endif()
if(Go_FOUND AND NOT WIN32)
add_subdirectory(tests/go)
endif()

1 change: 1 addition & 0 deletions externals/ffig-jars
Submodule ffig-jars added at 0993ce
12 changes: 10 additions & 2 deletions ffig/filters/capi_filter.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from ffig.cppmodel import TypeKind
import platform

# CPP filter to cast type if required

Expand Down Expand Up @@ -290,8 +291,15 @@ def to_lua(t, v):
'Type {} has no defined Lua type restoration'.format(t.name))


def to_shared_lib(module):
return "lib{}_c.dylib".format(module.name)
def to_shared_lib(m):
name = platform.system()
if name == 'Darwin':
return 'lib{}_c.dylib'.format(m)
elif name == 'Windows':
return '{}_c.dll'.format(m)
else:
return 'lib{}_c.so'.format(m)
raise Exception("Unsupported platform {}".format(name))


def to_dotnet_c_param(arg):
Expand Down
5 changes: 3 additions & 2 deletions ffig/templates/java.tmpl
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
{% import 'java.macros' as java_macros %}
// This code was generated by FFIG <http://ffig.org>.
// Manual edits will be lost.
package org.ffig.{{module.name}}

import com.sun.jna.Library;
import com.sun.jna.Native;
Expand All @@ -12,8 +11,10 @@ import com.sun.jna.ptr.IntByReference;

interface {{module.name}}CLibrary extends Library
{
// FIXME: Handle different OSs in code rather than in the template.
// The JAR file should not be OS-specific.
{{module.name}}CLibrary INSTANCE = ({{module.name}}CLibrary)Native.loadLibrary(
"lib{{module.name}}_c.dylib", {{module.name}}CLibrary.class);
"{{module.name|to_shared_lib}}", {{module.name}}CLibrary.class);

void {{module.name}}_clear_error();

Expand Down
124 changes: 0 additions & 124 deletions tests/expected_output/Shape.java.expected

This file was deleted.

21 changes: 21 additions & 0 deletions tests/java/TestAsset.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import static org.junit.Assert.assertEquals;
import org.junit.Test;
//import org.ffig.Asset;

public class TestAsset {
@Test
public void CDOhasPVofZero()
{
Asset cdo = Asset.Asset_CDO_create();

assertEquals(99.99, cdo.value(), 0.0);
}

@Test
public void CDOisCalledCDO()
{
Asset cdo = Asset.Asset_CDO_create();

assertEquals(cdo.name(), "CDO");
}
}

0 comments on commit 9c8080f

Please sign in to comment.