iutest  1.17.1.0
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
21 #include "internal/iutest_file.hpp"
23 
24 namespace iutest
25 {
26 
27 //======================================================================
28 // class
32 class UnitTest : public UnitTestImpl
33 {
34 public:
36  static UnitTest& instance() { static UnitTest inst; return inst; }
40  static UnitTest* GetInstance() { return &instance(); }
41 
42 public:
46  const TestCase* current_test_case() const { return m_current_testcase; }
47 
52  const TestInfo* current_test_info() const { return Test::GetCurrentTestInfo(); }
53 
55  unsigned int random_seed() const { return TestEnv::current_random_seed(); }
56 
58  int repeat_counter() const IUTEST_CXX_NOEXCEPT_SPEC { return m_repeat_counter; }
59 
61  int repeat_count() const IUTEST_CXX_NOEXCEPT_SPEC { return TestEnv::get_repeat_count(); }
62 
63 public:
65  int total_test_count() const IUTEST_CXX_NOEXCEPT_SPEC { return m_total_test_num; }
67  int reportable_test_count() const;
69  int test_to_run_count() const IUTEST_CXX_NOEXCEPT_SPEC { return m_should_run_num; }
71  int failed_test_count() const;
73  int disabled_test_count() const IUTEST_CXX_NOEXCEPT_SPEC { return m_disable_num; }
77  int successful_test_count() const;
79  int skip_test_count() const;
81  int reportable_skip_test_count() const;
83  int test_run_skipped_count() const;
86 
88  int total_test_case_count() const { return static_cast<int>(m_testcases.size()); }
90  int test_case_to_run_count() const;
92  int successful_test_case_count() const;
94  int failed_test_case_count() const;
95 
100  const TestResult* ad_hoc_testresult() const IUTEST_CXX_NOEXCEPT_SPEC { return ad_hoc_test_result(); }
101 
103  const TestResult* ad_hoc_test_result() const IUTEST_CXX_NOEXCEPT_SPEC { return &m_ad_hoc_testresult; }
104 
106  TimeInMillisec elapsed_time() const IUTEST_CXX_NOEXCEPT_SPEC { return m_elapsedmsec; }
107 
109  TimeInMillisec start_timestamp() const IUTEST_CXX_NOEXCEPT_SPEC { return m_start_timestamp; }
110 
112  const TestCase* GetTestCase(int index) const { return m_testcases[index]; }
113 
115  bool Passed() const;
117  bool Failed() const { return !Passed(); }
118 
120  TestEventListeners& listeners() const { return TestEnv::event_listeners(); }
121 
122 protected:
126  int Run();
127 
128 private:
129 #if IUTEST_HAS_SEH && IUTEST_HAS_EXCEPTIONS
130  int RunOnMSC();
131 #endif
132  int RunImpl();
133 
137  bool RunOnce();
138 
139 private:
143  void TestProgramStart();
144 
148  void SetUpTestIteration();
149 
153  void EnvironmentSetUp();
154 
158  void EnvironmentTearDown();
159 
163  void TestProgramEnd();
164 
165 private:
166  // C言語の終了コールバック関数
167  static void OnExit()
168  {
169  instance().TestProgramEnd();
170  }
171 
172 private:
173  UnitTest()
174  : m_repeat_counter(0)
175  , m_init_iutest_count(0)
176  , m_test_started(false)
177  , m_start_timestamp(0)
178  {
179  // デフォルトリポーターをセット
180  TestEnv::SetGlobalTestPartResultReporter(&m_default_test_part_result_reporter);
181  // 環境変数によるテストフラグ指定をロード
182  TestEnv::LoadEnvironmentVariable();
183  }
184 #if defined(_MSC_VER) && _MSC_VER < 1300
185 public: // VC++6.0 bug
186 #endif
187  ~UnitTest()
188  {
189  TestEnv::ReleaseGlobalTestEnvironment();
190  TestEnv::SetGlobalTestPartResultReporter(NULL);
191  }
192 
193 private:
194  // 初期化処理
195  void Initialize();
196 
197 #if IUTEST_HAS_PARAM_TEST
198 public:
200  detail::ParamTestCaseHolder& parameterized_test_registry() IUTEST_CXX_NOEXCEPT_SPEC
201  {
202  return m_param_testcase_holder;
203  }
204 
205 private:
206  detail::ParamTestCaseHolder m_param_testcase_holder;
207 #endif
208 
209 private:
210  friend class UnitTestSource;
211 
212  int m_repeat_counter;
213  int m_init_iutest_count;
214  bool m_test_started;
215  TimeInMillisec m_start_timestamp;
216  detail::DefaultGlobalTestPartResultReporter m_default_test_part_result_reporter;
217 
219 };
220 
221 namespace detail
222 {
223 
229 template<class Tester>
230 class TestInstance
231 {
232 public:
234  TestInstance(const char* testcase, const char* name, TestTypeId id
235  , SetUpMethod setup, TearDownMethod teardown)
236  : m_mediator(AddTestCase(testcase, id, setup, teardown))
237  , m_info(&m_mediator, name, &m_factory)
238  {
239  UnitTest::instance().AddTestInfo(m_mediator.ptr(), &m_info);
240  }
242  TestInstance(const ::std::string& testcase, const char* name, TestTypeId id
243  , SetUpMethod setup, TearDownMethod teardown)
244  : m_mediator(AddTestCase(testcase, id, setup, teardown))
245  , m_info(&m_mediator, name, &m_factory)
246  {
247  UnitTest::instance().AddTestInfo(m_mediator.ptr(), &m_info);
248  }
250  TestInstance(const char* testcase, const char* name, const char* value_params, TestTypeId id
251  , SetUpMethod setup, TearDownMethod teardown)
252  : m_mediator(AddTestCase(testcase, id, setup, teardown))
253  , m_info(&m_mediator, name, &m_factory)
254  {
255  m_info.set_value_param(value_params);
256  UnitTest::instance().AddTestInfo(m_mediator.ptr(), &m_info);
257  }
259  TestInstance(const ::std::string& testcase, const char* name, const char* value_params, TestTypeId id
260  , SetUpMethod setup, TearDownMethod teardown)
261  : m_mediator(AddTestCase(testcase, id, setup, teardown))
262  , m_info(&m_mediator, name, &m_factory)
263  {
264  m_info.set_value_param(value_params);
265  UnitTest::instance().AddTestInfo(m_mediator.ptr(), &m_info);
266  }
267 
268 private:
269  TestCase* AddTestCase(const char* testcase, TestTypeId id, SetUpMethod setup, TearDownMethod teardown)
270  {
271 #if !defined(IUTEST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS)
272  return UnitTest::instance().AddTestCase<TestCase>(testcase, id, setup, teardown);
273 #else
274  return UnitTest::instance().AddTestCase(testcase, id, setup, teardown, detail::explicit_type<TestCase>());
275 #endif
276  }
277  TestCase* AddTestCase(const ::std::string& testcase, TestTypeId id, SetUpMethod setup, TearDownMethod teardown)
278  {
279 #if !defined(IUTEST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS)
280  return UnitTest::instance().AddTestCase<TestCase>(testcase, id, setup, teardown);
281 #else
282  return UnitTest::instance().AddTestCase(testcase, id, setup, teardown, detail::explicit_type<TestCase>());
283 #endif
284  }
285 
286 private:
287  TestCaseMediator m_mediator;
288  TestInfo m_info;
289  iuFactory<Tester> m_factory;
290 };
291 
292 } // end of namespace detail
293 } // end of namespace iutest
294 
295 #if !IUTEST_HAS_LIB
296 # include "impl/iutest_core.ipp"
297 #endif
298 
299 #endif // INCG_IRIS_IUTEST_CORE_HPP_33560431_783B_4AE7_8FC8_6E78355CAF87_
iutest::UnitTest::Run
int Run()
テストの実行
iutest::UnitTest::test_case_to_run_count
int test_case_to_run_count() const
iutest::TestResult
テスト結果を示すクラス
Definition: iutest_result.hpp:213
iutest::UnitTest::GetInstance
static UnitTest * GetInstance()
UnitTest インスタンスの取得
Definition: iutest_core.hpp:41
iutest::UnitTest::ad_hoc_testresult
const TestResult * ad_hoc_testresult() const IUTEST_CXX_NOEXCEPT_SPEC
テスト実行中じゃないときのリザルトの取得
Definition: iutest_core.hpp:101
iutest::UnitTest::reportable_disabled_test_count
int reportable_disabled_test_count() const
iutest::UnitTest::failed_test_count
int failed_test_count() const
iutest::TestInfo
テスト情報クラス
Definition: iutest_info.hpp:32
iutest::UnitTest::current_test_case
const TestCase * current_test_case() const
テスト中の TestCase の取得
Definition: iutest_core.hpp:47
iutest_config.hpp
iris unit test config
iutest::UnitTest::ad_hoc_test_result
const TestResult * ad_hoc_test_result() const IUTEST_CXX_NOEXCEPT_SPEC
Definition: iutest_core.hpp:104
iutest::UnitTest::successful_test_case_count
int successful_test_case_count() const
iutest::UnitTest::reportable_test_count
int reportable_test_count() const
IUTEST_CXX_NOEXCEPT_SPEC
#define IUTEST_CXX_NOEXCEPT_SPEC
noexcept specification definition
Definition: iutest_compiler.hpp:734
iutest_result_reporter.hpp
iris unit test TestPartResult リポーター ファイル
iutest::UnitTest::current_test_info
const TestInfo * current_test_info() const
テスト中の TestInfo の取得
Definition: iutest_core.hpp:53
iutest_file.hpp
iris unit test ファイルクラス ファイル
iutest
iutest root namespace
Definition: iutest_charcode.hpp:31
iutest::UnitTest
テスト全体の管理者
Definition: iutest_core.hpp:33
iutest::UnitTest::skip_test_count
int skip_test_count() const
iutest::UnitTest::total_test_case_count
int total_test_case_count() const
Definition: iutest_core.hpp:89
iutest::Test::GetCurrentTestInfo
static const TestInfo * GetCurrentTestInfo()
実行中の TestInfo の取得
Definition: iutest_body.hpp:67
iutest::TestTypeId
internal::TypeId TestTypeId
テスト識別型
Definition: iutest_defs.hpp:440
iutest::UnitTest::successful_test_count
int successful_test_count() const
iutest::UnitTest::Failed
bool Failed() const
Definition: iutest_core.hpp:118
iutest::UnitTest::disabled_test_count
int disabled_test_count() const IUTEST_CXX_NOEXCEPT_SPEC
Definition: iutest_core.hpp:74
IUTEST_PP_DISALLOW_COPY_AND_ASSIGN
#define IUTEST_PP_DISALLOW_COPY_AND_ASSIGN(TypeName)
コピー禁止定義
Definition: iutest_pp.hpp:25
iutest::UnitTest::GetTestCase
const TestCase * GetTestCase(int index) const
Definition: iutest_core.hpp:113
iutest::UnitTest::reportable_skip_test_count
int reportable_skip_test_count() const
iutest::UnitTest::random_seed
unsigned int random_seed() const
Definition: iutest_core.hpp:56
iutest::TimeInMillisec
detail::type_least_t< 8 >::UInt TimeInMillisec
ミリ秒単位を扱う型
Definition: iutest_defs.hpp:445
iutest::TearDownMethod
void(* TearDownMethod)()
TearDown 関数型
Definition: iutest_defs.hpp:443
iutest::UnitTest::failed_test_case_count
int failed_test_case_count() const
iutest::UnitTest::elapsed_time
TimeInMillisec elapsed_time() const IUTEST_CXX_NOEXCEPT_SPEC
Definition: iutest_core.hpp:107
iutest::SetUpMethod
void(* SetUpMethod)()
SetUp 関数型
Definition: iutest_defs.hpp:442
iutest::UnitTest::repeat_count
int repeat_count() const IUTEST_CXX_NOEXCEPT_SPEC
Definition: iutest_core.hpp:62
iutest::UnitTest::start_timestamp
TimeInMillisec start_timestamp() const IUTEST_CXX_NOEXCEPT_SPEC
Definition: iutest_core.hpp:110
iutest_params_util.hpp
iris unit test parameter 定義 ファイル
iutest::TestEventListeners
イベントリスナーの管理クラス
Definition: iutest_listener.hpp:158
iutest::UnitTest::total_test_count
int total_test_count() const IUTEST_CXX_NOEXCEPT_SPEC
Definition: iutest_core.hpp:66
iutest::UnitTest::test_to_run_count
int test_to_run_count() const IUTEST_CXX_NOEXCEPT_SPEC
Definition: iutest_core.hpp:70
iutest::UnitTest::Passed
bool Passed() const
iutest::UnitTest::listeners
TestEventListeners & listeners() const
Definition: iutest_core.hpp:121
iutest::TestCase
テストケース
Definition: iutest_case.hpp:31
iutest::UnitTest::reportable_test_run_skipped_count
int reportable_test_run_skipped_count() const
iutest::UnitTest::repeat_counter
int repeat_counter() const IUTEST_CXX_NOEXCEPT_SPEC
Definition: iutest_core.hpp:59
iutest::UnitTest::test_run_skipped_count
int test_run_skipped_count() const