1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef MEDIA_BASE_GMOCK_CALLBACK_SUPPORT_H_
6#define MEDIA_BASE_GMOCK_CALLBACK_SUPPORT_H_
7
8#include "testing/gmock/include/gmock/gmock.h"
9
10namespace media {
11
12// Matchers for base::Callback and base::Closure.
13
14MATCHER(IsNullCallback, "a null callback") {
15  return (arg.is_null());
16}
17
18MATCHER(IsNotNullCallback, "a non-null callback") {
19  return (!arg.is_null());
20}
21
22// The RunClosure<N>() action invokes Run() method on the N-th (0-based)
23// argument of the mock function.
24
25ACTION_TEMPLATE(RunClosure,
26                HAS_1_TEMPLATE_PARAMS(int, k),
27                AND_0_VALUE_PARAMS()) {
28  ::std::tr1::get<k>(args).Run();
29}
30
31// Various overloads for RunCallback<N>().
32//
33// The RunCallback<N>(p1, p2, ..., p_k) action invokes Run() method on the N-th
34// (0-based) argument of the mock function, with arguments p1, p2, ..., p_k.
35//
36// Notes:
37//
38//   1. The arguments are passed by value by default.  If you need to
39//   pass an argument by reference, wrap it inside ByRef().  For example,
40//
41//     RunCallback<1>(5, string("Hello"), ByRef(foo))
42//
43//   passes 5 and string("Hello") by value, and passes foo by reference.
44//
45//   2. If the callback takes an argument by reference but ByRef() is
46//   not used, it will receive the reference to a copy of the value,
47//   instead of the original value.  For example, when the 0-th
48//   argument of the callback takes a const string&, the action
49//
50//     RunCallback<0>(string("Hello"))
51//
52//   makes a copy of the temporary string("Hello") object and passes a
53//   reference of the copy, instead of the original temporary object,
54//   to the callback.  This makes it easy for a user to define an
55//   RunCallback action from temporary values and have it performed later.
56
57ACTION_TEMPLATE(RunCallback,
58                HAS_1_TEMPLATE_PARAMS(int, k),
59                AND_0_VALUE_PARAMS()) {
60  return ::std::tr1::get<k>(args).Run();
61}
62
63ACTION_TEMPLATE(RunCallback,
64                HAS_1_TEMPLATE_PARAMS(int, k),
65                AND_1_VALUE_PARAMS(p0)) {
66  return ::std::tr1::get<k>(args).Run(p0);
67}
68
69ACTION_TEMPLATE(RunCallback,
70                HAS_1_TEMPLATE_PARAMS(int, k),
71                AND_2_VALUE_PARAMS(p0, p1)) {
72  return ::std::tr1::get<k>(args).Run(p0, p1);
73}
74
75ACTION_TEMPLATE(RunCallback,
76                HAS_1_TEMPLATE_PARAMS(int, k),
77                AND_3_VALUE_PARAMS(p0, p1, p2)) {
78  return ::std::tr1::get<k>(args).Run(p0, p1, p2);
79}
80
81ACTION_TEMPLATE(RunCallback,
82                HAS_1_TEMPLATE_PARAMS(int, k),
83                AND_4_VALUE_PARAMS(p0, p1, p2, p3)) {
84  return ::std::tr1::get<k>(args).Run(p0, p1, p2, p3);
85}
86
87ACTION_TEMPLATE(RunCallback,
88                HAS_1_TEMPLATE_PARAMS(int, k),
89                AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)) {
90  return ::std::tr1::get<k>(args).Run(p0, p1, p2, p3, p4);
91}
92
93ACTION_TEMPLATE(RunCallback,
94                HAS_1_TEMPLATE_PARAMS(int, k),
95                AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)) {
96  return ::std::tr1::get<k>(args).Run(p0, p1, p2, p3, p4, p5);
97}
98
99ACTION_TEMPLATE(RunCallback,
100                HAS_1_TEMPLATE_PARAMS(int, k),
101                AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)) {
102  return ::std::tr1::get<k>(args).Run(p0, p1, p2, p3, p4, p5, p6);
103}
104
105}  // namespace media
106
107#endif  // MEDIA_BASE_GMOCK_CALLBACK_SUPPORT_H_
108