Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(540)

Unified Diff: base/scoped_nullable_generic_unittest.cc

Issue 189613002: Add ScopedGeneric. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: removed bool Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« base/scoped_nullable_generic.h ('K') | « base/scoped_nullable_generic.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: base/scoped_nullable_generic_unittest.cc
diff --git a/base/scoped_nullable_generic_unittest.cc b/base/scoped_nullable_generic_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..977c6b1b1dcf572778b16502dbef5cc0aacb5ecc
--- /dev/null
+++ b/base/scoped_nullable_generic_unittest.cc
@@ -0,0 +1,157 @@
+// Copyright 2014 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 <vector>
+
+#include "base/scoped_nullable_generic.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace base {
+
+namespace {
+
+struct IntTraits {
+ IntTraits(std::vector<int>* freed) : freed_ints(freed) {}
+
+ static int NullValue() {
+ return -1;
+ }
+ void Free(int value) {
+ freed_ints->push_back(value);
+ }
+
+ std::vector<int>* freed_ints;
+};
+
+typedef ScopedNullableGeneric<int, IntTraits> ScopedInt;
+
+} // namespace
+
+TEST(ScopedGenericHandleTest, ScopedGenericHandle) {
+ std::vector<int> values_freed;
+ IntTraits traits(&values_freed);
+
+ // Null case, delete should not be called.
+ {
+ ScopedInt a(IntTraits::NullValue(), traits);
+ }
+ EXPECT_TRUE(values_freed.empty());
+
+ // Simple deleting case.
+ static const int kFirst = 0;
+ {
+ ScopedInt a(kFirst, traits);
+ }
+ ASSERT_EQ(1u, values_freed.size());
+ ASSERT_EQ(kFirst, values_freed[0]);
+ values_freed.clear();
+
+ // Release should return the right value and leave the object empty.
+ {
+ ScopedInt a(kFirst, traits);
+ EXPECT_EQ(kFirst, a.release());
+
+ ScopedInt b(IntTraits::NullValue(), traits);
+ EXPECT_EQ(IntTraits::NullValue(), b.release());
+ }
+ ASSERT_TRUE(values_freed.empty());
+
+ // Reset should free the old value, then the new one should go away when
+ // it goes out of scope.
+ static const int kSecond = 1;
+ {
+ ScopedInt b(kFirst, traits);
+ b.reset(kSecond);
+ ASSERT_EQ(1u, values_freed.size());
+ ASSERT_EQ(kFirst, values_freed[0]);
+ }
+ ASSERT_EQ(2u, values_freed.size());
+ ASSERT_EQ(kSecond, values_freed[1]);
+ values_freed.clear();
+
+ // Swap.
+ {
+ ScopedInt a(kFirst, traits);
+ ScopedInt b(kSecond, traits);
+ a.swap(b);
+ EXPECT_TRUE(values_freed.empty()); // Nothing should be freed.
+ EXPECT_EQ(kSecond, a.get());
+ EXPECT_EQ(kFirst, b.get());
+ }
+ // Values should be deleted in the opposite order.
+ ASSERT_EQ(2u, values_freed.size());
+ EXPECT_EQ(kFirst, values_freed[0]);
+ EXPECT_EQ(kSecond, values_freed[1]);
+ values_freed.clear();
+
+ // Pass.
+ {
+ ScopedInt a(kFirst, traits);
+ ScopedInt b(a.Pass());
+ EXPECT_TRUE(values_freed.empty()); // Nothing should be freed.
+ ASSERT_EQ(IntTraits::NullValue(), a.get());
+ ASSERT_EQ(kFirst, b.get());
+ }
+ ASSERT_EQ(1u, values_freed.size());
+ ASSERT_EQ(kFirst, values_freed[0]);
+}
+
+TEST(ScopedGenericHandleTest, Operators) {
+ std::vector<int> values_freed;
+ IntTraits traits(&values_freed);
+
+ static const int kFirst = 0;
+ static const int kSecond = 1;
+ {
+ ScopedInt a(kFirst, traits);
+ EXPECT_TRUE(a == kFirst);
+ EXPECT_FALSE(a != kFirst);
+ EXPECT_FALSE(a == kSecond);
+ EXPECT_TRUE(a != kSecond);
+
+ EXPECT_TRUE(kFirst == a);
+ EXPECT_FALSE(kFirst != a);
+ EXPECT_FALSE(kSecond == a);
+ EXPECT_TRUE(kSecond != a);
+ }
+
+ // Testable.
viettrungluu 2014/03/10 17:35:56 This comment no longer really makes sense.
+ {
+ ScopedInt a(kFirst, traits);
+ if (!a.is_valid()) {
viettrungluu 2014/03/10 17:35:56 Probably just EXPECT_TRUE(a.is_valid()); (etc., be
+ EXPECT_FALSE(true);
+ }
+ a.reset();
+ if (a.is_valid()) {
+ EXPECT_FALSE(true);
+ }
+ }
+}
+
+// Cheesy manual "no compile" test for manually validating changes.
+#if 0
+TEST(ScopedGenericHandleTest, NoCompile) {
+ // Assignment shouldn't work.
+ /*{
+ ScopedInt a(kFirst, traits);
+ ScopedInt b(a);
+ }*/
+
+ // Comparison shouldn't work.
+ /*{
+ ScopedInt a(kFirst, traits);
+ ScopedInt b(kFirst, traits);
+ if (a == b) {
+ }
+ }*/
+
+ // Implicit conversion to bool shouldn't work.
+ /*{
+ ScopedInt a(kFirst, traits);
+ bool result = a;
+ }*/
+}
+#endif
+
+} // namespace base
« base/scoped_nullable_generic.h ('K') | « base/scoped_nullable_generic.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698