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 #import "base/mac/bind_objc_block.h" 6 7 #include <string> 8 9 #include "base/callback.h" 10 #include "base/bind.h" 11 #include "base/callback_helpers.h" 12 #include "testing/gtest/include/gtest/gtest.h" 13 14 namespace { 15 16 TEST(BindObjcBlockTest, TestScopedClosureRunnerExitScope) { 17 int run_count = 0; 18 int* ptr = &run_count; 19 { 20 base::ScopedClosureRunner runner(base::BindBlock(^{ 21 (*ptr)++; 22 })); 23 EXPECT_EQ(0, run_count); 24 } 25 EXPECT_EQ(1, run_count); 26 } 27 28 TEST(BindObjcBlockTest, TestScopedClosureRunnerRelease) { 29 int run_count = 0; 30 int* ptr = &run_count; 31 base::Closure c; 32 { 33 base::ScopedClosureRunner runner(base::BindBlock(^{ 34 (*ptr)++; 35 })); 36 c = runner.Release(); 37 EXPECT_EQ(0, run_count); 38 } 39 EXPECT_EQ(0, run_count); 40 c.Run(); 41 EXPECT_EQ(1, run_count); 42 } 43 44 TEST(BindObjcBlockTest, TestReturnValue) { 45 const int kReturnValue = 42; 46 base::Callback<int(void)> c = base::BindBlock(^{return kReturnValue;}); 47 EXPECT_EQ(kReturnValue, c.Run()); 48 } 49 50 TEST(BindObjcBlockTest, TestArgument) { 51 const int kArgument = 42; 52 base::Callback<int(int)> c = base::BindBlock(^(int a){return a + 1;}); 53 EXPECT_EQ(kArgument + 1, c.Run(kArgument)); 54 } 55 56 TEST(BindObjcBlockTest, TestTwoArguments) { 57 std::string result; 58 std::string* ptr = &result; 59 base::Callback<void(const std::string&, const std::string&)> c = 60 base::BindBlock(^(const std::string& a, const std::string& b) { 61 *ptr = a + b; 62 }); 63 c.Run("forty", "two"); 64 EXPECT_EQ(result, "fortytwo"); 65 } 66 67 } // namespace 68