pref_member_unittest.cc revision 3345a6884c488ff3a535c2c9acdd33d74b37e311
1// Copyright (c) 2010 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#include "chrome/browser/prefs/dummy_pref_store.h" 6#include "chrome/browser/prefs/pref_member.h" 7#include "chrome/browser/prefs/pref_value_store.h" 8#include "chrome/common/notification_service.h" 9#include "chrome/test/testing_pref_service.h" 10#include "testing/gtest/include/gtest/gtest.h" 11 12namespace { 13 14static const char kBoolPref[] = "bool"; 15static const char kIntPref[] = "int"; 16static const char kRealPref[] = "real"; 17static const char kStringPref[] = "string"; 18 19void RegisterTestPrefs(PrefService* prefs) { 20 prefs->RegisterBooleanPref(kBoolPref, false); 21 prefs->RegisterIntegerPref(kIntPref, 0); 22 prefs->RegisterRealPref(kRealPref, 0.0); 23 prefs->RegisterStringPref(kStringPref, "default"); 24} 25 26class PrefMemberTestClass : public NotificationObserver { 27 public: 28 explicit PrefMemberTestClass(PrefService* prefs) 29 : observe_cnt_(0), prefs_(prefs) { 30 str_.Init(kStringPref, prefs, this); 31 } 32 33 virtual void Observe(NotificationType type, 34 const NotificationSource& source, 35 const NotificationDetails& details) { 36 DCHECK(NotificationType::PREF_CHANGED == type); 37 PrefService* prefs_in = Source<PrefService>(source).ptr(); 38 EXPECT_EQ(prefs_in, prefs_); 39 std::string* pref_name_in = Details<std::string>(details).ptr(); 40 EXPECT_EQ(*pref_name_in, kStringPref); 41 EXPECT_EQ(str_.GetValue(), prefs_->GetString(kStringPref)); 42 ++observe_cnt_; 43 } 44 45 StringPrefMember str_; 46 int observe_cnt_; 47 48 private: 49 PrefService* prefs_; 50}; 51 52} // anonymous namespace 53 54TEST(PrefMemberTest, BasicGetAndSet) { 55 TestingPrefService prefs; 56 RegisterTestPrefs(&prefs); 57 58 // Test bool 59 BooleanPrefMember boolean; 60 boolean.Init(kBoolPref, &prefs, NULL); 61 62 // Check the defaults 63 EXPECT_FALSE(prefs.GetBoolean(kBoolPref)); 64 EXPECT_FALSE(boolean.GetValue()); 65 EXPECT_FALSE(*boolean); 66 67 // Try changing through the member variable. 68 boolean.SetValue(true); 69 EXPECT_TRUE(boolean.GetValue()); 70 EXPECT_TRUE(prefs.GetBoolean(kBoolPref)); 71 EXPECT_TRUE(*boolean); 72 73 // Try changing back through the pref. 74 prefs.SetBoolean(kBoolPref, false); 75 EXPECT_FALSE(prefs.GetBoolean(kBoolPref)); 76 EXPECT_FALSE(boolean.GetValue()); 77 EXPECT_FALSE(*boolean); 78 79 // Test int 80 IntegerPrefMember integer; 81 integer.Init(kIntPref, &prefs, NULL); 82 83 // Check the defaults 84 EXPECT_EQ(0, prefs.GetInteger(kIntPref)); 85 EXPECT_EQ(0, integer.GetValue()); 86 EXPECT_EQ(0, *integer); 87 88 // Try changing through the member variable. 89 integer.SetValue(5); 90 EXPECT_EQ(5, integer.GetValue()); 91 EXPECT_EQ(5, prefs.GetInteger(kIntPref)); 92 EXPECT_EQ(5, *integer); 93 94 // Try changing back through the pref. 95 prefs.SetInteger(kIntPref, 2); 96 EXPECT_EQ(2, prefs.GetInteger(kIntPref)); 97 EXPECT_EQ(2, integer.GetValue()); 98 EXPECT_EQ(2, *integer); 99 100 // Test real (double) 101 RealPrefMember real; 102 real.Init(kRealPref, &prefs, NULL); 103 104 // Check the defaults 105 EXPECT_EQ(0.0, prefs.GetReal(kRealPref)); 106 EXPECT_EQ(0.0, real.GetValue()); 107 EXPECT_EQ(0.0, *real); 108 109 // Try changing through the member variable. 110 real.SetValue(1.0); 111 EXPECT_EQ(1.0, real.GetValue()); 112 EXPECT_EQ(1.0, prefs.GetReal(kRealPref)); 113 EXPECT_EQ(1.0, *real); 114 115 // Try changing back through the pref. 116 prefs.SetReal(kRealPref, 3.0); 117 EXPECT_EQ(3.0, prefs.GetReal(kRealPref)); 118 EXPECT_EQ(3.0, real.GetValue()); 119 EXPECT_EQ(3.0, *real); 120 121 // Test string 122 StringPrefMember string; 123 string.Init(kStringPref, &prefs, NULL); 124 125 // Check the defaults 126 EXPECT_EQ("default", prefs.GetString(kStringPref)); 127 EXPECT_EQ("default", string.GetValue()); 128 EXPECT_EQ("default", *string); 129 130 // Try changing through the member variable. 131 string.SetValue("foo"); 132 EXPECT_EQ("foo", string.GetValue()); 133 EXPECT_EQ("foo", prefs.GetString(kStringPref)); 134 EXPECT_EQ("foo", *string); 135 136 // Try changing back through the pref. 137 prefs.SetString(kStringPref, "bar"); 138 EXPECT_EQ("bar", prefs.GetString(kStringPref)); 139 EXPECT_EQ("bar", string.GetValue()); 140 EXPECT_EQ("bar", *string); 141} 142 143TEST(PrefMemberTest, TwoPrefs) { 144 // Make sure two RealPrefMembers stay in sync. 145 TestingPrefService prefs; 146 RegisterTestPrefs(&prefs); 147 148 RealPrefMember pref1; 149 pref1.Init(kRealPref, &prefs, NULL); 150 RealPrefMember pref2; 151 pref2.Init(kRealPref, &prefs, NULL); 152 153 pref1.SetValue(2.3); 154 EXPECT_EQ(2.3, *pref2); 155 156 pref2.SetValue(3.5); 157 EXPECT_EQ(3.5, *pref1); 158 159 prefs.SetReal(kRealPref, 4.2); 160 EXPECT_EQ(4.2, *pref1); 161 EXPECT_EQ(4.2, *pref2); 162} 163 164TEST(PrefMemberTest, Observer) { 165 TestingPrefService prefs; 166 RegisterTestPrefs(&prefs); 167 168 PrefMemberTestClass test_obj(&prefs); 169 EXPECT_EQ("default", *test_obj.str_); 170 171 // Calling SetValue should not fire the observer. 172 test_obj.str_.SetValue("hello"); 173 EXPECT_EQ(0, test_obj.observe_cnt_); 174 EXPECT_EQ("hello", prefs.GetString(kStringPref)); 175 176 // Changing the pref does fire the observer. 177 prefs.SetString(kStringPref, "world"); 178 EXPECT_EQ(1, test_obj.observe_cnt_); 179 EXPECT_EQ("world", *(test_obj.str_)); 180 181 // Not changing the value should not fire the observer. 182 prefs.SetString(kStringPref, "world"); 183 EXPECT_EQ(1, test_obj.observe_cnt_); 184 EXPECT_EQ("world", *(test_obj.str_)); 185 186 prefs.SetString(kStringPref, "hello"); 187 EXPECT_EQ(2, test_obj.observe_cnt_); 188 EXPECT_EQ("hello", prefs.GetString(kStringPref)); 189} 190 191TEST(PrefMemberTest, NoInit) { 192 // Make sure not calling Init on a PrefMember doesn't cause problems. 193 IntegerPrefMember pref; 194} 195