Move the C++ Listener from a patch against cppunit to a usable external module for...
authorRobert Collins <robertc@robertcollins.net>
Sat, 3 Oct 2009 13:33:53 +0000 (23:33 +1000)
committerRobert Collins <robertc@robertcollins.net>
Sat, 3 Oct 2009 13:33:53 +0000 (23:33 +1000)
.bzrignore
Makefile.am
NEWS
README
c++/README
c++/SubunitTestProgressListener.cpp [new file with mode: 0644]
c++/SubunitTestProgressListener.h [new file with mode: 0644]
c++/cppunit-subunit-1.10.2.patch [deleted file]
configure.ac
libcppunit_subunit.pc.in [new file with mode: 0644]

index 59334ac5ae6c1b7ffce2662466d793ec58630364..ac34aa19364c9c2cb0675cedec7920701b11f4c5 100644 (file)
@@ -21,10 +21,12 @@ py-compile
 .libs
 *.lo
 libsubunit.la
+libcppunit_subunit.la
 subunit-0.0.1.tar.gz
 libtool
 stamp-h1
 libsubunit.pc
+libcppunit_subunit.pc
 config.log
 config.status
 Makefile
index f6a4eff174a0a5802849c697f1db2d8ea7d6f943..58068e168d5ceb6f93b12a6b232e400a45880cc5 100644 (file)
@@ -39,6 +39,9 @@ ACLOCAL_AMFLAGS = -I m4
 SUBUNIT_CFLAGS = -Wall -Werror -Wextra -Wstrict-prototypes -Wmissing-prototypes \
        -Wwrite-strings -Wno-variadic-macros -I$(top_srcdir)/c/include
 AM_CFLAGS = $(SUBUNIT_CFLAGS)
+SUBUNIT_CXXFLAGS = -Wall -Werror -Wextra -Wwrite-strings -Wno-variadic-macros \
+       -I$(top_srcdir)/c/include
+AM_CXXFLAGS = $(SUBUNIT_CXXFLAGS)
 
 include_subunitdir = $(includedir)/subunit
 
@@ -67,9 +70,11 @@ pkgpython_PYTHON = \
        python/subunit/test_results.py
 
 lib_LTLIBRARIES = libsubunit.la
+lib_LTLIBRARIES +=  libcppunit_subunit.la
 
 include_subunit_HEADERS = \
-       c/include/subunit/child.h
+       c/include/subunit/child.h \
+       c++/SubunitTestProgressListener.h
 
 check_PROGRAMS = \
        c/tests/test_child
@@ -81,6 +86,10 @@ libsubunit_la_SOURCES = \
        c/lib/child.c \
        c/include/subunit/child.h
 
+libcppunit_subunit_la_SOURCES = \
+       c++/SubunitTestProgressListener.cpp \
+       c++/SubunitTestProgressListener.h
+
 tests_LDADD = @CHECK_LIBS@ $(top_builddir)/libsubunit.la
 c_tests_test_child_CFLAGS = $(SUBUNIT_CFLAGS) @CHECK_CFLAGS@
 c_tests_test_child_LDADD = $(tests_LDADD)
diff --git a/NEWS b/NEWS
index addf7fa8f7448267c0f795c7c60253bce9c5a69d..162e330669a8d86fee1f1e217ff945ef8de7dde3 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -13,6 +13,9 @@ subunit release notes
 
   IMPROVEMENTS:
 
+    * CPPUnit is now directly supported: subunit builds a cppunit listener
+      ``libcppunit-subunit``. 
+
     * INSTALLDIRS can be set to control the perl MakeMaker 'INSTALLDIRS'
       viarable when installing.
 
diff --git a/README b/README
index 118fc37b597e1e785325db7965fb27f67c224550..a48c638eb41c60c1b90811cc177ea425b3d79774 100644 (file)
--- a/README
+++ b/README
@@ -18,7 +18,6 @@
   subunit reuses iso8601 by Michael Twomey, distributed under an MIT style
   licence - see python/iso8601/LICENSE for details.
 
-
 Subunit
 -------
 
@@ -86,8 +85,8 @@ more details.
 C++
 ===
 
-C++ uses the C bindings and includes a patch for cppunit. See 'c++/README' for
-details.
+The C library is includable and usable directly from C++. A TestListener for
+CPPUnit is included in the Subunit distribution. See 'c++/README' for details.
 
 shell
 =====
