15 #ifndef INCG_IRIS_IUTEST_ENV_HPP_F4017EAB_6CA3_4E6E_8983_059393DADD04_
16 #define INCG_IRIS_IUTEST_ENV_HPP_F4017EAB_6CA3_4E6E_8983_059393DADD04_
54 #define IUTEST_FLAG(name) IIUT_FLAG(name)
60 #define IIUT_FLAG(name) TestEnv::name()
66 #if IUTEST_HAS_LIB && IUTEST_HAS_EXTERN_TEMPLATE
68 namespace iutest {
class Environment; }
70 IUTEST_PRAGMA_EXTERN_TEMPLATE_WARN_DISABLE_BEGIN()
72 extern template class ::std::vector< ::
iutest::Environment* >;
74 IUTEST_PRAGMA_EXTERN_TEMPLATE_WARN_DISABLE_END()
89 detail::GetEnvironmentVariable(name, var);
102 virtual void SetUp() {}
103 virtual void TearDown() {}
107 struct should_be_SetUp {};
129 m_test_flags = TestFlag::GetInstance().m_test_flags;
133 TestFlag::GetInstance().m_test_flags = m_test_flags;
176 #if defined(_MSC_VER)
189 static TestFlag& GetInstance() {
static TestFlag flag;
return flag; }
197 static void SetFlag(
int enable,
int mask=-1)
199 GetInstance().m_test_flags |= enable;
200 GetInstance().m_test_flags &= mask;
207 static bool IsEnableFlag(
int flag) {
return GetInstance().m_test_flags & flag ? true :
false; }
213 typedef Fragment<KIND> _Myt;
216 Fragment(
bool enabled) {
SetFlag(KIND, enabled ? -1 : ~KIND); }
217 _Myt& operator = (
bool enabled) {
SetFlag(KIND, enabled ? -1 : ~KIND);
return *
this; }
223 #if defined(IUTEST_NO_PRIVATE_IN_AGGREGATE)
224 friend class ScopedGuard;
231 class TestPartResultReporterInterface;
238 typedef ::std::vector<Environment*> iuEnvironmentList;
245 typedef TestFlag::Fragment<TestFlag::SHUFFLE_TESTS> shuffle;
246 typedef TestFlag::Fragment<TestFlag::RUN_DISABLED_TESTS> also_run_disabled_tests;
247 typedef TestFlag::Fragment<TestFlag::BREAK_ON_FAILURE> break_on_failure;
248 typedef TestFlag::Fragment<TestFlag::CATCH_EXCEPTION> catch_exceptions;
249 typedef TestFlag::Fragment<TestFlag::THROW_ON_FAILURE> throw_on_failure;
250 typedef TestFlag::Fragment<TestFlag::WARNING_INTO_ERROR> warning_into_error;
251 typedef TestFlag::Fragment<TestFlag::PRINT_TIME> print_time;
252 typedef TestFlag::Fragment<TestFlag::SHOW_TESTS_LIST> list_tests;
253 typedef TestFlag::Fragment<TestFlag::SHOW_TESTS_LIST_WITH_WHERE> list_tests_with_where;
255 typedef TestFlag::Fragment<TestFlag::CATCH_EXCEPTION_EACH> catch_exceptions_each;
256 typedef TestFlag::Fragment<TestFlag::CATCH_EXCEPTION_GLOBAL> catch_exceptions_global;
258 typedef TestFlag::Fragment<TestFlag::FILELOCATION_STYLE_MSVC> file_location_style_msvc;
259 typedef TestFlag::Fragment<TestFlag::VERBOSE> verbose;
269 typedef class RandomSeedSet
273 RandomSeedSet(
unsigned int seed) { init_random(seed); }
274 RandomSeedSet& operator = (
unsigned int seed) { init_random(seed);
return *
this; }
275 operator unsigned int()
const {
return get_random_seed(); }
282 typedef class RepeatCountSet
286 RepeatCountSet(
int count) { set_repeat_count(count); }
287 RepeatCountSet& operator = (
int count) { set_repeat_count(count);
return *
this; }
288 operator int()
const {
return get_repeat_count(); }
291 #if defined(IUTEST_NO_PRIVATE_IN_AGGREGATE)
292 friend class RandomSeedSet;
293 friend class RepeatCountSet;
301 , m_current_random_seed(0)
302 , m_before_origin_random_seed(0)
304 , m_testpartresult_reporter(NULL)
306 unsigned int m_random_seed;
307 unsigned int m_current_random_seed;
308 unsigned int m_before_origin_random_seed;
310 ::std::string m_output_option;
311 ::std::string m_test_filter;
312 ::std::string m_flagfile;
313 #if IUTEST_HAS_STREAM_RESULT
314 ::std::string m_stream_result_to;
316 ::std::string m_default_package_name;
317 detail::iuRandom m_genrand;
318 iuEnvironmentList m_environment_list;
321 #if IUTEST_HAS_STRINGSTREAM || IUTEST_HAS_STRSTREAM
322 iu_stringstream m_ostream_formatter;
324 ::std::string m_locale_ctype;
327 static Variable& get_vars() {
static Variable sVars;
return sVars; }
330 static detail::iuRandom& genrand() {
return get_vars().m_genrand; }
331 static unsigned int get_random_seed() {
return get_vars().m_random_seed; }
332 static unsigned int current_random_seed() {
return get_vars().m_current_random_seed; }
333 static int get_repeat_count() {
return get_vars().m_repeat_count; }
334 static const char* get_output_option() {
return get_vars().m_output_option.c_str(); }
335 static const char* get_default_package_name() {
return get_vars().m_default_package_name.c_str(); }
336 static const char* test_filter() {
return get_vars().m_test_filter.c_str(); }
337 static const char* get_flagfile() {
return get_vars().m_flagfile.c_str(); }
338 #if IUTEST_HAS_STREAM_RESULT
339 static const char* get_stream_result_to() {
return get_vars().m_stream_result_to.c_str(); }
341 #if IUTEST_HAS_STRINGSTREAM || IUTEST_HAS_STRSTREAM
342 static void global_ostream_copyfmt(iu_ostream& os) { os.copyfmt(get_vars().m_ostream_formatter); }
344 static const char* get_locale_ctype() {
return get_vars().m_locale_ctype.c_str(); }
345 static bool is_specific_locale_ctype() {
return !get_vars().m_locale_ctype.empty(); }
361 return get_vars().m_testpartresult_reporter;
366 get_vars().m_testpartresult_reporter = ptr;
369 static bool has_output_option()
371 return !get_vars().m_output_option.empty();
378 static void init_random(
unsigned int seed)
380 get_vars().m_random_seed = seed;
386 static void set_repeat_count(
int count)
388 get_vars().m_repeat_count = count;
394 static void set_test_filter(
const char* str)
396 get_vars().m_test_filter = str == NULL ?
"*" : str;
403 static void set_flagfile_path(
const char* str)
405 get_vars().m_flagfile = str;
411 static void set_flagfile(
const char* str)
413 ParseFlagFileOption(str);
417 #if IUTEST_HAS_STREAM_RESULT
421 static void set_stream_result_to(
const char* str)
423 get_vars().m_stream_result_to = detail::NullableString(str);
430 static const char* get_color_option()
449 static void set_color_option(
const char* str)
451 ParseColorOption(str);
457 static void set_output_option(
const char* str)
459 get_vars().m_output_option = detail::NullableString(str);
465 static void set_default_package_name(
const char* str)
467 get_vars().m_default_package_name = detail::NullableString(str);
473 static void set_locale_ctype(
const char* str)
475 get_vars().m_locale_ctype = detail::NullableString(str);
479 typedef const char* (*pfnOptionStringGet)();
480 typedef void(*pfnOptionStringSet)(
const char*);
481 template<pfnOptionStringGet G, pfnOptionStringSet S>
484 typedef OptionString<G, S> _Myt;
485 typedef const _Myt& _Argt;
487 ::std::string m_option;
489 friend bool operator == (
const char* c_str_, _Argt rhs) {
return rhs.m_option == c_str_; }
490 friend bool operator == (const ::std::string& str, _Argt rhs) {
return rhs.m_option == str; }
491 friend bool operator == (_Argt lhs,
const char* c_str_) {
return lhs.m_option == c_str_; }
492 friend bool operator == (_Argt lhs, const ::std::string& str) {
return lhs.m_option == str; }
493 friend bool operator != (
const char* c_str_, _Argt rhs) {
return rhs.m_option != c_str_; }
494 friend bool operator != (const ::std::string& str, _Argt rhs) {
return rhs.m_option != str; }
495 friend bool operator != (_Argt lhs,
const char* c_str_) {
return lhs.m_option != c_str_; }
496 friend bool operator != (_Argt lhs, const ::std::string& str) {
return lhs.m_option != str; }
498 operator ::std::string()
const {
return m_option; }
500 bool empty()
const {
return m_option.empty(); }
501 const char* c_str()
const {
return m_option.c_str(); }
502 size_t length()
const {
return m_option.length(); }
508 const _Myt& operator = (
const char* c_str_)
510 m_option = detail::NullableString(c_str_);
514 const _Myt& operator = (const ::std::string& str)
527 typedef OptionString<get_color_option, set_color_option> color;
533 typedef OptionString<test_filter, set_test_filter> filter;
539 typedef OptionString<get_flagfile, set_flagfile> flagfile;
545 typedef OptionString<get_output_option, set_output_option> output;
547 #if IUTEST_HAS_STREAM_RESULT
552 typedef OptionString<get_stream_result_to, set_stream_result_to> stream_result_to;
559 typedef OptionString<get_default_package_name, set_default_package_name> default_package_name;
565 typedef OptionString<get_locale_ctype, set_locale_ctype> locale_ctype;
567 #if IUTEST_HAS_STRINGSTREAM || IUTEST_HAS_STRSTREAM
572 typedef class OStreamFormatter :
public iu_stringstream
574 IUTEST_WORKAROUND_MSC_STLSTREAM_C4250()
578 copyfmt(get_vars().m_ostream_formatter);
580 virtual ~OStreamFormatter()
582 get_vars().m_ostream_formatter.copyfmt(*
this);
586 #if defined(IUTEST_NO_PRIVATE_IN_AGGREGATE)
587 friend class OStreamFormatter;
593 static iuEnvironmentList& environments() {
return get_vars().m_environment_list; }
607 environments().push_back(env);
622 iuEnvironmentList& list = environments();
623 iuEnvironmentList::iterator it = ::std::find(list.begin(), list.end(), env);
624 if( it == list.end() )
641 static void ReleaseGlobalTestEnvironment()
644 for( iuEnvironmentList::iterator it=environments().begin(); it != environments().end(); )
647 it = environments().erase(it);
657 template<
typename CharType>
658 static void ParseCommandLine(
int* pargc, CharType** argv)
666 for(
int i=0; i < argc; )
668 if( ParseCommandLineElem(argv[i]) )
672 for(
int k=i; k < argc; ++k )
674 CharType* tmp = argv[k];
691 template<
typename CharType>
692 static void ParseCommandLine(::std::vector< ::std::basic_string<CharType> >& argv)
694 typedef ::std::vector< ::std::basic_string<CharType> > argv_t;
695 for(
typename argv_t::iterator it = argv.begin(); it != argv.end(); )
697 if( ParseCommandLineElem(it->c_str()) )
712 template<
typename CharType>
713 static bool ParseCommandLineElem(CharType* argv)
715 typedef typename detail::mbs_ptr<CharType> formatter;
717 formatter argv_format;
718 const char* str = argv_format.ptr(argv);
719 return ParseCommandLineElemA(str);
721 static bool ParseCommandLineElemA(
const char* str);
722 static bool ParseIutestOptionCommandLineElemA(
const char* str);
723 static bool SetFlag(
int enable,
int mask = -1);
729 static void LoadEnvironmentVariable();
740 static inline const char* ParseOptionSettingStr(
const char* opt)
742 const char* eq = strchr(opt,
'=');
752 static bool ParseColorOption(
const char* option);
757 static bool ParseOutputOption(
const char* option);
762 static bool ParseFileLocationOption(
const char* option);
767 static bool ParseFilterOption(
const char* option);
772 static bool ParseFlagFileOption(
const char* option);
781 static bool ParseYesNoFlagCommandLine(
const char* str,
TestFlag::Kind flag,
int def);
790 static int ParseYesNoOption(
const char* option);
795 static bool IsYes(
const char* option);
799 static bool IsNo(
const char* option);
802 friend class UnitTest;
808 class iu_global_format_stringstream :
public iu_stringstream
810 IUTEST_WORKAROUND_MSC_STLSTREAM_C4250()
814 #if IUTEST_HAS_STRINGSTREAM || IUTEST_HAS_STRSTREAM
815 TestEnv::global_ostream_copyfmt(*
this);
819 : iu_stringstream(str)
821 #if IUTEST_HAS_STRINGSTREAM || IUTEST_HAS_STRSTREAM
822 TestEnv::global_ostream_copyfmt(*
this);
826 : iu_stringstream(str)
828 #if IUTEST_HAS_STRINGSTREAM || IUTEST_HAS_STRSTREAM
829 TestEnv::global_ostream_copyfmt(*
this);
837 # include "impl/iutest_env.ipp"
840 #endif // INCG_IRIS_IUTEST_ENV_HPP_F4017EAB_6CA3_4E6E_8983_059393DADD04_