1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- #ifndef BASE_TEST_BIND_TEST_UTIL_H_
- #define BASE_TEST_BIND_TEST_UTIL_H_
- #include <type_traits>
- #include <utility>
- #include "base/bind.h"
- #include "base/strings/string_piece.h"
- namespace base {
- class Location;
- namespace internal {
- template <typename Callable,
- typename Signature = decltype(&Callable::operator())>
- struct HasConstCallOperatorImpl : std::false_type {};
- template <typename Callable, typename R, typename... Args>
- struct HasConstCallOperatorImpl<Callable, R (Callable::*)(Args...) const>
- : std::true_type {};
- template <typename Callable>
- constexpr bool HasConstCallOperator =
- HasConstCallOperatorImpl<std::decay_t<Callable>>::value;
- template <typename F, typename Signature>
- struct BindLambdaHelper;
- template <typename F, typename R, typename... Args>
- struct BindLambdaHelper<F, R(Args...)> {
- static R Run(const std::decay_t<F>& f, Args... args) {
- return f(std::forward<Args>(args)...);
- }
- static R RunOnce(std::decay_t<F>&& f, Args... args) {
- return f(std::forward<Args>(args)...);
- }
- };
- }
- template <typename Lambda,
- std::enable_if_t<internal::HasConstCallOperator<Lambda>>* = nullptr>
- decltype(auto) BindLambdaForTesting(Lambda&& lambda) {
- using Signature = internal::ExtractCallableRunType<std::decay_t<Lambda>>;
- return BindRepeating(&internal::BindLambdaHelper<Lambda, Signature>::Run,
- std::forward<Lambda>(lambda));
- }
- template <typename Lambda,
- std::enable_if_t<!internal::HasConstCallOperator<Lambda>>* = nullptr>
- decltype(auto) BindLambdaForTesting(Lambda&& lambda) {
- static_assert(
- std::is_rvalue_reference<Lambda&&>() &&
- !std::is_const<std::remove_reference_t<Lambda>>(),
- "BindLambdaForTesting requires non-const rvalue for mutable lambda "
- "binding. I.e.: base::BindLambdaForTesting(std::move(lambda)).");
- using Signature = internal::ExtractCallableRunType<std::decay_t<Lambda>>;
- return BindOnce(&internal::BindLambdaHelper<Lambda, Signature>::RunOnce,
- std::move(lambda));
- }
- OnceClosure MakeExpectedRunClosure(const Location& location,
- StringPiece message = StringPiece());
- RepeatingClosure MakeExpectedRunAtLeastOnceClosure(
- const Location& location,
- StringPiece message = StringPiece());
- RepeatingClosure MakeExpectedNotRunClosure(const Location& location,
- StringPiece message = StringPiece());
- }
- #endif
|