[Libreoffice-commits] cppunit.git: Branch 'feature/cmake' - include/cppunit src/qttestrunner

Bernhard Sessler bernhard at burnsen.de
Mon Jan 6 08:36:39 PST 2014


 include/cppunit/ui/qt/QtTestRunner.h                |   98 +-
 src/qttestrunner/MostRecentTests.cpp                |   68 -
 src/qttestrunner/MostRecentTests.h                  |   62 -
 src/qttestrunner/QtTestFailure.cpp                  |   93 ++
 src/qttestrunner/QtTestFailure.h                    |   88 ++
 src/qttestrunner/QtTestListener.cpp                 |   29 
 src/qttestrunner/QtTestListener.h                   |   61 +
 src/qttestrunner/QtTestRunner.cpp                   |  112 +--
 src/qttestrunner/TestBrowser.cpp                    |   55 +
 src/qttestrunner/TestBrowser.h                      |   61 +
 src/qttestrunner/TestBrowser.ui                     |   88 ++
 src/qttestrunner/TestBrowserDlgImpl.cpp             |   83 --
 src/qttestrunner/TestBrowserDlgImpl.h               |   32 
 src/qttestrunner/TestFailureInfo.cpp                |   21 
 src/qttestrunner/TestFailureInfo.h                  |   43 -
 src/qttestrunner/TestFailureListViewItem.cpp        |   29 
 src/qttestrunner/TestFailureListViewItem.h          |   48 -
 src/qttestrunner/TestFailureTableModel.cpp          |  146 ++++
 src/qttestrunner/TestFailureTableModel.h            |   88 ++
 src/qttestrunner/TestListViewItem.cpp               |   27 
 src/qttestrunner/TestListViewItem.h                 |   43 -
 src/qttestrunner/TestRunnerDlgImpl.cpp              |  260 -------
 src/qttestrunner/TestRunnerDlgImpl.h                |   58 -
 src/qttestrunner/TestRunnerFailureEvent.cpp         |   28 
 src/qttestrunner/TestRunnerFailureEvent.h           |   48 -
 src/qttestrunner/TestRunnerModel.cpp                |  221 ------
 src/qttestrunner/TestRunnerModel.h                  |  154 ----
 src/qttestrunner/TestRunnerModelThreadInterface.cpp |    8 
 src/qttestrunner/TestRunnerModelThreadInterface.h   |   35 -
 src/qttestrunner/TestRunnerTestCaseRunEvent.cpp     |   26 
 src/qttestrunner/TestRunnerTestCaseRunEvent.h       |   45 -
 src/qttestrunner/TestRunnerThread.cpp               |   71 +-
 src/qttestrunner/TestRunnerThread.h                 |   77 +-
 src/qttestrunner/TestRunnerThreadEvent.cpp          |   19 
 src/qttestrunner/TestRunnerThreadEvent.h            |   37 -
 src/qttestrunner/TestRunnerThreadFinishedEvent.cpp  |   25 
 src/qttestrunner/TestRunnerThreadFinishedEvent.h    |   42 -
 src/qttestrunner/TestRunnerWindow.cpp               |   17 
 src/qttestrunner/TestRunnerWindow.h                 |   46 +
 src/qttestrunner/TestRunnerWindow.ui                |  228 ++++++
 src/qttestrunner/TestRunnerWindowPrivate.cpp        |  231 ++++++
 src/qttestrunner/TestRunnerWindowPrivate.h          |   64 +
 src/qttestrunner/qttestrunnerlib.pro                |  185 +----
 src/qttestrunner/testbrowserdlg.ui                  |  148 ----
 src/qttestrunner/testrunnerdlg.ui                   |  687 --------------------
 45 files changed, 1541 insertions(+), 2594 deletions(-)

New commits:
commit 3383bdf9639914bf85dfac4af9a32b18d62abbbc
Author: Bernhard Sessler <bernhard at burnsen.de>
Date:   Sun Dec 22 15:00:25 2013 +0100

    src/qttestrunner: Port Qt test runner to Qt4 / Qt5
    
    The codebase was (almost) completely recreated from scratch. The test
    runner now builds and runs with both Qt5 and Qt4 (>= 4.7.x).
    The qmake project file shipped with the old qt test runner was
    updated and can be used to build the library.
    
    Change-Id: Iaf8e773566189113fd45029240d3e3ebeaa60e50
    Signed-off-by: Bernhard Sessler <bernhard at burnsen.de>
    Reviewed-on: https://gerrit.libreoffice.org/7182
    Reviewed-by: Markus Mohrhard <markus.mohrhard at googlemail.com>
    Tested-by: Markus Mohrhard <markus.mohrhard at googlemail.com>

diff --git a/include/cppunit/ui/qt/QtTestRunner.h b/include/cppunit/ui/qt/QtTestRunner.h
index 4b6ab4e..169b91e 100644
--- a/include/cppunit/ui/qt/QtTestRunner.h
+++ b/include/cppunit/ui/qt/QtTestRunner.h
@@ -1,85 +1,69 @@
-// //////////////////////////////////////////////////////////////////////////
-// Header file TestRunner.h for class TestRunner
-// (c)Copyright 2000, Baptiste Lepilleur.
-// Created: 2001/09/19
-// //////////////////////////////////////////////////////////////////////////
-#ifndef CPPUNIT_QTUI_QTTESTRUNNER_H
-#define CPPUNIT_QTUI_QTTESTRUNNER_H
+#ifndef CPPUNIT_QTTESTRUNNER_H
+#define CPPUNIT_QTTESTRUNNER_H
 
-#include <cppunit/portability/CppUnitVector.h>
-#include "Config.h"
-
-CPPUNIT_NS_BEGIN
+#include <QScopedPointer>
 
+#include <cppunit/Portability.h>
+#include <cppunit/ui/qt/Config.h>
 
-  class Test;
-  class TestSuite;
+CPPUNIT_NS_BEGIN
 
+class Test;
 
-/*! 
- * \brief QT test runner.
+/*!
+ * \brief Qt test runner.
  * \ingroup ExecutingTest
  *
+ * This test runner uses the Qt GUI framework for running and displaying registered tests.
+ *
  * Here is an example of usage:
  * \code
  * #include <cppunit/extensions/TestFactoryRegistry.h>
  * #include <cppunit/ui/qt/TestRunner.h>
  *
- * [...]
- *
- * void 
- * QDepWindow::runTests()
+ * void main(int argc, char*argv[])
  * {
- *   CppUnit::QtUi::TestRunner runner;
- *   runner.addTest( CppUnit::TestFactoryRegistry::getRegistry().makeTest() );
- *   runner.run( true );
+ *     QApplication app(argc, argv);
+ *
+ *     CppUnit::QtTestRunner runner;
+ *     runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest());
+ *     runner.run(true);
+ *
+ *     return app.exec();
  * }
  * \endcode
- *
  */
 class QTTESTRUNNER_API QtTestRunner
 {
-public:
-  /*! Constructs a TestRunner object.
-   */
-  QtTestRunner();
-
-  /*! Destructor.
-   */
-  virtual ~QtTestRunner();
-
-  void run( bool autoRun =false );
+    Q_DISABLE_COPY(QtTestRunner)
 
-  void addTest( Test *test );
+public:
+    /*!
+     * \brief Constructs a TestRunner object.
+     */
+    QtTestRunner();
 
-private:
-  /// Prevents the use of the copy constructor.
-  QtTestRunner( const QtTestRunner &copy );
+    /*!
+     * \brief Destructor.
+     */
+    ~QtTestRunner();
 
-  /// Prevents the use of the copy operator.
-  void operator =( const QtTestRunner &copy );
+    /*!
+     * \brief Runs the specified test (and all of its child tests)
+     * \param autorun When set to \c true the tests are automatically run the first time
+     */
+    void run(bool autorun = false);
 
-  Test *getRootTest();
+    /*!
+     * \brief Adds a (top-level) test to the list of tests to run
+     * \param test A test that shall be executed
+     */
+    void addTest(Test *test);
 
 private:
-  typedef CppUnitVector<Test *> Tests;
-  Tests *_tests;
-
-  TestSuite *_suite;
+    QScopedPointer<class QtTestRunnerPrivate> _d;
 };
 
-
-#if CPPUNIT_HAVE_NAMESPACES
-  namespace QtUi
-  {
-    /*! Qt TestRunner (DEPRECATED).
-     * \deprecated Use CppUnit::QtTestRunner instead.
-     */
-    typedef CPPUNIT_NS::QtTestRunner TestRunner;
-  }
-#endif
-
-
 CPPUNIT_NS_END
 
