chromium/base/test/bind.h

// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef BASE_TEST_BIND_H_
#define BASE_TEST_BIND_H_

#include <string_view>
#include <type_traits>
#include <utility>

#include "base/functional/bind.h"

namespace base {

class Location;

namespace internal {

kHasConstCallOperator;
kHasConstCallOperator;

// Implementation of `BindLambdaForTesting()`, which checks preconditions before
// handing off to `Bind{Once,Repeating}()`.
template <typename Lambda,
          typename = ExtractCallableRunType<std::decay_t<Lambda>>>
struct BindLambdaForTestingHelper;

BindLambdaForTestingHelper<Lambda, R (Args...)>;

}  // namespace internal

// A variant of `Bind{Once,Repeating}()` that can bind capturing lambdas for
// testing. This doesn't support extra arguments binding as the lambda itself
// can do.
template <typename Lambda>
auto BindLambdaForTesting(Lambda&& lambda) {}

// Returns a closure that fails on destruction if it hasn't been run.
OnceClosure MakeExpectedRunClosure(
    const Location& location,
    std::string_view message = std::string_view());
RepeatingClosure MakeExpectedRunAtLeastOnceClosure(
    const Location& location,
    std::string_view message = std::string_view());

// Returns a closure that fails the test if run.
RepeatingClosure MakeExpectedNotRunClosure(
    const Location& location,
    std::string_view message = std::string_view());

}  // namespace base

#endif  // BASE_TEST_BIND_H_