iutest  1.17.99.14
iutest_result_reporter.hpp
[詳解]
1 //======================================================================
2 //-----------------------------------------------------------------------
13 //-----------------------------------------------------------------------
14 //======================================================================
15 #ifndef INCG_IRIS_IUTEST_RESULT_REPORTER_HPP_803FD1F7_1FD2_4D1E_9AFC_A5851284316F_
16 #define INCG_IRIS_IUTEST_RESULT_REPORTER_HPP_803FD1F7_1FD2_4D1E_9AFC_A5851284316F_
17 
18 //======================================================================
19 // include
20 // IWYU pragma: begin_exports
21 #include "iutest_core_impl.hpp"
22 // IWYU pragma: end_exports
23 
24 namespace iutest {
25 namespace detail
26 {
27 
28 //======================================================================
29 // class
33 class DefaultGlobalTestPartResultReporter : public TestPartResultReporterInterface
34 {
35 public:
36  virtual ~DefaultGlobalTestPartResultReporter() IUTEST_CXX_OVERRIDE {}
37  virtual void ReportTestPartResult(const TestPartResult& test_part_result) IUTEST_CXX_OVERRIDE
38  {
39  DefaultReportTestPartResult(test_part_result);
40  }
41  static void DefaultReportTestPartResult(const TestPartResult& test_part_result)
42  {
43  TestResult* result = UnitTestImpl::current_test_result();
44  if( result )
45  {
46  result->AddTestPartResult(test_part_result);
47  }
48  else
49  {
50  iuConsole::output("%s", test_part_result.make_newline_message().c_str());
51  }
52  TestEnv::event_listeners().OnTestPartResult(test_part_result);
53  }
54 };
55 
59 class NoTestPartResultReporter : public TestPartResultReporterInterface
60 {
61 public:
62  virtual ~NoTestPartResultReporter() IUTEST_CXX_OVERRIDE {}
63  virtual void ReportTestPartResult(const TestPartResult& result) IUTEST_CXX_OVERRIDE
64  {
65  IUTEST_UNUSED_VAR(result);
66  }
67 };
68 
72 class NewTestPartResultCheckHelper
73 {
74 public:
75  template<TestPartResult::Type Type>
76  struct CondEq
77  {
78  bool operator ()(const TestPartResult& result)
79  {
80  return result.type() == Type;
81  }
82  };
83 
84  template<TestPartResult::Type Type>
85  struct CondNe
86  {
87  bool operator ()(const TestPartResult& result)
88  {
89  return result.type() != Type;
90  }
91  };
92 
93  template<TestPartResult::Type Type>
94  struct CondGt
95  {
96  bool operator ()(const TestPartResult& result)
97  {
98  return result.type() > Type;
99  }
100  };
101 public:
102  class ReporterHolder
103  {
104  public:
105  ReporterHolder() : m_origin(NULL) {}
106  virtual ~ReporterHolder()
107  {
108  Detach();
109  }
110  void Attach(TestPartResultReporterInterface* p)
111  {
112  m_origin = TestEnv::GetGlobalTestPartResultReporter();
113  TestEnv::SetGlobalTestPartResultReporter(p);
114  }
115  void Detach()
116  {
117  TestEnv::SetGlobalTestPartResultReporter(m_origin);
118  }
119  public:
120  void ReportTestPartResultOrigin(const TestPartResult& result)
121  {
122  if( m_origin )
123  {
124  m_origin->ReportTestPartResult(result);
125  }
126  }
127  private:
128  TestPartResultReporterInterface* m_origin;
129  };
130 
131 public:
132  template<typename COND, typename REPORTER=DefaultGlobalTestPartResultReporter>
133  class Counter IUTEST_CXX_FINAL : public REPORTER
134  {
135  typedef REPORTER _Mybase;
136  public:
137  Counter() : m_count(0)
138  {
139  m_holder.Attach(this);
140  }
141  virtual void ReportTestPartResult(const TestPartResult& result) IUTEST_CXX_OVERRIDE
142  {
143  if( m_cond(result) )
144  {
145  ++m_count;
146  }
147  _Mybase::ReportTestPartResult(result);
148  }
149  public:
150  int count() const IUTEST_CXX_NOEXCEPT_SPEC { return m_count; }
151  private:
152  ReporterHolder m_holder;
153  COND m_cond;
154  int m_count;
155 
157  };
158  template<typename REPORTER=DefaultGlobalTestPartResultReporter>
159  class Collector : public REPORTER
160  {
161  typedef REPORTER _Mybase;
162  typedef ::std::vector<TestPartResult> TestPartResults;
163  public:
164  Collector()
165  {
166  m_holder.Attach(this);
167  }
168  public:
169  virtual void ReportTestPartResult(const TestPartResult& result) IUTEST_CXX_OVERRIDE
170  {
171  m_results.push_back(result);
172  _Mybase::ReportTestPartResult(result);
173  }
174  public:
175  size_t count() const IUTEST_CXX_NOEXCEPT_SPEC { return m_results.size(); }
176  const TestPartResult& GetTestPartResult(size_t index) const { return m_results[index]; }
177 
178  void ReportTestPartResult()
179  {
180  for( TestPartResults::iterator it=m_results.begin(); it != m_results.end(); ++it )
181  {
182  m_holder.ReportTestPartResultOrigin(*it);
183  }
184  }
185  private:
186  ReporterHolder m_holder;
187  TestPartResults m_results;
188  };
189 };
190 
191 //======================================================================
192 // function
196 inline void DefaultReportTestPartResult(const TestPartResult& test_part_result)
197 {
198  DefaultGlobalTestPartResultReporter::DefaultReportTestPartResult(test_part_result);
199 }
200 
201 } // end of namespace detail
202 } // end of namespace iutest
203 
204 #endif // INCG_IRIS_IUTEST_RESULT_REPORTER_HPP_803FD1F7_1FD2_4D1E_9AFC_A5851284316F_
virtual void ReportTestPartResult(const TestPartResult &result)=0
テスト結果通知受け取り関数
#define IUTEST_CXX_FINAL
final definition
Definition: iutest_compiler.hpp:756
#define IUTEST_CXX_OVERRIDE
override definition
Definition: iutest_compiler.hpp:747
#define IUTEST_CXX_NOEXCEPT_SPEC
noexcept specification definition
Definition: iutest_compiler.hpp:811
iris unit test UnitTest core
#define IUTEST_PP_DISALLOW_COPY_AND_ASSIGN(TypeName)
コピー禁止定義
Definition: iutest_pp.hpp:31
iutest root namespace
Definition: iutest_charcode.hpp:33