diff options
Diffstat (limited to 'tests/lib/unit++/gui.h')
-rw-r--r-- | tests/lib/unit++/gui.h | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/tests/lib/unit++/gui.h b/tests/lib/unit++/gui.h new file mode 100644 index 00000000..5a90ca38 --- /dev/null +++ b/tests/lib/unit++/gui.h @@ -0,0 +1,166 @@ +#ifndef __UNITPP_GUI_H +#define __UNITPP_GUI_H +#ifdef GUI +#include "tester.h" +#include <exception> +#include <vector> +#include <qwidget.h> +#include <qcolor.h> +#include <qframe.h> +#include <qlabel.h> +#include <qlistview.h> +#include <qprogressbar.h> +#include <qhbox.h> +#include <qvbox.h> +#include <qpixmap.h> +#include <qpushbutton.h> +#include <qapplication.h> + +/// \name unitpp +namespace unitpp { +/// A colored count with a unit. +class cnt_item : public QHBox +{ + Q_OBJECT +private: + int v; + QLabel* val; + QLabel* label; +public: + cnt_item(QWidget* par, const QString& txt, const QColor& col = black, + const char* nam = 0); +public slots: + void value(int v); + void inc(); +}; + +/// A line with total, ok, fail, and error counts. +class cnt_line : public QHBox +{ + Q_OBJECT +private: + enum fields { id_max, id_ok, id_fail, id_error, n_id }; + QLabel* label; + cnt_item* cnts[n_id]; +public slots: + void max(int v); + void reset(); + void inc_ok(); + void inc_fail(); + void inc_error(); +public: + cnt_line(const QString& txt, QWidget* par = 0, const char* name = 0); +}; + +/// A cnt_line stacked with a progress bar. +class res_stack : public QVBox +{ + Q_OBJECT +private: + cnt_line* cnts; + QProgressBar* bar; + void inc_progress(bool red); +public slots: + void max(int max); + void reset(); + void inc_ok(); + void inc_fail(); + void inc_error(); +public: + res_stack(const QString& txt, QWidget* par=0, const char* name=0); +}; +class node; +/// The whole GUI box with test tree, results, and buttons. +class gui : public QVBox +{ + Q_OBJECT +public: + gui(QApplication& app, QWidget* par = 0, const char* name = 0); + virtual ~gui(); + QListView* test_tree() { return tree; } + void add_test(node* n); + void add_suite(node* n); + void processEvents(int t); +signals: + void run(); + void stop(); +public slots: + void totSuites(int v); + void totTests(int v); + void reset(); +private slots: + void run_pressed() { emit run(); } + void stop_pressed() { emit stop(); } +private: + void nconnect(node* node, res_stack*); + QApplication& app; + QListView* tree; + res_stack* suites; + res_stack* tests; + QPushButton* b_run; + QPushButton* b_stop; + QPushButton* b_quit; +}; +class suite_node; +// a Qt error prevents this from being a ListViewItem... +/** + * A node in the test tree. An error in Qt prevents this to be derived from + * QListViewItem, hence the separation. + */ +class node : public QObject +{ + Q_OBJECT +public: + enum state { none, is_ok, is_fail, is_error }; + /// Create this node under par. + node(suite_node* par, test&); + /// Get the associated QListViewItem. + QListViewItem* lvi() { return item; } + /// + state status() { return st; } +signals: + /// [signal] emitted when the test succedes + void ok(); + /// [signal] emitted when the test fails + void fail(); + /// [signal] emitted when the test throws an exception + void error(); +public slots: + /// [slot] Make the test run, and emit appropriate signals. + virtual void run(); +protected: + /// Make a top level test, directly under the gui. + node(gui* par, test&); + /// Set the status of the node, including update of the displayed icon. + void status(state s) { + st = s; + setImg(); + } +private: + void show_error(assertion_error& e); + void show_error(const char*); + QListViewItem* item; + test& t; + state st; + void setImg(); +}; +/** + * A specialized node representing a test suite. + */ +class suite_node : public node +{ + typedef std::vector<node*> cctyp; + cctyp cc; // child container +public: + /// Inner suite creation. + suite_node(suite_node* par, suite&); + /// Top level suite_node. + suite_node(gui* par, suite&); + /// Test. + virtual void run(); + /// Register a node below this. + void add_child(node* n) { cc.push_back(n); } +}; +} +#endif +#endif |