iutest  1.17.99.14
iutest_core.hpp
[詳解]
1 //======================================================================
2 //-----------------------------------------------------------------------
13 //-----------------------------------------------------------------------
14 //======================================================================
15 #ifndef INCG_IRIS_IUTEST_CORE_HPP_33560431_783B_4AE7_8FC8_6E78355CAF87_
16 #define INCG_IRIS_IUTEST_CORE_HPP_33560431_783B_4AE7_8FC8_6E78355CAF87_
17 
18 //======================================================================
19 // include
20 // IWYU pragma: begin_exports
22 #include "internal/iutest_file.hpp"
24 // IWYU pragma: end_exports
25 
26 namespace iutest
27 {
28 
29 //======================================================================
30 // class
34 class UnitTest : public UnitTestImpl
35 {
36 public:
38  static UnitTest& instance() { static UnitTest inst; return inst; }
42  static UnitTest* GetInstance() { return &instance(); }
43 
44 public:
48  const TestSuite* current_test_suite() const { return m_current_testsuite; }
49 
54  const TestInfo* current_test_info() const { return Test::GetCurrentTestInfo(); }
55 
57  unsigned int random_seed() const { return TestEnv::current_random_seed(); }
58 
60  int repeat_counter() const IUTEST_CXX_NOEXCEPT_SPEC { return m_repeat_counter; }
61 
64 
65 public:
67  int total_test_count() const IUTEST_CXX_NOEXCEPT_SPEC { return m_total_test_num; }
69  int reportable_test_count() const;
71  int test_to_run_count() const IUTEST_CXX_NOEXCEPT_SPEC { return m_should_run_num; }
73  int failed_test_count() const;
75  int disabled_test_count() const IUTEST_CXX_NOEXCEPT_SPEC { return m_disable_num; }
79  int successful_test_count() const;
81  int skip_test_count() const;
83  int reportable_skip_test_count() const;
85  int test_run_skipped_count() const;
88 
90  int total_test_suite_count() const { return static_cast<int>(m_testsuites.size()); }
92  int test_suite_to_run_count() const;
94  int successful_test_suite_count() const;
96  int failed_test_suite_count() const;
97 
103 
105  const TestResult* ad_hoc_test_result() const IUTEST_CXX_NOEXCEPT_SPEC { return &m_ad_hoc_testresult; }
106 
108  TimeInMillisec elapsed_time() const IUTEST_CXX_NOEXCEPT_SPEC { return m_elapsedmsec; }
109 
111  TimeInMillisec start_timestamp() const IUTEST_CXX_NOEXCEPT_SPEC { return m_start_timestamp; }
112 
114  const TestSuite* GetTestSuite(int index) const { return m_testsuites[index]; }
115 
117  bool Passed() const;
119  bool Failed() const { return !Passed(); }
120 
122  TestEventListeners& listeners() const { return TestEnv::event_listeners(); }
123 
124 #if IUTEST_HAS_TESTCASE
125  const TestCase* GetTestCase(int index) const { return m_testsuites[index]; }
126  const TestCase* current_test_case() const { return m_current_testsuite; }
127  int total_test_case_count() const { return static_cast<int>(m_testsuites.size()); }
128  int test_case_to_run_count() const { return test_suite_to_run_count(); }
129  int successful_test_case_count() const { return successful_test_suite_count(); }
130  int failed_test_case_count() const { return failed_test_suite_count(); }
131 #endif
132 
133 protected:
137  int Run();
138 
139 private:
140 #if IUTEST_HAS_SEH && IUTEST_HAS_EXCEPTIONS
141  int RunOnMSC();
142 #endif
143  int RunImpl();
144 
148  bool RunOnce();
149 
150 private:
154  void TestProgramStart();
155 
159  void SetUpTestIteration();
160 
164  void EnvironmentSetUp();
165 
169  void EnvironmentTearDown();
170 
174  void TestProgramEnd();
175 
176 private:
177  // C言語の終了コールバック関数
178  static void OnExit()
179  {
180  instance().TestProgramEnd();
181  }
182 
183 private:
184  UnitTest()
185  : m_repeat_counter(0)
186  , m_init_iutest_count(0)
187  , m_test_started(false)
188  , m_start_timestamp(0)
189  {
190  // デフォルトリポーターをセット
191  TestEnv::SetGlobalTestPartResultReporter(&m_default_test_part_result_reporter);
192  // 環境変数によるテストフラグ指定をロード
193  TestEnv::LoadEnvironmentVariable();
194  }
195 #if defined(_MSC_VER) && _MSC_VER < 1300
196 public: // VC++6.0 bug
197 #endif
198  ~UnitTest()
199  {
200  TestEnv::ReleaseGlobalTestEnvironment();
201  TestEnv::SetGlobalTestPartResultReporter(NULL);
202  }
203 
204 private:
205  // 初期化処理
206  void Initialize();
207 
208 #if IUTEST_HAS_PARAM_TEST
209 public:
211  detail::ParamTestSuiteHolder& parameterized_test_registry() IUTEST_CXX_NOEXCEPT_SPEC
212  {
213  return m_param_testsuite_holder;
214  }
215 
216 private:
217  detail::ParamTestSuiteHolder m_param_testsuite_holder;
218 #endif
219 
220 private:
221  friend class UnitTestSource;
222 
223  int m_repeat_counter;
224  int m_init_iutest_count;
225  bool m_test_started;
226  TimeInMillisec m_start_timestamp;
227  detail::DefaultGlobalTestPartResultReporter m_default_test_part_result_reporter;
228 
230 };
231 
232 namespace detail
233 {
234 
240 template<class Tester>
241 class TestInstance
242 {
243 public:
245  TestInstance(const char* testsuite, const char* name, TestTypeId id
246  , SetUpMethod setup, TearDownMethod teardown)
247  : m_mediator(AddTestSuite(testsuite, id, setup, teardown))
248  , m_info(&m_mediator, name, &m_factory)
249  {
250  UnitTest::instance().AddTestInfo(m_mediator.ptr(), &m_info);
251  }
253  TestInstance(const ::std::string& testsuite, const char* name, TestTypeId id
254  , SetUpMethod setup, TearDownMethod teardown)
255  : m_mediator(AddTestSuite(testsuite, id, setup, teardown))
256  , m_info(&m_mediator, name, &m_factory)
257  {
258  UnitTest::instance().AddTestInfo(m_mediator.ptr(), &m_info);
259  }
261  TestInstance(const char* testsuite, const char* name, const char* value_params, TestTypeId id
262  , SetUpMethod setup, TearDownMethod teardown)
263  : m_mediator(AddTestSuite(testsuite, id, setup, teardown))
264  , m_info(&m_mediator, name, &m_factory)
265  {
266  m_info.set_value_param(value_params);
267  UnitTest::instance().AddTestInfo(m_mediator.ptr(), &m_info);
268  }
270  TestInstance(const ::std::string& testsuite, const char* name, const char* value_params, TestTypeId id
271  , SetUpMethod setup, TearDownMethod teardown)
272  : m_mediator(AddTestSuite(testsuite, id, setup, teardown))
273  , m_info(&m_mediator, name, &m_factory)
274  {
275  m_info.set_value_param(value_params);
276  UnitTest::instance().AddTestInfo(m_mediator.ptr(), &m_info);
277  }
278 
279 private:
280  TestSuite* AddTestSuite(const char* testsuite, TestTypeId id, SetUpMethod setup, TearDownMethod teardown)
281  {
282 #if !defined(IUTEST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS)
283  return UnitTest::instance().AddTestSuite<TestSuite>(testsuite, id, setup, teardown);
284 #else
285  return UnitTest::instance().AddTestSuite(testsuite, id, setup, teardown, detail::explicit_type<TestSuite>());
286 #endif
287  }
288  TestSuite* AddTestSuite(const ::std::string& testsuite, TestTypeId id, SetUpMethod setup, TearDownMethod teardown)
289  {
290 #if !defined(IUTEST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS)
291  return UnitTest::instance().AddTestSuite<TestSuite>(testsuite, id, setup, teardown);
292 #else
293  return UnitTest::instance().AddTestSuite(testsuite, id, setup, teardown, detail::explicit_type<TestSuite>());
294 #endif
295  }
296 
297 private:
298  TestSuiteMediator m_mediator;
299  TestInfo m_info;
300  iuFactory<Tester> m_factory;
301 };
302 
303 } // end of namespace detail
304 } // end of namespace iutest
305 
306 #if !IUTEST_HAS_LIB
307 # include "impl/iutest_core.ipp" // IWYU pragma: export
308 #endif
309 
310 #endif // INCG_IRIS_IUTEST_CORE_HPP_33560431_783B_4AE7_8FC8_6E78355CAF87_
static int get_repeat_count()
繰り返し回数
Definition: iutest_env.hpp:357
static unsigned int current_random_seed()
乱数シード
Definition: iutest_env.hpp:356
イベントリスナーの管理クラス
Definition: iutest_listener.hpp:169
static const TestInfo * GetCurrentTestInfo()
実行中の TestInfo の取得
Definition: iutest_body.hpp:67
テスト情報クラス
Definition: iutest_info.hpp:38
テスト結果を示すクラス
Definition: iutest_result.hpp:216
TestSuite
Definition: iutest_suite.hpp:37
テスト全体の管理者
Definition: iutest_core.hpp:36
int reportable_test_count() const
TimeInMillisec elapsed_time() const IUTEST_CXX_NOEXCEPT_SPEC
Definition: iutest_core.hpp:109
const TestSuite * current_test_suite() const
テスト中の TestSuite の取得
Definition: iutest_core.hpp:49
static UnitTest * GetInstance()
UnitTest インスタンスの取得
Definition: iutest_core.hpp:43
bool Failed() const
Definition: iutest_core.hpp:120
int failed_test_suite_count() const
int test_suite_to_run_count() const
const TestResult * ad_hoc_test_result() const IUTEST_CXX_NOEXCEPT_SPEC
Definition: iutest_core.hpp:106
int successful_test_suite_count() const
int reportable_test_run_skipped_count() const
int failed_test_count() const
unsigned int random_seed() const
Definition: iutest_core.hpp:58
bool Passed() const
int reportable_disabled_test_count() const
int reportable_skip_test_count() const
int Run()
テストの実行
int successful_test_count() const
int total_test_count() const IUTEST_CXX_NOEXCEPT_SPEC
Definition: iutest_core.hpp:68
int repeat_count() const IUTEST_CXX_NOEXCEPT_SPEC
Definition: iutest_core.hpp:64
TimeInMillisec start_timestamp() const IUTEST_CXX_NOEXCEPT_SPEC
Definition: iutest_core.hpp:112
int test_to_run_count() const IUTEST_CXX_NOEXCEPT_SPEC
Definition: iutest_core.hpp:72
const TestInfo * current_test_info() const
テスト中の TestInfo の取得
Definition: iutest_core.hpp:55
int test_run_skipped_count() const
int repeat_counter() const IUTEST_CXX_NOEXCEPT_SPEC
Definition: iutest_core.hpp:61
int skip_test_count() const
int disabled_test_count() const IUTEST_CXX_NOEXCEPT_SPEC
Definition: iutest_core.hpp:76
TestEventListeners & listeners() const
Definition: iutest_core.hpp:123
const TestResult * ad_hoc_testresult() const IUTEST_CXX_NOEXCEPT_SPEC
テスト実行中じゃないときのリザルトの取得
Definition: iutest_core.hpp:103
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_NOEXCEPT_SPEC
noexcept specification definition
Definition: iutest_compiler.hpp:811
iris unit test ファイルクラス ファイル
iris unit test parameter 定義 ファイル
#define IUTEST_PP_DISALLOW_COPY_AND_ASSIGN(TypeName)
コピー禁止定義
Definition: iutest_pp.hpp:31
iris unit test TestPartResult リポーター ファイル
iutest root namespace
Definition: iutest_charcode.hpp:33
detail::type_least_t< 8 >::UInt TimeInMillisec
ミリ秒単位を扱う型
Definition: iutest_defs.hpp:526
void(* SetUpMethod)()
SetUp 関数型
Definition: iutest_defs.hpp:523
void(* TearDownMethod)()
TearDown 関数型
Definition: iutest_defs.hpp:524
internal::TypeId TestTypeId
テスト識別型
Definition: iutest_defs.hpp:521