diff --git a/LibClang.cabal b/LibClang.cabal
--- a/LibClang.cabal
+++ b/LibClang.cabal
@@ -1,6 +1,6 @@
 Name: LibClang
 Cabal-version: >= 1.6
-Version: 0.0.7
+Version: 0.0.8
 Author: Chetan Taralekar <chetant@gmail.com>
 Maintainer: Chetan Taralekar <chetant@gmail.com>
 Homepage: https://github.com/chetant/LibClang/issues
@@ -26,7 +26,7 @@
 
 Category: Language
 Build-type: Configure
-Extra-Source-Files: configure, LibClang.buildinfo.in
+Extra-Source-Files: configure, LibClang.buildinfo.in, test/Makefile.in, test/*.hs, test/*.c, test/runTest.sh
 Source-Repository head
   type: git
   location: git://github.com/chetant/LibClang.git
diff --git a/test/Makefile.in b/test/Makefile.in
new file mode 100644
--- /dev/null
+++ b/test/Makefile.in
@@ -0,0 +1,22 @@
+CC=@CC@
+CFLAGS=-std=gnu99 @CFLAGS@
+LDFLAGS=@LDFLAGS@
+
+all: Test_Diagnostics_c Test_Diagnostics_hs Test_InclusionVisitor_c Test_InclusionVisitor_hs Test_ChildVisitor_c Test_ChildVisitor_hs
+
+test: all
+	@echo "########### TESTING ##############"
+	@./runTest.sh Test_Diagnostics $(CFLAGS) Test_Diagnostics.c
+	@./runTest.sh Test_InclusionVisitor $(CFLAGS) Test_InclusionVisitor.c
+	@./runTest.sh Test_ChildVisitor $(CFLAGS) Test_ChildVisitor.c
+
+%_c : %.c
+	$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $<
+
+%_hs : %.hs
+	ghc -o $@ $<
+
+clean:
+	rm *_c *_hs *.o *.hi
+
+.PHONY = all clean test
diff --git a/test/Test_ChildVisitor.c b/test/Test_ChildVisitor.c
new file mode 100644
--- /dev/null
+++ b/test/Test_ChildVisitor.c
@@ -0,0 +1,23 @@
+#include <clang-c/Index.h>
+
+enum CXChildVisitResult visitor(CXCursor cursor, CXCursor parent, CXClientData data)
+{
+  CXType type = clang_getCursorType(cursor);
+  CXString str = clang_getTypeKindSpelling(type.kind);
+  printf("Type:%s\n", clang_getCString(str));
+  clang_disposeString(str);
+  return CXChildVisit_Continue;
+}
+
+int main(int argc, char * argv[])
+{
+  CXIndex index = clang_createIndex(0, 0);
+  CXTranslationUnit txUnit = clang_parseTranslationUnit(index, 0, argv, argc, 0, 0, CXTranslationUnit_None);
+
+  CXCursor cur = clang_getTranslationUnitCursor(txUnit);
+  clang_visitChildren(cur, visitor, NULL);
+
+  clang_disposeTranslationUnit(txUnit);
+  clang_disposeIndex(index);
+  return 0;
+}
diff --git a/test/Test_ChildVisitor.hs b/test/Test_ChildVisitor.hs
new file mode 100644
--- /dev/null
+++ b/test/Test_ChildVisitor.hs
@@ -0,0 +1,24 @@
+import System(getArgs)
+import Data.Maybe(maybe)
+import Control.Monad((<=<))
+import Control.Applicative((<$>))
+import Clang.TranslationUnit(withCreateIndex, withParse, TranslationUnitFlags(..))
+import Clang.Traversal(visitChildren, ChildVisitResult(..))
+import Clang.Cursor(getTranslationUnitCursor)
+import Clang.Traversal(ChildVisitor, ChildVisitResult(..))
+import qualified Clang.FFI as FFI
+import Foreign.Ptr(nullPtr)
+
+visitor :: ChildVisitor
+visitor c p d = do
+  tk <- FFI.getTypeKind <$> FFI.getCursorType c
+  str <- (FFI.getCString <=< FFI.getTypeKindSpelling) tk
+  putStrLn $ "Type:" ++ str
+  return ChildVisit_Continue
+
+test tu = visitChildren (getTranslationUnitCursor tu) visitor nullPtr
+
+main = do
+  (arg:args) <- getArgs
+  withCreateIndex False False $ \index -> 
+      withParse index (Just arg) args [] [TranslationUnit_None] test (error "No TXUnit!")
diff --git a/test/Test_Diagnostics.c b/test/Test_Diagnostics.c
new file mode 100644
--- /dev/null
+++ b/test/Test_Diagnostics.c
@@ -0,0 +1,21 @@
+#include <clang-c/Index.h>
+
+int main(int argc, char * argv[])
+{
+  CXIndex index = clang_createIndex(0, 0);
+  CXTranslationUnit txUnit = clang_parseTranslationUnit(index, 0, argv, argc, 0, 0, CXTranslationUnit_None);
+
+  unsigned n = clang_getNumDiagnostics(txUnit);
+  /* printf("numDiags:%d\n", n); */
+  for(unsigned i = 0, n = clang_getNumDiagnostics(txUnit); i != n; ++i)
+  {
+    CXDiagnostic diag = clang_getDiagnostic(txUnit, i);
+    CXString str = clang_formatDiagnostic(diag, clang_defaultDiagnosticDisplayOptions());
+    printf("Diag:%s\n", clang_getCString(str));
+    clang_disposeString(str);
+  }
+
+  clang_disposeTranslationUnit(txUnit);
+  clang_disposeIndex(index);
+  return 0;
+}
diff --git a/test/Test_Diagnostics.hs b/test/Test_Diagnostics.hs
new file mode 100644
--- /dev/null
+++ b/test/Test_Diagnostics.hs
@@ -0,0 +1,17 @@
+import System(getArgs)
+import Control.Monad(when)
+import Data.Maybe(fromJust, isNothing)
+import qualified Clang.TranslationUnit as Clang
+import qualified Clang.Diagnostic as Diagnostic
+
+test tu = do
+  let diags = Diagnostic.getDiagnostics tu
+      printDiag d = Diagnostic.formatDiagnostic Diagnostic.getDefaultDisplayOptions d >>=
+                    putStrLn . ("Diag:" ++)
+  -- putStrLn $ "numDiags:" ++ show (length diags)
+  mapM_ printDiag diags
+
+main = do
+  (arg:args) <- getArgs
+  Clang.withCreateIndex False False $ \index -> 
+      Clang.withParse index (Just arg) args [] [Clang.TranslationUnit_None] test (error "No TXUnit!")
diff --git a/test/Test_Diagnostics_FFI.hs b/test/Test_Diagnostics_FFI.hs
new file mode 100644
--- /dev/null
+++ b/test/Test_Diagnostics_FFI.hs
@@ -0,0 +1,20 @@
+import System(getArgs)
+import Data.Maybe(fromJust, isJust)
+import qualified Clang.FFI as Clang
+-- import qualified Clang.TranslationUnit as Clang
+-- import qualified Clang.Diagnostic as Diagnostic
+
+main = do
+  args <- getArgs
+  index <- Clang.createIndex False False
+  mtu <- Clang.parseTranslationUnit index Nothing args [] 0
+  let tu = if isJust mtu then fromJust mtu else error "No TXUnit!"
+  defDisplayOpts <- Clang.defaultDiagnosticDisplayOptions
+  let printDiag i = do
+         diag <- Clang.getDiagnostic tu i
+         clstr <- Clang.formatDiagnostic diag defDisplayOpts
+         str <- Clang.getCString clstr
+         putStrLn $ "Diag:" ++ str
+  numDiags <- Clang.getNumDiagnostics tu
+  putStrLn $ "numDiags:" ++ show numDiags
+  mapM_ printDiag [0..numDiags]
diff --git a/test/Test_InclusionVisitor.c b/test/Test_InclusionVisitor.c
new file mode 100644
--- /dev/null
+++ b/test/Test_InclusionVisitor.c
@@ -0,0 +1,20 @@
+#include <clang-c/Index.h>
+
+void inclusionVisitor(CXFile file, CXSourceLocation * srcLocs, unsigned numSrcLocs, CXClientData data)
+{
+  CXString fname = clang_getFileName(file);
+  printf("Included:%s\n",clang_getCString(fname));
+  clang_disposeString(fname);
+}
+
+int main(int argc, char * argv[])
+{
+  CXIndex index = clang_createIndex(0, 0);
+  CXTranslationUnit txUnit = clang_parseTranslationUnit(index, 0, argv, argc, 0, 0, CXTranslationUnit_None);
+
+  clang_getInclusions(txUnit, inclusionVisitor, NULL);
+
+  clang_disposeTranslationUnit(txUnit);
+  clang_disposeIndex(index);
+  return 0;
+}
diff --git a/test/Test_InclusionVisitor.hs b/test/Test_InclusionVisitor.hs
new file mode 100644
--- /dev/null
+++ b/test/Test_InclusionVisitor.hs
@@ -0,0 +1,18 @@
+import System(getArgs)
+import Control.Monad(when)
+import Data.Maybe(fromJust, isNothing)
+import qualified Clang.FFI as FFI
+import qualified Clang.TranslationUnit as Clang
+import qualified Clang.Source as Clang
+import Foreign.Ptr(nullPtr)
+
+printInclusions f sls p = do
+  name <- FFI.getFileName f
+  putStrLn $ "Included:" ++ show name
+
+test tu = FFI.getInclusions tu printInclusions nullPtr
+
+main = do
+  (arg:args) <- getArgs
+  Clang.withCreateIndex False False $ \index -> 
+      Clang.withParse index (Just arg) args [] [Clang.TranslationUnit_None] test (error "No TXUnit!")
diff --git a/test/runTest.sh b/test/runTest.sh
new file mode 100644
--- /dev/null
+++ b/test/runTest.sh
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+TEST=$1
+CTEST=${TEST}_c
+HSTEST=${TEST}_hs
+shift
+
+TMPFILE_C=`mktemp`
+TMPFILE_HS=`mktemp`
+./$CTEST $* | grep -v "'linker' input unused" > $TMPFILE_C
+./$HSTEST $* > $TMPFILE_HS
+if [ -n "`diff $TMPFILE_C $TMPFILE_HS`" ]
+then
+  echo FAILED: $TEST refOutput:$TMPFILE_C testOutput:$TMPFILE_HS
+else
+  echo SUCCESS: $TEST
+  rm $TMPFILE_HS $TMPFILE_C
+fi