-#endif  // CPPUNIT_QTUI_QTTESTRUNNER_H
+#endif  // CPPUNIT_QTTESTRUNNER_H
diff --git a/src/qttestrunner/MostRecentTests.cpp b/src/qttestrunner/MostRecentTests.cpp
deleted file mode 100644
index e286ed1..0000000
--- a/src/qttestrunner/MostRecentTests.cpp
+++ /dev/null
@@ -1,68 +0,0 @@
-// //////////////////////////////////////////////////////////////////////////
-// Implementation file MostRecentTests.cpp for class MostRecentTests
-// (c)Copyright 2000, Baptiste Lepilleur.
-// Created: 2001/09/20
-// //////////////////////////////////////////////////////////////////////////
-
-#include "MostRecentTests.h"
-
-
-MostRecentTests::MostRecentTests()
-{
-}
-
-
-MostRecentTests::~MostRecentTests()
-{
-}
-
-
-void 
-MostRecentTests::setTestToRun( CPPUNIT_NS::Test *test )
-{
-  m_tests.removeRef( test );
-  m_tests.prepend( test );
-
-  const int maxRecentTest = 20;
-  if ( m_tests.count() > maxRecentTest )
-    m_tests.remove( maxRecentTest );
-
-  emit listChanged();
-  emit testToRunChanged( testToRun() );
-}
-
-
-CPPUNIT_NS::Test *
-MostRecentTests::testToRun()
-{
-  return testAt( 0 );
-}
-
-
-void 
-MostRecentTests::selectTestToRun( int index )
-{
-  if ( index < testCount() )
-    setTestToRun( testAt( index ) );
-}
-
-
-int 
-MostRecentTests::testCount()
-{
-  return m_tests.count();
-}
-
-
-QString 
-MostRecentTests::testNameAt( int index )
-{
-  return QString::fromLatin1( testAt( index )->getName().c_str() );
-}
-
-
-CPPUNIT_NS::Test *
-MostRecentTests::testAt( int index )
-{
-  return m_tests.at( index );
-}
diff --git a/src/qttestrunner/MostRecentTests.h b/src/qttestrunner/MostRecentTests.h
deleted file mode 100644
index ebd95fc..0000000
--- a/src/qttestrunner/MostRecentTests.h
+++ /dev/null
@@ -1,62 +0,0 @@
-// //////////////////////////////////////////////////////////////////////////
-// Header file MostRecentTests.h for class MostRecentTests
-// (c)Copyright 2000, Baptiste Lepilleur.
-// Created: 2001/09/20
-// //////////////////////////////////////////////////////////////////////////
-#ifndef MOSTRECENTTESTS_H
-#define MOSTRECENTTESTS_H
-
-#include <cppunit/Test.h>
-#include <qstring.h>
-#include <qptrlist.h>
-#include <qobject.h>
-
-
-/*! \class MostRecentTests
- * \brief This class represents the list of the recent tests.
- */
-class MostRecentTests : public QObject
-{
-  Q_OBJECT
-public:
-  /*! Constructs a MostRecentTests object.
-   */
-  MostRecentTests();
-
-  /*! Destructor.
-   */
-  virtual ~MostRecentTests();
-
-  void setTestToRun( CPPUNIT_NS::Test *test );
-  CPPUNIT_NS::Test *testToRun();
-
-  int testCount();
-  QString testNameAt( int index );
-  CPPUNIT_NS::Test *testAt( int index );
-
-signals:
-  void listChanged();
-  void testToRunChanged( CPPUNIT_NS::Test *testToRun );
-
-public slots:
-  void selectTestToRun( int index );
-
-private:
-  /// Prevents the use of the copy constructor.
-  MostRecentTests( const MostRecentTests &copy );
-
-  /// Prevents the use of the copy operator.
-  void operator =( const MostRecentTests &copy );
-
-private:
-  QList<CPPUNIT_NS::Test> m_tests;
-};
-
-
-
-// Inlines methods for MostRecentTests:
-// ------------------------------------
-
-
-
-#endif  // MOSTRECENTTESTS_H
diff --git a/src/qttestrunner/QtTestFailure.cpp b/src/qttestrunner/QtTestFailure.cpp
new file mode 100644
index 0000000..6ab1bbb
--- /dev/null
+++ b/src/qttestrunner/QtTestFailure.cpp
@@ -0,0 +1,93 @@
+#include <cppunit/Exception.h>
+
+#include "QtTestFailure.h"
+
+class QtTestFailurePrivate
+{
+    typedef CPPUNIT_NS::Test Test;
+    typedef CPPUNIT_NS::SourceLine SourceLine;
+
+public:
+    QtTestFailurePrivate()
+        : _isError(true)
+        , _test(NULL)
+        , _srcline()
+        , _message()
+    {}
+
+    QtTestFailurePrivate(Test *failed,
+                         const QString &message,
+                         const SourceLine &srcline,
+                         bool isError)
+        : _isError(isError)
+        , _test(failed)
+        , _srcline(srcline)
+        , _message(message)
+    {}
+
+    ~QtTestFailurePrivate()
+    {}
+
+public:
+    bool _isError;
+    Test *_test;
+    SourceLine _srcline;
+    QString _message;
+};
+
+QtTestFailure::QtTestFailure()
+    : _d(new QtTestFailurePrivate)
+{}
+
+QtTestFailure::QtTestFailure(Test *failed,
+                             const QString &message,
+                             const CppUnit::SourceLine &srcline,
+                             bool isError)
+    : _d(new QtTestFailurePrivate(failed, message, srcline, isError))
+{}
+
+QtTestFailure::QtTestFailure(const QtTestFailure &other)
+    : _d(new QtTestFailurePrivate(*other._d.data()))
+{}
+
+QtTestFailure::~QtTestFailure()
+{}
+
+QtTestFailure &QtTestFailure::operator =(const QtTestFailure &other)
+{
+    if (this != &other)
+    {
+        _d.reset(new QtTestFailurePrivate(*other._d.data()));
+    }
+
+    return *this;
+}
+
+QtTestFailure::SourceLine QtTestFailure::sourceLine() const
+{
+    return _d->_srcline;
+}
+
+QString QtTestFailure::message() const
+{
+    return _d->_message;
+}
+
+QString QtTestFailure::failedTestName() const
+{
+    if (_d->_test == NULL)
+        return QString();
+
+    return QString::fromStdString(_d->_test->getName());
+}
+
+bool QtTestFailure::isError() const
+{
+    return _d->_isError;
+}
+
+bool QtTestFailure::isValid() const
+{
+    return _d->_test != NULL;
+}
+
diff --git a/src/qttestrunner/QtTestFailure.h b/src/qttestrunner/QtTestFailure.h
new file mode 100644
index 0000000..ba8f1ff
--- /dev/null
+++ b/src/qttestrunner/QtTestFailure.h
@@ -0,0 +1,88 @@
+#ifndef QTTESTFAILURE_H
+#define QTTESTFAILURE_H
+
+#include <QMetaType>
+#include <QScopedPointer>
+#include <QString>
+
+#include <cppunit/Test.h>
+#include <cppunit/SourceLine.h>
+
+/*!
+ * \class QtTestFailure
+ * \brief This class represents a test failure.
+ */
+class QtTestFailure
+{
+    typedef CPPUNIT_NS::Test Test;
+    typedef CPPUNIT_NS::SourceLine SourceLine;
+
+public:
+    /*!
+     * \brief Constructs an invalid QtTestFailure object
+     */
+    QtTestFailure();
+
+    /*!
+     * \brief Constructs a QtTestFailure object from the given parameters
+     * \param failed A pointer to the failed test
+     * \param message The failure message
+     * \param srcline Information about the location of the failure
+     * \param isError \c true: the failure was actually an error, \c false: a standard test failure
+     */
+    QtTestFailure(Test *failed, const QString &message, const SourceLine &srcline, bool isError);
+
+    /*!
+     * \brief Copy c'tor
+     * \param other The object to copy
+     */
+    QtTestFailure(const QtTestFailure &other);
+
+    /*!
+     * \brief Destructor.
+     */
+    ~QtTestFailure();
+
+    /*!
+     * \brief Returns information about the location of the failure
+     * \return Information about the failure location
+     */
+    SourceLine sourceLine() const;
+
+    /*!
+     * \brief Returns the detailed message of the failure
+     * \return The detailed failure message
+     */
+    QString message() const;
+
+    /*!
+     * \brief Returns the name of the failed test
+     * \return The name of the failed test
+     */
+    QString failedTestName() const;
+
+    /*!
+     * \brief Returns whether the failure actually was an error
+     * \return \c true: the failure was an error, \c false: a standard test failure
+     */
+    bool isError() const;
+
+    /*!
+     * \brief Returns whether this failure object is valid
+     * \return \c true: The object is valid, \c false: the object is _not_ valid
+     */
+    bool isValid() const;
+
+    /*!
+     * \brief Copy assignment operator
+     * \param other The object to copy
+     */
+    QtTestFailure &operator =(const QtTestFailure &other);
+
+private:
+    QScopedPointer<class QtTestFailurePrivate> _d;
+};
+
+Q_DECLARE_METATYPE(QtTestFailure)
+
+#endif // QTTESTFAILURE_H
diff --git a/src/qttestrunner/QtTestListener.cpp b/src/qttestrunner/QtTestListener.cpp
new file mode 100644
index 0000000..2135330
--- /dev/null
+++ b/src/qttestrunner/QtTestListener.cpp
@@ -0,0 +1,29 @@
+#include <cppunit/Exception.h>
+
+#include "QtTestListener.h"
+
+QtTestListener::QtTestListener(QObject *parent)
+    : QObject(parent)
+    , CPPUNIT_NS::TestListener()
+{}
+
+QtTestListener::~QtTestListener()
+{}
+
+void QtTestListener::startTest(Test * /*test*/)
+{
+    emit testCaseStarted();
+}
+
+void QtTestListener::addFailure(const TestFailure &failure)
+{
+    emit testFailed(QtTestFailure(failure.failedTest(),
+                                  failure.thrownException()->what(),
+                                  failure.sourceLine(),
+                                  failure.isError()));
+}
+
+void QtTestListener::endTest(Test * /*test*/)
+{
+    emit testCaseFinished();
+}
diff --git a/src/qttestrunner/QtTestListener.h b/src/qttestrunner/QtTestListener.h
new file mode 100644
index 0000000..1b53f04
--- /dev/null
+++ b/src/qttestrunner/QtTestListener.h
@@ -0,0 +1,61 @@
+#ifndef QTTESTLISTENER_H
+#define QTTESTLISTENER_H
+
+#include <QObject>
+
+#include <cppunit/Test.h>
+#include <cppunit/TestListener.h>
+#include <cppunit/TestFailure.h>
+
+#include "QtTestFailure.h"
+
+/*!
+ * \class QtTestListener
+ * \brief A specialized Qt based test listener
+ *
+ * This listener uses the Qt meta object system for propagation of testing states.
+ */
+class QtTestListener : public QObject, public CPPUNIT_NS::TestListener
+{
+    Q_OBJECT
+    Q_DISABLE_COPY(QtTestListener)
+
+    typedef CPPUNIT_NS::Test Test;
+    typedef CPPUNIT_NS::TestFailure TestFailure;
+
+public:
+    /*!
+     * \brief Constructs a QtTestListener object.
+     * \param parent A parent QObject
+     */
+    QtTestListener(QObject *parent = 0);
+
+    /*!
+     * \brief Destructor.
+     */
+    ~QtTestListener();
+
+signals:
+    /*!
+     * \brief Signals that a test case is being executed
+     */
+    void testCaseStarted();
+
+    /*!
+     * \brief Signals that a test failed
+     * \param failure Contains information about the failed test
+     */
+    void testFailed(const QtTestFailure &failure);
+
+    /*!
+     * \brief Signals that a test case has finished
+     */
+    void testCaseFinished();
+
+private:
+    void startTest(Test *test);
+    void addFailure(const TestFailure &failure);
+    void endTest(Test *test);
+};
+
+#endif  // QTTESTLISTENER_H
diff --git a/src/qttestrunner/QtTestRunner.cpp b/src/qttestrunner/QtTestRunner.cpp
index 9f203cd..2f5d90f 100644
--- a/src/qttestrunner/QtTestRunner.cpp
+++ b/src/qttestrunner/QtTestRunner.cpp
@@ -1,70 +1,86 @@
-// //////////////////////////////////////////////////////////////////////////
-// Implementation file QtTestRunner.cpp for class QtTestRunner
-// (c)Copyright 2000, Baptiste Lepilleur.
-// Created: 2001/09/19
-// //////////////////////////////////////////////////////////////////////////
+#include <QApplication>
 
-#include <qapplication.h>
 #include <cppunit/TestSuite.h>
 #include <cppunit/ui/qt/QtTestRunner.h>
-#include "TestRunnerDlgImpl.h"
-#include "TestRunnerModel.h"
 
+#include "TestRunnerWindow.h"
 
 CPPUNIT_NS_BEGIN
 
-QtTestRunner::QtTestRunner() :
-  _suite( new CPPUNIT_NS::TestSuite( "All Tests" ) ),
-  _tests( new Tests() )
-{
-}
+//
+// QtTestRunnerPrivate
+//
 
+// Define a few types for better readability (and usability) later on
+typedef Test* TestPtr;
+typedef QVector< TestPtr > TestPtrList;
+typedef QVectorIterator< TestPtr > TestPtrListIterator;
 
-QtTestRunner::~QtTestRunner()
+class QtTestRunnerPrivate
 {
-  delete _suite;
+    typedef QScopedPointer< TestSuite > TestSuitePtr;
+
+public:
+    QtTestRunnerPrivate()
+        : _suite(new TestSuite("All Tests"))
+        , _tests()
+        , _dialog()
+    {}
+
+    ~QtTestRunnerPrivate()
+    {}
+
+    Test *rootTest()
+    {
+        if (_tests.size() != 1)
+        {
+            TestPtrListIterator it(_tests);
+            while (it.hasNext())
+            {
+                _suite->addTest(it.next());
+            }
+
+            _tests.clear();
+            return _suite.data();
+        }
+
+        return _tests.at(0);
+    }
+
+public:
+    TestSuitePtr _suite;
+    TestPtrList _tests;
+    QScopedPointer<TestRunnerWindow> _dialog;
+};
+
+//
+// QtTestRunner
+//
+
+QtTestRunner::QtTestRunner()
+    : _d(new QtTestRunnerPrivate)
+{}
 
-  Tests::iterator it = _tests->begin();
-  while ( it != _tests->end() )
-    delete *it++;
-
-  delete _tests;
+QtTestRunner::~QtTestRunner()
+{
+    TestPtrListIterator it(_d->_tests);
+    while (it.hasNext())
+        delete it.next();
 }
 
-
-Test *
-QtTestRunner::getRootTest()
+void QtTestRunner::run(bool autorun)
 {
-  if ( _tests->size() != 1 )
-  {
-    Tests::iterator it = _tests->begin();
-    while ( it != _tests->end() )
-      _suite->addTest( *it++ );
-    _tests->clear();
-    return _suite;
-  }
-  return (*_tests)[0];
-}
+    _d->_dialog.reset(new TestRunnerWindow(_d->rootTest()));
 
+    if (autorun)
+        _d->_dialog->startTesting();
 
-void 
-QtTestRunner::run( bool autoRun )
-{
-  TestRunnerDlg *dlg = new TestRunnerDlg( qApp->mainWidget(), 
-                                          "QtTestRunner", 
-                                          TRUE );
-  dlg->setModel( new TestRunnerModel( getRootTest() ),
-                 autoRun );
-  dlg->exec();
-  delete dlg;
+    _d->_dialog->show();
 }
 
-
-void 
-QtTestRunner::addTest( CPPUNIT_NS::Test *test )
+void QtTestRunner::addTest(Test *test)
 {
-  _tests->push_back( test );
+    _d->_tests.append(test);
 }
 
-
 CPPUNIT_NS_END
