12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef MEDIA_BASE_GMOCK_CALLBACK_SUPPORT_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MEDIA_BASE_GMOCK_CALLBACK_SUPPORT_H_
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace media {
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Matchers for base::Callback and base::Closure.
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MATCHER(IsNullCallback, "a null callback") {
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return (arg.is_null());
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MATCHER(IsNotNullCallback, "a non-null callback") {
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return (!arg.is_null());
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The RunClosure<N>() action invokes Run() method on the N-th (0-based)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// argument of the mock function.
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ACTION_TEMPLATE(RunClosure,
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                HAS_1_TEMPLATE_PARAMS(int, k),
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                AND_0_VALUE_PARAMS()) {
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ::std::tr1::get<k>(args).Run();
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Various overloads for RunCallback<N>().
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The RunCallback<N>(p1, p2, ..., p_k) action invokes Run() method on the N-th
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// (0-based) argument of the mock function, with arguments p1, p2, ..., p_k.
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Notes:
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//   1. The arguments are passed by value by default.  If you need to
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//   pass an argument by reference, wrap it inside ByRef().  For example,
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//     RunCallback<1>(5, string("Hello"), ByRef(foo))
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//   passes 5 and string("Hello") by value, and passes foo by reference.
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//   2. If the callback takes an argument by reference but ByRef() is
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//   not used, it will receive the reference to a copy of the value,
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//   instead of the original value.  For example, when the 0-th
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//   argument of the callback takes a const string&, the action
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//     RunCallback<0>(string("Hello"))
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//   makes a copy of the temporary string("Hello") object and passes a
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//   reference of the copy, instead of the original temporary object,
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//   to the callback.  This makes it easy for a user to define an
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//   RunCallback action from temporary values and have it performed later.
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ACTION_TEMPLATE(RunCallback,
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                HAS_1_TEMPLATE_PARAMS(int, k),
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                AND_0_VALUE_PARAMS()) {
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return ::std::tr1::get<k>(args).Run();
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ACTION_TEMPLATE(RunCallback,
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                HAS_1_TEMPLATE_PARAMS(int, k),
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                AND_1_VALUE_PARAMS(p0)) {
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return ::std::tr1::get<k>(args).Run(p0);
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ACTION_TEMPLATE(RunCallback,
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                HAS_1_TEMPLATE_PARAMS(int, k),
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                AND_2_VALUE_PARAMS(p0, p1)) {
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return ::std::tr1::get<k>(args).Run(p0, p1);
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ACTION_TEMPLATE(RunCallback,
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                HAS_1_TEMPLATE_PARAMS(int, k),
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                AND_3_VALUE_PARAMS(p0, p1, p2)) {
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return ::std::tr1::get<k>(args).Run(p0, p1, p2);
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ACTION_TEMPLATE(RunCallback,
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                HAS_1_TEMPLATE_PARAMS(int, k),
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                AND_4_VALUE_PARAMS(p0, p1, p2, p3)) {
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return ::std::tr1::get<k>(args).Run(p0, p1, p2, p3);
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ACTION_TEMPLATE(RunCallback,
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                HAS_1_TEMPLATE_PARAMS(int, k),
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)) {
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return ::std::tr1::get<k>(args).Run(p0, p1, p2, p3, p4);
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ACTION_TEMPLATE(RunCallback,
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                HAS_1_TEMPLATE_PARAMS(int, k),
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)) {
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return ::std::tr1::get<k>(args).Run(p0, p1, p2, p3, p4, p5);
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ACTION_TEMPLATE(RunCallback,
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                HAS_1_TEMPLATE_PARAMS(int, k),
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)) {
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return ::std::tr1::get<k>(args).Run(p0, p1, p2, p3, p4, p5, p6);
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace media
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // MEDIA_BASE_GMOCK_CALLBACK_SUPPORT_H_
108