147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/*
247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *
447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  Use of this source code is governed by a BSD-style license
547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  that can be found in the LICENSE file in the root of the source
647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  tree. An additional intellectual property rights grant can be found
747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  in the file PATENTS.  All contributing project authors may
847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org */
1047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/bind.h"
1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/gunit.h"
1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgnamespace rtc {
1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgnamespace {
1747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgstruct MethodBindTester {
1947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  void NullaryVoid() { ++call_count; }
2047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  int NullaryInt() { ++call_count; return 1; }
2147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  int NullaryConst() const { ++call_count; return 2; }
2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  void UnaryVoid(int dummy) { ++call_count; }
2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  template <class T> T Identity(T value) { ++call_count; return value; }
2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  int UnaryByRef(int& value) const { ++call_count; return ++value; }  // NOLINT
2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  int Multiply(int a, int b) const { ++call_count; return a * b; }
2647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  mutable int call_count;
2747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org};
2847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
2947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgint Return42() { return 42; }
3047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgint Negate(int a) { return -a; }
3147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgint Multiply(int a, int b) { return a * b; }
3247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
3347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}  // namespace
3447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
3547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(BindTest, BindToMethod) {
3647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  MethodBindTester object = {0};
3747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(0, object.call_count);
3847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Bind(&MethodBindTester::NullaryVoid, &object)();
3947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(1, object.call_count);
4047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(1, Bind(&MethodBindTester::NullaryInt, &object)());
4147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(2, object.call_count);
4247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(2, Bind(&MethodBindTester::NullaryConst,
4347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                    static_cast<const MethodBindTester*>(&object))());
4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(3, object.call_count);
4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Bind(&MethodBindTester::UnaryVoid, &object, 5)();
4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(4, object.call_count);
4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(100, Bind(&MethodBindTester::Identity<int>, &object, 100)());
4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(5, object.call_count);
4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  const std::string string_value("test string");
5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(string_value, Bind(&MethodBindTester::Identity<std::string>,
5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                               &object, string_value)());
5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(6, object.call_count);
5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  int value = 11;
5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(12, Bind(&MethodBindTester::UnaryByRef, &object, value)());
5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(12, value);
5647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(7, object.call_count);
5747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(56, Bind(&MethodBindTester::Multiply, &object, 7, 8)());
5847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(8, object.call_count);
5947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
6047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
6147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(BindTest, BindToFunction) {
6247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(42, Bind(&Return42)());
6347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(3, Bind(&Negate, -3)());
6447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(56, Bind(&Multiply, 8, 7)());
6547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
6647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
6747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}  // namespace rtc
68