diff --git a/src/qttestrunner/TestBrowser.cpp b/src/qttestrunner/TestBrowser.cpp
new file mode 100644
index 0000000..64fda53
--- /dev/null
+++ b/src/qttestrunner/TestBrowser.cpp
@@ -0,0 +1,55 @@
+#include <QTreeWidgetItem>
+#include <QVariant>
+
+#include <cppunit/Test.h>
+
+#include "TestBrowser.h"
+#include "ui_TestBrowser.h"
+
+TestBrowser::TestBrowser(Test *rootTest, QWidget *parent,  Qt::WindowFlags flags)
+    : QDialog(parent, flags),
+      _ui(new Ui::TestBrowser)
+{
+    _ui->setupUi(this);
+    buildTree(rootTest, NULL);
+
+    _ui->treeWidget->expandAll();
+}
+
+TestBrowser::~TestBrowser()
+{
+    // no need to delete child widgets, Qt does it all for us
+}
+
+void TestBrowser::buildTree(Test *test, QTreeWidgetItem *parentItem)
+{
+    QTreeWidgetItem *item = (parentItem != NULL)
+            ? new QTreeWidgetItem(parentItem)
+            : new QTreeWidgetItem(_ui->treeWidget);
+
+    QVariant data;
+    data.setValue(test);
+    item->setData(0, Qt::UserRole, data);
+    item->setText(0, QString::fromStdString(test->getName()));
+
+    if (test->getChildTestCount() > 0  ||    // suite with test
+         test->countTestCases() == 0)        // empty suite
+    {
+        for (int index = 0; index < test->getChildTestCount(); ++index)
+            buildTree(test->getChildTestAt(index), item);
+    }
+}
+
+void TestBrowser::accept()
+{
+    QList<QTreeWidgetItem*> selectedItems = _ui->treeWidget->selectedItems();
+
+    if(!selectedItems.isEmpty())
+    {
+        QTreeWidgetItem *selected = selectedItems.first();
+        QVariant data = selected->data(0, Qt::UserRole);
+        emit testSelected(data.value<Test*>());
+    }
+
+    QDialog::accept();
+}
diff --git a/src/qttestrunner/TestBrowser.h b/src/qttestrunner/TestBrowser.h
new file mode 100644
index 0000000..9f0efb1
--- /dev/null
+++ b/src/qttestrunner/TestBrowser.h
@@ -0,0 +1,61 @@
+#ifndef TESTBROWSER_H
+#define TESTBROWSER_H
+
+#include <QDialog>
+#include <QScopedPointer>
+
+#include <cppunit/Test.h>
+
+namespace Ui {
+class TestBrowser;
+}
+
+class QTreeWidgetItem;
+
+/*!
+ * \class TestBrowser
+ * \brief A small dialog that displays all registered tests in a hierarchical tree structure
+ *
+ * When a test is selected from this tree and the selection is confirmed, a pointer to the selected
+ * test is signalled to the outside world.
+ */
+class TestBrowser : public QDialog
+{
+    Q_OBJECT
+
+    typedef CPPUNIT_NS::Test Test;
+
+public:
+    /*!
+     * \brief Constructs the test browser dialog
+     * \param rootTest The top level test to use for determining all child tests
+     * \param parent A pointer to a parent QWidget
+     * \param flags Optional window flags controlling the dialog's appearance
+     *        (see the QDialog documentation at http://qt-project.org/doc for further details)
+     */
+    TestBrowser(Test *rootTest, QWidget *parent = 0, Qt::WindowFlags flags = 0);
+
+    /*!
+     * \brief Releases all allocated resources
+     */
+    ~TestBrowser();
+
+signals:
+    /*!
+     * \brief Signals that a test was selected on the test tree
+     */
+    void testSelected(Test *);
+
+private:
+    void buildTree(Test *test, QTreeWidgetItem *parentItem);
+
+private slots:
+    void accept();
+
+private:
+    QScopedPointer<class Ui::TestBrowser> _ui;
+};
+
+Q_DECLARE_METATYPE(CPPUNIT_NS::Test *)
+
+#endif // TESTBROWSER_H
diff --git a/src/qttestrunner/TestBrowser.ui b/src/qttestrunner/TestBrowser.ui
new file mode 100644
index 0000000..8d5f718
--- /dev/null
+++ b/src/qttestrunner/TestBrowser.ui
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>TestBrowser</class>
+ <widget class="QDialog" name="TestBrowser">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>647</width>
+    <height>416</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Select Test</string>
+  </property>
+  <property name="modal">
+   <bool>true</bool>
+  </property>
+  <layout class="QHBoxLayout" name="horizontalLayout">
+   <item>
+    <widget class="QTreeWidget" name="treeWidget">
+     <property name="editTriggers">
+      <set>QAbstractItemView::NoEditTriggers</set>
+     </property>
+     <property name="headerHidden">
+      <bool>true</bool>
+     </property>
+     <column>
+      <property name="text">
+       <string notr="true">1</string>
+      </property>
+     </column>
+    </widget>
+   </item>
+   <item>
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Fixed" vsizetype="Expanding">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>TestBrowser</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>TestBrowser</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/src/qttestrunner/TestBrowserDlgImpl.cpp b/src/qttestrunner/TestBrowserDlgImpl.cpp
deleted file mode 100644
index cef7c52..0000000
--- a/src/qttestrunner/TestBrowserDlgImpl.cpp
+++ /dev/null
@@ -1,83 +0,0 @@
-#include <cppunit/Test.h>
-#include <qlistview.h>
-#include <qmessagebox.h>
-#include "TestBrowserDlgImpl.h"
-#include "TestListViewItem.h"
-
-
-/* 
- *  Constructs a TestBrowser which is a child of 'parent', with the 
- *  name 'name' and widget flags set to 'f' 
- *
- *  The dialog will by default be modeless, unless you set 'modal' to
- *  TRUE to construct a modal dialog.
- */
-TestBrowser::TestBrowser( QWidget* parent,  const char* name, bool modal, WFlags fl )
-    : TestBrowserBase( parent, name, modal, fl ),
-    _selectedTest( NULL )
-{
-  _listTests->setRootIsDecorated( TRUE );
-}
-
-/*  
- *  Destroys the object and frees any allocated resources
- */
-TestBrowser::~TestBrowser()
-{
-    // no need to delete child widgets, Qt does it all for us
-}
-
-
-void 
-TestBrowser::setRootTest( CPPUNIT_NS::Test *rootTest )
-{
-  QListViewItem *dummyRoot = new QListViewItem( _listTests );
-
-  insertItemFor( rootTest, dummyRoot );
-  
-  dummyRoot->firstChild()->moveItem( dummyRoot );
-  delete dummyRoot;
-
-  _listTests->firstChild()->setOpen( TRUE );
-  _listTests->triggerUpdate();
-}
-
-
-void 
-TestBrowser::insertItemFor( CPPUNIT_NS::Test *test,
-                            QListViewItem *parentItem )
-{
-  QListViewItem *item = new TestListViewItem( test, parentItem );
-  QString testName = QString::fromLatin1( test->getName().c_str() );
-  item->setText( 0, testName );
-  if ( test->getChildTestCount() > 0  ||    // suite with test
-       test->countTestCases() == 0 )        // empty suite
-  {
-    for ( int index =0; index < test->getChildTestCount(); ++index )
-      insertItemFor( test->getChildTestAt( index ), item );
-  }
-}
-
-
-CPPUNIT_NS::Test *
-TestBrowser::selectedTest()
-{
-  return _selectedTest;
-}
-
-
-void 
-TestBrowser::accept()
-{
-  TestListViewItem *item = (TestListViewItem *)_listTests->selectedItem();
-  if ( item == NULL )
-  {
-    QMessageBox::information( this, tr("Selected test"),
-                              tr( "You must select a test." ) );
-    return;
-  }
-
-  _selectedTest = item->test();
-
-  TestBrowserBase::accept();
-}
diff --git a/src/qttestrunner/TestBrowserDlgImpl.h b/src/qttestrunner/TestBrowserDlgImpl.h
deleted file mode 100644
index d4c113a..0000000
--- a/src/qttestrunner/TestBrowserDlgImpl.h
+++ /dev/null
@@ -1,32 +0,0 @@
-#ifndef TESTBROWSER_H
-#define TESTBROWSER_H
-
-#include <cppunit/Test.h>
-#include "testbrowserdlg.h"
-
-class QListViewItem;
-
-class TestBrowser : public TestBrowserBase
-{ 
-    Q_OBJECT
-
-public:
-  TestBrowser( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 );
-  ~TestBrowser();
-
-  void setRootTest( CPPUNIT_NS::Test *rootTest );
-
-  CPPUNIT_NS::Test *selectedTest();
-
-protected slots:
-  void accept();
-
-private:
-  void insertItemFor( CPPUNIT_NS::Test *test,
-                      QListViewItem *parentItem );
-
-private:
-  CPPUNIT_NS::Test *_selectedTest;
-};
-
-#endif // TESTBROWSER_H
diff --git a/src/qttestrunner/TestFailureInfo.cpp b/src/qttestrunner/TestFailureInfo.cpp
deleted file mode 100644
index 54c5b1d..0000000
--- a/src/qttestrunner/TestFailureInfo.cpp
+++ /dev/null
@@ -1,21 +0,0 @@
-// //////////////////////////////////////////////////////////////////////////
-// Implementation file TestFailureInfo.cpp for class TestFailureInfo
-// (c)Copyright 2000, Baptiste Lepilleur.
-// Created: 2001/09/20
-// //////////////////////////////////////////////////////////////////////////
-
-#include "TestFailureInfo.h"
-#include <cppunit/Exception.h>
-
-
-TestFailureInfo::TestFailureInfo( CPPUNIT_NS::Test *failedTest, 
-                                  CPPUNIT_NS::Exception *thrownException,
-                                  bool isError ) : 
-    CPPUNIT_NS::TestFailure( failedTest, thrownException->clone(), isError )
-{
-}
-
-
-TestFailureInfo::~TestFailureInfo()
-{
-}
diff --git a/src/qttestrunner/TestFailureInfo.h b/src/qttestrunner/TestFailureInfo.h
deleted file mode 100644
index 64a2ceb..0000000
--- a/src/qttestrunner/TestFailureInfo.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// //////////////////////////////////////////////////////////////////////////
-// Header file TestFailureInfo.h for class TestFailureInfo
-// (c)Copyright 2000, Baptiste Lepilleur.
-// Created: 2001/09/20
-// //////////////////////////////////////////////////////////////////////////
-#ifndef TESTFAILUREINFO_H
-#define TESTFAILUREINFO_H
-
-#include <cppunit/TestFailure.h>
-
-
-/*! \class TestFailureInfo
- * \brief This class represents a test failure.
- */
-class TestFailureInfo : public CPPUNIT_NS::TestFailure
-{
-public:
-  /*! Constructs a TestFailureInfo object.
-   */
-  TestFailureInfo( CPPUNIT_NS::Test *failedTest, 
-                   CPPUNIT_NS::Exception *thrownException,
-                   bool isError );
-
-  /*! Destructor.
-   */
-  virtual ~TestFailureInfo();
-
-private:
-  /// Prevents the use of the copy constructor.
-  TestFailureInfo( const TestFailureInfo &copy );
-
-  /// Prevents the use of the copy operator.
-  void operator =( const TestFailureInfo &copy );
-};
-
-
-
-// Inlines methods for TestFailureInfo:
-// ------------------------------------
-
-
-
-#endif  // TESTFAILUREINFO_H
diff --git a/src/qttestrunner/TestFailureListViewItem.cpp b/src/qttestrunner/TestFailureListViewItem.cpp
deleted file mode 100644
index 387818f..0000000
--- a/src/qttestrunner/TestFailureListViewItem.cpp
+++ /dev/null
@@ -1,29 +0,0 @@
-// //////////////////////////////////////////////////////////////////////////
-// Implementation file TestFailureListViewItem.cpp for class TestFailureListViewItem
-// (c)Copyright 2000, Baptiste Lepilleur.
-// Created: 2001/09/20
-// //////////////////////////////////////////////////////////////////////////
-
-#include "TestFailureListViewItem.h"
-
-
-TestFailureListViewItem::TestFailureListViewItem(
-                           TestFailureInfo *failure,
-                           QListView *parent ) : 
-    QListViewItem( parent ),
-    _failure( failure )
-{
-	setMultiLinesEnabled (true);
-}
-
-
-TestFailureListViewItem::~TestFailureListViewItem()
-{
-}
-
-
-TestFailureInfo *
-TestFailureListViewItem::failure()
-{
-  return _failure;
-}
diff --git a/src/qttestrunner/TestFailureListViewItem.h b/src/qttestrunner/TestFailureListViewItem.h
deleted file mode 100644
index 97d3716..0000000
--- a/src/qttestrunner/TestFailureListViewItem.h
+++ /dev/null
@@ -1,48 +0,0 @@
-// //////////////////////////////////////////////////////////////////////////
-// Header file TestFailureListViewItem.h for class TestFailureListViewItem
-// (c)Copyright 2000, Baptiste Lepilleur.
-// Created: 2001/09/20
-// //////////////////////////////////////////////////////////////////////////
-#ifndef TESTFAILURELISTVIEWITEM_H
-#define TESTFAILURELISTVIEWITEM_H
-
-#include <qlistview.h>
-class TestFailureInfo;
-
-
-/*! \class TestFailureListViewItem
- * \brief This class represents a test failure item.
- */
-class TestFailureListViewItem : public QListViewItem
-{
-public:
-  /*! Constructs a TestFailureListViewItem object.
-   */
-  TestFailureListViewItem( TestFailureInfo *failure,
-                           QListView *parent );
-
-  /*! Destructor.
-   */
-  virtual ~TestFailureListViewItem();
-
-  TestFailureInfo *failure();
-
-private:
-  /// Prevents the use of the copy constructor.
-  TestFailureListViewItem( const TestFailureListViewItem &copy );
-
-  /// Prevents the use of the copy operator.
-  void operator =( const TestFailureListViewItem &copy );
-
-private:
-  TestFailureInfo *_failure;
-};
-
-
-
-// Inlines methods for TestFailureListViewItem:
-// --------------------------------------------
-
-
-
-#endif  // TESTFAILURELISTVIEWITEM_H
diff --git a/src/qttestrunner/TestFailureTableModel.cpp b/src/qttestrunner/TestFailureTableModel.cpp
new file mode 100644
index 0000000..d96ccec
--- /dev/null
+++ b/src/qttestrunner/TestFailureTableModel.cpp
@@ -0,0 +1,146 @@
+#include <QObject>
+#include <QMap>
+
+#include <cppunit/Exception.h>
+
+#include "TestFailureTableModel.h"
+
+//
+// TestFailureTableModelPrivate
+//
+
+class TestFailureTableModelPrivate
+{
+public:
+    // Column header enumeration
+    enum Column
+    {
+        ColumnType      = 0,
+        ColumnName      = 1,
+        ColumnMessage   = 2
+    };
+
+    // Convenience type definition
+    typedef QMap<Column, QString> ColumnStringMap;
+
+    // C'tor
+    TestFailureTableModelPrivate()
+        : columnCount(3)
+        , failureString(QObject::tr("Failure"))
+        , errorString(QObject::tr("Error"))
+        , columnStrings()
+        , failures()
+    {
+        // This would be so much easier using C++11... *sigh*
+        ColumnStringMap &map = const_cast<ColumnStringMap&>(columnStrings);
+        map.insert(ColumnType, QObject::tr("Type"));
+        map.insert(ColumnName, QObject::tr("Test name"));
+        map.insert(ColumnMessage, QObject::tr("Message"));
+    }
+
+public:
+    const int columnCount;
+    const QString failureString;
+    const QString errorString;
+    const ColumnStringMap columnStrings;
+
+    QList<QtTestFailure> failures;
+};
+
+//
+// TestFailureTableModel
+//
+
+TestFailureTableModel::TestFailureTableModel(QObject *parent)
+    : QAbstractTableModel(parent)
+    , _d(new TestFailureTableModelPrivate)
+{}
+
+TestFailureTableModel::~TestFailureTableModel()
+{}
+
+int TestFailureTableModel::rowCount(const QModelIndex &) const
+{
+    return _d->failures.size();
+}
+
+int TestFailureTableModel::columnCount(const QModelIndex &) const
+{
+    return _d->columnCount;
+}
+
+QVariant TestFailureTableModel::data(const QModelIndex &index, int role) const
+{
+    if (index.isValid())
+    {
+        if (role == Qt::DisplayRole)
+        {
+            QtTestFailure failure = _d->failures.at(index.row());
+            switch (index.column())
+            {
+            case TestFailureTableModelPrivate::ColumnType:
+                return failure.isError()
+                        ? QVariant(_d->errorString)
+                        : QVariant(_d->failureString);
+            case TestFailureTableModelPrivate::ColumnName:
+                return QVariant(failure.failedTestName());
+            case TestFailureTableModelPrivate::ColumnMessage:
+                return QVariant(failure.message());
+            default:
+                break;
+            }
+        }
+        else if (role == Qt::UserRole)
+        {
+            QVariant data;
+            data.setValue(_d->failures.at(index.row()));
+            return data;
+        }
+    }
+
+    return QVariant();
+}
+
+QVariant TestFailureTableModel::headerData(int section, Qt::Orientation orientation, int role) const
+{
+    if (orientation == Qt::Horizontal && role == Qt::DisplayRole)
+    {
+        switch (section)
+        {
+        case TestFailureTableModelPrivate::ColumnType:
+            return QVariant(_d->columnStrings.value(TestFailureTableModelPrivate::ColumnType));
+        case TestFailureTableModelPrivate::ColumnName:
+            return QVariant(_d->columnStrings.value(TestFailureTableModelPrivate::ColumnName));
+        case TestFailureTableModelPrivate::ColumnMessage:
+            return QVariant(_d->columnStrings.value(TestFailureTableModelPrivate::ColumnMessage));
+        default:
+            break;
+        }
+    }
+
+    return QVariant();
+}
+
+bool TestFailureTableModel::setHeaderData(int, Qt::Orientation, const QVariant &, int)
+{
+    // Header is fix, nothing to do here
+    return false;
+}
+
+void TestFailureTableModel::clear()
+{
+    beginResetModel();
+    _d->failures.clear();
+    endResetModel();
+}
+
+void TestFailureTableModel::addFailure(const QtTestFailure &failure)
+{
+    if (!failure.isValid())
+        return;
+
+    beginInsertRows(QModelIndex(), _d->failures.size(), _d->failures.size());
+    insertRow(_d->failures.size(), QModelIndex());
+    _d->failures.append(failure);
+    endInsertRows();
+}
diff --git a/src/qttestrunner/TestFailureTableModel.h b/src/qttestrunner/TestFailureTableModel.h
new file mode 100644
index 0000000..1f65b27
--- /dev/null
+++ b/src/qttestrunner/TestFailureTableModel.h
@@ -0,0 +1,88 @@
+#ifndef TESTRUNNERMODEL_H
+#define TESTRUNNERMODEL_H
+
+#include <QAbstractTableModel>
+#include <QScopedPointer>
+
+#include "QtTestFailure.h"
+
+/*!
+ * \class TestFailureTableModel
+ * \brief This class represents the data model for the failure list on the TestRunnerWindow
+ */
+class TestFailureTableModel : public QAbstractTableModel
+{
+    Q_OBJECT
+    Q_DISABLE_COPY(TestFailureTableModel)
+
+public:
+    /*!
+     * \brief Constructs a TestRunnerModel object.
+     * \param parent A parent QObject
+     */
+    TestFailureTableModel(QObject *parent = 0);
+
+    /*!
+     * \brief Destructor.
+     */
+    ~TestFailureTableModel();
+
+    /*!
+     * \brief Implements QAbstractItemModel::rowCount()
+     * \return The number of rows stored in this model
+     */
+    int rowCount(const QModelIndex &) const;
+
+    /*!
+     * \brief Implements QAbstractItemModel::columnCount()
+     * \return The number of columns this model provides.
+     */
+    int columnCount(const QModelIndex &) const;
+
+    /*!
+     * \brief Implements QAbstractItemModel::data()
+     * \param index The index of the data to retrieve
+     * \param role Specifies the role for which to retrieve data
+     * \return The data for the given index and role
+     */
+    QVariant data(const QModelIndex &index, int role) const;
+
+    /*!
+     * \brief Reimplemented from QAbstractTableModel::headerData()
+     * \param section The index of the section to retrieve information for
+     * \param orientation Either Qt::Horizontal or Qt::Vertical
+     * \param role The role to retrieve the header data for
+     * \return The header data of the given section for the given orientation and role
+     *
+     * This method actually returns the column names used in the view on the TestRunnerWindow
+     */
+    QVariant headerData(int section, Qt::Orientation orientation, int role) const;
+
+    /*!
+     * \brief Reimplemented from QAbstractTableModel::headerData()
+     * \return Always false
+     *
+     * As for this model setting the header data is not required, this method does nothing
+     * except always returning \c false.
+     */
+    bool setHeaderData(int, Qt::Orientation, const QVariant&, int);
+
+public slots:
+    /*!
+     * \brief Clears all data in the underlying data store
+     *
+     * Calling this slot causes all views using this model to be reset.
+     */
+    void clear();
+
+    /*!
+     * \brief Adds a new failure record to the underlying data store
+     * \param failure The failure information to add
+     */
+    void addFailure(const QtTestFailure &failure);
+
+private:
+    QScopedPointer<class TestFailureTableModelPrivate> _d;
+};
+
+#endif // TESTRUNNERMODEL_H
diff --git a/src/qttestrunner/TestListViewItem.cpp b/src/qttestrunner/TestListViewItem.cpp
deleted file mode 100644
index b4032dc..0000000
--- a/src/qttestrunner/TestListViewItem.cpp
+++ /dev/null
@@ -1,27 +0,0 @@
-// //////////////////////////////////////////////////////////////////////////
-// Implementation file TestListViewItem.cpp for class TestListViewItem
-// (c)Copyright 2000, Baptiste Lepilleur.
-// Created: 2001/09/19
-// //////////////////////////////////////////////////////////////////////////
-
-#include "TestListViewItem.h"
-
-
-TestListViewItem::TestListViewItem( CPPUNIT_NS::Test *test,
-                                    QListViewItem *parent ) : 
-    QListViewItem( parent ),
-    _test( test )
-{
-}
-
-
-TestListViewItem::~TestListViewItem()
-{
-}
-
-
-CPPUNIT_NS::Test *
-TestListViewItem::test() const
-{
-  return _test;
-}
diff --git a/src/qttestrunner/TestListViewItem.h b/src/qttestrunner/TestListViewItem.h
deleted file mode 100644
index 4032f68..0000000
--- a/src/qttestrunner/TestListViewItem.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// //////////////////////////////////////////////////////////////////////////
-// Header file TestListViewItem.h for class TestListViewItem
-// (c)Copyright 2000, Baptiste Lepilleur.
-// Created: 2001/09/19
-// //////////////////////////////////////////////////////////////////////////
-#ifndef TESTLISTVIEWITEM_H
-#define TESTLISTVIEWITEM_H
-
-#include <qlistview.h>
-#include <cppunit/Test.h>
-
-
-/*! \class TestListViewItem
- * \brief This class represents an list item pointing to a Test.
- */
-class TestListViewItem : public QListViewItem
-{
-public:
-  /*! Constructs a TestListViewItem object.
-   */
-  TestListViewItem( CPPUNIT_NS::Test *test,
-                    QListViewItem *parent );
-
-  /*! Destructor.
-   */
-  virtual ~TestListViewItem();
-
-  CPPUNIT_NS::Test *test() const;
-
-private:
-  /// Prevents the use of the copy constructor.
-  TestListViewItem( const TestListViewItem &copy );
-
-  /// Prevents the use of the copy operator.
-  void operator =( const TestListViewItem &copy );
-
-private:
-  CPPUNIT_NS::Test *_test;
-};
-
-
-
-#endif  // TESTLISTVIEWITEM_H
diff --git a/src/qttestrunner/TestRunnerDlgImpl.cpp b/src/qttestrunner/TestRunnerDlgImpl.cpp
deleted file mode 100644
index c1c8534..0000000
--- a/src/qttestrunner/TestRunnerDlgImpl.cpp
+++ /dev/null
@@ -1,260 +0,0 @@
-#include <qcombobox.h>
-#include <qgroupbox.h>
-#include <qlabel.h>
-#include <qlistview.h>
-#include <qmultilineedit.h>
-#include <qprogressbar.h>
-#include <qpushbutton.h>
-#include <cppunit/Exception.h>
-#include "TestRunnerDlgImpl.h"
-#include "TestBrowserDlgImpl.h"
-#include "MostRecentTests.h"
-#include "TestRunnerModel.h"
-#include "TestFailureListViewItem.h"
-
-
-/* 
- *  Constructs a TestRunnerDlg which is a child of 'parent', with the 
- *  name 'name' and widget flags set to 'f' 
- *
- *  The dialog will by default be modeless, unless you set 'modal' to
- *  TRUE to construct a modal dialog.
- */
-TestRunnerDlg::TestRunnerDlg( QWidget* parent,  const char* name, bool modal, WFlags fl )
-    : TestRunnerDlgBase( parent, name, modal, fl ),
-    _model( NULL ),
-    _recentTests( new MostRecentTests() )
-{
-}
-
-
-/*  
- *  Destroys the object and frees any allocated resources
- */
-TestRunnerDlg::~TestRunnerDlg()
-{
-  delete _model;
-  delete _recentTests;
-}
-
-
-void 
-TestRunnerDlg::setModel( TestRunnerModel *model,
-                         bool autorunTest )
-{
-  delete _model;
-
-  _model = model;
-
-  // update combo when recent list change
-  connect( _recentTests, SIGNAL( listChanged() ),
-           SLOT( refreshRecentTests() ) );
-
-  // make selected test in combo the "most recent"
-  connect( _comboTest, SIGNAL( activated(int) ),
-           _recentTests, SLOT( selectTestToRun(int) ) );
-
-  // refresh the test report counters when a test is selected
-  connect( _recentTests, SIGNAL( testToRunChanged(CPPUNIT_NS::Test *) ),
-           _model, SLOT( resetTestReportCounterFor(CPPUNIT_NS::Test *) ) );
-
-  // refresh progress bar
-  connect( _model, SIGNAL( numberOfTestCaseChanged(int) ),
-           _progressRun, SLOT( setTotalSteps(int) ) );
-  connect( _model, SIGNAL( numberOfTestCaseRunChanged(int) ),
-           _progressRun, SLOT( setProgress(int) ) );
-  
-  // refresh test report counters
-  connect( _model, SIGNAL( numberOfTestCaseChanged( int ) ),
-           SLOT( setNumberOfTestCase( int ) ) );
-  connect( _model, SIGNAL( numberOfTestCaseRunChanged( int ) ),
-           SLOT( setNumberOfTestCaseRun( int ) ) );
-  connect( _model, SIGNAL( numberOfTestCaseFailureChanged( int ) ),
-           SLOT( setNumberOfTestCaseFailure( int ) ) );
-
-  // clear failure list
-  connect( _model, SIGNAL( failuresCleared() ),
-           SLOT( clearTestFailureList() ) );
-
-  // clear failure detail list
-  connect( _model, SIGNAL( failuresCleared() ),
-           SLOT( clearFailureDetail() ) );
-
-  // add failure to failure list
-  connect( _model, SIGNAL( failureAdded(TestFailureInfo *) ),
-           SLOT( reportFailure(TestFailureInfo*) ) );
-
-  // show detail on failure selection
-  connect( _listFailures, SIGNAL( selectionChanged(QListViewItem*) ),
-           SLOT( showFailureDetailAt(QListViewItem*) ) );
-
-  // disable button when running test
-  connect( _model, SIGNAL( testRunStarted( CPPUNIT_NS::Test *, CPPUNIT_NS::TestResult *) ),
-           SLOT( beRunningTest() ) );
-
-  // enable button when finished running test
-  connect( _model, SIGNAL( testRunFinished() ),
-           SLOT( beCanRunTest() ) );
-
-  _recentTests->setTestToRun( model->rootTest() );
-  beCanRunTest();
-
-  if ( autorunTest )
-    runTest();
-}
-
-
-void 
-TestRunnerDlg::browseForTest()
-{
-  TestBrowser *dlg = new TestBrowser( this,
-                                      "Test Browser",
-                                      TRUE );
-  dlg->setRootTest( _model->rootTest() );
-
-  if ( dlg->exec() )
-    _recentTests->setTestToRun( dlg->selectedTest() );
-
-  delete dlg;
-}
-
-
-void 
-TestRunnerDlg::runTest()
-{
-  CPPUNIT_NS::Test *testToRun = _recentTests->testToRun();
-  if ( testToRun == NULL )
-    return;
-  _model->runTest( testToRun );
-}
-
-
-void 
-TestRunnerDlg::stopTest()
-{
-  _model->stopRunningTest();
-  if ( _model->isTestRunning() )
-    beStoppingTest();
-}
-
-
-void 
-TestRunnerDlg::clearTestFailureList()
-{
-  _listFailures->clear();
-}
-
-
-void 
-TestRunnerDlg::refreshRecentTests()
-{
-  _comboTest->clear();
-  for ( int index =0; index < _recentTests->testCount(); ++index )
-    _comboTest->insertItem( _recentTests->testNameAt( index ) );
-}
-
-
-void 
-TestRunnerDlg::setNumberOfTestCase( int numberOfTestCase )
-{
-  _labelTestCaseCount->setText( QString::number( numberOfTestCase ) );
-}
-
-
-void 
-TestRunnerDlg::setNumberOfTestCaseRun( int numberOfRun )
-{
-  _labelTestRunCount->setText( QString::number( numberOfRun ) );
-}
-
-
-void 
-TestRunnerDlg::setNumberOfTestCaseFailure( int numberOfFailure )
-{
-  _labelFailureCount->setText( QString::number( numberOfFailure ) );
-}
-
-
-void 
-TestRunnerDlg::reportFailure( TestFailureInfo *failure )
-{
-  QListViewItem *item = new TestFailureListViewItem( failure, 
-                                                     _listFailures );
-  item->setText( indexType, 
-                 failure->isError() ? tr("Error") : tr("Failure") );
-  std::string failedtestName = failure->failedTestName().c_str();
-  item->setText( indexTestName, QString::fromLatin1( failedtestName.c_str() ) );
-
-  CPPUNIT_NS::Exception *thrownException = failure->thrownException();
-//2.0  item->setText( indexMessage, thrownException->what() );
-  item->setText( indexMessage, QString(thrownException->what()).stripWhiteSpace() );
-  item->setText( indexFilename, failure->sourceLine().fileName().c_str() );
-  item->setText( indexLineNumber,
-                 QString::number( failure->sourceLine().lineNumber() ) );
-
-  _listFailures->insertItem( item );
-  _listFailures->triggerUpdate();
-
-  if ( _listFailures->childCount() == 1 )
-    _listFailures->setSelected( item, TRUE );
-}
-
-
-void 
-TestRunnerDlg::showFailureDetailAt( QListViewItem *selection )
-{
-  TestFailureInfo *failure = ((TestFailureListViewItem*)selection)->failure();
-  
-  QString title = tr("Failure detail for: ");
-  title += QString::fromLatin1( failure->failedTestName().c_str() );
-  _groupFailureDetail->setTitle( title );
-
-  QString location( failure->sourceLine().fileName().c_str() );
-  location += " (" + 
-              QString::number( failure->sourceLine().lineNumber() ) +
-              ")";
-  _labelFailureLocation->setText( location );
-
-  _editFailureMessage->setText( failure->thrownException()->what() );
-}
-
-
-void 
-TestRunnerDlg::clearFailureDetail()
-{
-  _groupFailureDetail->setTitle( tr("Failure detail for:...") );
-  _labelFailureLocation->setText( QString::null );
-  _editFailureMessage->setText( QString::null );
-}
-
-
-void 
-TestRunnerDlg::beCanRunTest()
-{
-  _buttonRunTest->setEnabled( true );
-  _buttonBrowse->setEnabled( true );
-  _comboTest->setEnabled( true );
-  _buttonStop->setDisabled( true );
-  _buttonStop->setText( tr("Stop") );
-  _buttonClose->setEnabled( true );
-}
-
-
-void 
-TestRunnerDlg::beRunningTest()
-{
-  _buttonRunTest->setDisabled( true );
-  _buttonBrowse->setDisabled( true );
-  _comboTest->setDisabled( true );
-  _buttonStop->setEnabled( true );
-  _buttonStop->setText( tr("Stop") );
-  _buttonClose->setDisabled( true );
-}
-
-
-void 
-TestRunnerDlg::beStoppingTest()
-{
-  _buttonStop->setDisabled( true );
-  _buttonStop->setText( tr("Stopping") );
-}
diff --git a/src/qttestrunner/TestRunnerDlgImpl.h b/src/qttestrunner/TestRunnerDlgImpl.h
deleted file mode 100644
index a3befc6..0000000
--- a/src/qttestrunner/TestRunnerDlgImpl.h
+++ /dev/null
@@ -1,58 +0,0 @@
-#ifndef TESTRUNNERDLG_H
-#define TESTRUNNERDLG_H
-
-#include "testrunnerdlg.h"
-#include <cppunit/Test.h>
-class TestRunnerModel;
-class MostRecentTests;
-class TestFailureInfo;
-class QListViewItem;
-
-class TestRunnerDlg : public TestRunnerDlgBase
-{ 
-  Q_OBJECT
-
-public:
-  TestRunnerDlg( QWidget* parent = 0, 
-                 const char* name = 0, 
-                 bool modal = FALSE, 
-                 WFlags fl = 0 );
-  ~TestRunnerDlg();
-
-  void setModel( TestRunnerModel *model,
-                 bool autorunTest );
-
-public slots:
-  void refreshRecentTests();
-
-protected slots:
-  void browseForTest();
-  void runTest();
-  void stopTest();
-  void setNumberOfTestCase( int numberOfTestCase );
-  void setNumberOfTestCaseRun( int numberOfRun );
-  void setNumberOfTestCaseFailure( int numberOfFailure );
-  void clearTestFailureList();
-  void clearFailureDetail();
-  void reportFailure( TestFailureInfo *failure );
-  void showFailureDetailAt( QListViewItem *selection );
-  void beCanRunTest();
-  void beRunningTest();
-  void beStoppingTest();
-
-private:
-
-  enum Columns
-  {
-    indexType =0,
-    indexTestName,
-    indexMessage,
-    indexFilename,
-    indexLineNumber
-  };
-
-  TestRunnerModel *_model;
-  MostRecentTests *_recentTests;
-};
-
-#endif // TESTRUNNERDLG_H
diff --git a/src/qttestrunner/TestRunnerFailureEvent.cpp b/src/qttestrunner/TestRunnerFailureEvent.cpp
deleted file mode 100644
index bceb2f6..0000000
--- a/src/qttestrunner/TestRunnerFailureEvent.cpp
+++ /dev/null
@@ -1,28 +0,0 @@
-// //////////////////////////////////////////////////////////////////////////
-// Implementation file TestRunnerFailureEvent.cpp for class TestRunnerFailureEvent
-// (c)Copyright 2000, Baptiste Lepilleur.
-// Created: 2001/09/22
-// //////////////////////////////////////////////////////////////////////////
-
-#include "TestRunnerFailureEvent.h"
-#include "TestRunnerModelThreadInterface.h"
-
-
-TestRunnerFailureEvent::TestRunnerFailureEvent( TestFailureInfo *failure,
-                                                int numberOfFailure ) :
-    _failure( failure ),
-    _numberOfFailure( numberOfFailure )
-{
-}
-
-
-TestRunnerFailureEvent::~TestRunnerFailureEvent()
-{
-}
-
-
-void 
-TestRunnerFailureEvent::process( TestRunnerModelThreadInterface *target )
-{
-  target->eventNewFailure( _failure, _numberOfFailure );
-}
diff --git a/src/qttestrunner/TestRunnerFailureEvent.h b/src/qttestrunner/TestRunnerFailureEvent.h
deleted file mode 100644
index fa6fef0..0000000
--- a/src/qttestrunner/TestRunnerFailureEvent.h
+++ /dev/null
@@ -1,48 +0,0 @@
-// //////////////////////////////////////////////////////////////////////////
-// Header file TestRunnerFailureEvent.h for class TestRunnerFailureEvent
-// (c)Copyright 2000, Baptiste Lepilleur.
-// Created: 2001/09/22
-// //////////////////////////////////////////////////////////////////////////
-#ifndef TESTRUNNERFAILUREEVENT_H
-#define TESTRUNNERFAILUREEVENT_H
-
-#include "TestRunnerThreadEvent.h"
-class TestFailureInfo;
-
-
-/*! \class TestRunnerFailureEvent
- * \brief This class represents a new TestCase failure event.
- */
-class TestRunnerFailureEvent : public TestRunnerThreadEvent
-{
-public:
-  /*! Constructs a TestRunnerFailureEvent object.
-   */
-  TestRunnerFailureEvent( TestFailureInfo *failure,
-                          int numberOfFailure );
-
-  /// Destructor.
-  virtual ~TestRunnerFailureEvent();
-
-private:
-  /// Prevents the use of the copy constructor.
-  TestRunnerFailureEvent( const TestRunnerFailureEvent &copy );
-
-  /// Prevents the use of the copy operator.
-  void operator =( const TestRunnerFailureEvent &copy );
-
-  void process( TestRunnerModelThreadInterface *target );
-
-private:
-  TestFailureInfo *_failure;
-  int _numberOfFailure;
-};
-
-
-
-// Inlines methods for TestRunnerFailureEvent:
-// -------------------------------------------
-
-
-
-#endif  // TESTRUNNERFAILUREEVENT_H
diff --git a/src/qttestrunner/TestRunnerModel.cpp b/src/qttestrunner/TestRunnerModel.cpp
deleted file mode 100644
index b224a34..0000000
--- a/src/qttestrunner/TestRunnerModel.cpp
+++ /dev/null
@@ -1,221 +0,0 @@
-// //////////////////////////////////////////////////////////////////////////
-// Implementation file TestRunnerModel.cpp for class TestRunnerModel
-// (c)Copyright 2000, Baptiste Lepilleur.
-// Created: 2001/09/20
-// //////////////////////////////////////////////////////////////////////////
-
-#include <cppunit/TestResult.h>
-#include "TestRunnerFailureEvent.h"
-#include "TestRunnerModel.h"
-#include "TestRunnerTestCaseRunEvent.h"
-#include "TestRunnerThread.h"
-#include "TestRunnerThreadFinishedEvent.h"
-
-
-TestRunnerModel::TestRunnerModel( CPPUNIT_NS::Test *rootTest ) :
-    _rootTest( rootTest ),
-    _runnerThread( NULL ),
-    _result( NULL )
-{
-}
-
-
-TestRunnerModel::~TestRunnerModel()
-{
-  delete _runnerThread;
-}
-
-
-CPPUNIT_NS::Test *
-TestRunnerModel::rootTest()
-{
-  return _rootTest;
-}
-
-
-void 
-TestRunnerModel::resetTestReportCounterFor( CPPUNIT_NS::Test *testToRun )
-{
-  if ( isTestRunning() )
-    return;
-
-  {
-    LockGuard guard( _lock );
-    _numberOfTestCase = testToRun->countTestCases();
-    _numberOfTestCaseRun =0;
-    _numberOfTestCaseFailure =0;
-    _failures.clear();
-  }
-  emit failuresCleared();
-
-  emit numberOfTestCaseChanged( _numberOfTestCase );
-  emit numberOfTestCaseRunChanged( _numberOfTestCaseRun );
-  emit numberOfTestCaseFailureChanged( _numberOfTestCaseFailure );
-}
-
-
-int 
-TestRunnerModel::numberOfTestCase()
-{
-  LockGuard guard( _lock );
-  return _numberOfTestCase;
-}
-
-
-int 
-TestRunnerModel::numberOfTestCaseFailure()
-{
-  LockGuard guard( _lock );
-  return _numberOfTestCaseFailure;
-}
-
-
-int 
-TestRunnerModel::numberOfTestCaseRun()
-{
-  LockGuard guard( _lock );
-  return _numberOfTestCaseRun;
-}
-
-
-TestFailureInfo *
-TestRunnerModel::failureAt( int index )
-{
-  LockGuard guard( _lock );
-  return _failures.at( index );
-}
-
-
-void 
-TestRunnerModel::runTest( CPPUNIT_NS::Test *testToRun )
-{
-  if ( isTestRunning() )
-    return;
-
-  resetTestReportCounterFor( testToRun );
-
-  {
-    LockGuard guard( _lock );
-    delete _result;
-    _result = new CPPUNIT_NS::TestResult();
-    _result->addListener( this );
-  }
-
-  emit testRunStarted( testToRun, _result );
-
-  LockGuard guard( _lock );
-  _runnerThread = new TestRunnerThread( testToRun, 
-                                        _result, 
-                                        this, 
-                                        new TestRunnerThreadFinishedEvent() );
-}
-
-
-bool 
-TestRunnerModel::isTestRunning()
-{
-  LockGuard guard( _lock );
-  return _runnerThread != NULL  &&  _runnerThread->running();
-}
-
-
-void 
-TestRunnerModel::stopRunningTest()
-{
-  {
-    LockGuard guard( _lock );
-    if ( _result == NULL )
-      return;
-  }
-  if ( isTestRunning() )
-  {
-    LockGuard guard( _lock );
-    _result->stop();
-  }
-}
-
-
-// Called from the TestRunnerThread.
-void 
-TestRunnerModel::startTest( CPPUNIT_NS::Test * /*test*/ )
-{
-}
-
-
-// Called from the TestRunnerThread.
-void 
-TestRunnerModel::addFailure( const CPPUNIT_NS::TestFailure &failure )
-{
-  addFailureInfo( new TestFailureInfo( failure.failedTest(), 
-                                       failure.thrownException(),
-                                       failure.isError() ) );
-}
-
-
-// Called from the TestRunnerThread.
-void 
-TestRunnerModel::endTest( CPPUNIT_NS::Test * /*test*/ )
-{
-  int numberOfTestCaseRun;
-  {
-    LockGuard guard( _lock );
-    numberOfTestCaseRun = ++_numberOfTestCaseRun;
-  }
-
-  // emit signal asynchronously
-  QThread::postEvent( this, 
-                      new TestRunnerTestCaseRunEvent( numberOfTestCaseRun ) );
-}
-
-
-// Called from the TestRunnerThread.
-void 
-TestRunnerModel::addFailureInfo( TestFailureInfo *failure )
-{
-  int numberOfTestCaseFailure;
-  {
-    LockGuard guard( _lock );
-    _failures.append( failure );
-    numberOfTestCaseFailure = ++_numberOfTestCaseFailure;
-  }
-
-  // emit signals asynchronously
-  QThread::postEvent( this, 
-                      new TestRunnerFailureEvent( failure,
-                                                  numberOfTestCaseFailure ) );
-}
-
-
-bool 
-TestRunnerModel::event( QEvent *event )
-{
-  if ( event->type() != QEvent::User )
-    return false;
-
-  TestRunnerThreadEvent *threadEvent = (TestRunnerThreadEvent *)event;
-  threadEvent->process( this );
-  return true;
-}
-
-
-void 
-TestRunnerModel::eventNewFailure( TestFailureInfo *failure,
-                                  int numberOfFailure )
-{
-  emit numberOfTestCaseFailureChanged( numberOfFailure );
-  emit failureAdded( failure );
-}
-
-
-void 
-TestRunnerModel::eventNumberOfTestRunChanged( int numberOfRun )
-{
-  emit numberOfTestCaseRunChanged( numberOfRun );
-}
-
-
-void 
-TestRunnerModel::eventTestRunnerThreadFinished()
-{
-  emit testRunFinished();
-}
diff --git a/src/qttestrunner/TestRunnerModel.h b/src/qttestrunner/TestRunnerModel.h
deleted file mode 100644
index ebd3a57..0000000
--- a/src/qttestrunner/TestRunnerModel.h
+++ /dev/null
@@ -1,154 +0,0 @@
-// //////////////////////////////////////////////////////////////////////////
-// Header file TestRunnerModel.h for class TestRunnerModel
-// (c)Copyright 2000, Baptiste Lepilleur.
-// Created: 2001/09/20
-// //////////////////////////////////////////////////////////////////////////
-#ifndef TESTRUNNERMODEL_H
-#define TESTRUNNERMODEL_H
-
-#include <cppunit/Test.h>
-#include <cppunit/TestListener.h>
-#include <qptrlist.h>
-#include <qobject.h>
-#include <qthread.h>
-#include "TestFailureInfo.h"
-#include "TestRunnerModelThreadInterface.h"
-class TestRunnerThread;
-
-/*! \class TestRunnerModel
- * \brief This class represents the model for the TestRunner.
- *
- * Warning: methods that override CppUnit::TestListener are called
- * from the TestRunner thread !
- *
- * Warning: _lock is not recursive. Might want to introduce Doug Lea
- * Thread Interface pattern for methods used while locked (isTestRunning()).
- *
- * Refactoring note: a large part of this object actually duplicate
- * TestResult. 
- */
-class TestRunnerModel : public QObject,
-                        private CPPUNIT_NS::TestListener,
-                        private TestRunnerModelThreadInterface
-{
-  Q_OBJECT
-public:
-  /*! Constructs a TestRunnerModel object.
-   */
-  TestRunnerModel( CPPUNIT_NS::Test *rootTest );
-
-  /*! Destructor.
-   */
-  virtual ~TestRunnerModel();
-
-  CPPUNIT_NS::Test *rootTest();
-
-  int numberOfTestCase();
-  int numberOfTestCaseFailure();
-  int numberOfTestCaseRun();
-
-  TestFailureInfo *failureAt( int index );
-
-
-  bool isTestRunning();
-
-signals:
-  void numberOfTestCaseChanged( int numberOfTestCase );
-  void numberOfTestCaseRunChanged( int numberOfRun );
-  void numberOfTestCaseFailureChanged( int numberOfFailure );
-  void failureAdded( TestFailureInfo *failure );
-  void failuresCleared();
-  void testRunStarted( CPPUNIT_NS::Test *runningTest,
-                       CPPUNIT_NS::TestResult *result );
-  void testRunFinished();
-
-public slots:
-  void resetTestReportCounterFor( CPPUNIT_NS::Test *testToRun );
-
-  /*! Request to run the specified test.
-   * Returns immedialty. If a test is already running, then
-   * the run request is ignored.
-   */
-  void runTest( CPPUNIT_NS::Test *testToRun );
-
-  /*! Request to stop running test.
-   * This methods returns immediately. testRunFinished() signal
-   * should be used to now when the test actually stopped running.
-   */
-  void stopRunningTest();
-
-private:
-  /// Prevents the use of the copy constructor.
-  TestRunnerModel( const TestRunnerModel &copy );
-
-  /// Prevents the use of the copy operator.
-  void operator =( const TestRunnerModel &copy );
-
-  /// Called from the TestRunnerThread.
-  void startTest( CPPUNIT_NS::Test *test );
-
-  /// Called from the TestRunnerThread.
-  void addFailure( const CPPUNIT_NS::TestFailure &failure );
-  
-  /// Called from the TestRunnerThread.
-  void endTest( CPPUNIT_NS::Test *test );
-
-  /// Called from the TestRunnerThread.
-  void addFailureInfo( TestFailureInfo *failure );
-
-  bool event( QEvent *event );
-
-  /*! Emits new failure signals.
-   * Called by the TestRunnerThreadEvent from the GUI thread to
-   * emit the following signals:
-   * - numberOfTestCaseFailureChanged()
-   * - failureAdded()
-   */
-  void eventNewFailure( TestFailureInfo *failure,
-                        int numberOfFailure );
-
-  /*! Emits numberOfTestCaseRunChanged() signal.
-   * Called by the TestRunnerThreadEvent from the GUI thread to
-   * emit the numberOfTestCaseRunChanged() signal.
-   */
-  void eventNumberOfTestRunChanged( int numberOfRun );
-
-  void eventTestRunnerThreadFinished();
-
-private:
-  class LockGuard
-  {
-  public:
-    LockGuard( QMutex &mutex ) : _mutex( mutex )
-    {
-      _mutex.lock();
-    }
-
-    ~LockGuard()
-    {
-      _mutex.unlock();
-    }
-
-  private:
-    QMutex &_mutex;
-  };
-
-
-  QMutex _lock;
-  CPPUNIT_NS::Test *_rootTest;
-  int _numberOfTestCase;
-  int _numberOfTestCaseRun;
-  int _numberOfTestCaseFailure;
-  QList<TestFailureInfo> _failures;
-  TestRunnerThread *_runnerThread;
-  CPPUNIT_NS::TestResult *_result;
-};
-
-
-
-// Inlines methods for TestRunnerModel:
-// ------------------------------------
-
-
-
-#endif  // TESTRUNNERMODEL_H
diff --git a/src/qttestrunner/TestRunnerModelThreadInterface.cpp b/src/qttestrunner/TestRunnerModelThreadInterface.cpp
deleted file mode 100644
index 3196054..0000000
--- a/src/qttestrunner/TestRunnerModelThreadInterface.cpp
+++ /dev/null
@@ -1,8 +0,0 @@
-// //////////////////////////////////////////////////////////////////////////
-// Implementation file TestRunnerModelThreadInterface.cpp for class TestRunnerModelThreadInterface
-// (c)Copyright 2000, Baptiste Lepilleur.
-// Created: 2001/09/21
-// //////////////////////////////////////////////////////////////////////////
-
-#include "TestRunnerModelThreadInterface.h"
-
diff --git a/src/qttestrunner/TestRunnerModelThreadInterface.h b/src/qttestrunner/TestRunnerModelThreadInterface.h
deleted file mode 100644
index 6a663a5..0000000
--- a/src/qttestrunner/TestRunnerModelThreadInterface.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// //////////////////////////////////////////////////////////////////////////
-// Header file TestRunnerModelThreadInterface.h for class TestRunnerModelThreadInterface
-// (c)Copyright 2000, Baptiste Lepilleur.
-// Created: 2001/09/21
-// //////////////////////////////////////////////////////////////////////////
-#ifndef TESTRUNNERMODELTHREADINTERFACE_H
-#define TESTRUNNERMODELTHREADINTERFACE_H
-
-class TestFailureInfo;
-
-/*! \class TestRunnerModelThreadInterface
- * \brief This class represents the interface used to process gui thread event.
- */
-class TestRunnerModelThreadInterface
-{
-public:
-  /// Destructor.
-  virtual ~TestRunnerModelThreadInterface() {}
-
-  virtual void eventNewFailure( TestFailureInfo *failure,
-                                int numberOfFailure ) =0;
-
-  virtual void eventNumberOfTestRunChanged( int numberOfRun ) =0;
-
-  virtual void eventTestRunnerThreadFinished() =0;
-};
-
-
-
-// Inlines methods for TestRunnerModelThreadInterface:
-// ---------------------------------------------------
-
-
-
-#endif  // TESTRUNNERMODELTHREADINTERFACE_H
diff --git a/src/qttestrunner/TestRunnerTestCaseRunEvent.cpp b/src/qttestrunner/TestRunnerTestCaseRunEvent.cpp
deleted file mode 100644
index 177b358..0000000
--- a/src/qttestrunner/TestRunnerTestCaseRunEvent.cpp
+++ /dev/null
@@ -1,26 +0,0 @@
-// //////////////////////////////////////////////////////////////////////////
-// Implementation file TestRunnerTestCaseRunEvent.cpp for class TestRunnerTestCaseRunEvent
-// (c)Copyright 2000, Baptiste Lepilleur.
-// Created: 2001/09/22
-// //////////////////////////////////////////////////////////////////////////
-
-#include "TestRunnerModelThreadInterface.h"
-#include "TestRunnerTestCaseRunEvent.h"
-
-
-TestRunnerTestCaseRunEvent::TestRunnerTestCaseRunEvent( int numberOfRun ) :
-    _numberOfRun( numberOfRun )
-{
-}
-
-
-TestRunnerTestCaseRunEvent::~TestRunnerTestCaseRunEvent()
-{
-}
-
-
-void 
-TestRunnerTestCaseRunEvent::process( TestRunnerModelThreadInterface *target )
-{
-  target->eventNumberOfTestRunChanged( _numberOfRun );
-}
diff --git a/src/qttestrunner/TestRunnerTestCaseRunEvent.h b/src/qttestrunner/TestRunnerTestCaseRunEvent.h
deleted file mode 100644
index bd2c635..0000000
--- a/src/qttestrunner/TestRunnerTestCaseRunEvent.h
+++ /dev/null
@@ -1,45 +0,0 @@
-// //////////////////////////////////////////////////////////////////////////
-// Header file TestRunnerTestCaseRunEvent.h for class TestRunnerTestCaseRunEvent
-// (c)Copyright 2000, Baptiste Lepilleur.
-// Created: 2001/09/22
-// //////////////////////////////////////////////////////////////////////////
-#ifndef TESTRUNNERTESTCASERUNEVENT_H
-#define TESTRUNNERTESTCASERUNEVENT_H
-
-#include "TestRunnerThreadEvent.h"
-
-
-/*! \class TestRunnerTestCaseRunEvent
- * \brief This class represents a new TestCase run event.
- */
-class TestRunnerTestCaseRunEvent : public TestRunnerThreadEvent
-{
-public:
-  /*! Constructs a TestRunnerTestCaseRunEvent object.
-   */
-  TestRunnerTestCaseRunEvent( int numberOfRun );
-
-  /// Destructor.
-  virtual ~TestRunnerTestCaseRunEvent();
-
-private:
-  /// Prevents the use of the copy constructor.
-  TestRunnerTestCaseRunEvent( const TestRunnerTestCaseRunEvent &copy );
-
-  /// Prevents the use of the copy operator.
-  void operator =( const TestRunnerTestCaseRunEvent &copy );
-
-  void process( TestRunnerModelThreadInterface *target );
-
-private:
-  int _numberOfRun;
-};
-
-
-
-// Inlines methods for TestRunnerTestCaseRunEvent:
-// -----------------------------------------------
-
-
-
-#endif  // TESTRUNNERTESTCASERUNEVENT_H
diff --git a/src/qttestrunner/TestRunnerThread.cpp b/src/qttestrunner/TestRunnerThread.cpp
index cc45526..dfc5cfe 100644
--- a/src/qttestrunner/TestRunnerThread.cpp
+++ b/src/qttestrunner/TestRunnerThread.cpp
@@ -1,38 +1,61 @@
-// //////////////////////////////////////////////////////////////////////////
-// Implementation file TestRunnerThread.cpp for class TestRunnerThread
-// (c)Copyright 2000, Baptiste Lepilleur.
-// Created: 2001/09/22
-// //////////////////////////////////////////////////////////////////////////
+#include <QMutex>
+#include <QMutexLocker>
 
 #include "TestRunnerThread.h"
