From 2a8f96d7dcce83d79f94931508b0dc2a7b53dd46 Mon Sep 17 00:00:00 2001
From: "Meredith L. Patterson" <mlp@thesmartpolitenerd.com>
Date: Wed, 1 Jan 2014 21:28:20 +0100
Subject: [PATCH] configuring java test generation

---
 .gitmodules                                   |  3 ++
 lib/tsgenjava.pl                              | 53 +++++++++++--------
 lib/{testgen.pl => tsparser.pl}               |  0
 src/bindings/haskell                          |  1 +
 src/bindings/java/SConscript                  |  5 +-
 .../com/upstandinghackers/hammer/Hammer.java  |  8 +--
 .../com/upstandinghackers/hammer/Parser.java  |  6 +++
 7 files changed, 48 insertions(+), 28 deletions(-)
 create mode 100644 .gitmodules
 rename lib/{testgen.pl => tsparser.pl} (100%)
 create mode 160000 src/bindings/haskell

diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 00000000..11288e0e
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "src/bindings/haskell"]
+	path = src/bindings/haskell
+	url = git://gitorious.org/hhammer/hhammer.git
diff --git a/lib/tsgenjava.pl b/lib/tsgenjava.pl
index 5773e610..7d6a8cee 100644
--- a/lib/tsgenjava.pl
+++ b/lib/tsgenjava.pl
@@ -15,10 +15,20 @@
 
 % TODO: build a Box-like pretty-printer
 
