15 #ifndef INCG_IRIS_IUTEST_PARAMS_UTIL_HPP_19F0C0BB_EEAE_4E8B_B269_A09A4A45E890_
16 #define INCG_IRIS_IUTEST_PARAMS_UTIL_HPP_19F0C0BB_EEAE_4E8B_B269_A09A4A45E890_
25 #if IUTEST_HAS_PARAM_TEST
40 class IParamTestInfoData
43 class EachTestBase :
public iuIObject {};
45 class ParamEachTestBase :
public EachTestBase
48 virtual void SetParam(
const T& param) = 0;
51 explicit IParamTestInfoData(
const char* name) : m_name(name) {}
54 virtual EachTestBase* RegisterTest(TestSuite* , const ::std::
string& ) const = 0;
55 const
char* GetName()
const {
return m_name.c_str(); }
63 class IParamTestSuiteInfo
66 virtual ~IParamTestSuiteInfo() {}
68 IParamTestSuiteInfo(const ::std::string& base_name, const ::std::string& package_name)
69 : m_testsuite_base_name(base_name), m_package_name(package_name) {}
70 IParamTestSuiteInfo(
const char* base_name,
const char* package_name)
71 : m_testsuite_base_name(base_name), m_package_name(package_name) {}
77 void AddTestPattern(IParamTestInfoData* testinfo)
79 m_testinfos.push_back(testinfo);
83 void RegisterTests()
const
85 for( TestInfoContainer::const_iterator it=m_testinfos.begin(), end=m_testinfos.end(); it != end; ++it )
91 ::std::string GetTestSuiteBaseName()
const {
return m_testsuite_base_name; }
92 ::std::string GetPackageName()
const {
return m_package_name; }
95 bool is_same(const ::std::string& base_name, const ::std::string& package_name)
97 return m_testsuite_base_name == base_name && m_package_name == package_name;
99 bool is_same(
const char* base_name,
const char* package_name)
101 return m_testsuite_base_name == base_name && m_package_name == package_name;
105 virtual void OnRegisterTests(IParamTestInfoData*)
const = 0;
107 typedef ::std::vector<IParamTestInfoData*> TestInfoContainer;
108 TestInfoContainer m_testinfos;
110 ::std::string m_testsuite_base_name;
111 ::std::string m_package_name;
124 typedef typename Tester::ParamType ParamType;
125 typedef detail::iuIParamGenerator<ParamType> ParamGenerator;
126 typedef typename ParamGenerator::Generator Generator;
127 typedef IParamTestInfoData::ParamEachTestBase<ParamType> EachTest;
129 typedef ::std::vector<IParamTestInfoData*> TestInfoContainer;
131 typedef ParamGenerator* (*pfnCreateGeneratorFunc)();
132 typedef ::std::string (*pfnParamNameGeneratorFunc)(
const TestParamInfo<ParamType>&);
138 : CreateGen(NULL), ParamNameGen(NULL), m_file(NULL), m_line(0) {}
139 Functor(pfnCreateGeneratorFunc c, pfnParamNameGeneratorFunc p,
const char* file,
int line)
140 : CreateGen(c), ParamNameGen(p), m_file(file), m_line(line) {}
141 pfnCreateGeneratorFunc CreateGen;
142 pfnParamNameGeneratorFunc ParamNameGen;
149 ParamTestSuiteInfo(const ::std::string& testsuite_name, const ::std::string& package_name)
150 : IParamTestSuiteInfo(testsuite_name, package_name)
153 ParamTestSuiteInfo(
const char* testsuite_name,
const char* package_name)
154 : IParamTestSuiteInfo(testsuite_name, package_name)
157 virtual ~ParamTestSuiteInfo() {}
162 int AddTestSuiteInstantiation(::std::string name
163 , pfnCreateGeneratorFunc create_func, pfnParamNameGeneratorFunc paramname_func
164 ,
const char* file,
int line)
166 #if IUTEST_HAS_STD_EMPLACE
167 m_instantiation.emplace_back(name, Functor(create_func, paramname_func, file, line));
169 m_instantiation.push_back(InstantiationPair(name, Functor(create_func, paramname_func, file, line)));
179 for(
typename InstantiationContainer::const_iterator gen_it=m_instantiation.begin()
180 , gen_end=m_instantiation.end(); gen_it != gen_end; ++gen_it )
183 detail::scoped_ptr<ParamGenerator> p((gen_it->second.CreateGen)());
185 const ::std::string testsuite_name = CreateTestSuiteName(gen_it->first);
186 const char* file = gen_it->second.m_file;
187 const int line = gen_it->second.m_line;
188 TestSuite* testsuite = infodata->MakeTestSuite(testsuite_name
189 , internal::GetTypeId<Tester>()
190 , IUTEST_GET_SETUP_TESTSUITE(Tester, file, line)
191 , IUTEST_GET_TEARDOWN_TESTSUITE(Tester, file, line));
193 if( p.get() != NULL )
196 for( p->Begin(); !p->IsEnd(); p->Next() )
198 const ::std::string name = MakeParamTestName(infodata->GetName()
199 , gen_it->second.ParamNameGen(TestParamInfo<ParamType>(p->GetCurrent(), i)) );
200 #if IUTEST_CHECK_STRICT
201 if( !CheckTestName(testsuite, name) )
203 IUTEST_LOG_(WARNING) << testsuite_name <<
"." << name <<
" is already exist.";
206 EachTest* test =
static_cast<EachTest*
>(infodata->RegisterTest(testsuite, name));
207 test->SetParam(p->GetCurrent());
214 static ::std::string DefaultParamNameFunc(
const TestParamInfo<ParamType>& info)
216 return Tester::MakeTestParamName(info);
219 template<
typename ParamNameFunctor>
220 static ParamNameFunctor GetParamNameGen(ParamNameFunctor func)
225 static pfnParamNameGeneratorFunc GetParamNameGen()
227 return DefaultParamNameFunc;
231 ::std::string CreateTestSuiteName(const ::std::string& generator_name)
const
233 ::std::string testsuite_name = m_package_name;
234 if( !generator_name.empty() )
236 testsuite_name += generator_name;
237 testsuite_name +=
"/";
239 testsuite_name += m_testsuite_base_name;
240 return testsuite_name;
243 static bool CheckTestName(
const TestSuite* testsuite, const::std::string& name)
245 const int count = testsuite->total_test_count();
246 for(
int i = 0; i < count; ++i )
248 if( detail::IsStringEqual(name.c_str(), testsuite->GetTestInfo(i)->name()) )
256 typedef ::std::pair< ::std::string, Functor > InstantiationPair;
257 typedef ::std::vector<InstantiationPair> InstantiationContainer;
258 InstantiationContainer m_instantiation;
264 class ParamTestSuiteHolder
267 ~ParamTestSuiteHolder()
270 for( TestSuiteInfoContainer::const_iterator it=m_testsuite_infos.begin(), end=m_testsuite_infos.end(); it != end; ++it )
278 ParamTestSuiteInfo<T>* GetTestSuitePatternHolder(const ::std::string& testsuite
279 , const ::std::string& package IUTEST_APPEND_EXPLICIT_TEMPLATE_TYPE_(T) )
281 ParamTestSuiteInfo<T>* p =
static_cast<ParamTestSuiteInfo<T>*
>(FindTestSuitePatternHolder(testsuite, package));
284 p =
new ParamTestSuiteInfo<T>(testsuite, package);
285 m_testsuite_infos.push_back(p);
292 IParamTestSuiteInfo* FindTestSuitePatternHolder(
const T& testsuite,
const T& package)
294 for( TestSuiteInfoContainer::iterator it=m_testsuite_infos.begin(), end=m_testsuite_infos.end(); it != end; ++it )
296 if( (*it)->is_same(testsuite, package) )
305 size_t count()
const {
return m_testsuite_infos.size(); }
309 void RegisterTests()
const
311 for( TestSuiteInfoContainer::const_iterator it = m_testsuite_infos.begin(); it != m_testsuite_infos.end(); ++it)
313 (*it)->RegisterTests();
317 friend class ::iutest::UnitTest;
318 typedef ::std::vector<IParamTestSuiteInfo*> TestSuiteInfoContainer;
319 TestSuiteInfoContainer m_testsuite_infos;
#define IUTEST_CXX_FINAL
final definition
Definition: iutest_compiler.hpp:756
#define IUTEST_CXX_OVERRIDE
override definition
Definition: iutest_compiler.hpp:747
#define IUTEST_CXX_DEFAULT_FUNCTION
default function
Definition: iutest_compiler.hpp:494
iris unit test parameter generator
iris unit test parameter generator from file
iris unit test memory pool
#define IUTEST_LOG_(level)
ログメッセージストリーム
Definition: iutest_port.hpp:56
iutest root namespace
Definition: iutest_charcode.hpp:33
void(* SetUpMethod)()
SetUp 関数型
Definition: iutest_defs.hpp:523
void(* TearDownMethod)()
TearDown 関数型
Definition: iutest_defs.hpp:524
internal::TypeId TestTypeId
テスト識別型
Definition: iutest_defs.hpp:521