-#include "TestRunnerThreadFinishedEvent.h"
 
+//
+// TestRunnerThreadPrivate
+//
 
-TestRunnerThread::TestRunnerThread( CPPUNIT_NS::Test *testToRun,
-                                    CPPUNIT_NS::TestResult *result,
-                                    QObject *eventTarget,
-                              TestRunnerThreadFinishedEvent *finishedEvent ) :
-    _testToRun( testToRun ),
-    _result( result ),
-    _eventTarget( eventTarget ),
-    _finishedEvent( finishedEvent )
+class TestRunnerThreadPrivate
 {
-  start();
-}
-
+    typedef CPPUNIT_NS::Test Test;
+    typedef CPPUNIT_NS::TestResult TestResult;
+
+public:
+    TestRunnerThreadPrivate()
+        : _test(NULL)
+        , _result(NULL)
+        , _mutex()
+    {}
+
+public:
+    Test *_test;
+    TestResult *_result;
+    QMutex _mutex;
+};
+
+//
+// TestRunnerThread
+//
+
+TestRunnerThread::TestRunnerThread(QObject *parent)
+    : QThread(parent)
+    , _d(new TestRunnerThreadPrivate)
+{}
 
 TestRunnerThread::~TestRunnerThread()
+{}
+
+void TestRunnerThread::adviseToStop()
 {
+    if (_d->_result)
+        _d->_result->stop();
 }
 
