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
14namespace {
15
16TEST(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
28TEST(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
44TEST(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
50TEST(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
56TEST(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