Chromium Code Reviews| Index: base/containers/scoped_ptr_hash_map_unittest.cc |
| diff --git a/base/containers/scoped_ptr_hash_map_unittest.cc b/base/containers/scoped_ptr_hash_map_unittest.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..da0107ad973caa991c4a6c2aa92deb98edee74f3 |
| --- /dev/null |
| +++ b/base/containers/scoped_ptr_hash_map_unittest.cc |
| @@ -0,0 +1,79 @@ |
| +// Copyright 2015 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "base/containers/scoped_ptr_hash_map.h" |
| + |
| +#include "base/memory/scoped_ptr.h" |
| +#include "testing/gtest/include/gtest/gtest.h" |
| + |
| +namespace base { |
| + |
|
danakj
2015/04/24 17:22:04
can you wrap everything inside this namespace with
kcwu
2015/04/27 13:28:03
Done.
base::DefaultDeleter have to be specialized
danakj
2015/04/27 16:50:09
I meant wrap it all like:
namespace base {
namesp
kcwu
2015/04/27 17:48:17
Done.
That doesn't work for DefaultDeleter (compil
|
| +struct DeleteCounter { |
| + public: |
| + DeleteCounter() {} |
| + ~DeleteCounter() { g_delete_count++; } |
| + |
| + static void ResetCounter() { g_delete_count = 0; } |
| + static int delete_count() { return g_delete_count; } |
| + |
| + private: |
| + static int g_delete_count; |
| +}; |
| + |
| +template <> |
| +struct DefaultDeleter<DeleteCounter> { |
| + public: |
| + inline void operator()(DeleteCounter* ptr) const { |
| + g_count++; |
| + delete ptr; |
| + } |
| + |
| + static int count() { return g_count; } |
| + static void ResetCounter() { g_count = 0; } |
| + |
| + private: |
| + static int g_count; |
|
danakj
2015/04/24 17:22:04
g_deleter_call_count?
kcwu
2015/04/27 13:28:03
Done.
|
| +}; |
| + |
| +int DeleteCounter::g_delete_count = 0; |
| +int DefaultDeleter<DeleteCounter>::g_count = 0; |
| + |
| +} // namespace |
|
danakj
2015/04/24 17:22:04
this isn't closing an anonymous namespace. i think
kcwu
2015/04/27 13:28:03
Done.
|
| + |
| +TEST(ScopedPtrHashMapTest, CustomDeleter) { |
| + int key = 123; |
| + base::DeleteCounter::ResetCounter(); |
| + base::DefaultDeleter<base::DeleteCounter>::ResetCounter(); |
| + { |
| + base::ScopedPtrHashMap<int, scoped_ptr<base::DeleteCounter>> map; |
| + map.set(key, scoped_ptr<base::DeleteCounter>(new base::DeleteCounter)); |
| + } |
| + EXPECT_EQ(1, base::DeleteCounter::delete_count()); |
| + EXPECT_EQ(1, base::DefaultDeleter<base::DeleteCounter>::count()); |
| + |
| + base::DeleteCounter::ResetCounter(); |
| + base::DefaultDeleter<base::DeleteCounter>::ResetCounter(); |
| + { |
| + base::ScopedPtrHashMap<int, scoped_ptr<base::DeleteCounter>> map; |
| + map.erase( |
| + map.set(key, scoped_ptr<base::DeleteCounter>(new base::DeleteCounter))); |
| + EXPECT_EQ(1, base::DeleteCounter::delete_count()); |
| + EXPECT_EQ(1, base::DefaultDeleter<base::DeleteCounter>::count()); |
| + } |
| + EXPECT_EQ(1, base::DeleteCounter::delete_count()); |
| + EXPECT_EQ(1, base::DefaultDeleter<base::DeleteCounter>::count()); |
| + |
| + base::DeleteCounter::ResetCounter(); |
| + base::DefaultDeleter<base::DeleteCounter>::ResetCounter(); |
| + { |
| + base::ScopedPtrHashMap<int, scoped_ptr<base::DeleteCounter>> map; |
| + map.set(key, scoped_ptr<base::DeleteCounter>(new base::DeleteCounter)); |
| + map.set(key, scoped_ptr<base::DeleteCounter>(new base::DeleteCounter)); |
| + map.set(key, scoped_ptr<base::DeleteCounter>(new base::DeleteCounter)); |
| + EXPECT_EQ(2, base::DeleteCounter::delete_count()); |
| + EXPECT_EQ(2, base::DefaultDeleter<base::DeleteCounter>::count()); |
| + } |
| + EXPECT_EQ(3, base::DeleteCounter::delete_count()); |
| + EXPECT_EQ(3, base::DefaultDeleter<base::DeleteCounter>::count()); |
| +} |
|
danakj
2015/04/24 17:22:04
can you test erase() too?
kcwu
2015/04/27 13:28:03
It is already tested in the second block.
|