+void TestRunnerThread::setTestInformation(Test *testToRun, TestResult *result)
+{
+    QMutexLocker lock(&_d->_mutex);
+    _d->_test = testToRun;
+    _d->_result = result;
+}
 
-void 
-TestRunnerThread::run()
+void TestRunnerThread::run()
 {
-  _testToRun->run( _result );
+    QMutexLocker lock(&_d->_mutex);
+    if (_d->_test != NULL && _d->_result != NULL)
+        _d->_test->run(_d->_result);
 
-  // Signal TestRunnerModel GUI thread
-  QThread::postEvent( _eventTarget, _finishedEvent );
-  _eventTarget = NULL;
-  _finishedEvent = NULL;
+    _d->_test = NULL;
+    _d->_result = NULL;
 }
diff --git a/src/qttestrunner/TestRunnerThread.h b/src/qttestrunner/TestRunnerThread.h
index 54cb4f1..68d1529 100644
--- a/src/qttestrunner/TestRunnerThread.h
+++ b/src/qttestrunner/TestRunnerThread.h
@@ -1,55 +1,54 @@
-// //////////////////////////////////////////////////////////////////////////
-// Header file TestRunnerThread.h for class TestRunnerThread
-// (c)Copyright 2000, Baptiste Lepilleur.
-// Created: 2001/09/22
-// //////////////////////////////////////////////////////////////////////////
 #ifndef TESTRUNNERTHREAD_H
 #define TESTRUNNERTHREAD_H
 
