iutest  1.17.99.14
iutest_tap_printer.hpp
[詳解]
1 //======================================================================
2 //-----------------------------------------------------------------------
13 //-----------------------------------------------------------------------
14 //======================================================================
15 #ifndef INCG_IRIS_IUTEST_TAP_PRINTER_HPP_77055C2B_AAE1_4944_A61C_26C58B04B37B_
16 #define INCG_IRIS_IUTEST_TAP_PRINTER_HPP_77055C2B_AAE1_4944_A61C_26C58B04B37B_
17 
18 //======================================================================
19 // include
20 // IWYU pragma: begin_exports
21 #include "../iutest_core.hpp"
22 #include "../internal/iutest_log_stream.hpp"
23 #include "../internal/iutest_filepath.hpp"
24 // IWYU pragma: end_exports
25 
26 namespace iutest
27 {
28 
29 //======================================================================
30 // class
34 class TAPPrintListener : public EmptyTestEventListener
35 {
36 public:
37  TAPPrintListener() {}
38 public:
39  virtual void OnTestProgramStart(const UnitTest& test) IUTEST_CXX_OVERRIDE;
40  virtual void OnTestProgramEnd(const UnitTest& test) IUTEST_CXX_OVERRIDE;
41 
42 protected:
44  void OnReportTestSuite(detail::IOutStream* const stream, const TestSuite& test_suite, int top=1);
45 
46 public:
50  static TestEventListener* SetUp()
51  {
53  delete listeners.Release(listeners.default_result_printer());
55  listeners.Append(p);
56  return p;
57  }
58 };
59 
63 class TAPFileGeneratorListener : public TAPPrintListener
64 {
65  ::std::string m_output_path;
66 public:
71  explicit TAPFileGeneratorListener(const char* directory=NULL)
72  {
73  SetFilePath(directory);
74  }
75 public:
79  const ::std::string& GetFilePath() const { return m_output_path; }
80 private:
84  void SetFilePath(const char* directory)
85  {
86  if( directory == NULL || *directory == '\0' )
87  {
88  m_output_path = internal::posix::GetCWD();
89  }
90  else
91  {
92  detail::iuFilePath path(directory);
93  if( path.IsDirectory() )
94  {
95  m_output_path = directory;
96  }
97  else
98  {
99  m_output_path = path.RemoveFileName().ToString();
100  }
101  }
102  }
103 public:
104  virtual void OnTestProgramStart(const UnitTest& test) IUTEST_CXX_OVERRIDE
105  {
106  IUTEST_UNUSED_VAR(test);
107  }
108  virtual void OnTestRecordProperty(const TestProperty& test_property) IUTEST_CXX_OVERRIDE
109  {
110  IUTEST_UNUSED_VAR(test_property);
111  }
112  virtual void OnTestProgramEnd(const UnitTest& test) IUTEST_CXX_OVERRIDE;
113 
114 public:
118  static TestEventListener* SetUp()
119  {
121  const ::std::string& output = TestEnv::get_output_option();
122  TestEventListener* p = new TAPFileGeneratorListener(output.c_str());
123  listeners.Append(p);
124  return p;
125  }
126 };
127 
128 inline void TAPPrintListener::OnTestProgramStart(const UnitTest& test)
129 {
130  IUTEST_UNUSED_VAR(test);
131  // フィルタリング
133  {
134  detail::iuConsole::color_output(detail::iuConsole::yellow
135  , "# Note: iutest filter = %s\n", TestEnv::test_filter());
136  }
137 }
138 inline void TAPPrintListener::OnTestProgramEnd(const UnitTest& test)
139 {
140  detail::LogStream stream;
141 
142  int number = 1;
143  for( int k=0, count=test.total_test_suite_count(); k < count; ++k )
144  {
145  const TestSuite& test_suite = *test.GetTestSuite(k);
146 
147  OnReportTestSuite(&stream, test_suite, number);
148 
149  number += test_suite.total_test_count();
150  }
151  detail::iuConsole::output("1..%d\n", number-1);
152 }
153 inline void TAPPrintListener::OnReportTestSuite(detail::IOutStream* const stream, const TestSuite& test_suite, int top)
154 {
155  stream->Printf("# %s started.\n", test_suite.name());
156 
157  for( int i=0, test_count=test_suite.total_test_count(); i < test_count; ++i )
158  {
159  const TestInfo* test_info = test_suite.GetTestInfo(i);
160  if( !test_info->should_run() )
161  {
162  // スキップ
163  stream->Printf("ok %d # SKIP - %s\n", top+i, test_info->name());
164  }
165  else
166  {
167  if( test_info->HasFailure() )
168  {
169  stream->Printf("not ok %d - %s ", top+i, test_info->name() );
170  for( int j=0, part_count=test_info->result()->total_part_count(); j < part_count; ++j )
171  {
172  const TestPartResult& part = test_info->result()->GetTestPartResult(j);
173  ::std::string summary = part.make_message();
174  // 改行を置き換え
175  detail::StringReplace(summary, '\n', ", ");
176  stream->Printf("%s. ", summary.c_str() );
177  }
178  stream->Printf("\n");
179  }
180  else
181  {
182  stream->Printf("ok %d - %s\n", top+i, test_info->name() );
183  }
184  }
185  }
186 
187  stream->Printf("# %s ended.\n", test_suite.name());
188 }
189 
191 {
192  for( int k=0, count=test.total_test_suite_count(); k < count; ++k )
193  {
194  const TestSuite& test_suite = *test.GetTestSuite(k);
195 
196  IUTEST_UNUSED_VAR(test);
197  IFile* fp = detail::IFileSystem::New();
198  if( fp == NULL )
199  {
200  return;
201  }
202 
203  ::std::string filepath = m_output_path;
204  ::std::string name = test_suite.name();
205  detail::StringReplace(name, '/', "_");
206  filepath += detail::GetPathSeparator();
207  filepath += name;
208  filepath += ".tap";
209 
210  if( !fp->Open(filepath.c_str(), IFile::OpenWrite) )
211  {
212  fprintf(stderr, "Unable to open file \"%s\".\n", filepath.c_str());
213  fflush(stderr);
214  }
215 
216  OnReportTestSuite(fp, test_suite);
217 
218  fp->Printf("1..%d\n", test_suite.total_test_count());
219 
220  fp->Close();
221  detail::IFileSystem::Free(fp);
222  }
223 }
224 
225 } // end of namespace iutest
226 
227 #endif // INCG_IRIS_IUTEST_TAP_PRINTER_HPP_77055C2B_AAE1_4944_A61C_26C58B04B37B_
ファイルクラスインターフェイス
Definition: iutest_file.hpp:41
bool Open(const char *filename, int mode)
開く
Definition: iutest_file.hpp:60
@ OpenWrite
書き込み
Definition: iutest_file.hpp:47
virtual void Close()=0
閉じる
static TestEventListener * SetUp()
TAPFileGeneratorListener に切り替え
Definition: iutest_tap_printer.hpp:119
const ::std::string & GetFilePath() const
出力パスの取得
Definition: iutest_tap_printer.hpp:80
virtual void OnTestRecordProperty(const TestProperty &test_property) IUTEST_CXX_OVERRIDE
RecordProperty 時に呼ばれます
Definition: iutest_tap_printer.hpp:109
TAPFileGeneratorListener(const char *directory=NULL)
コンストラクタ
Definition: iutest_tap_printer.hpp:72
virtual void OnTestProgramEnd(const UnitTest &test) IUTEST_CXX_OVERRIDE
テストプログラム終了時に呼ばれます
Definition: iutest_tap_printer.hpp:191
virtual void OnTestProgramStart(const UnitTest &test) IUTEST_CXX_OVERRIDE
テストプログラム開始時に呼ばれます
Definition: iutest_tap_printer.hpp:105
TAP出力イベントリスナー
Definition: iutest_tap_printer.hpp:36
void OnReportTestSuite(detail::IOutStream *const stream, const TestSuite &test_suite, int top=1)
TestSuite 毎の処理
Definition: iutest_tap_printer.hpp:154
static TestEventListener * SetUp()
TAPPrintListener に切り替え
Definition: iutest_tap_printer.hpp:51
virtual void OnTestProgramStart(const UnitTest &test) IUTEST_CXX_OVERRIDE
テストプログラム開始時に呼ばれます
Definition: iutest_tap_printer.hpp:129
virtual void OnTestProgramEnd(const UnitTest &test) IUTEST_CXX_OVERRIDE
テストプログラム終了時に呼ばれます
Definition: iutest_tap_printer.hpp:139
static const StateVariable< ::std::string > & get_output_option()
出力オプション
Definition: iutest_env.hpp:358
static const char * test_filter()
フィルター文字列
Definition: iutest_env.hpp:360
イベントリスナー
Definition: iutest_listener.hpp:64
イベントリスナーの管理クラス
Definition: iutest_listener.hpp:169
TestEventListener * Release(TestEventListener *listener)
リスナーの解放
Definition: iutest_listener.hpp:184
void Append(TestEventListener *listener)
リスナーの追加
Definition: iutest_listener.hpp:179
TestEventListener * default_result_printer() const IUTEST_CXX_NOEXCEPT_SPEC
デフォルト出力リスナーの取得
Definition: iutest_listener.hpp:201
@ FILTERING_TESTS
テストのフィルタリング
Definition: iutest_env.hpp:147
static bool IsEnableFlag(int flag)
フラグが立っているかどうか
Definition: iutest_env.hpp:210
テスト情報クラス
Definition: iutest_info.hpp:38
const char * name() const
Definition: iutest_info.hpp:66
bool should_run() const IUTEST_CXX_NOEXCEPT_SPEC
Definition: iutest_info.hpp:68
bool HasFailure() const
エラーが出たかどうか
Definition: iutest_info.hpp:115
const TestResult * result() const IUTEST_CXX_NOEXCEPT_SPEC
Definition: iutest_info.hpp:80
テスト結果を示すクラス
Definition: iutest_result.hpp:57
テストプロパティ
Definition: iutest_result.hpp:159
int total_part_count() const
結果の数を取得
Definition: iutest_result.hpp:295
const TestPartResult & GetTestPartResult(int index) const
テスト結果の取得
Definition: iutest_result.hpp:308
TestSuite
Definition: iutest_suite.hpp:37
const TestInfo * GetTestInfo(int index) const
Definition: iutest_suite.hpp:105
const char * name() const
Definition: iutest_suite.hpp:75
int total_test_count() const IUTEST_CXX_NOEXCEPT_SPEC
Definition: iutest_suite.hpp:78
テスト全体の管理者
Definition: iutest_core.hpp:36
static UnitTest * GetInstance()
UnitTest インスタンスの取得
Definition: iutest_core.hpp:43
TestEventListeners & listeners() const
Definition: iutest_core.hpp:123
int total_test_suite_count() const
Definition: iutest_core.hpp:91
const TestSuite * GetTestSuite(int index) const
Definition: iutest_core.hpp:115
#define IUTEST_CXX_OVERRIDE
override definition
Definition: iutest_compiler.hpp:747
iutest root namespace
Definition: iutest_charcode.hpp:33