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