index 3fd085c471031fae2c10c8ffb5e800f2568d5cd6..7b8184400ea37023c236a9338049e1b3e40c7aec 100644 (file)
 #
 
 Currently there are no native C++ bindings for subunit. However the C library
-can be used from C++ safely. There is also a patch for cppunit
-(http://cppunit.sourceforge.net/) to enable reporting via subunit
-(cppunit-subunit-1.10.2.patch).
-
-To use the patch, apply it and rebuild your cppunit. Then in your main do
-{
-  // Create the event manager and test controller
-  CPPUNIT_NS::TestResult controller;
-
-  // Add a listener that collects test result
-  // so we can get the overall status.
-  // note this isn't needed for subunit...
-  CPPUNIT_NS::TestResultCollector result;
-  controller.addListener( &result );
-
-  // Add a listener that print test activity in subunit format.
-  CPPUNIT_NS::SubunitTestProgressListener progress;
-  controller.addListener( &progress );
-
-  // Add the top suite to the test runner
-  CPPUNIT_NS::TestRunner runner;
-  runner.addTest( CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest() );
-  runner.run( controller );
-
-  return result.wasSuccessful() ? 0 : 1;
-}
-
-
-See the c/README for documentation on the C bindings for subunit.
+can be used from C++ safely. A CPPUnit listener is built as part of Subunit to
+allow CPPUnit users to simply get Subunit output.
+
+To use the listener, use pkg-config (or your preferred replacement) to get the
+cflags and link settings from libcppunit_subunit.pc.
+
+In your test driver main, use SubunitTestProgressListener, as shown in this
+example main::
+
+  {
+    // Create the event manager and test controller
+    CPPUNIT_NS::TestResult controller;
+  
+    // Add a listener that collects test result
+    // so we can get the overall status.
+    // note this isn't needed for subunit...
+    CPPUNIT_NS::TestResultCollector result;
+    controller.addListener( &result );
+  
+    // Add a listener that print test activity in subunit format.
+    CPPUNIT_NS::SubunitTestProgressListener progress;
+    controller.addListener( &progress );
+  
+    // Add the top suite to the test runner
+    CPPUNIT_NS::TestRunner runner;
+    runner.addTest( CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest() );
+    runner.run( controller );
+  
+    return result.wasSuccessful() ? 0 : 1;
+  }
diff --git a/c++/SubunitTestProgressListener.cpp b/c++/SubunitTestProgressListener.cpp
new file mode 100644 (file)
index 0000000..76cd9e1
--- /dev/null
@@ -0,0 +1,63 @@
+/*  Subunit test listener for cppunit (http://cppunit.sourceforge.net).
+ *  Copyright (C) 2006  Robert Collins <robertc@robertcollins.net>
+ *
+ *  Licensed under either the Apache License, Version 2.0 or the BSD 3-clause
+ *  license at the users choice. A copy of both licenses are available in the
+ *  project source as Apache-2.0 and BSD. You may not use this file except in
+ *  compliance with one of these two licences.
+ *  
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under these licenses is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the license you chose for the specific language governing permissions
+ *  and limitations under that license.
+ */
+
+#include <cppunit/Exception.h>
+#include <cppunit/Test.h>
+#include <cppunit/TestFailure.h>
+#include <cppunit/TextOutputter.h>
+#include <iostream>
+
+// Have to be able to import the public interface without config.h.
+#include "SubunitTestProgressListener.h"
+#include "config.h"
+#include "subunit/child.h"
+
+
+CPPUNIT_NS_BEGIN
+
+
+void 
+SubunitTestProgressListener::startTest( Test *test )
+{
+  subunit_test_start(test->getName().c_str());
+  last_test_failed = false;
+}
+
+void 
+SubunitTestProgressListener::addFailure( const TestFailure &failure )
+{
+  std::ostringstream capture_stream;
+  TextOutputter outputter(NULL, capture_stream);
+  outputter.printFailureLocation(failure.sourceLine());
+  outputter.printFailureDetail(failure.thrownException());
+
+  if (failure.isError())
+      subunit_test_error(failure.failedTestName().c_str(),
+                        capture_stream.str().c_str());
+  else
+      subunit_test_fail(failure.failedTestName().c_str(),
+                        capture_stream.str().c_str());
+  last_test_failed = true;
+}
+
+void 
+SubunitTestProgressListener::endTest( Test *test)
+{
+  if (!last_test_failed)
+      subunit_test_pass(test->getName().c_str());
+}
+
+
+CPPUNIT_NS_END
diff --git a/c++/SubunitTestProgressListener.h b/c++/SubunitTestProgressListener.h
new file mode 100644 (file)
index 0000000..5206d83
--- /dev/null
@@ -0,0 +1,56 @@
+/*  Subunit test listener for cppunit (http://cppunit.sourceforge.net).
+ *  Copyright (C) 2006  Robert Collins <robertc@robertcollins.net>
+ *
+ *  Licensed under either the Apache License, Version 2.0 or the BSD 3-clause
+ *  license at the users choice. A copy of both licenses are available in the
+ *  project source as Apache-2.0 and BSD. You may not use this file except in
+ *  compliance with one of these two licences.
+ *  
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under these licenses is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the license you chose for the specific language governing permissions
+ *  and limitations under that license.
+ */
+#ifndef CPPUNIT_SUBUNITTESTPROGRESSLISTENER_H
+#define CPPUNIT_SUBUNITTESTPROGRESSLISTENER_H
+
+#include <cppunit/TestListener.h>
+
+
+CPPUNIT_NS_BEGIN
+
+
+/*! 
+ * \brief TestListener that outputs subunit
+ * (http://www.robertcollins.net/unittest/subunit) compatible output.
+ * \ingroup TrackingTestExecution
+ */
+class CPPUNIT_API SubunitTestProgressListener : public TestListener
+{
+public:
+  SubunitTestProgressListener() {}
+  
+  void startTest( Test *test );
+
+  void addFailure( const TestFailure &failure );
+
+  void endTest( Test *test );
+
+private:
+  /// Prevents the use of the copy constructor.
+  SubunitTestProgressListener( const SubunitTestProgressListener &copy );
+
+  /// Prevents the use of the copy operator.
+  void operator =( const SubunitTestProgressListener &copy );
+
+private:
+  int last_test_failed;
+};
+
+
+CPPUNIT_NS_END
+
+#endif  // CPPUNIT_SUBUNITTESTPROGRESSLISTENER_H
+
diff --git a/c++/cppunit-subunit-1.10.2.patch b/c++/cppunit-subunit-1.10.2.patch
deleted file mode 100644 (file)
index b3c353b..0000000
+++ /dev/null
@@ -1,134 +0,0 @@
-diff -u cppunit-1.10.2/src/cppunit/Makefile.am cppunit-1.10.2/src/cppunit/Makefile.am
---- cppunit-1.10.2/src/cppunit/Makefile.am
-+++ cppunit-1.10.2/src/cppunit/Makefile.am
-@@ -28,6 +28,7 @@
-   ProtectorChain.cpp \
-   SourceLine.cpp \
-   StringTools.cpp \
-+  SubunitTestProgressListener.cpp \
-   SynchronizedObject.cpp \
-   Test.cpp \
-   TestAssert.cpp \
-@@ -74,0 +76,2 @@
-+
-+LIBRARY_LIBADD = $(LIBS)
---- cppunit-1.10.2.orig/src/cppunit/SubunitTestProgressListener.cpp
-+++ cppunit-1.10.2/src/cppunit/SubunitTestProgressListener.cpp
-@@ -0,0 +1,50 @@
-+#include <cppunit/Exception.h>
-+#include <cppunit/Test.h>
-+#include <cppunit/TestFailure.h>
-+#include <cppunit/SubunitTestProgressListener.h>
-+#include <cppunit/TextOutputter.h>
-+#include <iostream>
-+
-+#include "config.h"
-+#ifdef HAVE_LIBSUBUNIT
-+#include <subunit/child.h>
-+
-+
-+CPPUNIT_NS_BEGIN
-+
-+
-+void 
-+SubunitTestProgressListener::startTest( Test *test )
-+{
-+  subunit_test_start(test->getName().c_str());
-+  last_test_failed = false;
-+}
-+
-+void 
-+SubunitTestProgressListener::addFailure( const TestFailure &failure )
-+{
-+  std::ostringstream capture_stream;
-+  TextOutputter outputter(NULL, capture_stream);
-+  outputter.printFailureLocation(failure.sourceLine());
-+  outputter.printFailureDetail(failure.thrownException());
-+
-+  if (failure.isError())
-+      subunit_test_error(failure.failedTestName().c_str(),
-+                       capture_stream.str().c_str());
-+  else
-+      subunit_test_fail(failure.failedTestName().c_str(),
-+                        capture_stream.str().c_str());
-+  last_test_failed = true;
-+}
-+
-+void 
-+SubunitTestProgressListener::endTest( Test *test)
-+{
-+  if (!last_test_failed)
-+      subunit_test_pass(test->getName().c_str());
-+}
-+
-+
-+CPPUNIT_NS_END
-+
-+#endif
---- cppunit-1.10.2.orig/configure.in
-+++ cppunit-1.10.2/configure.in
-@@ -65,6 +65,8 @@
- # check for doxygen
- BB_ENABLE_DOXYGEN
-+# check for subunit
-+AC_CHECK_LIB(subunit, subunit_test_start)
- # Check for headers
- # Note that the fourth argument to AC_CHECK_HEADERS is non-empty to force
---- cppunit-1.10.2.orig/include/cppunit/Makefile.am
-+++ cppunit-1.10.2/include/cppunit/Makefile.am
-@@ -15,6 +15,7 @@
-       Portability.h \
-       Protector.h \
-       SourceLine.h \
-+      SubunitTestProgressListener.h \
-       SynchronizedObject.h \
-       Test.h \
-       TestAssert.h \
-only in patch2:
-unchanged:
---- cppunit-1.10.2.orig/include/cppunit/SubunitTestProgressListener.h
-+++ cppunit-1.10.2/include/cppunit/SubunitTestProgressListener.h
-@@ -0,0 +1,41 @@
-+#ifndef CPPUNIT_SUBUNITTESTPROGRESSLISTENER_H
-+#define CPPUNIT_SUBUNITTESTPROGRESSLISTENER_H
-+
-+#include <cppunit/TestListener.h>
-+
-+
-+CPPUNIT_NS_BEGIN
-+
-+
-+/*! 
-+ * \brief TestListener that outputs subunit
-+ * (http://www.robertcollins.net/unittest/subunit) compatible output.
-+ * \ingroup TrackingTestExecution
-+ */
-+class CPPUNIT_API SubunitTestProgressListener : public TestListener
-+{
-+public:
-+ 
-+  SubunitTestProgressListener() {}
-+  
-+  void startTest( Test *test );
-+
-+  void addFailure( const TestFailure &failure );
-+
-+  void endTest( Test *test );
-+
-+private:
-+  /// Prevents the use of the copy constructor.
-+  SubunitTestProgressListener( const SubunitTestProgressListener &copy );
-+
-+  /// Prevents the use of the copy operator.
-+  void operator =( const SubunitTestProgressListener &copy );
-+
-+private:
-+  int last_test_failed;
-+};
-+
-+
-+CPPUNIT_NS_END
-+
-+#endif  // CPPUNIT_SUBUNITTESTPROGRESSLISTENER_H
index f95071704667022ea843ea4cb309dad5e13ad816..76a91a48e893bb5907cb9e3a4854b1abfff4fe1b 100644 (file)
@@ -18,6 +18,7 @@ AC_SUBST([SUBUNIT_MICRO_VERSION])
 AC_SUBST([SUBUNIT_VERSION])
 AC_USE_SYSTEM_EXTENSIONS
 AC_PROG_CC
+AC_PROG_CXX
 AM_PROG_CC_C_O
 AC_PROG_INSTALL
 AC_PROG_LN_S
@@ -46,11 +47,14 @@ AC_FUNC_REALLOC
 # Easier memory management.
 # C unit testing.
 PKG_CHECK_MODULES([CHECK], [check >= 0.9.4])
+# C++ unit testing.
+PKG_CHECK_MODULES([CPPUNIT], [cppunit])
 
 # Output files
 AC_CONFIG_HEADERS([config.h])
 
 AC_CONFIG_FILES([libsubunit.pc
+                libcppunit_subunit.pc
                  Makefile
                 perl/Makefile.PL
                  ])
diff --git a/libcppunit_subunit.pc.in b/libcppunit_subunit.pc.in
new file mode 100644 (file)
index 0000000..98982c7
--- /dev/null
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: cppunit subunit listener
+Description: Subunit output listener for the CPPUnit test library.
+URL: http://launchpad.net/subunit
+Version: @VERSION@
+Libs: -L${libdir} -lsubunit
+Cflags: -I${includedir}