From de745f71cff330f37637c73d44c30acfb6f70a93 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Remko=20Tron=C3=A7on?= <git@el-tramo.be>
Date: Fri, 17 Jul 2009 21:16:53 +0200
Subject: Extended CppUnit checker to have test selection.


diff --git a/3rdParty/CppUnit/Makefile.inc b/3rdParty/CppUnit/Makefile.inc
index 3c94d1f..27aadc2 100644
--- a/3rdParty/CppUnit/Makefile.inc
+++ b/3rdParty/CppUnit/Makefile.inc
@@ -5,6 +5,7 @@ CPPUNIT_TARGET = 3rdParty/CppUnit/CppUnit.a
 CPPUNIT_SOURCES = \
   3rdParty/CppUnit/src/TextTestRunner.cpp \
   3rdParty/CppUnit/src/TextTestProgressListener.cpp \
+  3rdParty/CppUnit/src/BriefTestProgressListener.cpp \
   3rdParty/CppUnit/src/TextOutputter.cpp \
   3rdParty/CppUnit/src/XmlOutputter.cpp \
   3rdParty/CppUnit/src/XmlElement.cpp \
diff --git a/3rdParty/CppUnit/cppunit/BriefTestProgressListener.h b/3rdParty/CppUnit/cppunit/BriefTestProgressListener.h
new file mode 100644
index 0000000..137ca44
--- /dev/null
+++ b/3rdParty/CppUnit/cppunit/BriefTestProgressListener.h
@@ -0,0 +1,43 @@
+#ifndef CPPUNIT_BRIEFTESTPROGRESSLISTENER_H
+#define CPPUNIT_BRIEFTESTPROGRESSLISTENER_H
+
+#include <cppunit/TestListener.h>
+
+
+CPPUNIT_NS_BEGIN
+
+
+/*! \brief TestListener that prints the name of each test before running it.
+ * \ingroup TrackingTestExecution
+ */
+class CPPUNIT_API BriefTestProgressListener : public TestListener
+{
+public:
+  /*! Constructs a BriefTestProgressListener object.
+   */
+  BriefTestProgressListener();
+
+  /// Destructor.
+  virtual ~BriefTestProgressListener();
+
+  void startTest( Test *test );
+
+  void addFailure( const TestFailure &failure );
+
+  void endTest( Test *test );
+
+private:
+  /// Prevents the use of the copy constructor.
+  BriefTestProgressListener( const BriefTestProgressListener &copy );
+
+  /// Prevents the use of the copy operator.
+  void operator =( const BriefTestProgressListener &copy );
+
+private:
+  bool m_lastTestFailed;
+};
+
+
+CPPUNIT_NS_END
+
+#endif  // CPPUNIT_BRIEFTESTPROGRESSLISTENER_H
diff --git a/3rdParty/CppUnit/src/BriefTestProgressListener.cpp b/3rdParty/CppUnit/src/BriefTestProgressListener.cpp
new file mode 100644
index 0000000..c38cea0
--- /dev/null
+++ b/3rdParty/CppUnit/src/BriefTestProgressListener.cpp
@@ -0,0 +1,49 @@
+#include <cppunit/BriefTestProgressListener.h>
+#include <cppunit/Test.h>
+#include <cppunit/TestFailure.h>
+#include <cppunit/portability/Stream.h>
+
+
+CPPUNIT_NS_BEGIN
+
+
+BriefTestProgressListener::BriefTestProgressListener()
+    : m_lastTestFailed( false )
+{
+}
+
+
+BriefTestProgressListener::~BriefTestProgressListener()
+{
+}
+
+
+void 
+BriefTestProgressListener::startTest( Test *test )
+{
+  stdCOut() << test->getName();
+  stdCOut().flush();
+
+  m_lastTestFailed = false;
+}
+
+
+void 
+BriefTestProgressListener::addFailure( const TestFailure &failure )
+{
+  stdCOut() << " : " << (failure.isError() ? "error" : "assertion");
+  m_lastTestFailed  = true;
+}
+
+
+void 
+BriefTestProgressListener::endTest( Test *test )
+{
+  if ( !m_lastTestFailed )
+    stdCOut()  <<  " : OK";
+  stdCOut() << "\n";
+}
+
+
+CPPUNIT_NS_END
+
diff --git a/QA/UnitTest/checker.cpp b/QA/UnitTest/checker.cpp
index ea4f0d9..b59cea6 100644
--- a/QA/UnitTest/checker.cpp
+++ b/QA/UnitTest/checker.cpp
@@ -3,14 +3,71 @@
 #include <cppunit/extensions/TestFactoryRegistry.h>
 #include <cppunit/XmlOutputter.h>
 #include <cppunit/TextTestResult.h>
+#include <cppunit/BriefTestProgressListener.h>
+#include <cppunit/TextTestProgressListener.h>
+#include <cppunit/TextOutputter.h>
 
-int main(int argc, char* argv[])
-{
-	CppUnit::TestFactoryRegistry& registry = CppUnit::TestFactoryRegistry::getRegistry();
-	CppUnit::TextUi::TestRunner runner;
-	runner.addTest( registry.makeTest() );
-	if (argc >= 2 && std::string(argv[1]) != std::string("--xml")) {
-		runner.setOutputter(new CppUnit::XmlOutputter(&runner.result(), std::cout));
+int main(int argc, char* argv[]) {
+	bool verbose = false;
+	bool outputXML = false;
+
+	// Parse parameters
+	std::vector<std::string> testsToRun;
+	for (int i = 1; i < argc; ++i) {
+		std::string param(argv[i]);
+		if (param == "--verbose") {
+			verbose = true;
+		}
+		else if (param == "--xml") {
+			outputXML = true;
+		}
+		else {
+			testsToRun.push_back(param);
+		}
+	}
+	if (testsToRun.empty()) {
+		testsToRun.push_back("");
+	}
+
+	// Set up the listeners
+	CppUnit::TestResult controller;
+
+	CppUnit::TestResultCollector result;
+	controller.addListener(&result);
+
+	CppUnit::TextTestProgressListener progressListener;
+	CppUnit::BriefTestProgressListener verboseListener;
+	if (!outputXML) {
+		if (verbose) {
+			controller.addListener(&verboseListener);
+		}
+		else {
+			controller.addListener(&progressListener);
+		}
 	}
-	return (runner.run("") ? 0 : 1);
+
+	// Run the tests
+	CppUnit::TestRunner runner;
+	runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest());
+	for (std::vector<std::string>::const_iterator i = testsToRun.begin(); i != testsToRun.end(); ++i) {
+		try {
+			runner.run(controller, *i);
+		}
+		catch (const std::exception& e) {
+			std::cerr << "Error: " << e.what() << std::endl;
+			return -1;
+		}
+	}
+
+	// Output the results
+	if (outputXML) {
+		CppUnit::XmlOutputter outputter(&result, std::cerr);
+		outputter.write();
+	}
+	else {
+		CppUnit::TextOutputter outputter(&result, std::cerr);
+		outputter.write();
+	}
+
+	return result.wasSuccessful() ? 0 : 1;
 }
-- 
cgit v0.10.2-6-g49f6