34 #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_ 35 #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_ 48 #if GTEST_HAS_PARAM_TEST 59 GTEST_API_ void ReportInvalidTestCaseType(
const char* test_case_name,
62 template <
typename>
class ParamGeneratorInterface;
63 template <
typename>
class ParamGenerator;
68 class ParamIteratorInterface {
70 virtual ~ParamIteratorInterface() {}
74 virtual const ParamGeneratorInterface<T>* BaseGenerator()
const = 0;
79 virtual void Advance() = 0;
82 virtual ParamIteratorInterface* Clone()
const = 0;
87 virtual const T* Current()
const = 0;
91 virtual bool Equals(
const ParamIteratorInterface& other)
const = 0;
100 typedef T value_type;
105 ParamIterator(
const ParamIterator& other) :
impl_(other.
impl_->Clone()) {}
106 ParamIterator& operator=(
const ParamIterator& other) {
108 impl_.reset(other.impl_->Clone());
113 const T* operator->()
const {
return impl_->Current(); }
121 ParamIteratorInterface<T>*
clone =
impl_->Clone();
123 return ParamIterator(clone);
125 bool operator==(
const ParamIterator& other)
const {
126 return impl_.get() == other.impl_.get() ||
impl_->Equals(*other.impl_);
128 bool operator!=(
const ParamIterator& other)
const {
129 return !(*
this == other);
133 friend class ParamGenerator<
T>;
134 explicit ParamIterator(ParamIteratorInterface<T>* impl) :
impl_(impl) {}
135 scoped_ptr<ParamIteratorInterface<T> >
impl_;
140 template <
typename T>
141 class ParamGeneratorInterface {
145 virtual ~ParamGeneratorInterface() {}
148 virtual ParamIteratorInterface<T>*
Begin()
const = 0;
149 virtual ParamIteratorInterface<T>*
End()
const = 0;
158 class ParamGenerator {
160 typedef ParamIterator<T> iterator;
162 explicit ParamGenerator(ParamGeneratorInterface<T>* impl) :
impl_(impl) {}
163 ParamGenerator(
const ParamGenerator& other) :
impl_(other.
impl_) {}
165 ParamGenerator& operator=(
const ParamGenerator& other) {
170 iterator begin()
const {
return iterator(
impl_->Begin()); }
171 iterator
end()
const {
return iterator(
impl_->End()); }
181 template <
typename T,
typename IncrementT>
182 class RangeGenerator :
public ParamGeneratorInterface<T> {
184 RangeGenerator(
T begin,
T end, IncrementT step)
185 : begin_(begin), end_(end),
186 step_(step), end_index_(CalculateEndIndex(begin, end, step)) {}
187 virtual ~RangeGenerator() {}
189 virtual ParamIteratorInterface<T>*
Begin()
const {
190 return new Iterator(
this, begin_, 0, step_);
192 virtual ParamIteratorInterface<T>*
End()
const {
193 return new Iterator(
this, end_, end_index_, step_);
197 class Iterator :
public ParamIteratorInterface<T> {
201 :
base_(base), value_(value), index_(index), step_(step) {}
204 virtual const ParamGeneratorInterface<T>* BaseGenerator()
const {
207 virtual void Advance() {
208 value_ = value_ + step_;
211 virtual ParamIteratorInterface<T>* Clone()
const {
214 virtual const T* Current()
const {
return &value_; }
215 virtual bool Equals(
const ParamIteratorInterface<T>& other)
const {
219 <<
"The program attempted to compare iterators " 220 <<
"from different generators." << std::endl;
221 const int other_index =
222 CheckedDowncastToActualType<const Iterator>(&other)->index_;
223 return index_ == other_index;
228 : ParamIteratorInterface<
T>(),
229 base_(other.
base_), value_(other.value_), index_(other.index_),
230 step_(other.step_) {}
233 void operator=(
const Iterator& other);
235 const ParamGeneratorInterface<T>*
const base_;
238 const IncrementT step_;
241 static int CalculateEndIndex(
const T& begin,
243 const IncrementT& step) {
245 for (
T i = begin;
i <
end;
i =
i + step)
251 void operator=(
const RangeGenerator& other);
255 const IncrementT step_;
258 const int end_index_;
266 template <
typename T>
267 class ValuesInIteratorRangeGenerator :
public ParamGeneratorInterface<T> {
269 template <
typename ForwardIterator>
270 ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator
end)
271 : container_(begin, end) {}
272 virtual ~ValuesInIteratorRangeGenerator() {}
274 virtual ParamIteratorInterface<T>*
Begin()
const {
275 return new Iterator(
this, container_.begin());
277 virtual ParamIteratorInterface<T>*
End()
const {
278 return new Iterator(
this, container_.end());
282 typedef typename ::std::vector<T> ContainerType;
284 class Iterator :
public ParamIteratorInterface<T> {
287 typename ContainerType::const_iterator iterator)
288 :
base_(base), iterator_(iterator) {}
291 virtual const ParamGeneratorInterface<T>* BaseGenerator()
const {
294 virtual void Advance() {
298 virtual ParamIteratorInterface<T>* Clone()
const {
308 virtual const T* Current()
const {
309 if (value_.get() ==
NULL)
310 value_.reset(
new T(*iterator_));
313 virtual bool Equals(
const ParamIteratorInterface<T>& other)
const {
317 <<
"The program attempted to compare iterators " 318 <<
"from different generators." << std::endl;
320 CheckedDowncastToActualType<const Iterator>(&other)->iterator_;
327 : ParamIteratorInterface<
T>(),
329 iterator_(other.iterator_) {}
331 const ParamGeneratorInterface<T>*
const base_;
332 typename ContainerType::const_iterator iterator_;
338 mutable scoped_ptr<const T> value_;
342 void operator=(
const ValuesInIteratorRangeGenerator& other);
344 const ContainerType container_;
351 template <
class TestClass>
352 class ParameterizedTestFactory :
public TestFactoryBase {
354 typedef typename TestClass::ParamType ParamType;
355 explicit ParameterizedTestFactory(ParamType parameter) :
357 virtual Test* CreateTest() {
359 return new TestClass();
372 template <
class ParamType>
373 class TestMetaFactoryBase {
375 virtual ~TestMetaFactoryBase() {}
377 virtual TestFactoryBase* CreateTestFactory(ParamType parameter) = 0;
388 template <
class TestCase>
389 class TestMetaFactory
390 :
public TestMetaFactoryBase<typename TestCase::ParamType> {
392 typedef typename TestCase::ParamType ParamType;
396 virtual TestFactoryBase* CreateTestFactory(ParamType parameter) {
397 return new ParameterizedTestFactory<TestCase>(parameter);
414 class ParameterizedTestCaseInfoBase {
416 virtual ~ParameterizedTestCaseInfoBase() {}
419 virtual const String& GetTestCaseName()
const = 0;
421 virtual TypeId GetTestCaseTypeId()
const = 0;
426 virtual void RegisterTests() = 0;
429 ParameterizedTestCaseInfoBase() {}
442 template <
class TestCase>
443 class ParameterizedTestCaseInfo :
public ParameterizedTestCaseInfoBase {
448 typedef typename TestCase::ParamType ParamType;
450 typedef ParamGenerator<ParamType>(GeneratorCreationFunc)();
452 explicit ParameterizedTestCaseInfo(
const char*
name)
453 : test_case_name_(name) {}
456 virtual const String& GetTestCaseName()
const {
return test_case_name_; }
458 virtual TypeId GetTestCaseTypeId()
const {
return GetTypeId<TestCase>(); }
465 void AddTestPattern(
const char* test_case_name,
466 const char* test_base_name,
467 TestMetaFactoryBase<ParamType>* meta_factory) {
468 tests_.push_back(linked_ptr<TestInfo>(
new TestInfo(test_case_name,
474 int AddTestCaseInstantiation(
const char* instantiation_name,
475 GeneratorCreationFunc*
func,
478 instantiations_.push_back(::std::make_pair(instantiation_name, func));
486 virtual void RegisterTests() {
487 for (
typename TestInfoContainer::iterator test_it = tests_.begin();
488 test_it != tests_.end(); ++test_it) {
489 linked_ptr<TestInfo> test_info = *test_it;
490 for (
typename InstantiationContainer::iterator gen_it =
491 instantiations_.begin(); gen_it != instantiations_.end();
493 const String& instantiation_name = gen_it->first;
494 ParamGenerator<ParamType>
generator((*gen_it->second)());
497 if ( !instantiation_name.empty() )
498 test_case_name_stream << instantiation_name.c_str() <<
"/";
499 test_case_name_stream << test_info->test_case_base_name.c_str();
502 for (
typename ParamGenerator<ParamType>::iterator param_it =
504 param_it !=
generator.end(); ++param_it, ++
i) {
506 test_name_stream << test_info->test_base_name.c_str() <<
"/" <<
i;
508 test_case_name_stream.GetString().c_str(),
509 test_name_stream.GetString().c_str(),
514 TestCase::SetUpTestCase,
515 TestCase::TearDownTestCase,
516 test_info->test_meta_factory->CreateTestFactory(*param_it));
526 TestInfo(
const char* a_test_case_base_name,
527 const char* a_test_base_name,
528 TestMetaFactoryBase<ParamType>* a_test_meta_factory) :
529 test_case_base_name(a_test_case_base_name),
530 test_base_name(a_test_base_name),
531 test_meta_factory(a_test_meta_factory) {}
533 const String test_case_base_name;
534 const String test_base_name;
535 const scoped_ptr<TestMetaFactoryBase<ParamType> > test_meta_factory;
537 typedef ::std::vector<linked_ptr<TestInfo> > TestInfoContainer;
540 typedef ::std::vector<std::pair<String, GeneratorCreationFunc*> >
541 InstantiationContainer;
543 const String test_case_name_;
544 TestInfoContainer tests_;
545 InstantiationContainer instantiations_;
556 class ParameterizedTestCaseRegistry {
558 ParameterizedTestCaseRegistry() {}
559 ~ParameterizedTestCaseRegistry() {
560 for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
561 it != test_case_infos_.end(); ++it) {
568 template <
class TestCase>
569 ParameterizedTestCaseInfo<TestCase>* GetTestCasePatternHolder(
570 const char* test_case_name,
573 ParameterizedTestCaseInfo<TestCase>* typed_test_info =
NULL;
574 for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
575 it != test_case_infos_.end(); ++it) {
576 if ((*it)->GetTestCaseName() == test_case_name) {
577 if ((*it)->GetTestCaseTypeId() != GetTypeId<TestCase>()) {
581 ReportInvalidTestCaseType(test_case_name, file, line);
588 ParameterizedTestCaseInfo<TestCase> >(*it);
593 if (typed_test_info ==
NULL) {
594 typed_test_info =
new ParameterizedTestCaseInfo<TestCase>(test_case_name);
595 test_case_infos_.push_back(typed_test_info);
597 return typed_test_info;
599 void RegisterTests() {
600 for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
601 it != test_case_infos_.end(); ++it) {
602 (*it)->RegisterTests();
607 typedef ::std::vector<ParameterizedTestCaseInfoBase*> TestCaseInfoContainer;
609 TestCaseInfoContainer test_case_infos_;
617 #endif // GTEST_HAS_PARAM_TEST 619 #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_ line
Definition: buildtests.py:37
Definition: testutils.h:40
Iterator
Definition: six.py:544
GLuint GLuint end
Definition: gl2ext.h:323
TimeDelta operator*(T a, TimeDelta td)
Definition: timedelta.h:123
bool operator==(T *ptr, const linked_ptr< T > &x)
Definition: gtest-linked_ptr.h:222
Definition: RenderStyleConstants.h:245
#define GTEST_API_
Definition: gtest-port.h:615
Message
Definition: peerconnection_unittest.cc:105
std::unique_ptr< CounterDirectiveMap > clone(const CounterDirectiveMap &)
Definition: CounterDirectives.cpp:35
std::unique_ptr< ModuleRtpRtcpImpl > impl_
Definition: rtp_rtcp_impl_unittest.cc:125
const void * TypeId
Definition: gtest-internal.h:490
VoEFile * file
Definition: voe_cmd_test.cc:59
TestSubObjConstructor T
Definition: TestTypedefs.idl:84
Definition: gtest-linked_ptr.h:136
#define GTEST_CHECK_(condition)
Definition: gtest-port.h:810
GLuint index
Definition: gl2.h:383
EGLAttrib * value
Definition: eglext.h:120
GLenum func
Definition: gl2.h:481
EGLImageKHR EGLint * name
Definition: eglext.h:851
uint16_t base_
Definition: transport_feedback_packet_loss_tracker_unittest.cc:36
GLint reference
Definition: gl2ext.h:922
GTEST_API_ TestInfo * MakeAndRegisterTestInfo(const char *test_case_name, const char *name, const char *test_case_comment, const char *comment, TypeId fixture_class_id, SetUpTestCaseFunc set_up_tc, TearDownTestCaseFunc tear_down_tc, TestFactoryBase *factory)
Definition: gtest.cc:2157
Definition: safe_conversions.h:16
Definition: document.h:393
Definition: bn_test.cc:620
std::integral_constant< std::ptrdiff_t, V > ptrdiff_t
Definition: Brigand.h:449
for i
Definition: complexityMeasures.m:24
abort
Definition: config.py:261
#define NULL
Definition: common_types.h:41
string parameter_
Definition: command_line_interface_unittest.cc:231
#define GTEST_DISALLOW_COPY_AND_ASSIGN_(type)
Definition: gtest-port.h:573
Definition: generator.py:1
AVCFAssetImageGeneratorRef generator
Definition: AVFoundationCFSoftLinking.h:75
bool operator!=(T *ptr, const linked_ptr< T > &x)
Definition: gtest-linked_ptr.h:227
SubsamplingLevel & operator++(SubsamplingLevel &subsamplingLevel)
Definition: ImageFrame.h:51
Derived * CheckedDowncastToActualType(Base *base)
Definition: gtest-port.h:835