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