Home | History | Annotate | Download | only in spellchecker
      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 "base/strings/utf_string_conversions.h"
      6 #include "chrome/browser/spellchecker/spellcheck_factory.h"
      7 #include "chrome/browser/spellchecker/spellcheck_message_filter.h"
      8 #include "chrome/browser/spellchecker/spellcheck_service.h"
      9 #include "chrome/common/spellcheck_marker.h"
     10 #include "chrome/common/spellcheck_messages.h"
     11 #include "chrome/test/base/testing_profile.h"
     12 #include "content/public/test/test_browser_thread_bundle.h"
     13 #include "ipc/ipc_message.h"
     14 #include "testing/gtest/include/gtest/gtest.h"
     15 
     16 class TestingSpellCheckMessageFilter : public SpellCheckMessageFilter {
     17  public:
     18   TestingSpellCheckMessageFilter()
     19       : SpellCheckMessageFilter(0),
     20         spellcheck_(new SpellcheckService(&profile_)) {}
     21 
     22   virtual bool Send(IPC::Message* message) OVERRIDE {
     23     sent_messages.push_back(message);
     24     return true;
     25   }
     26 
     27   virtual SpellcheckService* GetSpellcheckService() const OVERRIDE {
     28     return spellcheck_.get();
     29   }
     30 
     31 #if !defined(OS_MACOSX)
     32   void OnTextCheckComplete(int route_id,
     33                            int identifier,
     34                            const std::vector<SpellCheckMarker>& markers,
     35                            bool success,
     36                            const base::string16& text,
     37                            const std::vector<SpellCheckResult>& results) {
     38     SpellCheckMessageFilter::OnTextCheckComplete(
     39         route_id, identifier, markers, success, text, results);
     40   }
     41 #endif
     42 
     43   ScopedVector<IPC::Message> sent_messages;
     44 
     45  private:
     46   virtual ~TestingSpellCheckMessageFilter() {}
     47 
     48   content::TestBrowserThreadBundle thread_bundle_;
     49   TestingProfile profile_;
     50   scoped_ptr<SpellcheckService> spellcheck_;
     51 
     52   DISALLOW_COPY_AND_ASSIGN(TestingSpellCheckMessageFilter);
     53 };
     54 
     55 TEST(SpellCheckMessageFilterTest, TestOverrideThread) {
     56   static const uint32 kSpellcheckMessages[] = {
     57     SpellCheckHostMsg_RequestDictionary::ID,
     58     SpellCheckHostMsg_NotifyChecked::ID,
     59     SpellCheckHostMsg_RespondDocumentMarkers::ID,
     60 #if !defined(OS_MACOSX)
     61     SpellCheckHostMsg_CallSpellingService::ID,
     62 #endif
     63   };
     64   content::BrowserThread::ID thread;
     65   IPC::Message message;
     66   scoped_refptr<TestingSpellCheckMessageFilter> filter(
     67       new TestingSpellCheckMessageFilter);
     68   for (size_t i = 0; i < arraysize(kSpellcheckMessages); ++i) {
     69     message.SetHeaderValues(
     70         0, kSpellcheckMessages[i], IPC::Message::PRIORITY_NORMAL);
     71     thread = content::BrowserThread::IO;
     72     filter->OverrideThreadForMessage(message, &thread);
     73     EXPECT_EQ(content::BrowserThread::UI, thread);
     74   }
     75 }
     76 
     77 #if !defined(OS_MACOSX)
     78 TEST(SpellCheckMessageFilterTest, OnTextCheckCompleteTestCustomDictionary) {
     79   static const std::string kCustomWord = "Helllo";
     80   static const int kRouteId = 0;
     81   static const int kCallbackId = 0;
     82   static const std::vector<SpellCheckMarker> kMarkers;
     83   static const base::string16 kText = base::ASCIIToUTF16("Helllo warld.");
     84   static const bool kSuccess = true;
     85   static const SpellCheckResult::Decoration kDecoration =
     86       SpellCheckResult::SPELLING;
     87   static const int kLocation = 7;
     88   static const int kLength = 5;
     89   static const base::string16 kReplacement = base::ASCIIToUTF16("world");
     90 
     91   std::vector<SpellCheckResult> results;
     92   results.push_back(SpellCheckResult(
     93       SpellCheckResult::SPELLING, 0, 6, base::ASCIIToUTF16("Hello")));
     94   results.push_back(
     95       SpellCheckResult(kDecoration, kLocation, kLength, kReplacement));
     96 
     97   scoped_refptr<TestingSpellCheckMessageFilter> filter(
     98       new TestingSpellCheckMessageFilter);
     99   filter->GetSpellcheckService()->GetCustomDictionary()->AddWord(kCustomWord);
    100   filter->OnTextCheckComplete(
    101       kRouteId, kCallbackId, kMarkers, kSuccess, kText, results);
    102   EXPECT_EQ(static_cast<size_t>(1), filter->sent_messages.size());
    103 
    104   SpellCheckMsg_RespondSpellingService::Param params;
    105   bool ok = SpellCheckMsg_RespondSpellingService::Read(
    106       filter->sent_messages[0], & params);
    107   int sent_identifier = params.a;
    108   bool sent_success = params.b;
    109   base::string16 sent_text = params.c;
    110   std::vector<SpellCheckResult> sent_results = params.d;
    111   EXPECT_TRUE(ok);
    112   EXPECT_EQ(kCallbackId, sent_identifier);
    113   EXPECT_EQ(kSuccess, sent_success);
    114   EXPECT_EQ(kText, sent_text);
    115   EXPECT_EQ(static_cast<size_t>(1), sent_results.size());
    116   EXPECT_EQ(kDecoration, sent_results[0].decoration);
    117   EXPECT_EQ(kLocation, sent_results[0].location);
    118   EXPECT_EQ(kLength, sent_results[0].length);
    119   EXPECT_EQ(kReplacement, sent_results[0].replacement);
    120 }
    121 
    122 TEST(SpellCheckMessageFilterTest, OnTextCheckCompleteTest) {
    123   std::vector<SpellCheckResult> results;
    124   results.push_back(SpellCheckResult(
    125       SpellCheckResult::SPELLING, 0, 6, base::ASCIIToUTF16("Hello")));
    126   results.push_back(SpellCheckResult(
    127       SpellCheckResult::SPELLING, 7, 7, base::ASCIIToUTF16("world")));
    128 
    129   scoped_refptr<TestingSpellCheckMessageFilter> filter(
    130       new TestingSpellCheckMessageFilter);
    131   filter->OnTextCheckComplete(1, 1, std::vector<SpellCheckMarker>(),
    132       true,  base::ASCIIToUTF16("Helllo walrd"), results);
    133   EXPECT_EQ(static_cast<size_t>(1), filter->sent_messages.size());
    134 
    135   SpellCheckMsg_RespondSpellingService::Param params;
    136   bool ok = SpellCheckMsg_RespondSpellingService::Read(
    137       filter->sent_messages[0], & params);
    138   base::string16 sent_text = params.c;
    139   std::vector<SpellCheckResult> sent_results = params.d;
    140   EXPECT_TRUE(ok);
    141   EXPECT_EQ(static_cast<size_t>(2), sent_results.size());
    142 }
    143 #endif
    144