1 // Copyright 2014 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 "components/dom_distiller/core/distilled_page_prefs.h"
6 
7 #include "base/run_loop.h"
8 #include "base/test/task_environment.h"
9 #include "components/sync_preferences/testing_pref_service_syncable.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11 
12 namespace dom_distiller {
13 
14 namespace {
15 
16 class TestingObserver : public DistilledPagePrefs::Observer {
17  public:
TestingObserver()18   TestingObserver()
19       : font_(mojom::FontFamily::kSansSerif),
20         theme_(mojom::Theme::kLight),
21         scaling_(1.0f) {}
22 
OnChangeFontFamily(mojom::FontFamily new_font)23   void OnChangeFontFamily(mojom::FontFamily new_font) override {
24     font_ = new_font;
25   }
26 
GetFontFamily()27   mojom::FontFamily GetFontFamily() { return font_; }
28 
OnChangeTheme(mojom::Theme new_theme)29   void OnChangeTheme(mojom::Theme new_theme) override { theme_ = new_theme; }
30 
GetTheme()31   mojom::Theme GetTheme() { return theme_; }
32 
OnChangeFontScaling(float new_scaling)33   void OnChangeFontScaling(float new_scaling) override {
34     scaling_ = new_scaling;
35   }
36 
GetFontScaling()37   float GetFontScaling() { return scaling_; }
38 
39  private:
40   mojom::FontFamily font_;
41   mojom::Theme theme_;
42   float scaling_;
43 };
44 
45 }  // namespace
46 
47 class DistilledPagePrefsTest : public testing::Test {
48  protected:
SetUp()49   void SetUp() override {
50     pref_service_.reset(new sync_preferences::TestingPrefServiceSyncable());
51     DistilledPagePrefs::RegisterProfilePrefs(pref_service_->registry());
52     distilled_page_prefs_.reset(new DistilledPagePrefs(pref_service_.get()));
53   }
54 
55   std::unique_ptr<sync_preferences::TestingPrefServiceSyncable> pref_service_;
56   std::unique_ptr<DistilledPagePrefs> distilled_page_prefs_;
57 
58  private:
59   base::test::SingleThreadTaskEnvironment task_environment_;
60 };
61 
TEST_F(DistilledPagePrefsTest,TestingOnChangeFontIsBeingCalled)62 TEST_F(DistilledPagePrefsTest, TestingOnChangeFontIsBeingCalled) {
63   TestingObserver obs;
64   distilled_page_prefs_->AddObserver(&obs);
65 
66   distilled_page_prefs_->SetFontFamily(mojom::FontFamily::kMonospace);
67   EXPECT_EQ(mojom::FontFamily::kSansSerif, obs.GetFontFamily());
68   base::RunLoop().RunUntilIdle();
69   EXPECT_EQ(mojom::FontFamily::kMonospace, obs.GetFontFamily());
70 
71   distilled_page_prefs_->SetFontFamily(mojom::FontFamily::kSerif);
72   base::RunLoop().RunUntilIdle();
73   EXPECT_EQ(mojom::FontFamily::kSerif, obs.GetFontFamily());
74   distilled_page_prefs_->RemoveObserver(&obs);
75 }
76 
TEST_F(DistilledPagePrefsTest,TestingMultipleObserversFont)77 TEST_F(DistilledPagePrefsTest, TestingMultipleObserversFont) {
78   TestingObserver obs;
79   distilled_page_prefs_->AddObserver(&obs);
80   TestingObserver obs2;
81   distilled_page_prefs_->AddObserver(&obs2);
82 
83   distilled_page_prefs_->SetFontFamily(mojom::FontFamily::kSerif);
84   base::RunLoop().RunUntilIdle();
85   EXPECT_EQ(mojom::FontFamily::kSerif, obs.GetFontFamily());
86   EXPECT_EQ(mojom::FontFamily::kSerif, obs2.GetFontFamily());
87 
88   distilled_page_prefs_->RemoveObserver(&obs);
89 
90   distilled_page_prefs_->SetFontFamily(mojom::FontFamily::kMonospace);
91   base::RunLoop().RunUntilIdle();
92   EXPECT_EQ(mojom::FontFamily::kSerif, obs.GetFontFamily());
93   EXPECT_EQ(mojom::FontFamily::kMonospace, obs2.GetFontFamily());
94 
95   distilled_page_prefs_->RemoveObserver(&obs2);
96 }
97 
TEST_F(DistilledPagePrefsTest,TestingOnChangeThemeIsBeingCalled)98 TEST_F(DistilledPagePrefsTest, TestingOnChangeThemeIsBeingCalled) {
99   TestingObserver obs;
100   distilled_page_prefs_->AddObserver(&obs);
101 
102   distilled_page_prefs_->SetTheme(mojom::Theme::kSepia);
103   EXPECT_EQ(mojom::Theme::kLight, obs.GetTheme());
104   base::RunLoop().RunUntilIdle();
105   EXPECT_EQ(mojom::Theme::kSepia, obs.GetTheme());
106 
107   distilled_page_prefs_->SetTheme(mojom::Theme::kDark);
108   base::RunLoop().RunUntilIdle();
109   EXPECT_EQ(mojom::Theme::kDark, obs.GetTheme());
110 
111   distilled_page_prefs_->RemoveObserver(&obs);
112 }
113 
TEST_F(DistilledPagePrefsTest,TestingMultipleObserversTheme)114 TEST_F(DistilledPagePrefsTest, TestingMultipleObserversTheme) {
115   TestingObserver obs;
116   distilled_page_prefs_->AddObserver(&obs);
117   TestingObserver obs2;
118   distilled_page_prefs_->AddObserver(&obs2);
119 
120   distilled_page_prefs_->SetTheme(mojom::Theme::kSepia);
121   base::RunLoop().RunUntilIdle();
122   EXPECT_EQ(mojom::Theme::kSepia, obs.GetTheme());
123   EXPECT_EQ(mojom::Theme::kSepia, obs2.GetTheme());
124 
125   distilled_page_prefs_->RemoveObserver(&obs);
126 
127   distilled_page_prefs_->SetTheme(mojom::Theme::kLight);
128   base::RunLoop().RunUntilIdle();
129   EXPECT_EQ(mojom::Theme::kSepia, obs.GetTheme());
130   EXPECT_EQ(mojom::Theme::kLight, obs2.GetTheme());
131 
132   distilled_page_prefs_->RemoveObserver(&obs2);
133 }
134 
TEST_F(DistilledPagePrefsTest,TestingOnChangeFontScalingIsBeingCalled)135 TEST_F(DistilledPagePrefsTest, TestingOnChangeFontScalingIsBeingCalled) {
136   TestingObserver obs;
137   distilled_page_prefs_->AddObserver(&obs);
138 
139   distilled_page_prefs_->SetFontScaling(1.5f);
140   ASSERT_FLOAT_EQ(1.0f, obs.GetFontScaling());
141   base::RunLoop().RunUntilIdle();
142   ASSERT_FLOAT_EQ(1.5f, obs.GetFontScaling());
143 
144   distilled_page_prefs_->SetFontScaling(0.7f);
145   base::RunLoop().RunUntilIdle();
146   ASSERT_FLOAT_EQ(0.7f, obs.GetFontScaling());
147 
148   distilled_page_prefs_->RemoveObserver(&obs);
149 }
150 
TEST_F(DistilledPagePrefsTest,TestingMultipleObserversFontScaling)151 TEST_F(DistilledPagePrefsTest, TestingMultipleObserversFontScaling) {
152   TestingObserver obs;
153   distilled_page_prefs_->AddObserver(&obs);
154   TestingObserver obs2;
155   distilled_page_prefs_->AddObserver(&obs2);
156 
157   distilled_page_prefs_->SetFontScaling(1.3f);
158   base::RunLoop().RunUntilIdle();
159   ASSERT_FLOAT_EQ(1.3f, obs.GetFontScaling());
160   ASSERT_FLOAT_EQ(1.3f, obs2.GetFontScaling());
161 
162   distilled_page_prefs_->RemoveObserver(&obs);
163 
164   distilled_page_prefs_->SetFontScaling(0.9f);
165   base::RunLoop().RunUntilIdle();
166   ASSERT_FLOAT_EQ(1.3f, obs.GetFontScaling());
167   ASSERT_FLOAT_EQ(0.9f, obs2.GetFontScaling());
168 
169   distilled_page_prefs_->RemoveObserver(&obs2);
170 }
171 
172 }  // namespace dom_distiller
173