iutest  1.17.1.0
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(testcase_, testname_) \
55  IUTEST_VCUNIT_I(testcase_, testname_, testcase_##testname_##_class, testcase_##_##testname_); \
56  IUTEST_TEST(testcase_, 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(testcase_, testname_, className, methodName) \
88  IUTEST_VCUNIT_TEST_CLASS(className) { \
89  public: TEST_METHOD(methodName) { \
90  IUTEST_VCUNIT_EXEC_(testcase_, testname_); } \
91  IIUT_VCUNIT_METHOD_ATTRIBUTE(testcase_, methodName) \
92  }
93 
94 //#define IUTEST_VCUNIT_F(testcase_, testname_, className, methodName) \
95 // IUTEST_VCUNIT_TEST_CLASS(className) { \
96 // public: TEST_METHOD(methodName) { \
97 // IUTEST_VCUNIT_EXEC_(testcase_, testname_); } \
98 // IIUT_VCUNIT_METHOD_ATTRIBUTE(testcase_, methodName) \
99 // TEST_CLASS_INITIALIZE(iuSetUp) { testcase_::SetUpTestCase(); } \
100 // TEST_CLASS_CLEANUP(iuTearDown) { testcase_::TearDownTestCase(); } \
101 // }
102 
103 #define IIUT_VCUNIT_METHOD_ATTRIBUTE(testcase_, methodName) \
104  BEGIN_TEST_METHOD_ATTRIBUTE(methodName) \
105  TEST_METHOD_ATTRIBUTE(L"TestCase", L#testcase_) \
106  END_TEST_METHOD_ATTRIBUTE()
107 
108 #define IUTEST_VCUNIT_EXEC_(testcase_, testname_) \
109  Body( "*" #testcase_ "." #testname_ "*" )
110 
111 #define IUTEST_VCUNIT_TEST_CLASS(className) \
112  ONLY_USED_AT_NAMESPACE_SCOPE class className : public ::iuutil::VisualStudio::TestClass<className>
113 
114 //======================================================================
115 // class
116 namespace iuutil {
117 namespace VisualStudio
118 {
119 
120 template<typename T>
121 class TestClass : public ::Microsoft::VisualStudio::CppUnitTestFramework::TestClass<T>
122 {
123  typedef ::Microsoft::VisualStudio::CppUnitTestFramework::Logger Logger;
124 public:
125  void Body(const char* filter)
126  {
127  SetUpCppUnitTest();
128  ::iutest::IUTEST_FLAG(catch_exceptions) = false;
129  ::iutest::IUTEST_FLAG(filter) = filter;
130  ::iutest::IUTEST_FLAG(also_run_disabled_tests) = true;
132  }
133 };
134 
138 class VCCppUnitTestLogger : public ::iutest::detail::iuLogger
139 {
140  typedef ::Microsoft::VisualStudio::CppUnitTestFramework::Logger Logger;
141 public:
142  virtual void voutput(const char* fmt, va_list va)
143  {
144  int length = _vscprintf(fmt, va);
145  if( length <= 0 )
146  {
147  return;
148  }
149  length += 1;
150  char* buf = new char [length];
151  vsprintf_s(buf, length, fmt, va);
152  m_log += buf;
153  delete [] buf;
154 
155  int pos = m_log.find('\n');
156  while(pos >= 0) {
157  Logger::WriteMessage(m_log.substr(0, pos).c_str());
158  m_log = m_log.substr(pos+1);
159  pos = m_log.find('\n');
160  }
161  }
162 private:
163  ::std::string m_log;
164 };
165 
169 class VCCppUnitTestPartResultReporter : public ::iutest::EmptyTestEventListener
170 {
171 public:
172  VCCppUnitTestPartResultReporter()
173  {
175  listeners.Append(this);
176  }
177  virtual ~VCCppUnitTestPartResultReporter()
178  {
180  listeners.Release(this);
181  }
182  virtual void OnTestPartResult(const ::iutest::TestPartResult& result)
183  {
184  // VC にも送る
185  if( result.failed() )
186  {
187  size_t size=0;
188  wchar_t buf1[4096]; // TODO: Fixed buffer...
189  wchar_t buf2[MAX_PATH];
190  ::mbstowcs_s(&size, buf1, sizeof(buf1)/sizeof(buf1[0]), result.message(), _TRUNCATE);
191  ::mbstowcs_s(&size, buf2, sizeof(buf2)/sizeof(buf2[0]), result.file_name(), _TRUNCATE);
192  ::Microsoft::VisualStudio::CppUnitTestFramework::Assert::Fail(buf1
193  , &Microsoft::VisualStudio::CppUnitTestFramework::__LineInfo(buf2, "", result.line_number()) );
194  }
195  }
196 };
197 
198 class VCCppUnitResultPrinter : public ::iutest::TestEventListener
199 {
200 public:
201  explicit VCCppUnitResultPrinter(::iutest::TestEventListener* default_printer)
202  : m_default_printer(default_printer)
203  {}
204  virtual ~VCCppUnitResultPrinter()
205  {
206  delete m_default_printer;
207  }
208 
209 public:
210  virtual void OnTestProgramStart(const ::iutest::UnitTest& ) {}
211 
212  virtual void OnTestIterationStart(const ::iutest::UnitTest& , int ) {}
213 
214  virtual void OnEnvironmentsSetUpStart(const ::iutest::UnitTest& ) {}
215 
216  virtual void OnEnvironmentsSetUpEnd(const ::iutest::UnitTest& ) {}
217 
218  virtual void OnTestCaseStart(const ::iutest::TestCase& ) {}
219 
220  virtual void OnTestStart(const ::iutest::TestInfo& test_info)
221  {
222  m_default_printer->OnTestStart(test_info);
223  }
224  virtual void OnTestPartResult(const ::iutest::TestPartResult& test_part_result)
225  {
226  m_default_printer->OnTestPartResult(test_part_result);
227  }
228  virtual void OnTestEnd(const ::iutest::TestInfo& test_info)
229  {
230  m_default_printer->OnTestEnd(test_info);
231  }
232 
233  virtual void OnTestCaseEnd(const ::iutest::TestCase& ) {}
234 
235  virtual void OnEnvironmentsTearDownStart(const ::iutest::UnitTest& ) {}
236 
237  virtual void OnEnvironmentsTearDownEnd(const ::iutest::UnitTest& ) {}
238 
239  virtual void OnTestIterationEnd(const ::iutest::UnitTest& , int iteration) {}
240 
241  virtual void OnTestProgramEnd(const ::iutest::UnitTest& ) {}
242 private:
243  ::iutest::TestEventListener* m_default_printer;
244 
245 public:
249  static ::iutest::TestEventListener* SetUp()
250  {
251  static ::iutest::TestEventListener* p = NULL;
252  if( p == NULL )
253  {
255  ::iutest::TestEventListener* default_printer = listeners.Release(listeners.default_result_printer());
256  if( default_printer == NULL )
257  {
258  return NULL;
259  }
260  p = new VCCppUnitResultPrinter(default_printer);
261  listeners.Append(p);
262  }
263  return p;
264  }
265 };
266 
267 inline void SetUpCppUnitTest()
268 {
269  {
270  static VCCppUnitTestPartResultReporter fake;
271 #ifndef IUTEST_USE_GTEST
272  static VCCppUnitTestLogger logger;
273  ::iutest::detail::iuConsole::SetLogger(&logger);
274  ::iutest::UnitTestSource::GetInstance().Initialize();
275 #endif
276  VCCppUnitResultPrinter::SetUp();
277  }
278 }
279 
280 } // end of namespace VisualStudio
281 } // end of namespace iuutil
282 
288 #endif // INCG_IRIS_IUTEST_UTIL_VC_UNITTEST_HPP_5CA7C30C_2D2A_40A1_A9DE_83EAB4527787_
iutest::TestEventListener::OnEnvironmentsSetUpStart
virtual void OnEnvironmentsSetUpStart(const UnitTest &test)=0
グローバル環境設定 SetUp 前に呼ばれます
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::TestEventListener::OnTestPartResult
virtual void OnTestPartResult(const TestPartResult &test_part_result)=0
テスト失敗時に呼ばれます
iutest::TestEventListener::OnTestProgramStart
virtual void OnTestProgramStart(const UnitTest &test)=0
テストプログラム開始時に呼ばれます
iutest_config.hpp
iris unit test config
iutest::TestEventListener::OnTestProgramEnd
virtual void OnTestProgramEnd(const UnitTest &test)=0
テストプログラム終了時に呼ばれます
iutest::TestEventListener::OnTestCaseStart
virtual void OnTestCaseStart(const TestCase &test_case)=0
テストケース開始時に呼ばれます
iutest::TestEventListener::OnEnvironmentsSetUpEnd
virtual void OnEnvironmentsSetUpEnd(const UnitTest &test)=0
グローバル環境設定 SetUp 後に呼ばれます
iutest::TestEventListener::OnTestEnd
virtual void OnTestEnd(const TestInfo &test_info)=0
テストケース終了時にに呼ばれます
iutest::TestEventListener::OnEnvironmentsTearDownStart
virtual void OnEnvironmentsTearDownStart(const UnitTest &test)=0
グローバル環境設定 TearDown 前に呼ばれます
IUTEST_FLAG
#define IUTEST_FLAG(name)
フラグセット
Definition: iutest_env.hpp:55
iutest::TestEventListeners::Release
TestEventListener * Release(TestEventListener *listener)
リスナーの解放
Definition: iutest_listener.hpp:174
iutest::TestEventListener::OnEnvironmentsTearDownEnd
virtual void OnEnvironmentsTearDownEnd(const UnitTest &test)=0
グローバル環境設定 TearDown 前に呼ばれます
iutest::TestEventListener::OnTestStart
virtual void OnTestStart(const TestInfo &test_info)=0
テスト開始時に呼ばれます
iutest::EmptyTestEventListener::OnTestPartResult
virtual void OnTestPartResult(const TestPartResult &) IUTEST_CXX_OVERRIDE
テスト失敗時に呼ばれます
Definition: iutest_listener.hpp:101
iutest::TestEventListener::OnTestIterationEnd
virtual void OnTestIterationEnd(const UnitTest &test, int iteration)=0
単体テスト終了時に毎回呼ばれます
iuutil
iutest utility namespace
Definition: iutest_util.hpp:33
iutest::TestEventListeners::Append
void Append(TestEventListener *listener)
リスナーの追加
Definition: iutest_listener.hpp:169
iutest::TestEventListener::OnTestIterationStart
virtual void OnTestIterationStart(const UnitTest &test, int iteration)=0
単体テスト開始時に毎回呼ばれます
iutest::TestEventListeners
イベントリスナーの管理クラス
Definition: iutest_listener.hpp:158
iutest::UnitTest::listeners
TestEventListeners & listeners() const
Definition: iutest_core.hpp:121
iutest::TestEventListener::OnTestCaseEnd
virtual void OnTestCaseEnd(const TestCase &test_case)=0
テスト終了時にに呼ばれます
iutest::TestEventListeners::default_result_printer
TestEventListener * default_result_printer() const IUTEST_CXX_NOEXCEPT_SPEC
デフォルト出力リスナーの取得
Definition: iutest_listener.hpp:180
IUTEST_RUN_ALL_TESTS
#define IUTEST_RUN_ALL_TESTS()
すべてのテストを実行する
Definition: iutest.hpp:154