Chromium Code Reviews| 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 "webkit/glue/webkit_glue.h" | 5 #include "webkit/glue/webkit_glue.h" |
| 6 | 6 |
| 7 #include "base/file_util.h" | 7 #include "base/file_util.h" |
| 8 #include "base/message_loop.h" | 8 #include "base/message_loop.h" |
| 9 #include "base/path_service.h" | 9 #include "base/path_service.h" |
| 10 #include "base/platform_file.h" | 10 #include "base/platform_file.h" |
| 11 #include "base/sys_string_conversions.h" | 11 #include "base/sys_string_conversions.h" |
| 12 #include "base/utf_string_conversions.h" | 12 #include "base/utf_string_conversions.h" |
| 13 #include "chrome/renderer/spellchecker/spellcheck.h" | 13 #include "chrome/renderer/spellchecker/spellcheck.h" |
| 14 #include "chrome/common/chrome_paths.h" | 14 #include "chrome/common/chrome_paths.h" |
| 15 #include "chrome/common/spellcheck_common.h" | 15 #include "chrome/common/spellcheck_common.h" |
| 16 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
| 17 #include "third_party/WebKit/Source/WebKit/chromium/public/WebTextCheckingComple tion.h" | |
| 17 #include "third_party/WebKit/Source/WebKit/chromium/public/WebTextCheckingResult .h" | 18 #include "third_party/WebKit/Source/WebKit/chromium/public/WebTextCheckingResult .h" |
| 18 | 19 |
| 19 namespace { | 20 namespace { |
| 20 | 21 |
| 21 FilePath GetHunspellDirectory() { | 22 FilePath GetHunspellDirectory() { |
| 22 FilePath hunspell_directory; | 23 FilePath hunspell_directory; |
| 23 if (!PathService::Get(base::DIR_SOURCE_ROOT, &hunspell_directory)) | 24 if (!PathService::Get(base::DIR_SOURCE_ROOT, &hunspell_directory)) |
| 24 return FilePath(); | 25 return FilePath(); |
| 25 | 26 |
| 26 hunspell_directory = hunspell_directory.AppendASCII("third_party"); | 27 hunspell_directory = hunspell_directory.AppendASCII("third_party"); |
| 27 hunspell_directory = hunspell_directory.AppendASCII("hunspell_dictionaries"); | 28 hunspell_directory = hunspell_directory.AppendASCII("hunspell_dictionaries"); |
| 28 return hunspell_directory; | 29 return hunspell_directory; |
| 29 } | 30 } |
| 30 | 31 |
| 31 } // namespace | 32 } // namespace |
| 32 | 33 |
| 33 class SpellCheckTest : public testing::Test { | 34 class SpellCheckTest : public testing::Test { |
| 34 public: | 35 public: |
| 35 SpellCheckTest() { | 36 SpellCheckTest() { |
| 36 ReinitializeSpellCheck("en-US"); | 37 ReinitializeSpellCheck("en-US"); |
| 37 } | 38 } |
| 38 | 39 |
| 39 void ReinitializeSpellCheck(const std::string& language) { | 40 void ReinitializeSpellCheck(const std::string& language) { |
| 40 spell_check_.reset(new SpellCheck()); | 41 spell_check_.reset(new SpellCheck()); |
| 42 InitializeSpellCheck(language); | |
| 43 } | |
| 41 | 44 |
| 45 void UninitializeSpellCheck() { | |
| 46 spell_check_.reset(new SpellCheck()); | |
| 47 } | |
| 48 | |
| 49 void InitializeSpellCheck(const std::string& language) { | |
| 42 FilePath hunspell_directory = GetHunspellDirectory(); | 50 FilePath hunspell_directory = GetHunspellDirectory(); |
| 43 EXPECT_FALSE(hunspell_directory.empty()); | 51 EXPECT_FALSE(hunspell_directory.empty()); |
| 44 base::PlatformFile file = base::CreatePlatformFile( | 52 base::PlatformFile file = base::CreatePlatformFile( |
| 45 SpellCheckCommon::GetVersionedFileName(language, hunspell_directory), | 53 SpellCheckCommon::GetVersionedFileName(language, hunspell_directory), |
| 46 base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_READ, NULL, NULL); | 54 base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_READ, NULL, NULL); |
| 47 spell_check_->Init( | 55 spell_check_->Init( |
| 48 file, std::vector<std::string>(), language); | 56 file, std::vector<std::string>(), language); |
| 49 } | 57 } |
| 50 | 58 |
| 51 virtual ~SpellCheckTest() { | 59 virtual ~SpellCheckTest() { |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 68 for (size_t j = 0; j < size; ++j) { | 76 for (size_t j = 0; j < size; ++j) { |
| 69 EXPECT_EQ(results[j].type, WebKit::WebTextCheckingTypeSpelling); | 77 EXPECT_EQ(results[j].type, WebKit::WebTextCheckingTypeSpelling); |
| 70 EXPECT_EQ(results[j].location, expected[j].location); | 78 EXPECT_EQ(results[j].location, expected[j].location); |
| 71 EXPECT_EQ(results[j].length, expected[j].length); | 79 EXPECT_EQ(results[j].length, expected[j].length); |
| 72 } | 80 } |
| 73 } | 81 } |
| 74 #endif | 82 #endif |
| 75 | 83 |
| 76 private: | 84 private: |
| 77 scoped_ptr<SpellCheck> spell_check_; | 85 scoped_ptr<SpellCheck> spell_check_; |
| 86 MessageLoop loop; | |
| 78 }; | 87 }; |
| 79 | 88 |
| 89 // A fake completion object for verification. | |
| 90 class FakeTextCheckingCompletion : public WebKit::WebTextCheckingCompletion { | |
|
Hironori Bono
2012/01/27 06:17:41
nit: we use "Mock..." instead of "Fake...".
shinyak
2012/01/30 06:53:05
Done.
| |
| 91 public: | |
| 92 FakeTextCheckingCompletion() | |
| 93 : completion_count_(0) { | |
| 94 } | |
| 95 | |
| 96 virtual void didFinishCheckingText( | |
| 97 const WebKit::WebVector<WebKit::WebTextCheckingResult>& results) { | |
| 98 completion_count_++; | |
| 99 last_results_ = results; | |
| 100 } | |
| 101 | |
| 102 size_t completion_count_; | |
| 103 WebKit::WebVector<WebKit::WebTextCheckingResult> last_results_; | |
| 104 }; | |
| 105 | |
| 106 | |
| 80 // Operates unit tests for the webkit_glue::SpellCheckWord() function | 107 // Operates unit tests for the webkit_glue::SpellCheckWord() function |
| 81 // with the US English dictionary. | 108 // with the US English dictionary. |
| 82 // The unit tests in this function consist of: | 109 // The unit tests in this function consist of: |
| 83 // * Tests for the function with empty strings; | 110 // * Tests for the function with empty strings; |
| 84 // * Tests for the function with a valid English word; | 111 // * Tests for the function with a valid English word; |
| 85 // * Tests for the function with a valid non-English word; | 112 // * Tests for the function with a valid non-English word; |
| 86 // * Tests for the function with a valid English word with a preceding | 113 // * Tests for the function with a valid English word with a preceding |
| 87 // space character; | 114 // space character; |
| 88 // * Tests for the function with a valid English word with a preceding | 115 // * Tests for the function with a valid English word with a preceding |
| 89 // non-English word; | 116 // non-English word; |
| (...skipping 710 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 800 WebKit::WebTextCheckingTypeSpelling, 135, 3)); | 827 WebKit::WebTextCheckingTypeSpelling, 135, 3)); |
| 801 expected.push_back(WebKit::WebTextCheckingResult( | 828 expected.push_back(WebKit::WebTextCheckingResult( |
| 802 WebKit::WebTextCheckingTypeSpelling, 163, 3)); | 829 WebKit::WebTextCheckingTypeSpelling, 163, 3)); |
| 803 expected.push_back(WebKit::WebTextCheckingResult( | 830 expected.push_back(WebKit::WebTextCheckingResult( |
| 804 WebKit::WebTextCheckingTypeSpelling, 195, 3)); | 831 WebKit::WebTextCheckingTypeSpelling, 195, 3)); |
| 805 expected.push_back(WebKit::WebTextCheckingResult( | 832 expected.push_back(WebKit::WebTextCheckingResult( |
| 806 WebKit::WebTextCheckingTypeSpelling, 298, 3)); | 833 WebKit::WebTextCheckingTypeSpelling, 298, 3)); |
| 807 | 834 |
| 808 TestSpellCheckParagraph(text, expected); | 835 TestSpellCheckParagraph(text, expected); |
| 809 } | 836 } |
| 837 | |
| 838 // We also skip RequestSpellCheck tests on Mac, because a system spellchecker | |
| 839 // is used on Mac instead of SpellCheck::RequestTextChecking. | |
| 840 | |
| 841 // Make sure RequestTextChecking does not crash if input is empty. | |
| 842 TEST_F(SpellCheckTest, RequestSpellCheckWithEmptyString) { | |
| 843 FakeTextCheckingCompletion completion; | |
| 844 | |
| 845 const string16 text = ASCIIToUTF16(""); | |
| 846 spell_check()->RequestTextChecking(text, 0, &completion); | |
| 847 | |
| 848 MessageLoop::current()->RunAllPending(); | |
| 849 | |
| 850 EXPECT_EQ(completion.completion_count_, 1U); | |
| 851 } | |
| 852 | |
| 853 // A simple test case having no misspellings. | |
| 854 TEST_F(SpellCheckTest, RequestSpellCheckWithoutMisspelling) { | |
| 855 FakeTextCheckingCompletion completion; | |
| 856 | |
| 857 const string16 text = ASCIIToUTF16("hello"); | |
| 858 spell_check()->RequestTextChecking(text, 0, &completion); | |
| 859 | |
| 860 MessageLoop::current()->RunAllPending(); | |
| 861 | |
| 862 EXPECT_EQ(completion.completion_count_, 1U); | |
| 863 } | |
| 864 | |
| 865 // A simple test case having one misspelling. | |
| 866 TEST_F(SpellCheckTest, RequestSpellCheckWithSingleMisspelling) { | |
| 867 FakeTextCheckingCompletion completion; | |
| 868 | |
| 869 const string16 text = ASCIIToUTF16("apple, zz"); | |
| 870 spell_check()->RequestTextChecking(text, 0, &completion); | |
| 871 | |
| 872 MessageLoop::current()->RunAllPending(); | |
| 873 | |
| 874 EXPECT_EQ(completion.completion_count_, 1U); | |
| 875 EXPECT_EQ(completion.last_results_.size(), 1U); | |
| 876 EXPECT_EQ(completion.last_results_[0].location, 7); | |
| 877 EXPECT_EQ(completion.last_results_[0].length, 2); | |
| 878 } | |
| 879 | |
| 880 // A simple test case having a few misspellings. | |
| 881 TEST_F(SpellCheckTest, RequestSpellCheckWithMisspellings) { | |
| 882 FakeTextCheckingCompletion completion; | |
| 883 | |
| 884 const string16 text = ASCIIToUTF16("apple, zz, orange, zz"); | |
| 885 spell_check()->RequestTextChecking(text, 0, &completion); | |
| 886 | |
| 887 MessageLoop::current()->RunAllPending(); | |
| 888 | |
| 889 EXPECT_EQ(completion.completion_count_, 1U); | |
| 890 EXPECT_EQ(completion.last_results_.size(), 2U); | |
| 891 EXPECT_EQ(completion.last_results_[0].location, 7); | |
| 892 EXPECT_EQ(completion.last_results_[0].length, 2); | |
| 893 EXPECT_EQ(completion.last_results_[1].location, 19); | |
| 894 EXPECT_EQ(completion.last_results_[1].length, 2); | |
| 895 } | |
| 896 | |
| 897 // A test case that multiple requests comes at once. Make sure all | |
| 898 // requests are processed. | |
| 899 TEST_F(SpellCheckTest, RequestSpellCheckWithMultipleRequests) { | |
| 900 FakeTextCheckingCompletion completion[3]; | |
| 901 | |
| 902 const string16 text[3] = { | |
| 903 ASCIIToUTF16("what, zz"), | |
| 904 ASCIIToUTF16("apple, zz"), | |
| 905 ASCIIToUTF16("orange, zz") | |
| 906 }; | |
| 907 | |
| 908 for (int i = 0; i < 3; ++i) | |
| 909 spell_check()->RequestTextChecking(text[i], 0, &completion[i]); | |
| 910 | |
| 911 MessageLoop::current()->RunAllPending(); | |
| 912 | |
| 913 for (int i = 0; i < 3; ++i) { | |
| 914 EXPECT_EQ(completion[i].completion_count_, 1U); | |
| 915 EXPECT_EQ(completion[i].last_results_.size(), 1U); | |
| 916 EXPECT_EQ(completion[i].last_results_[0].location, 6 + i); | |
| 917 EXPECT_EQ(completion[i].last_results_[0].length, 2); | |
| 918 } | |
| 919 } | |
| 920 | |
| 921 // A test case that spellchecking is requested before initializing. | |
| 922 // In this case, we postpone to post a request. | |
| 923 TEST_F(SpellCheckTest, RequestSpellCheckWithoutInitialization) { | |
| 924 UninitializeSpellCheck(); | |
| 925 | |
| 926 FakeTextCheckingCompletion completion; | |
| 927 const string16 text = ASCIIToUTF16("zz"); | |
| 928 | |
| 929 spell_check()->RequestTextChecking(text, 0, &completion); | |
| 930 | |
| 931 // The task will not be posted yet. | |
| 932 MessageLoop::current()->RunAllPending(); | |
| 933 EXPECT_EQ(completion.completion_count_, 0U); | |
| 934 } | |
| 935 | |
| 936 // Requests several spellchecking before initializing. Except the last one, | |
| 937 // posting requests is cancelled and text is rendered as correct one. | |
| 938 TEST_F(SpellCheckTest, RequestSpellCheckMultipleTimesWithoutInitialization) { | |
| 939 UninitializeSpellCheck(); | |
| 940 | |
| 941 FakeTextCheckingCompletion completion[3]; | |
| 942 const string16 text[3] = { | |
| 943 ASCIIToUTF16("what, zz"), | |
| 944 ASCIIToUTF16("apple, zz"), | |
| 945 ASCIIToUTF16("orange, zz") | |
| 946 }; | |
| 947 | |
| 948 // Calls RequestTextchecking a few times. | |
| 949 for (int i = 0; i < 3; ++i) | |
| 950 spell_check()->RequestTextChecking(text[i], 0, &completion[i]); | |
| 951 | |
| 952 // The last task will be posted after initialization, however the other | |
| 953 // requests should be pressed without spellchecking. | |
| 954 MessageLoop::current()->RunAllPending(); | |
| 955 for (int i = 0; i < 2; ++i) | |
| 956 EXPECT_EQ(completion[i].completion_count_, 1U); | |
| 957 EXPECT_EQ(completion[2].completion_count_, 0U); | |
| 958 | |
| 959 // Checks the last request is processed after initialization. | |
| 960 InitializeSpellCheck("en-US"); | |
| 961 | |
| 962 // Calls PostDelayedSpellCheckTask instead of OnInit here for simplicity. | |
| 963 spell_check()->PostDelayedSpellCheckTask(); | |
| 964 MessageLoop::current()->RunAllPending(); | |
| 965 for (int i = 0; i < 3; ++i) | |
| 966 EXPECT_EQ(completion[i].completion_count_, 1U); | |
| 967 } | |
| 968 | |
| 810 #endif | 969 #endif |
| OLD | NEW |