-#include <qthread.h>
+#include <QScopedPointer>
+#include <QThread>
+
 #include <cppunit/Test.h>
 #include <cppunit/TestResult.h>
-class QObject;
-class TestRunnerThreadFinishedEvent;
-
 
-/*! \class TestRunnerThread
- * \brief This class represents the thread used to run TestCase.
+/**
+ * \class TestRunnerThread
+ * \brief This class represents the thread used to run the test cases asynchronously.
  */
 class TestRunnerThread : public QThread
 {
-public:
-  /*! Constructs a TestRunnerThread object.
-   */
-  TestRunnerThread( CPPUNIT_NS::Test *testToRun,
-                    CPPUNIT_NS::TestResult *result,
-                    QObject *eventTarget,
-                    TestRunnerThreadFinishedEvent *finishedEvent );
+    Q_OBJECT
+    Q_DISABLE_COPY(TestRunnerThread)
 
-  /// Destructor.
-  virtual ~TestRunnerThread();
+    typedef CPPUNIT_NS::Test Test;
+    typedef CPPUNIT_NS::TestResult TestResult;
 
-private:
-  /// Prevents the use of the copy constructor.
-  TestRunnerThread( const TestRunnerThread &copy );
-
-  /// Prevents the use of the copy operator.
-  void operator =( const TestRunnerThread &copy );
+public:
+    /*!
+     * \brief Constructs a TestRunner thread object.
+     * \param parent A pointer to a parent QObject
+     */
+    TestRunnerThread(QObject *parent = 0);
+
+    /*!
+     * \brief Destructor
+     */
+    ~TestRunnerThread();
+
+public slots:
+    /*!
+     * \brief Stops a running test
+     */
+    void adviseToStop();
+
+    /*!
+     * \brief Sets information for the test to run and the output result
+     * \param testToRun A pointer to a Test which should be run
+     * \param result A pointer to a TestResult object.
+     */
+    void setTestInformation(Test *testToRun, TestResult *result);
 
-  void run();
+private:
+    void run();
 
 private:
- CPPUNIT_NS::Test *_testToRun;
- CPPUNIT_NS::TestResult *_result;
- QObject *_eventTarget;
- TestRunnerThreadFinishedEvent *_finishedEvent;
+    QScopedPointer<class TestRunnerThreadPrivate> _d;
 };
 
