summaryrefslogtreecommitdiffstats
path: root/base/callback_unittest.cc
diff options
context:
space:
mode:
authorajwong@chromium.org <ajwong@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-12-20 00:10:04 +0000
committerajwong@chromium.org <ajwong@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-12-20 00:10:04 +0000
commite24f876c537646cab5a9e8492658f570ccd7da4a (patch)
tree85aa283d18c10b47f1e3acbafce3283661407477 /base/callback_unittest.cc
parentb538d7ea0b2484074dea680d60f7f68750d1d1e3 (diff)
downloadchromium_src-e24f876c537646cab5a9e8492658f570ccd7da4a.zip
chromium_src-e24f876c537646cab5a9e8492658f570ccd7da4a.tar.gz
chromium_src-e24f876c537646cab5a9e8492658f570ccd7da4a.tar.bz2
Retry 114494 - Remove BindStateHolder and have Bind() return a Callback<> object directly."
This removes some complexity and also fixes a bug where if you call Bind() with the result of Bind(), the resulting Callback would only be valid during the first call. Ouch. Also makes the static type checking a bit more strict when assigning into a Callback<>. BUG=none TEST=new unittests Review URL: http://codereview.chromium.org/8915024 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@115045 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/callback_unittest.cc')
-rw-r--r--base/callback_unittest.cc36
1 files changed, 29 insertions, 7 deletions
diff --git a/base/callback_unittest.cc b/base/callback_unittest.cc
index 8527e70..e42b933 100644
--- a/base/callback_unittest.cc
+++ b/base/callback_unittest.cc
@@ -9,6 +9,7 @@
#include "testing/gtest/include/gtest/gtest.h"
namespace base {
+
namespace {
class HelperObject {
@@ -26,18 +27,40 @@ struct FakeInvoker {
static void Run(internal::BindStateBase*) {
}
};
+} // namespace
+
+namespace internal {
+template <typename Runnable, typename RunType, typename BoundArgsType>
+struct BindState;
// White-box testpoints to inject into a Callback<> object for checking
-// comparators and emptiness APIs.
-class FakeBindState1 : public internal::BindStateBase {
+// comparators and emptiness APIs. Use a BindState that is specialized
+// based on a type we declared in the anonymous namespace above to remove any
+// chance of colliding with another instantiation and breaking the
+// one-definition-rule.
+template <>
+struct BindState<void(void), void(void), void(FakeInvoker)>
+ : public BindStateBase {
public:
typedef FakeInvoker InvokerType;
};
-class FakeBindState2 : public internal::BindStateBase {
+template <>
+struct BindState<void(void), void(void),
+ void(FakeInvoker, FakeInvoker)>
+ : public BindStateBase {
public:
typedef FakeInvoker InvokerType;
};
+} // namespace internal
+
+namespace {
+
+typedef internal::BindState<void(void), void(void), void(FakeInvoker)>
+ FakeBindState1;
+typedef internal::BindState<void(void), void(void),
+ void(FakeInvoker, FakeInvoker)>
+ FakeBindState2;
TEST(CallbackOld, OneArg) {
HelperObject obj;
@@ -60,8 +83,8 @@ TEST(CallbackOld, ReturnValue) {
class CallbackTest : public ::testing::Test {
public:
CallbackTest()
- : callback_a_(MakeBindStateHolder(new FakeBindState1())),
- callback_b_(MakeBindStateHolder(new FakeBindState2())) {
+ : callback_a_(new FakeBindState1()),
+ callback_b_(new FakeBindState2()) {
}
virtual ~CallbackTest() {
@@ -105,8 +128,7 @@ TEST_F(CallbackTest, Equals) {
EXPECT_FALSE(callback_b_.Equals(callback_a_));
// We should compare based on instance, not type.
- Callback<void(void)> callback_c(
- MakeBindStateHolder(new FakeBindState1()));
+ Callback<void(void)> callback_c(new FakeBindState1());
Callback<void(void)> callback_a2 = callback_a_;
EXPECT_TRUE(callback_a_.Equals(callback_a2));
EXPECT_FALSE(callback_a_.Equals(callback_c));