Go to the documentation of this file.
36 #ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
37 #define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
46 #include <type_traits>
50 #include "gtest/internal/gtest-internal.h"
51 #include "gtest/internal/gtest-port.h"
52 #include "gtest/gtest-printers.h"
53 #include "gtest/gtest-test-part.h"
58 template <
class ParamType>
59 struct TestParamInfo {
69 struct PrintToStringParamName {
70 template <
class ParamType>
86 CodeLocation code_location);
88 template <
typename>
class ParamGeneratorInterface;
89 template <
typename>
class ParamGenerator;
94 class ParamIteratorInterface {
113 virtual const T*
Current()
const = 0;
123 template <
typename T>
124 class ParamIterator {
134 impl_.reset(other.impl_->Clone());
152 return impl_.get() == other.impl_.get() ||
impl_->Equals(*other.impl_);
155 return !(*
this == other);
161 std::unique_ptr<ParamIteratorInterface<T> >
impl_;
166 template <
typename T>
167 class ParamGeneratorInterface {
184 class ParamGenerator {
200 std::shared_ptr<const ParamGeneratorInterface<T> >
impl_;
207 template <
typename T,
typename IncrementT>
208 class RangeGenerator :
public ParamGeneratorInterface<T> {
245 <<
"The program attempted to compare iterators "
246 <<
"from different generators." << std::endl;
247 const int other_index =
248 CheckedDowncastToActualType<const Iterator>(&other)->index_;
249 return index_ == other_index;
264 const IncrementT
step_;
269 const IncrementT&
step) {
271 for (
T i =
begin; i < end; i = static_cast<T>(
i +
step))
281 const IncrementT
step_;
292 template <
typename T>
293 class ValuesInIteratorRangeGenerator :
public ParamGeneratorInterface<T> {
295 template <
typename ForwardIterator>
313 typename ContainerType::const_iterator
iterator)
342 <<
"The program attempted to compare iterators "
343 <<
"from different generators." << std::endl;
345 CheckedDowncastToActualType<const Iterator>(&other)->iterator_;
357 typename ContainerType::const_iterator
iterator_;
363 mutable std::unique_ptr<const T>
value_;
376 template <
class ParamType>
379 name_stream << info.index;
383 template <
typename T =
int>
385 static_assert(
sizeof(
T) == 0,
"Empty arguments are not allowed.");
387 template <
typename T =
int>
394 template <
class TestClass>
395 class ParameterizedTestFactory :
public TestFactoryBase {
402 return new TestClass();
415 template <
class ParamType>
416 class TestMetaFactoryBase {
431 template <
class TestSuite>
432 class TestMetaFactory
433 :
public TestMetaFactoryBase<typename TestSuite::ParamType> {
457 class ParameterizedTestSuiteInfoBase {
483 explicit MarkAsIgnored(
const char*
test_suite);
487 CodeLocation location,
bool has_test_p);
496 template <
class TestSuite>
497 class ParameterizedTestSuiteInfo :
public ParameterizedTestSuiteInfoBase {
527 test_suite_name, test_base_name, meta_factory, code_location)));
532 GeneratorCreationFunc*
func,
545 bool generated_instantiations =
false;
548 test_it !=
tests_.end(); ++test_it) {
549 std::shared_ptr<TestInfo> test_info = *test_it;
553 const std::string& instantiation_name = gen_it->name;
556 const char*
file = gen_it->file;
557 int line = gen_it->line;
560 if ( !instantiation_name.empty() )
561 test_suite_name = instantiation_name +
"/";
562 test_suite_name += test_info->test_suite_base_name;
565 std::set<std::string> test_param_names;
568 param_it != generator.end(); ++param_it, ++
i) {
569 generated_instantiations =
true;
577 <<
"Parameterized test name '" << param_name
578 <<
"' is invalid, in " <<
file
579 <<
" line " <<
line << std::endl;
582 <<
"Duplicate parameterized test name '" << param_name
583 <<
"', in " <<
file <<
" line " <<
line << std::endl;
585 test_param_names.insert(param_name);
587 if (!test_info->test_base_name.empty()) {
588 test_name_stream << test_info->test_base_name <<
"/";
590 test_name_stream << param_name;
592 test_suite_name.c_str(), test_name_stream.
GetString().c_str(),
598 test_info->test_meta_factory->CreateTestFactory(*param_it));
603 if (!generated_instantiations) {
614 TestInfo(
const char* a_test_suite_base_name,
const char* a_test_base_name,
633 GeneratorCreationFunc* generator_in,
674 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
675 template <
class TestCase>
677 #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
685 class ParameterizedTestSuiteRegistry {
690 delete test_suite_info;
696 template <
class TestSuite>
698 const char* test_suite_name,
CodeLocation code_location) {
701 if (test_suite_info->GetTestSuiteName() == test_suite_name) {
702 if (test_suite_info->GetTestSuiteTypeId() != GetTypeId<TestSuite>()) {
718 if (typed_test_info ==
nullptr) {
720 test_suite_name, code_location);
723 return typed_test_info;
727 test_suite_info->RegisterTests();
731 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
732 template <
class TestCase>
734 const char* test_case_name,
CodeLocation code_location) {
735 return GetTestSuitePatternHolder<TestCase>(test_case_name, code_location);
738 #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
765 struct TypeParameterizedTestSuiteInfo {
773 std::map<std::string, TypeParameterizedTestSuiteInfo>
suites_;
780 template <
class Container>
781 internal::ParamGenerator<typename Container::value_type>
ValuesIn(
788 #pragma warning(push)
789 #pragma warning(disable : 4100)
792 template <
typename... Ts>
797 template <
typename T>
803 template <
typename T,
size_t...
I>
805 return std::vector<T>{
static_cast<T>(
v_.template Get<I>())...};
815 template <
typename...
T>
816 class CartesianProductGenerator
817 :
public ParamGeneratorInterface<::std::tuple<T...>> {
835 template <
size_t...
I>
845 ComputeCurrentValue();
859 AdvanceIfEnd<
sizeof...(T) - 1>();
860 ComputeCurrentValue();
872 <<
"The program attempted to compare iterators "
873 <<
"from different generators." << std::endl;
875 CheckedDowncastToActualType<const IteratorImpl>(&other);
880 if (AtEnd() && typed_other->AtEnd())
return true;
884 (same = same && std::get<I>(
current_) ==
885 std::get<I>(typed_other->current_))...};
891 template <
size_t ThisI>
893 if (std::get<ThisI>(
current_) != std::get<ThisI>(
end_))
return;
895 bool last = ThisI == 0;
901 constexpr
size_t NextI = ThisI - (ThisI != 0);
902 std::get<ThisI>(
current_) = std::get<ThisI>(begin_);
904 AdvanceIfEnd<NextI>();
909 current_value_ = std::make_shared<ParamType>(*std::get<I>(
current_)...);
914 (at_end = at_end || std::get<I>(
current_) == std::get<I>(
end_))...};
923 std::shared_ptr<ParamType> current_value_;
931 template <
class... Gen>
935 template <
typename...
T>
948 #endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
ParameterizedTestSuiteInfo< TestCase > ParameterizedTestCaseInfo
ParamIteratorInterface< T > * Clone() const override
static int CalculateEndIndex(const T &begin, const T &end, const IncrementT &step)
ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end)
absl::string_view get(const Cont &c)
std::string operator()(const TestParamInfo< ParamType > &info) const
virtual bool Equals(const ParamIteratorInterface &other) const =0
bool operator==(const ParamIterator &other) const
const std::string test_suite_base_name
ParameterizedTestFactory(ParamType parameter)
ParamIterator & operator=(const ParamIterator &other)
void RegisterTestSuite(const char *test_suite_name, CodeLocation code_location)
~ValuesInIteratorRangeGenerator() override
~CartesianProductGenerator() override
GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestSuiteRegistry)
const std::unique_ptr< TestMetaFactoryBase< ParamType > > test_meta_factory
ParamIteratorInterface< T > * Begin() const override
const typedef void * TypeId
void operator=(const ValuesInIteratorRangeGenerator &other)
TypeId GetTestSuiteTypeId() const override
CartesianProductHolder(const Gen &... g)
ParamIterator< T > iterator
Derived * CheckedDowncastToActualType(Base *base)
ParamIteratorInterface< ParamType > * End() const override
const T * Current() const override
GTEST_API_ void ReportInvalidTestSuiteType(const char *test_suite_name, CodeLocation code_location)
Iterator(const ParamGeneratorInterface< T > *base, T value, int index, IncrementT step)
ParamIteratorInterface< ParamType > * Clone() const override
const ParamType parameter_
std::string(const TestParamInfo< ParamType > &) ParamNameGeneratorFunc
const ParamGeneratorInterface< T > *const base_
ParamIteratorInterface< T > * Clone() const override
const std::string test_base_name
const typedef MCPhysReg * iterator
GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestSuiteInfoBase)
#define T(upbtypeconst, upbtype, ctype, default_value)
ParamIteratorInterface< ParamType > * Begin() const override
const std::string & GetTestSuiteName() const override
const T & operator*() const
ptrdiff_t difference_type
::std::vector< InstantiationInfo > InstantiationContainer
CartesianProductGenerator(const std::tuple< ParamGenerator< T >... > &g)
ParamGenerator(const ParamGenerator &other)
InstantiationContainer instantiations_
const T * operator->() const
TestInfo(const char *a_test_suite_base_name, const char *a_test_base_name, TestMetaFactoryBase< ParamType > *a_test_meta_factory, CodeLocation a_code_location)
virtual ~ParamIteratorInterface()
ParamIteratorInterface< T > * End() const override
constexpr absl::remove_reference_t< T > && move(T &&t) noexcept
void * Clone(FlagOpFn op, const void *obj)
TypeParameterizedTestSuiteInfo(CodeLocation c)
CodeLocation code_location
~ParameterizedTestSuiteRegistry()
typename TestSuite::ParamType ParamType
const ContainerType container_
void AddTestPattern(const char *test_suite_name, const char *test_base_name, TestMetaFactoryBase< ParamType > *meta_factory, CodeLocation code_location)
CodeLocation code_location_
virtual const T * Current() const =0
TestSuiteInfoContainer test_suite_infos_
ParamNameGeneratorFunc * name_func
const ParamGeneratorInterface< T > * BaseGenerator() const override
ParamGenerator(ParamGeneratorInterface< T > *impl)
const ParamType * Current() const override
virtual ~ParameterizedTestSuiteInfoBase()
virtual void RegisterTests()=0
IteratorImpl< typename MakeIndexSequence< sizeof...(T)>::type > Iterator
void RegisterInstantiation(const char *test_suite_name)
GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestSuiteInfo)
~RangeGenerator() override
std::string GetString() const
IteratorImpl(const ParamGeneratorInterface< ParamType > *base, const std::tuple< ParamGenerator< T >... > &generators, bool is_end)
void CheckForInstantiations()
ParameterizedTestSuiteRegistry()
bool operator!=(const ParamIterator &other) const
const ParamGeneratorInterface< T > *const base_
ParamIterator(const ParamIterator &other)
std::map< std::string, TypeParameterizedTestSuiteInfo > suites_
::std::tuple< T... > ParamType
Iterator(const Iterator &other)
ParamIterator operator++(int)
Iterator(const ParamGeneratorInterface< T > *base, typename ContainerType::const_iterator iterator)
GTEST_API_ TestInfo * MakeAndRegisterTestInfo(const char *test_suite_name, const char *name, const char *type_param, const char *value_param, CodeLocation code_location, TypeId fixture_class_id, SetUpTestSuiteFunc set_up_tc, TearDownTestSuiteFunc tear_down_tc, TestFactoryBase *factory)
InstantiationInfo(const std::string &name_in, GeneratorCreationFunc *generator_in, ParamNameGeneratorFunc *name_func_in, const char *file_in, int line_in)
#define GTEST_CHECK_(condition)
::std::vector< T > ContainerType
virtual ~ParamGeneratorInterface()
::std::vector< std::shared_ptr< TestInfo > > TestInfoContainer
RangeGenerator(T begin, T end, IncrementT step)
const typedef T & reference
::std::vector< ParameterizedTestSuiteInfoBase * > TestSuiteInfoContainer
ParameterizedTestSuiteInfo(const char *name, CodeLocation code_location)
bool Equals(const ParamIteratorInterface< T > &other) const override
std::shared_ptr< const ParamGeneratorInterface< T > > impl_
bool Equals(const ParamIteratorInterface< T > &other) const override
const std::string test_suite_name_
const T * Current() const override
void RegisterTests() override
virtual ParamIteratorInterface * Clone() const =0
ParameterizedTestSuiteInfo< TestSuite > * GetTestSuitePatternHolder(const char *test_suite_name, CodeLocation code_location)
void operator=(const RangeGenerator &other)
void ComputeCurrentValue()
ParamIterator(ParamIteratorInterface< T > *impl)
GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestFactory)
ParameterizedTestSuiteInfoBase()
virtual ParamIteratorInterface< T > * End() const =0
GTEST_API_ void InsertSyntheticTestCase(const std::string &name, CodeLocation location, bool has_test_p)
std::vector< T > MakeVector(IndexSequence< I... >) const
std::tuple< Gen... > generators_
ParamGenerator & operator=(const ParamGenerator &other)
const ParamGeneratorInterface< T > * BaseGenerator() const override
ParamIteratorInterface< T > * End() const override
bool Equals(const ParamIteratorInterface< ParamType > &other) const override
virtual const ParamGeneratorInterface< T > * BaseGenerator() const =0
ParamIterator & operator++()
Iterator(const Iterator &other)
std::string DefaultParamName(const TestParamInfo< ParamType > &info)
TestParamInfo(const ParamType &a_param, size_t an_index)
internal::ParamGenerator< typename std::iterator_traits< ForwardIterator >::value_type > ValuesIn(ForwardIterator begin, ForwardIterator end)
ParameterizedTestCaseInfo< TestCase > * GetTestCasePatternHolder(const char *test_case_name, CodeLocation code_location)
ContainerType::const_iterator iterator_
ParamIteratorInterface< T > * Begin() const override
std::unique_ptr< const T > value_
const CodeLocation code_location
virtual TypeId GetTestSuiteTypeId() const =0
Test * CreateTest() override
void operator=(const Iterator &other)
const ParamGeneratorInterface< ParamType > * BaseGenerator() const override
static bool IsValidParamName(const std::string &name)
virtual ParamIteratorInterface< T > * Begin() const =0
std::unique_ptr< ParamIteratorInterface< T > > impl_
int AddTestSuiteInstantiation(const std::string &instantiation_name, GeneratorCreationFunc *func, ParamNameGeneratorFunc *name_func, const char *file, int line)
TestClass::ParamType ParamType
GeneratorCreationFunc * generator
static struct async_container * container
virtual const std::string & GetTestSuiteName() const =0
::std::string PrintToString(const T &value)
std::tuple< ParamGenerator< T >... > generators_
grpc
Author(s):
autogenerated on Fri May 16 2025 02:58:47