-
-
-// Inlines methods for TestRunnerThread:
-// -------------------------------------
-
-
-
-#endif  // TESTRUNNERTHREAD_H
+#endif // TESTRUNNERTHREAD_H
diff --git a/src/qttestrunner/TestRunnerThreadEvent.cpp b/src/qttestrunner/TestRunnerThreadEvent.cpp
deleted file mode 100644
index 17be770..0000000
--- a/src/qttestrunner/TestRunnerThreadEvent.cpp
+++ /dev/null
@@ -1,19 +0,0 @@
-// //////////////////////////////////////////////////////////////////////////
-// Implementation file TestRunnerThreadEvent.cpp for class TestRunnerThreadEvent
-// (c)Copyright 2000, Baptiste Lepilleur.
-// Created: 2001/09/21
-// //////////////////////////////////////////////////////////////////////////
-
-#include "TestRunnerThreadEvent.h"
-
-
-TestRunnerThreadEvent::TestRunnerThreadEvent() : 
-    QCustomEvent( User )
-{
-}
-
-
-TestRunnerThreadEvent::~TestRunnerThreadEvent()
-{
-}
-
diff --git a/src/qttestrunner/TestRunnerThreadEvent.h b/src/qttestrunner/TestRunnerThreadEvent.h
deleted file mode 100644
index 32389bd..0000000
--- a/src/qttestrunner/TestRunnerThreadEvent.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// //////////////////////////////////////////////////////////////////////////
-// Header file TestRunnerThreadEvent.h for class TestRunnerThreadEvent
-// (c)Copyright 2000, Baptiste Lepilleur.
-// Created: 2001/09/21
-// //////////////////////////////////////////////////////////////////////////
-#ifndef TESTRUNNERTHREADEVENT_H
-#define TESTRUNNERTHREADEVENT_H
-
-#include <qevent.h>
-class TestRunnerModelThreadInterface;
-
-/*! \class TestRunnerThreadEvent
- * \brief This class represents an event send by the test runner thread.
- */
-class TestRunnerThreadEvent : public QCustomEvent
-{
-public:
-  /*! Constructs a TestRunnerThreadEvent object.
-   */
-  TestRunnerThreadEvent();
-
-  /// Destructor.
-  virtual ~TestRunnerThreadEvent();
-
-  virtual void process( TestRunnerModelThreadInterface *target ) =0;
-
-private:
-  /// Prevents the use of the copy constructor.
-  TestRunnerThreadEvent( const TestRunnerThreadEvent &copy );
-
-  /// Prevents the use of the copy operator.
-  void operator =( const TestRunnerThreadEvent &copy );
-};
-
-
-
-#endif  // TESTRUNNERTHREADEVENT_H
diff --git a/src/qttestrunner/TestRunnerThreadFinishedEvent.cpp b/src/qttestrunner/TestRunnerThreadFinishedEvent.cpp
deleted file mode 100644
index 5c2f2ba..0000000
--- a/src/qttestrunner/TestRunnerThreadFinishedEvent.cpp
+++ /dev/null
@@ -1,25 +0,0 @@
-// //////////////////////////////////////////////////////////////////////////
-// Implementation file TestRunnerThreadFinishedEvent.cpp for class TestRunnerThreadFinishedEvent
-// (c)Copyright 2000, Baptiste Lepilleur.
-// Created: 2001/09/22
-// //////////////////////////////////////////////////////////////////////////
-
-#include "TestRunnerThreadFinishedEvent.h"
-#include "TestRunnerModelThreadInterface.h"
-
-
-TestRunnerThreadFinishedEvent::TestRunnerThreadFinishedEvent()
-{
-}
-
-
-TestRunnerThreadFinishedEvent::~TestRunnerThreadFinishedEvent()
-{
-}
-
-
-void 
-TestRunnerThreadFinishedEvent::process( TestRunnerModelThreadInterface *target )
-{
-  target->eventTestRunnerThreadFinished();
-}
diff --git a/src/qttestrunner/TestRunnerThreadFinishedEvent.h b/src/qttestrunner/TestRunnerThreadFinishedEvent.h
deleted file mode 100644
index b390e7a..0000000
--- a/src/qttestrunner/TestRunnerThreadFinishedEvent.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// //////////////////////////////////////////////////////////////////////////
-// Header file TestRunnerThreadFinishedEvent.h for class TestRunnerThreadFinishedEvent
-// (c)Copyright 2000, Baptiste Lepilleur.
-// Created: 2001/09/22
-// //////////////////////////////////////////////////////////////////////////
-#ifndef TESTRUNNERTHREADFINISHEDEVENT_H
-#define TESTRUNNERTHREADFINISHEDEVENT_H
-
-#include "TestRunnerThreadEvent.h"
-
-
-/*! \class TestRunnerThreadFinishedEvent
- * \brief This class represents an event indicating that the TestRunnerThread finished.
- */
-class TestRunnerThreadFinishedEvent : public TestRunnerThreadEvent
-{
-public:
-  /*! Constructs a TestRunnerThreadFinishedEvent object.
-   */
-  TestRunnerThreadFinishedEvent();
-
-  /// Destructor.
-  virtual ~TestRunnerThreadFinishedEvent();
-
-  void process( TestRunnerModelThreadInterface *target );
-
-private:
-  /// Prevents the use of the copy constructor.
-  TestRunnerThreadFinishedEvent( const TestRunnerThreadFinishedEvent &copy );
-
-  /// Prevents the use of the copy operator.
-  void operator =( const TestRunnerThreadFinishedEvent &copy );
-};
-
-
-
-// Inlines methods for TestRunnerThreadFinishedEvent:
-// --------------------------------------------------
-
-
-
-#endif  // TESTRUNNERTHREADFINISHEDEVENT_H
diff --git a/src/qttestrunner/TestRunnerWindow.cpp b/src/qttestrunner/TestRunnerWindow.cpp
new file mode 100644
index 0000000..b187fea
--- /dev/null
+++ b/src/qttestrunner/TestRunnerWindow.cpp
@@ -0,0 +1,17 @@
+#include <cppunit/Exception.h>
+
+#include "TestRunnerWindow.h"
+#include "TestRunnerWindowPrivate.h"
+
+TestRunnerWindow::TestRunnerWindow(Test *rootTest, QWidget* parent, Qt::WindowFlags flags)
+    : QWidget(parent, flags)
+    , _d(new TestRunnerWindowPrivate(rootTest, this))
+{}
+
+TestRunnerWindow::~TestRunnerWindow()
+{}
+
+void TestRunnerWindow::startTesting()
+{
+    _d->startTesting();
+}
diff --git a/src/qttestrunner/TestRunnerWindow.h b/src/qttestrunner/TestRunnerWindow.h
new file mode 100644
index 0000000..9133bf8
--- /dev/null
+++ b/src/qttestrunner/TestRunnerWindow.h
@@ -0,0 +1,46 @@
+#ifndef TESTRUNNERWINDOW_H
+#define TESTRUNNERWINDOW_H
+
+#include <QScopedPointer>
+#include <QWidget>
+
+#include <cppunit/Test.h>
+
+/*!
+ * \class TestRunnerWindow
+ * \brief This class represents the external interface to the test runner dialog
+ */
+class TestRunnerWindow : public QWidget
+{
+    Q_OBJECT
+
+    typedef CPPUNIT_NS::Test Test;
+
+public:
+    /*!
+     * \brief Constructs a new test runner dialog
+     * \param rootTest The root test to use
+     * \param parent A pointer to a parent QWidget
+     * \param flags Window flags controlling the appearance of the dialog
+     */
+    TestRunnerWindow(Test* rootTest, QWidget* parent = 0, Qt::WindowFlags flags = 0);
+
+    /*!
+     * \brief Destructor
+     */
+    ~TestRunnerWindow();
+
+public slots:
+    /*!
+     * \brief Runs the registered root test (and all of its child tests)
+     *
+     * This slot is used by the test runner to _automatically_ start testing once the dialog
+     * is displayed.
+     */
+    void startTesting();
+
+private:
+    QScopedPointer<class TestRunnerWindowPrivate> _d;
+};
+
+#endif // TESTRUNNERWINDOW_H
diff --git a/src/qttestrunner/TestRunnerWindow.ui b/src/qttestrunner/TestRunnerWindow.ui
new file mode 100644
index 0000000..4980f26
--- /dev/null
+++ b/src/qttestrunner/TestRunnerWindow.ui
@@ -0,0 +1,228 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>TestRunnerWindow</class>
+ <widget class="QWidget" name="TestRunnerWindow">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>605</width>
+    <height>595</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Qt Test Runner</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout">
+   <item row="0" column="0" colspan="6">
+    <widget class="QComboBox" name="comboTest">
+     <property name="maxVisibleItems">
+      <number>20</number>
+     </property>
+     <property name="maxCount">
+      <number>20</number>
+     </property>
+     <property name="insertPolicy">
+      <enum>QComboBox::InsertAtTop</enum>
+     </property>
+     <property name="sizeAdjustPolicy">
+      <enum>QComboBox::AdjustToContents</enum>
+     </property>
+     <property name="duplicatesEnabled">
+      <bool>false</bool>
+     </property>
+    </widget>
+   </item>
+   <item row="1" column="6">
+    <widget class="QPushButton" name="pushButton_Run">
+     <property name="text">
+      <string>Run</string>
+     </property>
+    </widget>
+   </item>
+   <item row="2" column="6">
+    <widget class="QPushButton" name="pushButton_Stop">
+     <property name="text">
+      <string>Stop Test</string>
+     </property>
+    </widget>
+   </item>
+   <item row="3" column="6">
+    <widget class="QPushButton" name="pushButton_Close">
+     <property name="text">
+      <string>Close</string>
+     </property>
+    </widget>
+   </item>
+   <item row="0" column="6">
+    <widget class="QPushButton" name="pushButton_Browse">
+     <property name="text">
+      <string>Browse...</string>
+     </property>
+    </widget>
+   </item>
+   <item row="3" column="0">
+    <widget class="QLabel" name="label_2">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="text">
+      <string>Test Cases:</string>
+     </property>
+    </widget>
+   </item>
+   <item row="3" column="1">
+    <widget class="QLabel" name="label_TestCaseCount">
+     <property name="text">
+      <string>0</string>
+     </property>
+    </widget>
+   </item>
+   <item row="3" column="2">
+    <widget class="QLabel" name="label_3">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="text">
+      <string>Run:</string>
+     </property>
+    </widget>
+   </item>
+   <item row="3" column="3">
+    <widget class="QLabel" name="label_TestRunCount">
+     <property name="text">
+      <string>0</string>
+     </property>
+    </widget>
+   </item>
+   <item row="3" column="4">
+    <widget class="QLabel" name="label_4">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="text">
+      <string>Failure:</string>
+     </property>
+    </widget>
+   </item>
+   <item row="3" column="5">
+    <widget class="QLabel" name="label_FailureCount">
+     <property name="text">
+      <string>0</string>
+     </property>
+    </widget>
+   </item>
+   <item row="4" column="0" colspan="7">
+    <widget class="QProgressBar" name="progressBar_Run">
+     <property name="value">
+      <number>0</number>
+     </property>
+    </widget>
+   </item>
+   <item row="6" column="0" colspan="7">
+    <widget class="QGroupBox" name="groupBox_Details">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="title">
+      <string>Failure Details for: ...</string>
+     </property>
+     <layout class="QGridLayout" name="gridLayout_2">
+      <item row="0" column="0">
+       <widget class="QLabel" name="label">
+        <property name="text">
+         <string>Location:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="0">
+       <widget class="QLabel" name="label_5">
+        <property name="text">
+         <string>Message:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="1">
+       <widget class="QLineEdit" name="lineEdit_Location">
+        <property name="minimumSize">
+         <size>
+          <width>0</width>
+          <height>24</height>
+         </size>
+        </property>
+        <property name="readOnly">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="1" colspan="2">
+       <widget class="QPlainTextEdit" name="plainTextEdit_Message">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="readOnly">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="2">
+       <widget class="QToolButton" name="toolButton_View">
+        <property name="enabled">
+         <bool>false</bool>
+        </property>
+        <property name="text">
+         <string>View</string>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item row="5" column="0" colspan="7">
+    <widget class="QTableView" name="failureView">
+     <property name="editTriggers">
+      <set>QAbstractItemView::NoEditTriggers</set>
+     </property>
+     <property name="alternatingRowColors">
+      <bool>true</bool>
+     </property>
+     <property name="selectionMode">
+      <enum>QAbstractItemView::SingleSelection</enum>
+     </property>
+     <property name="selectionBehavior">
+      <enum>QAbstractItemView::SelectRows</enum>
+     </property>
+     <property name="gridStyle">
+      <enum>Qt::NoPen</enum>
+     </property>
+     <attribute name="horizontalHeaderCascadingSectionResizes">
+      <bool>true</bool>
+     </attribute>
+     <attribute name="horizontalHeaderStretchLastSection">
+      <bool>true</bool>
+     </attribute>
+     <attribute name="verticalHeaderVisible">
+      <bool>false</bool>
+     </attribute>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src/qttestrunner/TestRunnerWindowPrivate.cpp b/src/qttestrunner/TestRunnerWindowPrivate.cpp
new file mode 100644
index 0000000..abdfc92
--- /dev/null
+++ b/src/qttestrunner/TestRunnerWindowPrivate.cpp
@@ -0,0 +1,231 @@
+#include <QDesktopServices>
+#include <QFile>
+#include <QMutex>
+#include <QUrl>
+#include <cppunit/Exception.h>
+
+#include "TestRunnerWindowPrivate.h"
+#include "ui_TestRunnerWindow.h"
+
+namespace {
+
+class QtSynchronizationObject : public CPPUNIT_NS::SynchronizedObject::SynchronizationObject
+{
+public:
+    QtSynchronizationObject()
+        : CPPUNIT_NS::SynchronizedObject::SynchronizationObject()
+    {}
+
+    ~QtSynchronizationObject()
+    {}
+
+    void lock()
+    {
+        _mutex.lock();
+    }
+
+    void unlock()
+    {
+        _mutex.unlock();
+    }
+
+private:
+    QMutex _mutex;
+};
+
+} // unnamed namespace
+
+//
+// TestRunnerWindowPrivate
+//
+
+TestRunnerWindowPrivate::TestRunnerWindowPrivate(Test *root, QWidget *parent)
+    : QObject(parent)
+    , _model(new TestFailureTableModel(parent))
+    , _thread(new TestRunnerThread(parent))
+    , _browser(new TestBrowser(root, parent))
+    , _listener(new QtTestListener(parent))
+    , _rootTest(root)
+    , _srcfile()
+    , _result()
+    , _ui(new Ui::TestRunnerWindow)
+{
+    _ui->setupUi(parent);
+    setup();
+    updateTestList(_rootTest);
+}
+
+TestRunnerWindowPrivate::~TestRunnerWindowPrivate()
+{}
+
+void TestRunnerWindowPrivate::setup()
+{
+    qRegisterMetaType<QtTestFailure>("QtTestFailure");
+
+    connect(_thread, SIGNAL(started()), SLOT(testingStarted()));
+    connect(_thread, SIGNAL(finished()), SLOT(testingFinished()));
+
+    connect(_ui->pushButton_Browse, SIGNAL(clicked()), _browser, SLOT(exec()));
+    connect(_ui->pushButton_Stop, SIGNAL(clicked()), SLOT(stopTesting()));
+    connect(_ui->pushButton_Run, SIGNAL(clicked()), SLOT(startTesting()));
+    connect(_ui->pushButton_Close, SIGNAL(clicked()), parent(), SLOT(close()));
+    connect(_ui->toolButton_View, SIGNAL(clicked()), SLOT(viewSourceFile()));
+    connect(_ui->comboTest, SIGNAL(currentIndexChanged(int)), SLOT(testIndexChanged(int)));
+
+    connect(_ui->failureView, SIGNAL(activated(QModelIndex)),
+            SLOT(displayFailureDetail(QModelIndex)));
+    connect(_ui->failureView, SIGNAL(clicked(QModelIndex)),
+            SLOT(displayFailureDetail(QModelIndex)));
+    connect(_browser, SIGNAL(testSelected(Test*)),
+            SLOT(updateTestList(Test*)));
+    connect(_listener, SIGNAL(testFailed(QtTestFailure)),
+            _model, SLOT(addFailure(QtTestFailure)));
+
+    connect(_listener, SIGNAL(testCaseFinished()), SLOT(testCaseFinished()));
+    connect(_listener, SIGNAL(testFailed(QtTestFailure)), SLOT(testCaseFailed()));
+
+    _ui->failureView->setModel(_model);
+}
+
+void TestRunnerWindowPrivate::startTesting()
+{
+    int currentIndex = _ui->comboTest->currentIndex();
+    Test *testToRun = _ui->comboTest->itemData(currentIndex).value<Test*>();
+
+    if (testToRun == NULL)
+        return;
+
+    clearPreviousRun();
+    _result.reset(new TestResult(new QtSynchronizationObject));
+    _result->addListener(_listener);
+
+    connect(_listener, SIGNAL(testCaseStarted()), SLOT(testingStarted()));
+    connect(_listener, SIGNAL(testCaseFinished()), SLOT(testingFinished()));
+
+    _thread->setTestInformation(testToRun, _result.data());
+    _thread->start();
+}
+
+void TestRunnerWindowPrivate::stopTesting()
+{
+    if (_thread->isRunning())
+    {
+        _ui->pushButton_Stop->setText(tr("Stopping"));
+        _thread->adviseToStop();
+    }
+}
+
+void TestRunnerWindowPrivate::testingStarted()
+{
+    _ui->comboTest->setEnabled(false);
+    _ui->pushButton_Browse->setEnabled(false);
+    _ui->pushButton_Close->setEnabled(false);
+    _ui->pushButton_Run->setEnabled(false);
+    _ui->pushButton_Stop->setEnabled(true);
+}
+
+void TestRunnerWindowPrivate::testingFinished()
+{
+    _ui->comboTest->setEnabled(true);
+    _ui->pushButton_Browse->setEnabled(true);
+    _ui->pushButton_Close->setEnabled(true);
+    _ui->pushButton_Run->setEnabled(true);
+    _ui->pushButton_Stop->setEnabled(false);
+
+    if (_ui->pushButton_Stop->text() != tr("Stop Test"))
+        _ui->pushButton_Stop->setText(tr("Stop Test"));
+}
+
+void TestRunnerWindowPrivate::testIndexChanged(int index)
+{
+    Test *testToRun = _ui->comboTest->itemData(index).value<Test*>();
+
+    setTestCaseCount(testToRun->countTestCases());
+    clearPreviousRun();
+}
+
+void TestRunnerWindowPrivate::clearPreviousRun()
+{
+    _model->clear();
+    _ui->label_FailureCount->setText("0");
+    _ui->label_TestRunCount->setText("0");
+    _ui->progressBar_Run->setValue(0);
+    _ui->toolButton_View->setEnabled(false);
+    clearFailureDetail();
+}
+
+void TestRunnerWindowPrivate::setTestCaseCount(int count)
+{
+    _ui->label_TestCaseCount->setText(QString::number(count));
+    _ui->progressBar_Run->setMaximum(count);
+}
+
+void TestRunnerWindowPrivate::testCaseFinished()
+{
+    int val = _ui->progressBar_Run->value() + 1;
+    _ui->label_TestRunCount->setText(QString::number(val));
+    _ui->progressBar_Run->setValue(val);
+}
+
+void TestRunnerWindowPrivate::testCaseFailed()
+{
+    int val = _ui->label_FailureCount->text().toInt() + 1;
+    _ui->label_FailureCount->setText(QString::number(val));
+}
+
+void TestRunnerWindowPrivate::clearFailureDetail()
+{
+    _ui->groupBox_Details->setTitle(tr("Failure detail for: ..."));
+    _ui->lineEdit_Location->clear();
+    _ui->plainTextEdit_Message->clear();
+}
+
+void TestRunnerWindowPrivate::displayFailureDetail(const QModelIndex &index)
+{
+    QVariant data = _model->data(index, Qt::UserRole);
+    QtTestFailure failure = data.value<QtTestFailure>();
+
+    QString title = tr("Failure detail for: ") + failure.failedTestName();
+    _ui->groupBox_Details->setTitle(title);
+
+    QString location = QString::fromStdString(failure.sourceLine().fileName());
+    bool fileExists = QFile::exists(location);
+
+    if (fileExists && !_ui->toolButton_View->isEnabled())
+    {
+        _srcfile = location;
+        _ui->toolButton_View->setEnabled(true);
+    }
+    else if(!fileExists && _ui->toolButton_View->isEnabled())
+    {
+        _ui->toolButton_View->setEnabled(false);
+    }
+
+    location += " (" + QString::number(failure.sourceLine().lineNumber()) + ")";
+    _ui->lineEdit_Location->setText(location);
+
+    _ui->plainTextEdit_Message->setPlainText(failure.message());
+}
+
+void TestRunnerWindowPrivate::updateTestList(Test *test)
+{
+    QVariant data;
+    QString testName = QString::fromStdString(test->getName());
+
+    int duplicateIndex = _ui->comboTest->findText(testName);
+    if (duplicateIndex > -1)
+        _ui->comboTest->removeItem(duplicateIndex);
+
+    data.setValue(test);
+    _ui->comboTest->insertItem(0, testName , data);
+    _ui->comboTest->setCurrentIndex(0);
+}
+
+void TestRunnerWindowPrivate::viewSourceFile()
+{
+    if (_srcfile.isEmpty())
+        return;
+
+    QUrl location("file:///" + _srcfile);
+    QDesktopServices::openUrl(location);
+}
diff --git a/src/qttestrunner/TestRunnerWindowPrivate.h b/src/qttestrunner/TestRunnerWindowPrivate.h
new file mode 100644
index 0000000..f52fac9
--- /dev/null
+++ b/src/qttestrunner/TestRunnerWindowPrivate.h
@@ -0,0 +1,64 @@
+#ifndef TESTRUNNERWINDOWPRIVATE_H
+#define TESTRUNNERWINDOWPRIVATE_H
+
+#include <QScopedPointer>
+#include <QWidget>
+
+#include "QtTestFailure.h"
+#include "QtTestListener.h"
+#include "TestFailureTableModel.h"
+#include "TestRunnerThread.h"
+#include "TestBrowser.h"
+
+#include <cppunit/Test.h>
+
+namespace Ui {
+class TestRunnerWindow;
+}
+
+class TestRunnerWindowPrivate : public QObject
+{
+    Q_OBJECT
+    Q_DISABLE_COPY(TestRunnerWindowPrivate)
+
+    typedef CPPUNIT_NS::Test Test;
+    typedef CPPUNIT_NS::TestResult TestResult;
+
+public:
+    TestRunnerWindowPrivate(Test *root, QWidget *parent);
+    ~TestRunnerWindowPrivate();
+
+public slots:
+    void startTesting();
+
+private:
+    void setup();
+
+private slots:
+    void stopTesting();
+    void testingStarted();
+    void testingFinished();
+    void testIndexChanged(int index);
+    void clearPreviousRun();
+    void setTestCaseCount(int count);
+    void testCaseFinished();
+    void testCaseFailed();
+    void clearFailureDetail();
+    void displayFailureDetail(const QModelIndex &index);
+    void updateTestList(Test *test);
+    void viewSourceFile();
+
+private:
+    TestFailureTableModel *_model;
+    TestRunnerThread *_thread;
+    TestBrowser *_browser;
+    QtTestListener *_listener;
+    Test *_rootTest;
+
+    QString _srcfile;
+
+    QScopedPointer<TestResult> _result;
+    QScopedPointer<Ui::TestRunnerWindow> _ui;
+};
+
+#endif // TESTRUNNERWINDOWPRIVATE_H
diff --git a/src/qttestrunner/qttestrunnerlib.pro b/src/qttestrunner/qttestrunnerlib.pro
index 18870ee..ac366ad 100644
--- a/src/qttestrunner/qttestrunnerlib.pro
+++ b/src/qttestrunner/qttestrunnerlib.pro
@@ -1,149 +1,76 @@
 #----------------------------------------------------------------------
 # File:    qttestrunnerlib.pro
 # Purpose: qmake config file for the QtTestRunner library.
