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_
23 #if IUTEST_HAS_PARAM_TEST
36 class IParamTestInfoData
39 class EachTestBase :
public iuIObject {};
41 class ParamEachTestBase :
public EachTestBase
44 virtual void SetParam(
const T& param) = 0;
47 explicit IParamTestInfoData(
const char* name) : m_name(name) {}
50 virtual EachTestBase* RegisterTest(TestCase* , const ::std::
string& ) const = 0;
51 const
char* GetName()
const {
return m_name.c_str(); }
59 class IParamTestCaseInfo
62 virtual ~IParamTestCaseInfo() {}
64 IParamTestCaseInfo(const ::std::string& base_name, const ::std::string& package_name)
65 : m_testcase_base_name(base_name), m_package_name(package_name) {}
66 IParamTestCaseInfo(
const char* base_name,
const char* package_name)
67 : m_testcase_base_name(base_name), m_package_name(package_name) {}
73 void AddTestPattern(IParamTestInfoData* testinfo)
75 m_testinfos.push_back(testinfo);
79 void RegisterTests()
const
81 for( TestInfoContainer::const_iterator it=m_testinfos.begin(), end=m_testinfos.end(); it != end; ++it )
87 ::std::string GetTestCaseBaseName()
const {
return m_testcase_base_name; }
88 ::std::string GetPackageName()
const {
return m_package_name; }
91 bool is_same(const ::std::string& base_name, const ::std::string& package_name)
93 return m_testcase_base_name == base_name && m_package_name == package_name;
95 bool is_same(
const char* base_name,
const char* package_name)
97 return m_testcase_base_name == base_name && m_package_name == package_name;
101 virtual void OnRegisterTests(IParamTestInfoData*)
const = 0;
103 typedef ::std::vector<IParamTestInfoData*> TestInfoContainer;
104 TestInfoContainer m_testinfos;
106 ::std::string m_testcase_base_name;
107 ::std::string m_package_name;
115 class ParamTestCaseInfo :
public IParamTestCaseInfo
118 typedef typename Tester::ParamType ParamType;
119 typedef detail::iuIParamGenerator<ParamType> ParamGenerator;
120 typedef typename ParamGenerator::Generator Generator;
121 typedef IParamTestInfoData::ParamEachTestBase<ParamType> EachTest;
123 typedef ::std::vector<IParamTestInfoData*> TestInfoContainer;
125 typedef ParamGenerator* (*pfnCreateGeneratorFunc)();
126 typedef ::std::string (*pfnParamNameGeneratorFunc)(
const TestParamInfo<ParamType>&);
132 : CreateGen(NULL), ParamNameGen(NULL) {}
133 Functor(pfnCreateGeneratorFunc c, pfnParamNameGeneratorFunc p)
134 : CreateGen(c), ParamNameGen(p) {}
135 pfnCreateGeneratorFunc CreateGen;
136 pfnParamNameGeneratorFunc ParamNameGen;
141 ParamTestCaseInfo(const ::std::string& testcase_name, const ::std::string& package_name)
142 : IParamTestCaseInfo(testcase_name, package_name)
145 ParamTestCaseInfo(
const char* testcase_name,
const char* package_name)
146 : IParamTestCaseInfo(testcase_name, package_name)
149 virtual ~ParamTestCaseInfo() {}
154 int AddTestCaseInstantiation(::std::string name
155 , pfnCreateGeneratorFunc create_func, pfnParamNameGeneratorFunc paramname_func)
157 #if IUTEST_HAS_STD_EMPLACE
158 m_instantiation.emplace_back(name, Functor(create_func, paramname_func));
160 m_instantiation.push_back(InstantiationPair(name, Functor(create_func, paramname_func)));
170 for(
typename InstantiationContainer::const_iterator gen_it=m_instantiation.begin()
171 , gen_end=m_instantiation.end(); gen_it != gen_end; ++gen_it )
174 detail::scoped_ptr<ParamGenerator> p((gen_it->second.CreateGen)());
176 const ::std::string testcase_name = CreateTestCaseName(gen_it->first);
177 TestCase* testcase = infodata->MakeTestCase(testcase_name
178 , internal::GetTypeId<Tester>()
179 , Tester::SetUpTestCase
180 , Tester::TearDownTestCase);
182 if( p.get() != NULL )
185 for( p->Begin(); !p->IsEnd(); p->Next() )
187 const ::std::string name = MakeParamTestName(infodata->GetName()
188 , gen_it->second.ParamNameGen(TestParamInfo<ParamType>(p->GetCurrent(), i)) );
189 #if IUTEST_CHECK_STRICT
190 if( !CheckTestName(testcase, name) )
192 IUTEST_LOG_(WARNING) << testcase_name <<
"." << name <<
" is already exist.";
195 EachTest* test =
static_cast<EachTest*
>(infodata->RegisterTest(testcase, name));
196 test->SetParam(p->GetCurrent());
203 static ::std::string DefaultParamNameFunc(
const TestParamInfo<ParamType>& info)
205 return Tester::MakeTestParamName(info);
208 template<
typename ParamNameFunctor>
209 static ParamNameFunctor GetParamNameGen(ParamNameFunctor func)
214 static pfnParamNameGeneratorFunc GetParamNameGen()
216 return DefaultParamNameFunc;
220 ::std::string CreateTestCaseName(const ::std::string& generator_name)
const
222 ::std::string testcase_name = m_package_name;
223 if( !generator_name.empty() )
225 testcase_name += generator_name;
226 testcase_name +=
"/";
228 testcase_name += m_testcase_base_name;
229 return testcase_name;
232 static bool CheckTestName(
const TestCase* testcase, const::std::string& name)
234 const int count = testcase->total_test_count();
235 for(
int i = 0; i < count; ++i )
237 if( detail::IsStringEqual(name.c_str(), testcase->GetTestInfo(i)->name()) )
245 typedef ::std::pair< ::std::string, Functor > InstantiationPair;
246 typedef ::std::vector<InstantiationPair> InstantiationContainer;
247 InstantiationContainer m_instantiation;
253 class ParamTestCaseHolder
256 ~ParamTestCaseHolder()
259 for( TestCaseInfoContainer::const_iterator it=m_testcase_infos.begin(), end=m_testcase_infos.end(); it != end; ++it )
267 ParamTestCaseInfo<T>* GetTestCasePatternHolder(const ::std::string& testcase
268 , const ::std::string& package IUTEST_APPEND_EXPLICIT_TEMPLATE_TYPE_(T) )
270 ParamTestCaseInfo<T>* p =
static_cast<ParamTestCaseInfo<T>*
>(FindTestCasePatternHolder(testcase, package));
273 p =
new ParamTestCaseInfo<T>(testcase, package);
274 m_testcase_infos.push_back(p);
281 IParamTestCaseInfo* FindTestCasePatternHolder(
const T& testcase,
const T& package)
283 for( TestCaseInfoContainer::iterator it=m_testcase_infos.begin(), end=m_testcase_infos.end(); it != end; ++it )
285 if( (*it)->is_same(testcase, package) )
294 size_t count()
const {
return m_testcase_infos.size(); }
297 struct RegisterTestsFunctor
299 inline void operator ()(
const IParamTestCaseInfo* p)
const
308 ::std::for_each(m_testcase_infos.begin(), m_testcase_infos.end(), RegisterTestsFunctor());
311 friend class ::iutest::UnitTest;
312 typedef ::std::vector<IParamTestCaseInfo*> TestCaseInfoContainer;
313 TestCaseInfoContainer m_testcase_infos;
321 #endif // INCG_IRIS_IUTEST_PARAMS_UTIL_HPP_19F0C0BB_EEAE_4E8B_B269_A09A4A45E890_