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