iutest  1.17.99.14
iutest_util_vc_unittest.hpp
[詳解]
1 //======================================================================
2 //-----------------------------------------------------------------------
13 //-----------------------------------------------------------------------
14 //======================================================================
15 #ifndef INCG_IRIS_IUTEST_UTIL_VC_UNITTEST_HPP_5CA7C30C_2D2A_40A1_A9DE_83EAB4527787_
16 #define INCG_IRIS_IUTEST_UTIL_VC_UNITTEST_HPP_5CA7C30C_2D2A_40A1_A9DE_83EAB4527787_
17 
18 //======================================================================
19 // include
20 #include <CppUnitTest.h>
21 #include "../../include/iutest_prod.hpp"
22 #include "../../include/util/iutest_util_tests.hpp"
23 
24 //======================================================================
25 // define
26 
27 #ifdef IUTEST_USE_GTEST
28 
29 #ifdef IIUT_TEST_P_
30 # undef IIUT_TEST_P_
31 #endif
32 #define IIUT_TEST_P_ TEST_P
33 
34 #ifdef IIUT_TYPED_TEST_
35 # undef IIUT_TYPED_TEST_
36 #endif
37 #define IIUT_TYPED_TEST_ TYPED_TEST
38 
39 #ifdef IIUT_TYPED_TEST_P_
40 # undef IIUT_TYPED_TEST_P_
41 #endif
42 #define IIUT_TYPED_TEST_P_ TYPED_TEST_P
43 
44 #endif
45 
51 #ifdef IUTEST
52 # undef IUTEST
53 #endif
54 #define IUTEST(testsuite_, testname_) \
55  IUTEST_VCUNIT_I(testsuite_, testname_, testsuite_##testname_##_class, testsuite_##_##testname_); \
56  IUTEST_TEST(testsuite_, testname_)
57 
58 #ifdef IUTEST_F
59 # undef IUTEST_F
60 #endif
61 #define IUTEST_F(testfixture_, testname_) \
62  IUTEST_VCUNIT_I(testfixture_, testname_, testfixture_##testname_##_class, testfixture_##_##testname_); \
63  IUTEST_TEST_F_(testfixture_, testname_)
64 
65 #ifdef IUTEST_P
66 # undef IUTEST_P
67 #endif
68 #define IUTEST_P(testfixture_, testname_) \
69  IUTEST_VCUNIT_I(testfixture_, testname_, testfixture_##testname_##_class, testfixture_##_##testname_); \
70  IUTEST_TEST_P_(testfixture_, testname_)
71 
72 #ifdef IUTEST_TYPED_TEST
73 # undef IUTEST_TYPED_TEST
74 #endif
75 #define IUTEST_TYPED_TEST(testfixture_, testname_) \
76  IUTEST_VCUNIT_I(testfixture_, testname_, testfixture_##testname_##_class, testfixture_##_##testname_); \
77  IUTEST_TYPED_TEST_(testfixture_, testname_)
78 
79 #ifdef IUTEST_TYPED_TEST_P
80 # undef IUTEST_TYPED_TEST_P
81 #endif
82 #define IUTEST_TYPED_TEST_P(testfixture_, testname_) \
83  IUTEST_VCUNIT_I(testfixture_, testname_, testfixture_##testname_##_class, testfixture_##_##testname_); \
84  IIUT_TYPED_TEST_P_(testfixture_, testname_)
85 
86 
87 #define IUTEST_VCUNIT_I(testsuite_, testname_, className, methodName) \
88  IUTEST_VCUNIT_TEST_CLASS(className) { \
89  public: TEST_METHOD(methodName) { \
90  IUTEST_VCUNIT_EXEC_(testsuite_, testname_); } \
91  IIUT_VCUNIT_METHOD_ATTRIBUTE(testsuite_, methodName) \
92  }
93 
94 /*
95 #define IUTEST_VCUNIT_F(testsuite_, testname_, className, methodName) \
96  IUTEST_VCUNIT_TEST_CLASS(className) { \
97  public: TEST_METHOD(methodName) { \
98  IUTEST_VCUNIT_EXEC_(testsuite_, testname_); } \
99  IIUT_VCUNIT_METHOD_ATTRIBUTE(testsuite_, methodName) \
100  TEST_CLASS_INITIALIZE(iuSetUp) { IUTEST_GET_SETUP_TESTSUITE(testsuite_, __FILE__, __LINE__)(); } \
101  TEST_CLASS_CLEANUP(iuTearDown) { IUTEST_GET_TEARDOWN_TESTSUITE(testsuite_, __FILE__, __LINE__)(); } \
102  }
103 */
104 
105 #define IIUT_VCUNIT_METHOD_ATTRIBUTE(testsuite_, methodName) \
106  BEGIN_TEST_METHOD_ATTRIBUTE(methodName) \
107  TEST_METHOD_ATTRIBUTE(L"TestSuite", L#testsuite_) \
108  END_TEST_METHOD_ATTRIBUTE()
109 
110 #define IUTEST_VCUNIT_EXEC_(testsuite_, testname_) \
111  Body( "*" #testsuite_ "." #testname_ "*" )
112 
113 #define IUTEST_VCUNIT_TEST_CLASS(className) \
114  ONLY_USED_AT_NAMESPACE_SCOPE class className : public ::iuutil::VisualStudio::TestClass<className>
115 
116 //======================================================================
117 // class
118 namespace iuutil {
119 namespace VisualStudio
120 {
121 
122 template<typename T>
123 class TestClass : public ::Microsoft::VisualStudio::CppUnitTestFramework::TestClass<T>
124 {
125  typedef ::Microsoft::VisualStudio::CppUnitTestFramework::Logger Logger;
126 public:
127  void Body(const char* filter)
128  {
129  SetUpCppUnitTest();
130  ::iutest::IUTEST_FLAG(catch_exceptions) = false;
131  ::iutest::IUTEST_FLAG(filter) = filter;
132  ::iutest::IUTEST_FLAG(also_run_disabled_tests) = true;
134  }
135 };
136 
140 class VCCppUnitTestLogger : public ::iutest::detail::iuLogger
141 {
142  typedef ::Microsoft::VisualStudio::CppUnitTestFramework::Logger Logger;
143 public:
144  virtual void voutput(const char* fmt, va_list va)
145  {
146  int length = _vscprintf(fmt, va);
147  if( length <= 0 )
148  {
149  return;
150  }
151  length += 1;
152  char* buf = new char [length];
153  vsprintf_s(buf, length, fmt, va);
154  m_log += buf;
155  delete [] buf;
156 
157  int pos = m_log.find('\n');
158  while(pos >= 0) {
159  Logger::WriteMessage(m_log.substr(0, pos).c_str());
160  m_log = m_log.substr(pos+1);
161  pos = m_log.find('\n');
162  }
163  }
164 private:
165  ::std::string m_log;
166 };
167 
171 class VCCppUnitTestPartResultReporter : public ::iutest::EmptyTestEventListener
172 {
173 public:
174  VCCppUnitTestPartResultReporter()
175  {
177  listeners.Append(this);
178  }
179  virtual ~VCCppUnitTestPartResultReporter()
180  {
182  listeners.Release(this);
183  }
184  virtual void OnTestPartResult(const ::iutest::TestPartResult& result)
185  {
186  // VC にも送る
187  if( result.failed() )
188  {
189  size_t size=0;
190  wchar_t buf1[4096]; // TODO: Fixed buffer...
191  wchar_t buf2[MAX_PATH];
192  ::mbstowcs_s(&size, buf1, sizeof(buf1)/sizeof(buf1[0]), result.message(), _TRUNCATE);
193  ::mbstowcs_s(&size, buf2, sizeof(buf2)/sizeof(buf2[0]), result.file_name(), _TRUNCATE);
194  ::Microsoft::VisualStudio::CppUnitTestFramework::Assert::Fail(buf1
195  , &Microsoft::VisualStudio::CppUnitTestFramework::__LineInfo(buf2, "", result.line_number()) );
196  }
197  }
198 };
199 
200 class VCCppUnitResultPrinter : public ::iutest::TestEventListener
201 {
202 public:
203  explicit VCCppUnitResultPrinter(::iutest::TestEventListener* default_printer)
204  : m_default_printer(default_printer)
205  {}
206  virtual ~VCCppUnitResultPrinter()
207  {
208  delete m_default_printer;
209  }
210 
211 public:
212  virtual void OnTestProgramStart(const ::iutest::UnitTest& ) {}
213 
214  virtual void OnTestIterationStart(const ::iutest::UnitTest& , int ) {}
215 
216  virtual void OnEnvironmentsSetUpStart(const ::iutest::UnitTest& ) {}
217 
218  virtual void OnEnvironmentsSetUpEnd(const ::iutest::UnitTest& ) {}
219 
220  virtual void OnTestSuiteStart(const ::iutest::TestSuite& ) {}
221 
222  virtual void OnTestStart(const ::iutest::TestInfo& test_info)
223  {
224  m_default_printer->OnTestStart(test_info);
225  }
226  virtual void OnTestPartResult(const ::iutest::TestPartResult& test_part_result)
227  {
228  m_default_printer->OnTestPartResult(test_part_result);
229  }
230  virtual void OnTestEnd(const ::iutest::TestInfo& test_info)
231  {
232  m_default_printer->OnTestEnd(test_info);
233  }
234 
235  virtual void OnTestSuiteEnd(const ::iutest::TestSuite& ) {}
236 
237  virtual void OnEnvironmentsTearDownStart(const ::iutest::UnitTest& ) {}
238 
239  virtual void OnEnvironmentsTearDownEnd(const ::iutest::UnitTest& ) {}
240 
241  virtual void OnTestIterationEnd(const ::iutest::UnitTest& , int iteration) {}
242 
243  virtual void OnTestProgramEnd(const ::iutest::UnitTest& ) {}
244 private:
245  ::iutest::TestEventListener* m_default_printer;
246 
247 public:
251  static ::iutest::TestEventListener* SetUp()
252  {
253  static ::iutest::TestEventListener* p = NULL;
254  if( p == NULL )
255  {
257  ::iutest::TestEventListener* default_printer = listeners.Release(listeners.default_result_printer());
258  if( default_printer == NULL )
259  {
260  return NULL;
261  }
262  p = new VCCppUnitResultPrinter(default_printer);
263  listeners.Append(p);
264  }
265  return p;
266  }
267 };
268 
269 inline void SetUpCppUnitTest()
270 {
271  {
272  static VCCppUnitTestPartResultReporter fake;
273 #ifndef IUTEST_USE_GTEST
274  static VCCppUnitTestLogger logger;
275  ::iutest::detail::iuConsole::SetLogger(&logger);
276  ::iutest::UnitTestSource::GetInstance().Initialize();
277 #endif
278  VCCppUnitResultPrinter::SetUp();
279  }
280 }
281 
282 } // end of namespace VisualStudio
283 } // end of namespace iuutil
284 
290 #endif // INCG_IRIS_IUTEST_UTIL_VC_UNITTEST_HPP_5CA7C30C_2D2A_40A1_A9DE_83EAB4527787_
空のイベントリスナー
Definition: iutest_listener.hpp:102
virtual void OnTestPartResult(const TestPartResult &) IUTEST_CXX_OVERRIDE
テスト失敗時に呼ばれます
Definition: iutest_listener.hpp:111
イベントリスナー
Definition: iutest_listener.hpp:64
virtual void OnTestEnd(const TestInfo &test_info)=0
テスト終了時にに呼ばれます
virtual void OnTestIterationEnd(const UnitTest &test, int iteration)=0
単体テスト終了時に毎回呼ばれます
virtual void OnEnvironmentsTearDownEnd(const UnitTest &test)=0
グローバル環境設定 TearDown 前に呼ばれます
virtual void OnTestSuiteStart(const TestSuite &test_suite)
TestSuite 開始時に呼ばれます
Definition: iutest_listener.hpp:76
virtual void OnTestPartResult(const TestPartResult &test_part_result)=0
テスト失敗時に呼ばれます
virtual void OnTestProgramStart(const UnitTest &test)=0
テストプログラム開始時に呼ばれます
virtual void OnTestSuiteEnd(const TestSuite &test_suite)
TestSuite 終了時にに呼ばれます
Definition: iutest_listener.hpp:86
virtual void OnTestIterationStart(const UnitTest &test, int iteration)=0
単体テスト開始時に毎回呼ばれます
virtual void OnTestStart(const TestInfo &test_info)=0
テスト開始時に呼ばれます
virtual void OnTestProgramEnd(const UnitTest &test)=0
テストプログラム終了時に呼ばれます
virtual void OnEnvironmentsSetUpEnd(const UnitTest &test)=0
グローバル環境設定 SetUp 後に呼ばれます
virtual void OnEnvironmentsSetUpStart(const UnitTest &test)=0
グローバル環境設定 SetUp 前に呼ばれます
virtual void OnEnvironmentsTearDownStart(const UnitTest &test)=0
グローバル環境設定 TearDown 前に呼ばれます
イベントリスナーの管理クラス
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
static UnitTest * GetInstance()
UnitTest インスタンスの取得
Definition: iutest_core.hpp:43
TestEventListeners & listeners() const
Definition: iutest_core.hpp:123
#define IUTEST_FLAG(name)
フラグセット
Definition: iutest_env.hpp:57
#define IUTEST_RUN_ALL_TESTS()
すべてのテストを実行する
Definition: iutest.hpp:160
iutest utility namespace
Definition: iutest_util.hpp:36