summaryrefslogtreecommitdiffstats
blob: 5ded3b1ee889e08922928c693208714f96f0d762 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#ifndef CPPUNIT_XMLOUTPUTTERHOOK_H
#define CPPUNIT_XMLOUTPUTTERHOOK_H

#include <cppunit/Portability.h>


CPPUNIT_NS_BEGIN


class Test;
class TestFailure;
class XmlDocument;
class XmlElement;



/*! \brief Hook to customize Xml output.
 *
 * XmlOutputterHook can be passed to XmlOutputter to customize the XmlDocument.
 *
 * Common customizations are:
 * - adding some datas to successfull or failed test with
 *   failTestAdded() and successfulTestAdded(),
 * - adding some statistics with statisticsAdded(),
 * - adding other datas with beginDocument() or endDocument().
 *
 * See examples/ClockerPlugIn which makes use of most the hook.
 *
 * Another simple example of an outputter hook is shown below. It may be  
 * used to add some meta information to your result files. In the example,
 * the author name as well as the project name and test creation date is
 * added to the head of the xml file.
 *
 * In order to make this information stored within the xml file, the virtual 
 * member function beginDocument() is overriden where a new 
 * XmlElement object is created.
 *
 * This element is simply added to the root node of the document which
 * makes the information automatically being stored when the xml file
 * is written.
 *
 * \code
 * #include <cppunit/XmlOutputterHook.h>
 * #include <cppunit/XmlElement.h>
 * #include <cppunit/tools/StringTools.h>
 * 
 * ...
 * 
 * class MyXmlOutputterHook : public CppUnit::XmlOutputterHook
 * {
 * public:
 *   MyXmlOutputterHook(const std::string projectName,
 *                      const std::string author)
 *   {
 *      m_projectName = projectName;
 *      m_author      = author;
 *   };
 * 
 *   virtual ~MyXmlOutputterHook()
 *   {
 *   };
 * 
 *   void beginDocument(CppUnit::XmlDocument* document)
 *   {
 *     if (!document)
 *       return;
 *
 *     // dump current time
 *     std::string szDate          = CppUnit::StringTools::toString( (int)time(0) );
 *     CppUnit::XmlElement* metaEl = new CppUnit::XmlElement("SuiteInfo", 
 *                                                           "");
 *
 *     metaEl->addElement( new CppUnit::XmlElement("Author", m_author) );
 *     metaEl->addElement( new CppUnit::XmlElement("Project", m_projectName) );
 *     metaEl->addElement( new CppUnit::XmlElement("Date", szDate ) );
 *    
 *     document->rootElement().addElement(metaEl);
 *   };
 * private:
 *   std::string m_projectName;
 *   std::string m_author;
 * }; 
 * \endcode
 *
 * Within your application's main code, you need to snap the hook 
 * object into your xml outputter object like shown below:
 *
 * \code
 * CppUnit::TextUi::TestRunner runner;
 * std::ofstream outputFile("testResults.xml");
 * 
 * CppUnit::XmlOutputter* outputter = new CppUnit::XmlOutputter( &runner.result(),
 *                                                               outputFile );    
 * MyXmlOutputterHook hook("myProject", "meAuthor");
 * outputter->addHook(&hook);
 * runner.setOutputter(outputter);    
 * runner.addTest( VectorFixture::suite() );   
 * runner.run();
 * outputFile.close();
 * \endcode
 *
 * This results into the following output:
 *
 * \code
 * <TestRun>
 *   <suiteInfo>
 *     <author>meAuthor</author>
 *     <project>myProject</project>
 *     <date>1028143912</date>
 *   </suiteInfo>
 *   <FailedTests>
 *    ...
 * \endcode
 *
 * \see XmlOutputter, CppUnitTestPlugIn.
 */
class CPPUNIT_API XmlOutputterHook
{
public:
  /*! Called before any elements is added to the root element.
   * \param document XML Document being created.
   */
  virtual void beginDocument( XmlDocument *document );

  /*! Called after adding all elements to the root element.
   * \param document XML Document being created.
   */
  virtual void endDocument( XmlDocument *document );

  /*! Called after adding a fail test element.
   * \param document XML Document being created.
   * \param testElement \<FailedTest\> element.
   * \param test Test that failed.
   * \param failure Test failure data.
   */
  virtual void failTestAdded( XmlDocument *document,
                              XmlElement *testElement,
                              Test *test,
                              TestFailure *failure );

  /*! Called after adding a successful test element.
   * \param document XML Document being created.
   * \param testElement \<Test\> element.
   * \param test Test that was successful.
   */
  virtual void successfulTestAdded( XmlDocument *document,
                                    XmlElement *testElement,
                                    Test *test );

  /*! Called after adding the statistic element.
   * \param document XML Document being created.
   * \param statisticsElement \<Statistics\> element.
   */
  virtual void statisticsAdded( XmlDocument *document,
                                XmlElement *statisticsElement );

  virtual ~XmlOutputterHook() {}
};


CPPUNIT_NS_END

#endif  // CPPUNIT_XMLOUTPUTTERHOOK_H