+% ch_range should become chRange
+underscore_to_camel([0'_, X|Xs], [Xp|Xsp]) :- !,
+    code_type(Xp, to_upper(X)),
+    underscore_to_camel(Xs,Xsp).
+underscore_to_camel([X|Xs],[X|Xsp]) :- !,
+    underscore_to_camel(Xs,Xsp).
+underscore_to_camel([],[]) :- !.
+				     
 format_parser_name(Name, Result) :-
-    atom_codes(Name, [CInit|CName]),
-    code_type(RInit, to_upper(CInit)),
-    append("Hammer.", [RInit|CName], Result), !.
+    atom_codes(Name, CName),
+    ( member(0'_, CName) -> 
+	  underscore_to_camel(CName, Result0);
+          CName = Result0),
+    append("Hammer.", Result0, Result), !.
 
 format_test_name(Name, Result) :-
     atom_codes(Name, [CInit|CName]),
@@ -99,16 +109,16 @@ pp_parser(A) -->
 pp_test_elem(decl, parser(_)) --> !.
 pp_test_elem(init, parser(_)) --> !.
 pp_test_elem(exec, parser(P)) -->
-    !, indent(3),
+    !, indent(2),
     "parser = ",
     pp_parser(P),
     ";\n".
 pp_test_elem(decl, subparser(Name,_)) -->
-    !, indent(3),
+    !, indent(2),
     "IndirectParser ", pp_parser(ref(Name)),
     " = Hammer.Indirect();\n".
 pp_test_elem(init, subparser(Name, Parser)) -->
-    !, indent(3),
+    !, indent(2),
     pp_parser(ref(Name)), ".Bind(",
     pp_parser(Parser),
     ");\n".
@@ -118,15 +128,15 @@ pp_test_elem(init, test(_,_)) --> !.
 pp_test_elem(decl, testFail(_)) --> !.
 pp_test_elem(init, testFail(_)) --> !.
 pp_test_elem(exec, test(Str, Result)) -->
-    !, indent(3),
-    "  CheckParseOK(parser, ", pp_parser(string(Str)),
-    ", ",
+    !, indent(2),
+    "Assert.assertEquals(parser.parse(", pp_parser(string(Str)),
+    "), ",
     pp_parse_result(Result),
     ");\n".
 pp_test_elem(exec, testFail(Str)) -->
-    !, indent(3),
-    "  CheckParseFail(parser, ", pp_parser(string(Str)),
-    ");\n".
+    !, indent(2),
+    "Assert.assertNull(parser.parse(", pp_parser(string(Str)),
+    "));\n".
 
 % pp_test_elem(_, _) --> !.
 
@@ -151,7 +161,7 @@ pp_byte_seq_r([X|Xs]) --> !,
     pp_byte_seq_r(Xs).
 
 pp_parse_result(char(C)) --> !,
-    "(System.UInt64)",
+    "(byte)",
     pp_parser(char(C)).
 pp_parse_result(seq(Args)) --> !,
     "new object[]{ ", pp_result_seq(Args), "}".
@@ -178,14 +188,14 @@ pp_test_elems(Phase, [X|Xs]) -->
 
 pp_test_case(testcase(Name, Elems)) -->
     !,
-    indent(2), "[Test]\n",
+    indent(1), "@Test\n",
     { format_test_name(Name, TName) },
-    indent(2), "public void ", TName, "() {\n",
-    indent(3), "Parser parser;\n",
+    indent(1), "public void ", TName, "() {\n",
+    indent(2), "Parser parser;\n",
     pp_test_elems(decl, Elems),
     pp_test_elems(init, Elems),
     pp_test_elems(exec, Elems),
-    indent(2), "}\n".
+    indent(1), "}\n".
 
 
 pp_test_cases([]) --> !.
@@ -194,13 +204,10 @@ pp_test_cases([A|As]) -->
     pp_test_cases(As).
 
 pp_test_suite(Suite) -->
-    "namespace Hammer.Test {\n",
-    indent(1), "using NUnit.Framework;\n",
-    %indent(1), "using Hammer;\n",
-    indent(1), "[TestFixture]\n",
-    indent(1), "public partial class HammerTest {\n",
+    "package com.upstandinghackers.hammer; \n\n",
+    "import org.testng.annotations.*;\n\n",
+    "public class HammerTest {\n",
     pp_test_cases(Suite),
-    indent(1), "}\n",
     "}\n".
 
 gen_ts(Foo,Str) :-
diff --git a/lib/testgen.pl b/lib/tsparser.pl
similarity index 100%
rename from lib/testgen.pl
rename to lib/tsparser.pl
diff --git a/src/bindings/haskell b/src/bindings/haskell
new file mode 160000
index 00000000..332e242d
--- /dev/null
+++ b/src/bindings/haskell
@@ -0,0 +1 @@
+Subproject commit 332e242d6314d1a5b8aee7bde47dd4c080f9b4e6
diff --git a/src/bindings/java/SConscript b/src/bindings/java/SConscript
index 4690f501..26444c99 100644
--- a/src/bindings/java/SConscript
+++ b/src/bindings/java/SConscript
@@ -21,4 +21,7 @@ jni_headers = javaenv.JavaH(target = 'csrc', source = classes)
 native_src = PrependDir('csrc', csources)
 libhammer_java = javaenv.SharedLibrary('libjhammer', native_src, LIBS=['hammer'], LIBPATH='../../')
 hammer_jar = javaenv.Jar('hammer.jar', 'classes')
-Default(libhammer_java, hammer_jar)
\ No newline at end of file
+Default(libhammer_java, hammer_jar)
+
+javatestenv = javaenv.Clone()
+javatestenv['ENV']['LD_LIBRARY_PATH'] = os.path.dirname(str(libhammer_shared[0]))
diff --git a/src/bindings/java/jsrc/com/upstandinghackers/hammer/Hammer.java b/src/bindings/java/jsrc/com/upstandinghackers/hammer/Hammer.java
index 3e06a91e..4661e943 100644
--- a/src/bindings/java/jsrc/com/upstandinghackers/hammer/Hammer.java
+++ b/src/bindings/java/jsrc/com/upstandinghackers/hammer/Hammer.java
@@ -43,10 +43,10 @@ public class Hammer
     public static native Parser int32();
     public static native Parser int16();
     public static native Parser int8();
-    public static native Parser uInt64();
-    public static native Parser uInt32();
-    public static native Parser uInt16();
-    public static native Parser uInt8();
+    public static native Parser uint64();
+    public static native Parser uint32();
+    public static native Parser uint16();
+    public static native Parser uint8();
     public static native Parser whitespace(Parser p);
     public static native Parser left(Parser p, Parser q);
     public static native Parser right(Parser p, Parser q);
diff --git a/src/bindings/java/jsrc/com/upstandinghackers/hammer/Parser.java b/src/bindings/java/jsrc/com/upstandinghackers/hammer/Parser.java
index 2e924cb2..eb5f89bb 100644
--- a/src/bindings/java/jsrc/com/upstandinghackers/hammer/Parser.java
+++ b/src/bindings/java/jsrc/com/upstandinghackers/hammer/Parser.java
@@ -5,6 +5,12 @@ public class Parser
     public native void bindIndirect(Parser inner);
     public native void free();
     public long getInner() {return this.inner;}
+    public ParseResult parse(String input) {
+	return Hammer.parse(this, input.getBytes(), input.length());
+    }
+    public ParseResult parse(byte[] input, int length) {
+	return Hammer.parse(this, input, length);
+    }
 
     private long inner;
     Parser(long inner) {this.inner=inner;}
-- 
GitLab