00001 #include <unistd.h>
00002 #include <wibble/sys/pipe.h>
00003
00004 #define RUN(x, y) x().y()
00005
00006 struct RunTest {
00007 const char *name;
00008 void (*run)();
00009 };
00010
00011 struct RunSuite {
00012 const char *name;
00013 RunTest *tests;
00014 int testCount;
00015 };
00016
00017 struct RunAll {
00018 RunSuite *suites;
00019 int suiteCount;
00020 FILE *status;
00021 wibble::sys::Pipe confirm;
00022
00023 RunSuite *findSuite( std::string name ) {
00024 for ( int i = 0; i < suiteCount; ++i )
00025 if ( suites[i].name == name )
00026 return suites + i;
00027 return 0;
00028 }
00029
00030 void waitForAck() {
00031 std::string line = confirm.nextLineBlocking();
00032 assert_eq( std::string( "ack" ), line );
00033 }
00034
00035 void runSuite( RunSuite &s, int fromTest, int suite, int suiteCount )
00036 {
00037 fprintf( status, "s/s: (%d/%d) %s\n", suite + 1, suiteCount, s.name );
00038 for ( int i = fromTest; i < s.testCount; ++i ) {
00039 fprintf( status, "t/s: (%d/%d) %s\n", i, s.testCount,
00040 s.tests[i].name );
00041 fflush( status );
00042 waitForAck();
00043 s.tests[i].run();
00044 fprintf( status, "t/d: %s\n", s.tests[i].name );
00045 fflush( status );
00046 waitForAck();
00047
00048
00049 }
00050 fprintf( status, "s/d: %s\n", s.name );
00051 }
00052
00053 void runTest( RunSuite &s, int test )
00054 {
00055 fprintf( status, "s/s: (1/1) %s\n", s.name );
00056 fprintf( status, "t/s: (1/1) %s\n", s.tests[test].name );
00057 fflush( status );
00058 waitForAck();
00059 s.tests[test].run();
00060 fprintf( status, "t/d: %s\n", s.tests[test].name );
00061 fflush( status );
00062 waitForAck();
00063 fprintf( status, "s/d: %s\n", s.name );
00064 }
00065
00066 void runFrom( int suite, int test )
00067 {
00068 for ( int i = suite; i < suiteCount; ++i ) {
00069 assert( suite <= suiteCount );
00070 runSuite( suites[i], test, i, suiteCount );
00071 test = 0;
00072 }
00073 }
00074 };
00075