1// Copyright (c) 2013 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 <algorithm>
6#include <vector>
7
8#include "base/memory/scoped_ptr.h"
9#include "chrome/browser/chromeos/login/screens/screen_context.h"
10#include "testing/gtest/include/gtest/gtest.h"
11
12namespace chromeos {
13
14class ScreenContextTest : public testing::Test {
15 public:
16  ScreenContextTest() {}
17  virtual ~ScreenContextTest() {}
18
19  virtual void SetUp() {
20    context_.reset(new ScreenContext());
21  }
22
23  virtual void TearDown() {
24  }
25
26 protected:
27  ScreenContext& context() { return *context_.get(); }
28
29 private:
30  scoped_ptr<ScreenContext> context_;
31};
32
33TEST_F(ScreenContextTest, Simple) {
34  ASSERT_FALSE(context().HasChanges());
35
36  ASSERT_FALSE(context().HasKey("key0"));
37
38  bool rv = context().SetBoolean("key0", true);
39  ASSERT_TRUE(rv);
40  ASSERT_TRUE(context().HasKey("key0"));
41  ASSERT_TRUE(context().GetBoolean("key0"));
42  ASSERT_TRUE(context().GetBoolean("key0", false));
43  ASSERT_TRUE(context().HasChanges());
44
45  rv = context().SetBoolean("key0", true);
46  ASSERT_FALSE(rv);
47
48  rv = context().SetBoolean("key0", false);
49  ASSERT_TRUE(rv);
50  ASSERT_TRUE(context().HasKey("key0"));
51  ASSERT_FALSE(context().GetBoolean("key0"));
52  ASSERT_FALSE(context().GetBoolean("key0", true));
53  ASSERT_TRUE(context().HasChanges());
54
55  ASSERT_FALSE(context().HasKey("key1"));
56
57  ASSERT_EQ(1, context().GetInteger("key1", 1));
58  rv = context().SetInteger("key1", 2);
59  ASSERT_TRUE(rv);
60  ASSERT_TRUE(context().HasKey("key1"));
61  ASSERT_EQ(2, context().GetInteger("key1"));
62  ASSERT_EQ(2, context().GetInteger("key1", 1));
63}
64
65TEST_F(ScreenContextTest, Changes) {
66  ASSERT_FALSE(context().HasChanges());
67
68  bool rv = context().SetInteger("key0", 2);
69  ASSERT_TRUE(rv);
70  ASSERT_EQ(2, context().GetInteger("key0"));
71  ASSERT_TRUE(context().HasChanges());
72
73  base::DictionaryValue changes;
74  context().GetChangesAndReset(&changes);
75  ASSERT_FALSE(context().HasChanges());
76
77  ASSERT_EQ(1u, changes.size());
78  int value;
79  rv = changes.GetInteger("key0", &value);
80  ASSERT_TRUE(rv);
81  ASSERT_EQ(2, value);
82
83  rv = context().SetInteger("key0", 3);
84  ASSERT_TRUE(rv);
85  ASSERT_EQ(3, context().GetInteger("key0", 3));
86  ASSERT_TRUE(context().HasChanges());
87
88  rv = context().SetInteger("key0", 2);
89  ASSERT_TRUE(rv);
90  ASSERT_TRUE(context().HasChanges());
91}
92
93TEST_F(ScreenContextTest, ComplexChanges) {
94  ASSERT_FALSE(context().HasChanges());
95
96  context().SetString("key0", "value0");
97  context().SetBoolean("key1", true);
98  context().SetDouble("key2", 3.14159);
99  ASSERT_TRUE(context().HasChanges());
100
101  // Get all changes and verify them.
102  base::DictionaryValue changes;
103  context().GetChangesAndReset(&changes);
104  ASSERT_FALSE(context().HasChanges());
105  ASSERT_EQ(3u, changes.size());
106
107  std::string string_value;
108  bool bool_value;
109  double double_value;
110  bool rv = changes.GetString("key0", &string_value);
111  ASSERT_TRUE(rv);
112  rv = changes.GetBoolean("key1", &bool_value);
113  ASSERT_TRUE(rv);
114  rv = changes.GetDouble("key2", &double_value);
115  ASSERT_TRUE(rv);
116  ASSERT_EQ("value0", string_value);
117  ASSERT_EQ(true, bool_value);
118  ASSERT_DOUBLE_EQ(3.14159, double_value);
119
120  context().SetString("key0", "value1");
121  ASSERT_TRUE(context().HasChanges());
122
123  context().SetString("key0", "value0");
124  ASSERT_TRUE(context().HasChanges());
125
126  context().GetChangesAndReset(&changes);
127  ASSERT_FALSE(context().HasChanges());
128  ASSERT_EQ(1u, changes.size());
129  rv = changes.GetString("key0", &string_value);
130  ASSERT_TRUE(rv);
131  ASSERT_EQ("value0", string_value);
132}
133
134TEST_F(ScreenContextTest, ApplyChanges) {
135  ASSERT_FALSE(context().HasChanges());
136
137  base::DictionaryValue changes;
138  changes.SetString("key0", "value0");
139  changes.SetInteger("key1", 1);
140  changes.SetBoolean("key2", true);
141
142  std::vector<std::string> keys;
143  context().ApplyChanges(changes, &keys);
144
145  ASSERT_EQ(3u, keys.size());
146  std::sort(keys.begin(), keys.end());
147  ASSERT_EQ("key0", keys[0]);
148  ASSERT_EQ("key1", keys[1]);
149  ASSERT_EQ("key2", keys[2]);
150
151  ASSERT_FALSE(context().HasChanges());
152  ASSERT_EQ("value0", context().GetString("key0"));
153  ASSERT_EQ(1, context().GetInteger("key1"));
154  ASSERT_TRUE(context().GetBoolean("key2"));
155}
156
157}  // namespace chromeos
158