-#          The library is built as debug staticlib. Set the CONFIG
-#          variable accordingly to build it differently.
+#          The library is built in both debug and release configs as
+#          shared library. Set the CONFIG variable accordingly to build
+#          it differently.
 #----------------------------------------------------------------------
 
-TEMPLATE = lib
-LANGUAGE = C++
-
-# Get rid of possibly predefined options
-
-CONFIG -= debug
-CONFIG -= release
-CONFIG -= dll
-CONFIG -= staticlib
-
-CONFIG += qt warn_on debug staticlib
+QT       += core gui
 
-#CONFIG += qt warn_on release staticlib
-#CONFIG += qt warn_on debug dll
-#CONFIG += qt warn_on release dll
+greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
 
+TEMPLATE = lib
+TARGET = cppunit-qttestrunner
+CONFIG += debug_and_release warn_on
+CONFIG += dll # Set this to 'static' when building a static library
 
-QTRUNNER_LIB = qttestrunner   # Name of the library
-
+CPPUNIT_LIB = cppunit # cppunit library base name
 
-#----------------------------------------------------------------------
-# MS Windows
-#----------------------------------------------------------------------
+CONFIG(debug, debug|release) {
+    mac {
+        TARGET = $$join(TARGET,,,_debug)
+        CPPUNIT_LIB = $$join(CPPUNIT_LIB,,,_debug)
+    }
+    win32 {
+        TARGET = $$join(TARGET,,,d)
+        CPPUNIT_LIB = $$join(CPPUNIT_LIB,,,d)
+    }
+}
 
-win32 {
-    # Suppress program database creation (should better be done
-    # in the qmake spec file)
-    QMAKE_CXXFLAGS_DEBUG += /Z7
-    QMAKE_CXXFLAGS_DEBUG -= -Gm
-    QMAKE_CXXFLAGS_DEBUG -= -Zi
+static { # everything below takes effect with CONFIG += static
+    CONFIG += staticlib
+    mac: TARGET = $$join(TARGET,,,_static)
+    win32: TARGET = $$join(TARGET,,,s)
 }
 
-win32 {
-    MOC_DIR = tmp\moc
-    UI_DIR = tmp\moc
-    dll {
+dll { # everything below takes effect with CONFIG += dll
+    win32 {
         DEFINES += QTTESTRUNNER_DLL_BUILD
-        DLLDESTDIR = ..\..\lib
-        debug {
-            TARGET = $${QTRUNNER_LIB}d_dll
-            QTRUNNER_IMPORTLIB = $${QTRUNNER_LIB}d_dll.lib
-            OBJECTS_DIR = DebugDLL
-            LIBS += ..\..\lib\cppunitd_dll.lib
-        }
-        release {
-            TARGET = $${QTRUNNER_LIB}_dll
-            QTRUNNER_IMPORTLIB = $${QTRUNNER_LIB}_dll.lib
-            OBJECTS_DIR = ReleaseDLL
-            LIBS += ..\..\lib\cppunit_dll.lib
-        }
-        DESTDIR = $${OBJECTS_DIR}
-        QMAKE_CLEAN += $${QTRUNNER_IMPORTLIB}
-        
-        # Also copy the import library after build of the DLL       
-        QTRUNNER_IMPORTLIB = $${DESTDIR}-SEP-$${QTRUNNER_IMPORTLIB}
-        QTRUNNER_IMPORTLIB ~= s/-SEP-/\/
-        QMAKE_POST_LINK = copy $${QTRUNNER_IMPORTLIB} $${DLLDESTDIR}
-    }
-    staticlib {
-        DESTDIR = ..\..\lib
-        debug {
-            TARGET = $${QTRUNNER_LIB}d
-            OBJECTS_DIR = Debug
-        }
-        release {
-            TARGET = $${QTRUNNER_LIB}
-            OBJECTS_DIR = Release
-        }
+        TARGET = $$join(TARGET,,,_dll)
+        CPPUNIT_LIB = $$join(CPPUNIT_LIB,,,_dll)
     }
 }
 
-#----------------------------------------------------------------------
-# Linux/Unix
-#----------------------------------------------------------------------
+# Link paths for the correct cppunit library
+win32 {
+    LIBS += $${CPPUNIT_LIB}.lib
+}
 
 unix {
-    MOC_DIR = .moc
-    UI_DIR = .moc
-    DESTDIR = ../../lib
-    dll {
-        debug {
-            TARGET = $${QTRUNNER_LIB}d_shared
-            OBJECTS_DIR = .obj_debug_shared
-            LIBS += -L../../lib -lcppunit
-        }
-        release {
-            TARGET = $${QTRUNNER_LIB}_shared
-            OBJECTS_DIR = .obj_release_shared
-            LIBS += -L../../lib -lcppunit
-        }
-    }
-    staticlib {
-        debug {
-            TARGET = $${QTRUNNER_LIB}d
-            OBJECTS_DIR = .obj_debug
-        }
-        release {
-            TARGET = $${QTRUNNER_LIB}
-            OBJECTS_DIR = .obj_release
-        }
-    }
+    LIBS += -l$${CPPUNIT_LIB}
+    target.path = /lib
+    INSTALLS += target
 }
 
-#----------------------------------------------------------------------
-
-HEADERS = \
-        MostRecentTests.h \
-        TestBrowserDlgImpl.h \
-        TestFailureInfo.h \
-        TestFailureListViewItem.h \
-        TestListViewItem.h \
-        TestRunnerDlgImpl.h \
-        TestRunnerFailureEvent.h \
-        TestRunnerModel.h \
-        TestRunnerModelThreadInterface.h \
-        TestRunnerTestCaseRunEvent.h \
-        TestRunnerThread.h \
-        TestRunnerThreadEvent.h \
-        TestRunnerThreadFinishedEvent.h \
-        ../../include/cppunit/ui/qt/TestRunner.h
-
-SOURCES = \
-        MostRecentTests.cpp \
-        TestBrowserDlgImpl.cpp \
-        TestFailureInfo.cpp \
-        TestFailureListViewItem.cpp \
-        TestListViewItem.cpp \
-        QtTestRunner.cpp \
-        TestRunnerDlgImpl.cpp \
-        TestRunnerFailureEvent.cpp \
-        TestRunnerModel.cpp \
-        TestRunnerModelThreadInterface.cpp \
-        TestRunnerTestCaseRunEvent.cpp \
-        TestRunnerThread.cpp \
-        TestRunnerThreadEvent.cpp \
-        TestRunnerThreadFinishedEvent.cpp
-
-INTERFACES = \
-        testbrowserdlg.ui \
-        testrunnerdlg.ui
-
-INCLUDEPATH += . ../../include
+INCLUDEPATH += ../../include
+
+SOURCES += QtTestFailure.cpp \
+    QtTestListener.cpp \
+    QtTestRunner.cpp \
+    TestBrowser.cpp \
+    TestFailureTableModel.cpp \
+    TestRunnerThread.cpp \
+    TestRunnerWindow.cpp \
+    TestRunnerWindowPrivate.cpp
+
+HEADERS  += QtTestFailure.h \
+    QtTestListener.h \
+    TestBrowser.h \
+    TestFailureTableModel.h \
+    TestRunnerThread.h \
+    TestRunnerWindow.h \
+    TestRunnerWindowPrivate.h
+
+FORMS    += TestBrowser.ui \
+    TestRunnerWindow.ui
diff --git a/src/qttestrunner/testbrowserdlg.ui b/src/qttestrunner/testbrowserdlg.ui
deleted file mode 100644
index 4daedf8..0000000
--- a/src/qttestrunner/testbrowserdlg.ui
+++ /dev/null
@@ -1,148 +0,0 @@
-<!DOCTYPE UI><UI>
-<class>TestBrowserBase</class>
-<widget>
-    <class>QDialog</class>
-    <property stdset="1">
-        <name>name</name>
-        <cstring>TestBrowserBase</cstring>
-    </property>
-    <property>
-        <name>geometry</name>
-        <rect>
-            <x>0</x>
-            <y>0</y>
-            <width>352</width>

... etc. - the rest is truncated


More information about the Libreoffice-commits mailing list