Googletest export
Add a matcher `testing::ReturnRoundRobin` which, on each call, returns the next element in the sequence, restarting at the beginning once it has reached the end. PiperOrigin-RevId: 276312136
This commit is contained in:
committed by
Gennadiy Civil
parent
1110c471ca
commit
37f3227831
@@ -716,6 +716,36 @@ class ReturnRefOfCopyAction {
|
||||
GTEST_DISALLOW_ASSIGN_(ReturnRefOfCopyAction);
|
||||
};
|
||||
|
||||
// Implements the polymorphic ReturnRoundRobin(v) action, which can be
|
||||
// used in any function that returns the element_type of v.
|
||||
template <typename T>
|
||||
class ReturnRoundRobinAction {
|
||||
public:
|
||||
explicit ReturnRoundRobinAction(std::vector<T> values) {
|
||||
GTEST_CHECK_(!values.empty())
|
||||
<< "ReturnRoundRobin requires at least one element.";
|
||||
state_->values = std::move(values);
|
||||
}
|
||||
|
||||
template <typename... Args>
|
||||
T operator()(Args&&...) const {
|
||||
return state_->Next();
|
||||
}
|
||||
|
||||
private:
|
||||
struct State {
|
||||
T Next() {
|
||||
T ret_val = values[i++];
|
||||
if (i == values.size()) i = 0;
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
std::vector<T> values;
|
||||
size_t i = 0;
|
||||
};
|
||||
std::shared_ptr<State> state_ = std::make_shared<State>();
|
||||
};
|
||||
|
||||
// Implements the polymorphic DoDefault() action.
|
||||
class DoDefaultAction {
|
||||
public:
|
||||
@@ -1039,6 +1069,23 @@ internal::ByMoveWrapper<R> ByMove(R x) {
|
||||
return internal::ByMoveWrapper<R>(std::move(x));
|
||||
}
|
||||
|
||||
// Creates an action that returns an element of `vals`. Calling this action will
|
||||
// repeatedly return the next value from `vals` until it reaches the end and
|
||||
// will restart from the beginning.
|
||||
template <typename T>
|
||||
internal::ReturnRoundRobinAction<T> ReturnRoundRobin(std::vector<T> vals) {
|
||||
return internal::ReturnRoundRobinAction<T>(std::move(vals));
|
||||
}
|
||||
|
||||
// Creates an action that returns an element of `vals`. Calling this action will
|
||||
// repeatedly return the next value from `vals` until it reaches the end and
|
||||
// will restart from the beginning.
|
||||
template <typename T>
|
||||
internal::ReturnRoundRobinAction<T> ReturnRoundRobin(
|
||||
std::initializer_list<T> vals) {
|
||||
return internal::ReturnRoundRobinAction<T>(std::vector<T>(vals));
|
||||
}
|
||||
|
||||
// Creates an action that does the default action for the give mock function.
|
||||
inline internal::DoDefaultAction DoDefault() {
|
||||
return internal::DoDefaultAction();
|
||||
|
||||
Reference in New Issue
Block a user