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