OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/spellchecker/spellcheck_service.h" | 5 #include "chrome/browser/spellchecker/spellcheck_service.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <string> |
| 8 #include <vector> |
8 | 9 |
9 #include "base/memory/scoped_ptr.h" | 10 #include "base/command_line.h" |
10 #include "chrome/browser/spellchecker/feedback_sender.h" | 11 #include "base/message_loop/message_loop.h" |
11 #include "chrome/browser/spellchecker/spellcheck_factory.h" | 12 #include "base/prefs/pref_registry_simple.h" |
12 #include "chrome/test/base/testing_profile.h" | 13 #include "base/prefs/testing_pref_service.h" |
13 #include "content/public/test/test_browser_thread_bundle.h" | 14 #include "base/strings/string_split.h" |
| 15 #include "base/supports_user_data.h" |
| 16 #include "chrome/common/chrome_switches.h" |
| 17 #include "chrome/common/pref_names.h" |
| 18 #include "components/user_prefs/user_prefs.h" |
| 19 #include "content/public/test/test_browser_thread.h" |
14 #include "testing/gtest/include/gtest/gtest.h" | 20 #include "testing/gtest/include/gtest/gtest.h" |
15 | 21 |
16 static scoped_ptr<KeyedService> BuildSpellcheckService( | 22 |
17 content::BrowserContext* profile) { | 23 struct SpellcheckLanguageTestCase { |
18 return make_scoped_ptr(new SpellcheckService(static_cast<Profile*>(profile))); | 24 SpellcheckLanguageTestCase(const std::string& spellcheck_dictionaries, |
| 25 const std::string& accept_languages, |
| 26 size_t num_expected_enabled_spellcheck_languages, |
| 27 const std::string& unsplit_expected_languages) |
| 28 : spellcheck_dictionaries(spellcheck_dictionaries), |
| 29 accept_languages(accept_languages), |
| 30 num_expected_enabled_spellcheck_languages( |
| 31 num_expected_enabled_spellcheck_languages) { |
| 32 base::SplitString(unsplit_expected_languages, ',', |
| 33 &expected_spellcheck_languages); |
| 34 } |
| 35 ~SpellcheckLanguageTestCase() {} |
| 36 |
| 37 const std::string spellcheck_dictionaries; |
| 38 const std::string accept_languages; |
| 39 size_t num_expected_enabled_spellcheck_languages; |
| 40 std::vector<std::string> expected_spellcheck_languages; |
| 41 }; |
| 42 |
| 43 struct TestSupportsUserData : public base::SupportsUserData {}; |
| 44 |
| 45 class SpellcheckServiceUnitTest |
| 46 : public testing::TestWithParam<SpellcheckLanguageTestCase> { |
| 47 public: |
| 48 SpellcheckServiceUnitTest() |
| 49 : ui_thread_(content::BrowserThread::UI, &message_loop_){ |
| 50 user_prefs::UserPrefs::Set(&context_, &prefs_); |
| 51 } |
| 52 ~SpellcheckServiceUnitTest() override {} |
| 53 |
| 54 void SetUp() override { |
| 55 prefs()->registry()->RegisterStringPref(prefs::kSpellCheckDictionary, |
| 56 "spellcheck_dictionary"); |
| 57 prefs()->registry()->RegisterStringPref(prefs::kAcceptLanguages, |
| 58 "accept_languages"); |
| 59 } |
| 60 |
| 61 base::SupportsUserData* context() { return &context_; } |
| 62 TestingPrefServiceSimple* prefs() { return &prefs_; } |
| 63 |
| 64 private: |
| 65 TestSupportsUserData context_; |
| 66 TestingPrefServiceSimple prefs_; |
| 67 base::MessageLoop message_loop_; |
| 68 content::TestBrowserThread ui_thread_; |
| 69 |
| 70 DISALLOW_COPY_AND_ASSIGN(SpellcheckServiceUnitTest); |
| 71 }; |
| 72 |
| 73 INSTANTIATE_TEST_CASE_P( |
| 74 SpellcheckLanguageTestCases, |
| 75 SpellcheckServiceUnitTest, |
| 76 testing::Values( |
| 77 SpellcheckLanguageTestCase("en-US", "en,en-US", 1UL, "en-US"), |
| 78 SpellcheckLanguageTestCase("en-US", "en-US,en", 1UL, "en-US"), |
| 79 SpellcheckLanguageTestCase("en-US", |
| 80 "en,fr,en-US,en-AU", |
| 81 1UL, |
| 82 "en-US,fr,en-AU"), |
| 83 SpellcheckLanguageTestCase("fr", |
| 84 "en,en-JP,fr,zz,en-US", |
| 85 1UL, |
| 86 "fr,en-US"))); |
| 87 |
| 88 TEST_P(SpellcheckServiceUnitTest, GetSpellcheckLanguages) { |
| 89 prefs()->SetString(prefs::kSpellCheckDictionary, |
| 90 GetParam().spellcheck_dictionaries); |
| 91 prefs()->SetString(prefs::kAcceptLanguages, GetParam().accept_languages); |
| 92 |
| 93 std::vector<std::string> spellcheck_languages; |
| 94 size_t enabled_spellcheck_languages = |
| 95 SpellcheckService::GetSpellCheckLanguages( |
| 96 context(), |
| 97 &spellcheck_languages); |
| 98 |
| 99 EXPECT_EQ(GetParam().num_expected_enabled_spellcheck_languages, |
| 100 enabled_spellcheck_languages); |
| 101 EXPECT_EQ(GetParam().expected_spellcheck_languages, spellcheck_languages); |
19 } | 102 } |
20 | 103 |
21 class SpellcheckServiceTest : public testing::Test { | 104 class MultilingualSpellcheckServiceUnitTest : public SpellcheckServiceUnitTest { |
22 protected: | 105 public: |
| 106 MultilingualSpellcheckServiceUnitTest() {} |
| 107 ~MultilingualSpellcheckServiceUnitTest() override {} |
| 108 |
23 void SetUp() override { | 109 void SetUp() override { |
24 // Use SetTestingFactoryAndUse to force creation and initialization. | 110 prefs()->registry()->RegisterStringPref(prefs::kSpellCheckDictionaries, |
25 SpellcheckServiceFactory::GetInstance()->SetTestingFactoryAndUse( | 111 "spellcheck_dictionary"); |
26 &profile_, &BuildSpellcheckService); | 112 prefs()->registry()->RegisterStringPref(prefs::kAcceptLanguages, |
| 113 "accept_languages"); |
| 114 base::CommandLine::ForCurrentProcess()->AppendSwitch( |
| 115 switches::kEnableMultilingualSpellChecker); |
27 } | 116 } |
28 | 117 |
29 private: | 118 private: |
30 content::TestBrowserThreadBundle thread_bundle_; | 119 DISALLOW_COPY_AND_ASSIGN(MultilingualSpellcheckServiceUnitTest); |
31 TestingProfile profile_; | |
32 }; | 120 }; |
33 | 121 |
34 TEST_F(SpellcheckServiceTest, GetSpellCheckLanguages1) { | 122 INSTANTIATE_TEST_CASE_P( |
35 std::vector<std::string> accept_languages; | 123 MultilingualSpellcheckLanguageTestCases, |
36 accept_languages.push_back("en"); | 124 MultilingualSpellcheckServiceUnitTest, |
37 accept_languages.push_back("en-US"); | 125 testing::Values( |
38 std::vector<std::string> languages; | 126 SpellcheckLanguageTestCase("en-US", "en,en-US", 1UL, "en-US"), |
| 127 SpellcheckLanguageTestCase("en-US", "en-US,en", 1UL, "en-US"), |
| 128 SpellcheckLanguageTestCase("en-US,fr", |
| 129 "en,fr,en-US,en-AU", |
| 130 2UL, |
| 131 "en-US,fr,en-AU"), |
| 132 SpellcheckLanguageTestCase("fr", |
| 133 "en,en-JP,fr,zz,en-US", |
| 134 1UL, |
| 135 "fr,en-US"))); |
39 | 136 |
40 SpellcheckService::GetSpellCheckLanguagesFromAcceptLanguages( | 137 TEST_P(MultilingualSpellcheckServiceUnitTest, GetSpellcheckLanguages) { |
41 accept_languages, "en-US", &languages); | 138 prefs()->SetString(prefs::kSpellCheckDictionaries, |
| 139 GetParam().spellcheck_dictionaries); |
| 140 prefs()->SetString(prefs::kAcceptLanguages, GetParam().accept_languages); |
42 | 141 |
43 EXPECT_EQ(1U, languages.size()); | 142 std::vector<std::string> spellcheck_languages; |
44 EXPECT_EQ("en-US", languages[0]); | 143 size_t enabled_spellcheck_languages = |
| 144 SpellcheckService::GetSpellCheckLanguages(context(), |
| 145 &spellcheck_languages); |
| 146 |
| 147 EXPECT_EQ(GetParam().num_expected_enabled_spellcheck_languages, |
| 148 enabled_spellcheck_languages); |
| 149 EXPECT_EQ(GetParam().expected_spellcheck_languages, spellcheck_languages); |
45 } | 150 } |
46 | |
47 TEST_F(SpellcheckServiceTest, GetSpellCheckLanguages2) { | |
48 std::vector<std::string> accept_languages; | |
49 accept_languages.push_back("en-US"); | |
50 accept_languages.push_back("en"); | |
51 std::vector<std::string> languages; | |
52 | |
53 SpellcheckService::GetSpellCheckLanguagesFromAcceptLanguages( | |
54 accept_languages, "en-US", &languages); | |
55 | |
56 EXPECT_EQ(1U, languages.size()); | |
57 EXPECT_EQ("en-US", languages[0]); | |
58 } | |
59 | |
60 TEST_F(SpellcheckServiceTest, GetSpellCheckLanguages3) { | |
61 std::vector<std::string> accept_languages; | |
62 accept_languages.push_back("en"); | |
63 accept_languages.push_back("en-US"); | |
64 accept_languages.push_back("en-AU"); | |
65 std::vector<std::string> languages; | |
66 | |
67 SpellcheckService::GetSpellCheckLanguagesFromAcceptLanguages( | |
68 accept_languages, "en-US", &languages); | |
69 | |
70 EXPECT_EQ(2U, languages.size()); | |
71 | |
72 std::sort(languages.begin(), languages.end()); | |
73 EXPECT_EQ("en-AU", languages[0]); | |
74 EXPECT_EQ("en-US", languages[1]); | |
75 } | |
76 | |
77 TEST_F(SpellcheckServiceTest, GetSpellCheckLanguages4) { | |
78 std::vector<std::string> accept_languages; | |
79 accept_languages.push_back("en"); | |
80 accept_languages.push_back("en-US"); | |
81 accept_languages.push_back("fr"); | |
82 std::vector<std::string> languages; | |
83 | |
84 SpellcheckService::GetSpellCheckLanguagesFromAcceptLanguages( | |
85 accept_languages, "en-US", &languages); | |
86 | |
87 EXPECT_EQ(2U, languages.size()); | |
88 | |
89 std::sort(languages.begin(), languages.end()); | |
90 EXPECT_EQ("en-US", languages[0]); | |
91 EXPECT_EQ("fr", languages[1]); | |
92 } | |
93 | |
94 TEST_F(SpellcheckServiceTest, GetSpellCheckLanguages5) { | |
95 std::vector<std::string> accept_languages; | |
96 accept_languages.push_back("en"); | |
97 accept_languages.push_back("en-JP"); // Will not exist. | |
98 accept_languages.push_back("fr"); | |
99 accept_languages.push_back("aa"); // Will not exist. | |
100 std::vector<std::string> languages; | |
101 | |
102 SpellcheckService::GetSpellCheckLanguagesFromAcceptLanguages( | |
103 accept_languages, "fr", &languages); | |
104 | |
105 EXPECT_EQ(1U, languages.size()); | |
106 EXPECT_EQ("fr", languages[0]); | |
107 } | |
OLD | NEW |