|
- //
- // "$Id: unittests.cxx 7903 2010-11-28 21:06:39Z matt $"
- //
- // Unit tests for the Fast Light Tool Kit (FLTK).
- //
- // Copyright 1998-2010 by Bill Spitzak and others.
- //
- // This library is free software; you can redistribute it and/or
- // modify it under the terms of the GNU Library General Public
- // License as published by the Free Software Foundation; either
- // version 2 of the License, or (at your option) any later version.
- //
- // This library is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- // Library General Public License for more details.
- //
- // You should have received a copy of the GNU Library General Public
- // License along with this library; if not, write to the Free Software
- // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- // USA.
- //
- // Please report all bugs and problems on the following page:
- //
- // http://www.fltk.org/str.php
- //
- // Fltk unit tests
- // v0.1 - Greg combines Matthias + Ian's tests
- // v0.2 - Ian's 02/12/09 fixes applied
- // v0.3 - Fixes to circle desc, augmented extent tests, fixed indents, added show(argc,argv)
- // v1.0 - Submit for svn
- // v1.1 - Matthias seperated all tests into multiple source files for hopefully easier handling
-
- #include <FL/Fl.H>
- #include <FL/Fl_Double_Window.H>
- #include <FL/Fl_Hold_Browser.H>
- #include <FL/Fl_Help_View.H>
- #include <FL/Fl_Group.H>
- #include <FL/Fl_Box.H>
- #include <FL/fl_draw.H> // fl_text_extents()
-
- // WINDOW/WIDGET SIZES
- #define MAINWIN_W 700 // main window w()
- #define MAINWIN_H 400 // main window h()
- #define BROWSER_X 10 // browser x()
- #define BROWSER_Y 25 // browser y()
- #define BROWSER_W 150 // browser w()
- #define BROWSER_H MAINWIN_H-35 // browser h()
- #define TESTAREA_X (BROWSER_W + 20) // test area x()
- #define TESTAREA_Y 25 // test area y()
- #define TESTAREA_W (MAINWIN_W - BROWSER_W - 30) // test area w()
- #define TESTAREA_H BROWSER_H // test area h()
-
- typedef void (*UnitTestCallback)(const char*,Fl_Group*);
-
- class MainWindow *mainwin = 0;
- Fl_Hold_Browser *browser = 0;
-
- // This class helps to automagically register a new test with the unittest app.
- // Please see the examples on how this is used.
- class UnitTest {
- public:
- UnitTest(const char *label, Fl_Widget* (*create)()) :
- fWidget(0L)
- {
- fLabel = strdup(label);
- fCreate = create;
- add(this);
- }
- ~UnitTest() {
- delete fWidget;
- free(fLabel);
- }
- const char *label() {
- return fLabel;
- }
- void create() {
- fWidget = fCreate();
- if (fWidget) fWidget->hide();
- }
- void show() {
- if (fWidget) fWidget->show();
- }
- void hide() {
- if (fWidget) fWidget->hide();
- }
- static int numTest() { return nTest; }
- static UnitTest *test(int i) { return fTest[i]; }
- private:
- char *fLabel;
- Fl_Widget *(*fCreate)();
- Fl_Widget *fWidget;
-
- static void add(UnitTest *t) {
- fTest[nTest] = t;
- nTest++;
- }
- static int nTest;
- static UnitTest *fTest[200];
- };
-
- int UnitTest::nTest = 0;
- UnitTest *UnitTest::fTest[];
-
-
- // The main window needs an additional drawing feature in order to support
- // the viewport alignment test.
- class MainWindow : public Fl_Double_Window {
- public:
- MainWindow(int w, int h, const char *l=0L) :
- Fl_Double_Window(w, h, l),
- fTestAlignment(0)
- { }
- // this code is used by the viewport alignment test
- void drawAlignmentIndicators() {
- const int sze = 16;
- // top left corner
- fl_color(FL_GREEN); fl_yxline(0, sze, 0, sze);
- fl_color(FL_RED); fl_yxline(-1, sze, -1, sze);
- fl_color(FL_WHITE); fl_rectf(3, 3, sze-2, sze-2);
- fl_color(FL_BLACK); fl_rect(3, 3, sze-2, sze-2);
- // bottom left corner
- fl_color(FL_GREEN); fl_yxline(0, h()-sze-1, h()-1, sze);
- fl_color(FL_RED); fl_yxline(-1, h()-sze-1, h(), sze);
- fl_color(FL_WHITE); fl_rectf(3, h()-sze-1, sze-2, sze-2);
- fl_color(FL_BLACK); fl_rect(3, h()-sze-1, sze-2, sze-2);
- // bottom right corner
- fl_color(FL_GREEN); fl_yxline(w()-1, h()-sze-1, h()-1, w()-sze-1);
- fl_color(FL_RED); fl_yxline(w(), h()-sze-1, h(), w()-sze-1);
- fl_color(FL_WHITE); fl_rectf(w()-sze-1, h()-sze-1, sze-2, sze-2);
- fl_color(FL_BLACK); fl_rect(w()-sze-1, h()-sze-1, sze-2, sze-2);
- // top right corner
- fl_color(FL_GREEN); fl_yxline(w()-1, sze, 0, w()-sze-1);
- fl_color(FL_RED); fl_yxline(w(), sze, -1, w()-sze-1);
- fl_color(FL_WHITE); fl_rectf(w()-sze-1, 3, sze-2, sze-2);
- fl_color(FL_BLACK); fl_rect(w()-sze-1, 3, sze-2, sze-2);
- }
- void draw() {
- Fl_Double_Window::draw();
- if (fTestAlignment) {
- drawAlignmentIndicators();
- }
- }
- void testAlignment(int v) {
- fTestAlignment = v;
- redraw();
- }
- int fTestAlignment;
- };
-
- //------- include the various unit tests as inline code -------
-
- #include "unittest_about.cxx"
- #include "unittest_points.cxx"
- #include "unittest_lines.cxx"
- #include "unittest_rects.cxx"
- #include "unittest_circles.cxx"
- #include "unittest_text.cxx"
- #include "unittest_images.cxx"
- #include "unittest_viewport.cxx"
- #include "unittest_scrollbarsize.cxx"
-
-
- // callback whenever the browser value changes
- void Browser_CB(Fl_Widget*, void*) {
- for ( int t=1; t<=browser->size(); t++ ) {
- UnitTest *ti = (UnitTest*)browser->data(t);
- if ( browser->selected(t) ) {
- ti->show();
- } else {
- ti->hide();
- }
- }
- }
-
-
- // this is the main call. It creates the window and adds all previously
- // registered tests to the browser widget.
- int main(int argc, char **argv) {
- Fl::args(argc,argv);
- Fl::visual(FL_RGB);
- mainwin = new MainWindow(MAINWIN_W, MAINWIN_H, "Fltk Unit Tests");
- browser = new Fl_Hold_Browser(BROWSER_X, BROWSER_Y, BROWSER_W, BROWSER_H, "Unit Tests");
- browser->align(FL_ALIGN_TOP|FL_ALIGN_LEFT);
- browser->when(FL_WHEN_CHANGED);
- browser->callback(Browser_CB);
-
- int i, n = UnitTest::numTest();
- for (i=0; i<n; i++) {
- UnitTest *t = UnitTest::test(i);
- mainwin->begin();
- t->create();
- mainwin->end();
- browser->add(t->label(), (void*)t);
- }
-
- /////
- mainwin->resizable(mainwin);
- mainwin->show(argc,argv);
- // Select first test in browser, and show that test.
- browser->select(1);
- Browser_CB(browser,0);
- return(Fl::run());
- }
-
- //
- // End of "$Id: unittests.cxx 7903 2010-11-28 21:06:39Z matt $".
- //
|