Code

Adding multiple test output formats.
[inkscape.git] / src / MultiPrinter.h
1 #ifndef SEEN_MULTI_PRINTER_H
2 #define SEEN_MULTI_PRINTER_H
5 #include <cxxtest/Flags.h>
7 #ifndef _CXXTEST_HAVE_STD
8 #   define _CXXTEST_HAVE_STD
9 #endif // _CXXTEST_HAVE_STD
11 #include <cxxtest/ErrorFormatter.h>
12 #include <cxxtest/StdValueTraits.h>
14 #ifdef _CXXTEST_OLD_STD
15 #   include <iostream.h>
16 #   include <fstream.h>
17 #   include <string.h>
18 #else // !_CXXTEST_OLD_STD
19 #   include <iostream>
20 #   include <fstream>
21 #   include <string>
22 #endif // _CXXTEST_OLD_STD
25 #include <cxxtest/TeeListener.h>
26 #include "TRPIFormatter.h"
27 #include "PylogFormatter.h"
29 namespace CxxTest {
31 class MultiPrinter : public TeeListener
32 {
33 public:
34     MultiPrinter( const char* baseName = "result" ) :
35         TeeListener(),
36         _baseName( baseName ),
37         _xmlName( _baseName + ".xml" ),
38         _logName( _baseName + ".log" ),
39         _xmlFile( _xmlName.c_str(), CXXTEST_STD(ios::out)),
40         _logFile( _logName.c_str(), CXXTEST_STD(ios::out)),
41         _dstOne( new FileAdapter( CXXTEST_STD(cout) ) ),
42         _dstXml( new FileAdapter( _xmlFile ) ),
43         _dstPylog( new FileAdapter( _logFile ), _baseName.c_str() )
44     {
45         setFirst( _dstOne );
46         setSecond( _subTee );
47         _subTee.setFirst( _dstXml );
48         _subTee.setSecond( _dstPylog );
49     }
51     virtual ~MultiPrinter()
52     {
53         std::cout << "CLOSING OUT TEST" << std::endl;
54         _xmlFile.close();
55         _logFile.close();
56     }
58     int run()
59     {
60         TestRunner::runAllTests( *this );
61         return tracker().failedTests();
62     }
64 protected:
65     CXXTEST_STD(string) _baseName;
66     CXXTEST_STD(string) _xmlName;
67     CXXTEST_STD(string) _logName;
68     CXXTEST_STD(fstream) _xmlFile;
69     CXXTEST_STD(fstream) _logFile;
71     TeeListener _subTee;
72     ErrorFormatter _dstOne;
73     TRPIFormatter _dstXml;
74     PylogFormatter _dstPylog;
76 private:
77     class FileAdapter : public OutputStream
78     {
79         FileAdapter( const FileAdapter & );
80         FileAdapter &operator=( const FileAdapter & );
82         CXXTEST_STD(ostream) &_o;
84     public:
85         FileAdapter( CXXTEST_STD(ostream) &o ) : _o(o) {}
86         void flush() { _o.flush(); }
87         OutputStream &operator<<( const char *s ) { _o << s; return *this; }
88         OutputStream &operator<<( Manipulator m ) { return OutputStream::operator<<( m ); }
89         OutputStream &operator<<( unsigned i )
90         {
91             char s[1 + 3 * sizeof(unsigned)];
92             numberToString( i, s );
93             _o << s;
94             return *this;
95         }
96     };
98 };
102 /*
103   Local Variables:
104   mode:c++
105   c-file-style:"stroustrup"
106   c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
107   indent-tabs-mode:nil
108   fill-column:99
109   End:
110 */
111 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :
113 #endif //SEEN_MULTI_PRINTER_H