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