Theolizer  Version.1.2.0
serializer for C++ / Do you want to update your classes easily ?
test_tool.h
[詳解]
1 //############################################################################
2 /*!
3  @brief テスト用ツール群
4  @details 各種テスト用マクロとツールを提供する。
5  @ingroup TheolizerLib
6  @file test_tool.h
7  @author Yoshinori Tahara(Theoride Technology)
8  @date 2015/08/08 Created
9 */
10 /*
11  © 2016 Theoride Technology (http://theolizer.com/) All Rights Reserved.
12  "Theolizer" is a registered trademark of Theoride Technology.
13 
14  "Theolizer" License
15  In the case where you are in possession of a valid “Theolizer” License,
16  you may use this file in accordance with the terms and conditions of
17  the use license determined by Theoride Technology.
18 
19  General Public License Version 3 ("GPLv3")
20  You may use this file in accordance with the terms and conditions of
21  GPLv3 published by Free Software Foundation.
22  Please confirm the contents of GPLv3 at https://www.gnu.org/licenses/gpl.txt .
23  A copy of GPLv3 is also saved in a LICENSE.TXT file.
24 
25  商用ライセンス
26  あなたが有効なTheolizer商用ライセンスを保持している場合、
27  セオライド テクノロジーの定める使用許諾書の条件に従って、
28  このファイルを取り扱うことができます。
29 
30  General Public License Version 3(以下GPLv3)
31  Free Software Foundationが公表するGPLv3の使用条件に従って、
32  あなたはこのファイルを取り扱うことができます。
33  GPLv3の内容を https://www.gnu.org/licenses/gpl.txt にて確認して下さい。
34  またGPLv3のコピーをLICENSE.TXTファイルにおいてます。
35 */
36 //############################################################################
37 
38 #if !defined(THEOLIZER_INTERNAL_TEST_TOOL_H)
39 #define THEOLIZER_INTERNAL_TEST_TOOL_H
40 
41 #include <thread>
42 #include <sstream>
43 #include <iomanip>
44 
45 // ***************************************************************************
46 // 基本ツールのインクルード
47 // ***************************************************************************
48 
49 #include "report.h"
50 
51 //############################################################################
52 // Begin
53 //############################################################################
54 
55 // ***************************************************************************
56 // DLL用の警告禁止
57 // ***************************************************************************
58 
59 #ifdef _MSC_VER
60  #pragma warning(push)
61  #pragma warning(disable:4251)
62 #endif
63 
64 //############################################################################
65 // theolizer名前空間外のユーティリティ
66 //############################################################################
67 
68 // ***************************************************************************
69 // 文字型の表示補助
70 // ***************************************************************************
71 
72 //! @ingroup Test
73 //! char型を数値として出力する
74 THEOLIZER_INTERNAL_DLL std::ostream& operator<<(std::ostream& iOStream, char iChar);
75 
76 //! @ingroup Test
77 //! signed char型を数値として出力する
78 THEOLIZER_INTERNAL_DLL std::ostream& operator<<(std::ostream& iOStream, signed char iSChar);
79 
80 //! @ingroup Test
81 //! unsgined char型を数値として出力する
82 THEOLIZER_INTERNAL_DLL std::ostream& operator<<(std::ostream& iOStream, unsigned char iUChar);
83 
84 // ***************************************************************************
85 //! @ingroup Test
86 //! scoped enum型表示補助
87 // ***************************************************************************
88 
89 template<typename tEnum, THEOLIZER_INTERNAL_OVERLOAD((std::is_enum<tEnum>::value))>
90 std::ostream& operator<<(std::ostream& iOStream, tEnum iEnum)
91 {
92  typedef typename std::underlying_type<tEnum>::type Type;
93  iOStream << static_cast<Type>(iEnum);
94  return iOStream;
95 }
96 
97 // ***************************************************************************
98 //! @ingroup Test
99 //! type_info型を型名へ変換して表示する
100 // ***************************************************************************
101 
102 THEOLIZER_INTERNAL_DLL std::ostream& operator<<(std::ostream& iOStream, std::type_info const&);
103 
104 //############################################################################
105 // theolizer名前空間内のユーティリティ
106 //############################################################################
107 
108 namespace theolizer
109 {
110 namespace internal
111 {
112 #ifndef THEOLIZER_INTERNAL_DOXYGEN
113 
114 // ***************************************************************************
115 // 環境変数操作(テスト用)
116 // ***************************************************************************
117 
118 THEOLIZER_INTERNAL_DLL std::string getenv(std::string const& iEnv);
119 THEOLIZER_INTERNAL_DLL int putenv(char const* iPutEnv);
120 
121 // ***************************************************************************
122 // 結果出力先設定/獲得
123 // ***************************************************************************
124 
125 THEOLIZER_INTERNAL_DLL void setOStream(std::ostream& iOStream);
126 THEOLIZER_INTERNAL_DLL std::ostream& getOStream();
127 
128 // ***************************************************************************
129 // テスト中断
130 // ***************************************************************************
131 
132 THEOLIZER_INTERNAL_DLL void throwAbort();
133 
134 // ***************************************************************************
135 //! @ingroup Test
136 //! 開放時、関数呼び出し
137 //! ほぼN4189のscope_exitの名前を変えただけ。
138 // ***************************************************************************
139 
140 //----------------------------------------------------------------------------
141 // ヘルパー・クラス
142 //----------------------------------------------------------------------------
143 
144 template<typename tReleaser>
145 class ScopeExit
146 {
147  tReleaser mReleaser;
148  bool mMoved;
149 
150 public:
151  explicit ScopeExit(tReleaser &&iReleaser) noexcept :
152  mReleaser(std::move(iReleaser)), mMoved{false}
153  {}
154  ~ScopeExit() noexcept(noexcept(mReleaser()))
155  {
156  if (!mMoved)
157  {
158  mReleaser();
159  }
160  }
161 
162  // ムーブ・コンストラクタ可
163  ScopeExit(ScopeExit &&iRhs) noexcept :
164  mReleaser(std::move(iRhs.mReleaser)),
165  mMoved{iRhs.mMoved}
166  {
167  iRhs.mMoved=true;
168  }
169 
170  // コピー不可/ムーブ代入不可
171  ScopeExit(ScopeExit const&) = delete;
172  void operator=(ScopeExit const &)=delete;
173  ScopeExit& operator=(ScopeExit &&)=delete;
174 };
175 
176 #endif // THEOLIZER_INTERNAL_DOXYGEN
177 } // namespace internal
178 
179 //----------------------------------------------------------------------------
180 // 本体
181 //----------------------------------------------------------------------------
182 
183 //! @ingroup Test
184 //! ScopeExitファクトリ
185 template <typename tReleaser>
186 internal::ScopeExit<tReleaser> makeScopeExit(tReleaser &&iReleaser) noexcept
187 {
188  return internal::ScopeExit<typename std::remove_reference<tReleaser>::type>
189  (
190  std::forward<tReleaser>(iReleaser)
191  );
192 }
193 
194 // ***************************************************************************
195 //! @brief PASS結果表示の有無指定
196 //! @details trueにするとPASS結果も表示する
197 // ***************************************************************************
198 
199 //----------------------------------------------------------------------------
200 // 本体
201 //----------------------------------------------------------------------------
202 
203 struct THEOLIZER_INTERNAL_DLL DisplayPass : public internal::AutoRestore<bool>
204 {
205  //! @ingroup Test
206  //! デフォルト・コンストラクタ
207  explicit DisplayPass();
208 
209  //! @ingroup Test
210  //! PASS結果表示の状態を返却する
211  static bool on();
212 };
213 
214 // ***************************************************************************
215 //! @ingroup Test
216 //! @brief MinGW不具合対処
217 //! @details 関数テンプレートで浮動小数点を取り扱う時、最適化上の不具合がある模様<br>
218 //! 処理に割り込んで最適化させないためのダミー関数
219 // ***************************************************************************
220 
221 #if defined(__MINGW32__)
222  THEOLIZER_INTERNAL_DLL void cutOptimize();
223 #else
224  inline void cutOptimize() { }
225 #endif
226 
227 // ***************************************************************************
228 // テスト結果集計用
229 // ***************************************************************************
230 
231 //! @ingroup Test
232 //! テスト集計初期化
233 THEOLIZER_INTERNAL_DLL void initResult();
234 
235 //! @ingroup Test
236 //! テスト結果のFAIL数をインクリメントする
237 THEOLIZER_INTERNAL_DLL void incrementFailCount();
238 
239 //! @ingroup Test
240 //! テスト結果を表示する
241 THEOLIZER_INTERNAL_DLL bool printResult(char const* iTitle=nullptr);
242 
243 //############################################################################
244 // ファイル操作
245 //############################################################################
246 
247 // ***************************************************************************
248 /*!
249  @ingroup Test
250  @brief テスト用フォルダの準備
251  @details もし、iDirPathフォルダが既に存在していたら削除する。<br>
252  次に、iDirPathフォルダを作成する。<br>
253  デストラクタにてiIsNoDeleteがfalseなら、iDirPathフォルダを削除する。<br>
254  iDirPathフォルダを生成できなかったら、std::runtime_errorを投げるので、<br>
255  catchしないことにより、テストが中断される。<br>
256 */
257 // ***************************************************************************
258 
259 class THEOLIZER_INTERNAL_DLL PrepareDir
260 {
261 private:
262  std::string mDirPath;
263  bool mIsNoDelete;
264 
265 public:
266  //! @ingroup Test
267  //! コンストラクタ
268  PrepareDir(std::string const& iDirPath, bool iIsNoDelete=false);
269 
270  //! @ingroup Test
271  //! デストラクタ
272  ~PrepareDir();
273 };
274 
275 // ***************************************************************************
276 //! ファイル/フォルダの有無チェック
277 // ***************************************************************************
278 
279 THEOLIZER_INTERNAL_DLL bool isExist(u8string const& iFilePath);
280 
281 // ***************************************************************************
282 /*!
283  @ingroup Test
284  @brief ファイルの削除
285  @details 指定ファイルが無くても正常終了する。
286  iFilePathがフォルダの場合何もしない。
287 */
288 // ***************************************************************************
289 
290 THEOLIZER_INTERNAL_DLL void removeFile(u8string const& iFilePath);
291 
292 // ***************************************************************************
293 /*!
294  @ingroup Test
295  @brief ファイル・リスト獲得
296  @details 指定フォルダ内のファイル(フォルダ除く)のリストを返却する。<br>
297    ファイル名(拡張子含む)が正規表現iRegexとマッチするもののみ。<br>
298    iRegex=""の時は全て返却。<br>
299    リスト取得後、std:sort()でソートして返却する。<br>
300 <br>
301  注意事項<br>
302    正規表現のマッチング処理はstd::wregexとregex_matchにより実装。<br>
303    MSVC 2015とMinGW 4.9.2は、サロゲートペアに非対応なので注意。<br>
304 */
305 // ***************************************************************************
306 
307 THEOLIZER_INTERNAL_DLL
308 std::vector<std::string> getFileList(std::string const& iDirPath, std::string const& iRegex="");
309 
310 // ***************************************************************************
311 /*!
312  @ingroup Test
313  @brief アクセス許可設定
314  @details ownerの書き込み許可をセット/クリアする
315 */
316 // ***************************************************************************
317 
318 THEOLIZER_INTERNAL_DLL void setWritePermission(const u8string& iPath, bool iIsEnable);
319 
320 // ***************************************************************************
321 /*!
322  @ingroup Test
323  @brief スレッド・オブジェクト<br>
324  @details コンストラクタで指定スレッドを生成し、<br>
325  デストラクタでそのスレッドの終了を待つ。<br>
326 <br>
327  ThreadIdは、boost::interprocess::ipcdetail::get_current_thread_id()<br>
328  にて取得する。<br>
329  std::this_thread::get_id()が返す型は扱いにくいため。<br>
330 */
331 // ***************************************************************************
332 
333 class ThreadGuard : public std::thread
334 {
335 private:
336  std::string mThreadId;
337  void setThreadId()
338  {
339  std::stringstream ss;
340  ss << std::setfill('_') << std::setw(15) << get_id();
341  mThreadId=ss.str();
342  }
343 
344 public :
345  //! @ingroup Test
346  //! デフォルト・コンストラクタ
347  ThreadGuard() noexcept
348  {
349  setThreadId();
350  }
351 
352  //! @ingroup Test
353  //! 汎用コンストラクタ
354  template <class Fn, class... Args>
355  ThreadGuard(Fn&& fn, Args&&... args) : thread(fn, args...)
356  { setThreadId(); }
357 
358  //! @ingroup Test
359  //! コピー禁止
360  ThreadGuard (const ThreadGuard&) = delete;
361  ThreadGuard& operator=(const ThreadGuard&) = delete;
362 
363  //! @ingroup Test
364  //! ムーブ可
365  ThreadGuard(ThreadGuard&& iThread) noexcept :
366  thread(static_cast<std::thread&&>(iThread)),
367  mThreadId(std::move(iThread.mThreadId))
368  { }
369 
370  //! @ingroup Test
371  //! ムーブ演算子
373  {
374  static_cast<std::thread&>(*this)=static_cast<std::thread&&>(iTheread);
375  mThreadId=std::move(iTheread.mThreadId);
376  return *this;
377  }
378 
379  //! @ingroup Test
380  //! デストラクタ
381  ~ThreadGuard () {if (thread::joinable()) thread::join();}
382 
383  //! @ingroup Test
384  //! スレッドID返却
385  std::string const& getThreadId() {return mThreadId;}
386 };
387 
388 //############################################################################
389 // テスト用マクロ
390 //############################################################################
391 
392 #ifndef THEOLIZER_INTERNAL_DOXYGEN
393 
394 #define THEOLIZER_INTERNAL_PASS "<<<PASS>>>"
395 #define THEOLIZER_INTERNAL_FAIL "<<<FAIL>>>"
396 
397 namespace internal
398 {
399  THEOLIZER_INTERNAL_DLL extern unsigned gTotal;
400  THEOLIZER_INTERNAL_DLL extern unsigned gFailCount;
401  THEOLIZER_INTERNAL_DLL extern bool gAbortedOutput;
402  THEOLIZER_INTERNAL_DLL bool checkFailCount();
403  THEOLIZER_INTERNAL_DLL void lockMutex();
404  THEOLIZER_INTERNAL_DLL void unlockMutex();
405 } // namespace internal
406 
407 #endif //THEOLIZER_INTERNAL_DOXYGEN
408 
409 // ***************************************************************************
410 // 内部処理用マクロ
411 // ***************************************************************************
412 
413 #ifndef THEOLIZER_INTERNAL_DOXYGEN
414 
415 #define THEOLIZER_INTERNAL_U8(dString) u8##dString
416 #define THEOLZIER_INTERNAL_FIRST(dFirst, ...) (dFirst)
417 
418 // ---<<< 判定と表示用マクロ >>>---
419 
420 #define THEOLIZER_INTERNAL_RESULT(dResult) \
421  do \
422  { \
423  if ((!aIsPass && theolizer::internal::checkFailCount()) || theolizer::DisplayPass::on())\
424  { \
425  std::ostream& os=theolizer::internal::getOStream(); \
426  std::streamsize precision=os.precision(); \
427  os.precision(std::numeric_limits<long double>::digits10); \
428  os << THEOLIZER_INTERNAL_U8(#dResult) " : " << (dResult) << "\n";\
429  os.precision(precision); \
430  } \
431  } \
432  while(0)
433 
434 #define THEOLIZER_INTERNAL_RESULT_FOR(...) \
435  THEOLIZER_INTERNAL_FOR(THEOLIZER_INTERNAL_RESULT, __VA_ARGS__)
436 
437 // --- ここでgTestMutexをロックする ---
438 
439 #define THEOLIZER_INTERNAL_JUDGE_ONLY(dAbort, dJudge) \
440  do \
441  { \
442  if (!(dJudge)) \
443  { \
444  theolizer::internal::lockMutex(); \
445  theolizer::internal::gFailCount++; \
446  aIsPass=false; \
447  if (theolizer::internal::checkFailCount()) { \
448  theolizer::internal::getOStream() << "\n" THEOLIZER_INTERNAL_FAIL\
449  << ((dAbort)?"(skiped following tests)":"") << "\n"; \
450  } \
451  } \
452  else \
453  { \
454  theolizer::internal::lockMutex(); \
455  } \
456  theolizer::internal::gTotal++; \
457  } \
458  while(0)
459 
460 #define THEOLIZER_INTERNAL_JUDGE(dAbort, dJudge, dExpression) \
461  do \
462  { \
463  THEOLIZER_INTERNAL_JUDGE_ONLY(dAbort, dJudge); \
464  if (!aIsPass && theolizer::internal::checkFailCount()) \
465  { \
466  theolizer::internal::getOStream() \
467  << THEOLIZER_INTERNAL_FILE << "(" << __LINE__ << ")\n" \
468  << "Expression : " << (u8##dExpression) << "\n"; \
469  } \
470  else if (theolizer::DisplayPass::on()) \
471  { \
472  theolizer::internal::getOStream() << "\n" THEOLIZER_INTERNAL_PASS "\n"\
473  << THEOLIZER_INTERNAL_FILE << "(" << __LINE__ << ")\n" \
474  << "Expression : " << (u8##dExpression) << "\n"; \
475  } \
476  } \
477  while(0)
478 
479 // --- ポインタ表示用のマクロ ---
480 // char*は文字列として出力されるのでそれを回避する
481 
482 namespace internal
483 {
484  template<typename tType>
485  tType const* OutputData(tType const* iType)
486  {
487  return iType;
488  }
489 
490  inline void const* OutputData(char const* iCharPtr)
491  {
492  return reinterpret_cast<void const*>(iCharPtr);
493  }
494 }
495 
496 #define THEOLIZER_INTERNAL_RESULT_PTR(dResult) \
497  do \
498  { \
499  if ((!aIsPass && theolizer::internal::checkFailCount()) || theolizer::DisplayPass::on())\
500  { \
501  std::ostream& os=theolizer::internal::getOStream(); \
502  std::streamsize precision=os.precision(); \
503  os.precision(std::numeric_limits<long double>::digits10); \
504  os << THEOLIZER_INTERNAL_U8(#dResult) " : " \
505  << theolizer::internal::OutputData(dResult) << "\n"; \
506  os.precision(precision); \
507  } \
508  } \
509  while(0)
510 
511 #endif //THEOLIZER_INTERNAL_DOXYGEN
512 
513 // ***************************************************************************
514 // 結果判定マクロ群
515 // dStatement 例外の発生をチェックする文
516 // dException この例外が発生すればPass
517 // catch(dException)と定義している。
518 // dJudge 判定式(true時Pass)
519 // dResult 処理結果
520 // ***************************************************************************
521 
522 // ---<<< 等しいことをチェックする(Fail時、処理継続) >>>---
523 // 最も良く使うので専用で用意する
524 
525 //! @ingroup Test
526 //! 値が一致することをテストする。(ポインタ以外)
527 #define THEOLIZER_EQUAL(dLhs, ...) \
528  do \
529  { \
530  bool aIsPass=true; \
531  THEOLIZER_INTERNAL_JUDGE_ONLY(false, \
532  ((dLhs)==THEOLZIER_INTERNAL_FIRST(__VA_ARGS__))); \
533  if (!aIsPass && theolizer::internal::checkFailCount()) { \
534  theolizer::internal::getOStream() \
535  << THEOLIZER_INTERNAL_FILE << "(" << __LINE__ << ")\n"; \
536  } else if (theolizer::DisplayPass::on()) { \
537  theolizer::internal::getOStream() << "\n" THEOLIZER_INTERNAL_PASS "\n"\
538  << THEOLIZER_INTERNAL_FILE << "(" << __LINE__ << ")\n"; \
539  } \
540  THEOLIZER_INTERNAL_RESULT(dLhs); \
541  THEOLIZER_INTERNAL_RESULT_FOR(__VA_ARGS__); \
542  theolizer::internal::unlockMutex(); \
543  } \
544  while(0)
545 
546 // ---<<< ポインタが等しいことをチェックする(Fail時、処理継続) >>>---
547 // char型へのポインタの値を出力しようとすると文字列として出力される。
548 // ポインタ値がnullptrだったら落ちる。
549 
550 //! @ingroup Test
551 //! ポインタの値が一致することをテストする。
552 #define THEOLIZER_EQUAL_PTR(dLhs, dRhs) \
553  do \
554  { \
555  bool aIsPass=true; \
556  THEOLIZER_INTERNAL_JUDGE_ONLY(false, (dLhs) == (dRhs)); \
557  if (!aIsPass && theolizer::internal::checkFailCount()) { \
558  theolizer::internal::getOStream() \
559  << THEOLIZER_INTERNAL_FILE << "(" << __LINE__ << ")\n"; \
560  } else if (theolizer::DisplayPass::on()) { \
561  theolizer::internal::getOStream() << "\n" THEOLIZER_INTERNAL_PASS "\n"\
562  << THEOLIZER_INTERNAL_FILE << "(" << __LINE__ << ")\n"; \
563  } \
564  THEOLIZER_INTERNAL_RESULT_PTR(dLhs); \
565  THEOLIZER_INTERNAL_RESULT_PTR(dRhs); \
566  theolizer::internal::unlockMutex(); \
567  } \
568  while(0)
569 
570 // ---<<< 結果をチェックする(Fail時、処理継続) >>>---
571 
572 //! @ingroup Test
573 //! 結果がtrueになることをテストする。
574 #define THEOLIZER_CHECK(dJudge, ...) \
575  do \
576  { \
577  bool aIsPass=true; \
578  THEOLIZER_INTERNAL_JUDGE(false, dJudge, #dJudge); \
579  THEOLIZER_INTERNAL_RESULT_FOR(__VA_ARGS__); \
580  theolizer::internal::unlockMutex(); \
581  } \
582  while(0)
583 
584 // ---<<< 結果をチェックする(Fail時、処理中断) >>>---
585 
586 //! @ingroup Test
587 //! 結果がtrueになることをテストする。(Fail時、以降の処理を中断する)
588 #define THEOLIZER_REQUIRE(dJudge, ...) \
589  do \
590  { \
591  bool aIsPass=true; \
592  THEOLIZER_INTERNAL_JUDGE(true, dJudge, #dJudge); \
593  THEOLIZER_INTERNAL_RESULT_FOR(__VA_ARGS__); \
594  theolizer::internal::unlockMutex(); \
595  if (!aIsPass) theolizer::internal::throwAbort(); \
596  } \
597  while(0)
598 
599 // ---<<< 例外が発生することをチェックする(Fail時、処理継続) >>>---
600 
601 //! @ingroup Test
602 //! 例外が発生することをチェックする(Fail時、処理継続)
603 #define THEOLIZER_CHECK_EXCEPTION(dStatements, dException) \
604  do \
605  { \
606  bool aIsPass=true; \
607  try \
608  { \
609  dStatements \
610  aIsPass=false; \
611  THEOLIZER_INTERNAL_JUDGE(false, false, "No exception(" #dException ")");\
612  } \
613  catch (dException) \
614  { \
615  THEOLIZER_INTERNAL_JUDGE(false, true, "exception(" #dException ")");\
616  } \
617  theolizer::internal::unlockMutex(); \
618  } \
619  while(0)
620 
621 // ---<<< 例外が発生することをチェックする(Fail時、処理中断) >>>---
622 
623 //! @ingroup Test
624 //! 例外が発生することをチェックする(Fail時、処理中断)
625 #define THEOLIZER_REQUIRE_EXCEPTION(dStatements, dException) \
626  do \
627  { \
628  bool aIsPass=true; \
629  try \
630  { \
631  dStatements \
632  aIsPass=false; \
633  THEOLIZER_INTERNAL_JUDGE(true, false, "No exception(" #dException ")");\
634  } \
635  catch (dException) \
636  { \
637  THEOLIZER_INTERNAL_JUDGE(false, true, "exception(" #dException ")");\
638  } \
639  theolizer::internal::unlockMutex(); \
640  if (!aIsPass) theolizer::internal::throwAbort(); \
641  } \
642  while(0)
643 
644 // ---<<< 例外が発生することと結果をチェックする(Fail時、処理継続) >>>---
645 
646 //! @ingroup Test
647 //! 例外が発生することをチェックする(Fail時、処理継続)
648 #define THEOLIZER_CHECK_EXCEPTION2(dStatement, dException, dJudge, dResult) \
649  do \
650  { \
651  bool aIsPass=true; \
652  try \
653  { \
654  dStatement; \
655  aIsPass=false; \
656  THEOLIZER_INTERNAL_JUDGE(false, false, "No exception(" #dException ")");\
657  } \
658  catch (dException) \
659  { \
660  THEOLIZER_INTERNAL_JUDGE(false, dJudge, #dJudge); \
661  THEOLIZER_INTERNAL_RESULT(dResult); \
662  } \
663  theolizer::internal::unlockMutex(); \
664  } \
665  while(0)
666 
667 // ---<<< 例外が発生することと結果をチェックする(Fail時、処理中断) >>>---
668 
669 //! @ingroup Test
670 //! 例外が発生することをチェックする(Fail時、処理中断)
671 #define THEOLIZER_REQUIRE_EXCEPTION2(dStatement, dException, dJudge, dResult)\
672  do \
673  { \
674  bool aIsPass=true; \
675  try \
676  { \
677  dStatement; \
678  aIsPass=false; \
679  THEOLIZER_INTERNAL_JUDGE(true, false, "No exception(" #dException ")");\
680  } \
681  catch (dException) \
682  { \
683  THEOLIZER_INTERNAL_JUDGE(true, dJudge, #dJudge); \
684  THEOLIZER_INTERNAL_RESULT(dResult); \
685  } \
686  theolizer::internal::unlockMutex(); \
687  if (!aIsPass) theolizer::internal::throwAbort(); \
688  } \
689  while(0)
690 
691 //############################################################################
692 // End
693 //############################################################################
694 
695 } // namespace theolizer
696 
697 // ***************************************************************************
698 // DLL用の警告禁止解除
699 // ***************************************************************************
700 
701 #ifdef _MSC_VER
702  #pragma warning(pop)
703 #endif
704 
705 #endif // THEOLIZER_INTERNAL_TEST_TOOL_H
ThreadGuard(Fn &&fn, Args &&... args)
Definition: test_tool.h:355
theolizer名前空間
Definition: base.h:53
std::string const & getThreadId()
Definition: test_tool.h:385
THEOLIZER_INTERNAL_DLL void removeFile(u8string const &iFilePath)
ファイルの削除
Unicode記録用文字列クラスu8string.
Definition: u8string.h:274
THEOLIZER_INTERNAL_DLL std::ostream & operator<<(std::ostream &iOStream, char iChar)
THEOLIZER_INTERNAL_DLL bool printResult(char const *iTitle=nullptr)
ThreadGuard(ThreadGuard &&iThread) noexcept
Definition: test_tool.h:365
ThreadGuard & operator=(ThreadGuard &&iTheread)
Definition: test_tool.h:372
スレッド・オブジェクト
Definition: test_tool.h:333
THEOLIZER_INTERNAL_DLL void incrementFailCount()
THEOLIZER_INTERNAL_DLL std::vector< std::string > getFileList(std::string const &iDirPath, std::string const &iRegex="")
ファイル・リスト獲得
テスト用フォルダの準備
Definition: test_tool.h:259
THEOLIZER_INTERNAL_DLL void initResult()
PASS結果表示の有無指定
Definition: test_tool.h:203
ThreadGuard() noexcept
Definition: test_tool.h:347
void cutOptimize()
MinGW不具合対処
Definition: test_tool.h:224
internal::ScopeExit< tReleaser > makeScopeExit(tReleaser &&iReleaser) noexcept
Definition: test_tool.h:186
THEOLIZER_INTERNAL_DLL void setWritePermission(const u8string &iPath, bool iIsEnable)
アクセス許可設定
THEOLIZER_INTERNAL_DLL bool isExist(u8string const &iFilePath)
ファイル/フォルダの有無チェック
Theolizerシステム部