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/translate/core/browser/language_state.h"
6
7 #include "base/memory/scoped_ptr.h"
8 #include "components/translate/core/browser/language_state.h"
9 #include "components/translate/core/browser/translate_driver.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11 #include "url/gurl.h"
12
13 namespace {
14
15 const std::string kHtmlMimeType = "text/html";
16
17 class MockTranslateDriver : public TranslateDriver {
18 public:
MockTranslateDriver()19 MockTranslateDriver()
20 : on_is_page_translated_changed_called_(false),
21 on_translate_enabled_changed_called_(false),
22 language_state_(this) {
23 }
24
Reset()25 void Reset() {
26 on_is_page_translated_changed_called_ = false;
27 on_translate_enabled_changed_called_ = false;
28 }
29
~MockTranslateDriver()30 virtual ~MockTranslateDriver() {}
31
OnIsPageTranslatedChanged()32 virtual void OnIsPageTranslatedChanged() OVERRIDE {
33 on_is_page_translated_changed_called_ = true;
34 }
35
OnTranslateEnabledChanged()36 virtual void OnTranslateEnabledChanged() OVERRIDE {
37 on_translate_enabled_changed_called_ = true;
38 }
39
IsLinkNavigation()40 virtual bool IsLinkNavigation() OVERRIDE {
41 return false;
42 }
43
TranslatePage(const std::string & translate_script,const std::string & source_lang,const std::string & target_lang)44 virtual void TranslatePage(const std::string& translate_script,
45 const std::string& source_lang,
46 const std::string& target_lang) OVERRIDE {}
47
RevertTranslation()48 virtual void RevertTranslation() OVERRIDE {}
49
IsOffTheRecord()50 virtual bool IsOffTheRecord() OVERRIDE { return false; }
51
GetContentsMimeType()52 virtual const std::string& GetContentsMimeType() OVERRIDE {
53 return kHtmlMimeType;
54 }
55
GetLastCommittedURL()56 virtual const GURL& GetLastCommittedURL() OVERRIDE {
57 return GURL::EmptyGURL();
58 }
59
GetActiveURL()60 virtual const GURL& GetActiveURL() OVERRIDE { return GURL::EmptyGURL(); }
61
GetVisibleURL()62 virtual const GURL& GetVisibleURL() OVERRIDE { return GURL::EmptyGURL(); }
63
HasCurrentPage()64 virtual bool HasCurrentPage() OVERRIDE { return true; }
65
GetCurrentPageID()66 virtual int GetCurrentPageID() OVERRIDE { return 0; }
67
OpenUrlInNewTab(const GURL & url)68 virtual void OpenUrlInNewTab(const GURL& url) OVERRIDE {}
69
on_is_page_translated_changed_called() const70 bool on_is_page_translated_changed_called() const {
71 return on_is_page_translated_changed_called_;
72 }
73
on_translate_enabled_changed_called() const74 bool on_translate_enabled_changed_called() const {
75 return on_translate_enabled_changed_called_;
76 }
77
78 private:
79 bool on_is_page_translated_changed_called_;
80 bool on_translate_enabled_changed_called_;
81 LanguageState language_state_;
82
83 DISALLOW_COPY_AND_ASSIGN(MockTranslateDriver);
84 };
85
86 } // namespace
87
TEST(LanguageStateTest,IsPageTranslated)88 TEST(LanguageStateTest, IsPageTranslated) {
89 scoped_ptr<MockTranslateDriver> driver(
90 new MockTranslateDriver);
91 LanguageState language_state(driver.get());
92 EXPECT_FALSE(language_state.IsPageTranslated());
93
94 // Navigate to a French page.
95 language_state.LanguageDetermined("fr", true);
96 EXPECT_EQ("fr", language_state.original_language());
97 EXPECT_EQ("fr", language_state.current_language());
98 EXPECT_FALSE(language_state.IsPageTranslated());
99
100 // Translate the page into English.
101 language_state.SetCurrentLanguage("en");
102 EXPECT_EQ("fr", language_state.original_language());
103 EXPECT_EQ("en", language_state.current_language());
104 EXPECT_TRUE(language_state.IsPageTranslated());
105
106 // Move on another page in Japanese.
107 language_state.LanguageDetermined("ja", true);
108 EXPECT_EQ("ja", language_state.original_language());
109 EXPECT_EQ("ja", language_state.current_language());
110 EXPECT_FALSE(language_state.IsPageTranslated());
111 }
112
TEST(LanguageStateTest,Driver)113 TEST(LanguageStateTest, Driver) {
114
115 scoped_ptr<MockTranslateDriver> driver(
116 new MockTranslateDriver);
117 LanguageState language_state(driver.get());
118
119 // Enable/Disable translate.
120 EXPECT_FALSE(language_state.translate_enabled());
121 EXPECT_FALSE(driver->on_translate_enabled_changed_called());
122 language_state.SetTranslateEnabled(true);
123 EXPECT_TRUE(language_state.translate_enabled());
124 EXPECT_TRUE(driver->on_translate_enabled_changed_called());
125
126 driver->Reset();
127 language_state.SetTranslateEnabled(false);
128 EXPECT_FALSE(language_state.translate_enabled());
129 EXPECT_TRUE(driver->on_translate_enabled_changed_called());
130
131 // Navigate to a French page.
132 driver->Reset();
133 language_state.LanguageDetermined("fr", true);
134 EXPECT_FALSE(language_state.translate_enabled());
135 EXPECT_FALSE(driver->on_is_page_translated_changed_called());
136 EXPECT_FALSE(driver->on_translate_enabled_changed_called());
137
138 // Translate.
139 language_state.SetCurrentLanguage("en");
140 EXPECT_TRUE(language_state.IsPageTranslated());
141 EXPECT_TRUE(driver->on_is_page_translated_changed_called());
142
143 // Translate feature must be enabled after an actual translation.
144 EXPECT_TRUE(language_state.translate_enabled());
145 EXPECT_TRUE(driver->on_translate_enabled_changed_called());
146 }
147