15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/ibus/ibus_input_context_client.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
99ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/ibus/ibus_constants.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/ibus/ibus_text.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/message.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/mock_bus.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/mock_object_proxy.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Invoke;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Return;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(nona): Remove after complete libibus removal.
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using chromeos::IBusText;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kObjectPath[] = "/org/freedesktop/IBus/InputContext_1010";
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Following variables are used in callback expectations.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint32 kCapabilities = 12345;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 kCursorX = 30;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 kCursorY = 31;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 kCursorWidth = 32;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 kCursorHeight = 33;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint32 kKeyval = 34;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint32 kKeycode = 35;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint32 kState = 36;
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int32 kCompositionX = 37;
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int32 kCompositionY = 38;
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int32 kCompositionWidth = 39;
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int32 kCompositionHeight = 40;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const bool kIsKeyHandled = false;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSurroundingText[] = "Surrounding Text";
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint32 kCursorPos = 2;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint32 kAnchorPos = 7;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kPropertyKey[] = "Property Key";
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const ibus::IBusPropertyState kPropertyState =
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ibus::IBUS_PROPERTY_STATE_CHECKED;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockInputContextHandler : public IBusInputContextHandlerInterface {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD1(CommitText, void(const IBusText& text));
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD3(ForwardKeyEvent,
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               void(uint32 keyval, uint32 keycode, uint32 state));
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD0(ShowPreeditText, void());
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD0(HidePreeditText, void());
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD3(UpdatePreeditText,
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               void(const IBusText& text, uint32 cursor_pos, bool visible));
60b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  MOCK_METHOD2(DeleteSurroundingText, void(int32 offset, uint32 length));
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockProcessKeyEventHandler {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(Run, void(bool is_key_handled));
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockProcessKeyEventErrorHandler {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(Run, void());
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MATCHER_P(IBusTextEq, expected_text, "The expected IBusText does not match") {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(nona): Check attributes.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (arg.text() == expected_text->text());
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IBusInputContextClientTest : public testing::Test {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  IBusInputContextClientTest()
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : response_(NULL),
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        on_set_cursor_location_call_count_(0) {}
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Create a mock bus.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::Bus::Options options;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    options.bus_type = dbus::Bus::SYSTEM;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mock_bus_ = new dbus::MockBus(options);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Create a mock proxy.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mock_proxy_ = new dbus::MockObjectProxy(mock_bus_.get(),
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            ibus::kServiceName,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            dbus::ObjectPath(kObjectPath));
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Create a client.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    client_.reset(IBusInputContextClient::Create(
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        REAL_DBUS_CLIENT_IMPLEMENTATION));
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Set an expectation so mock_bus's GetObjectProxy() for the given service
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // name and the object path will return mock_proxy_. The GetObjectProxy
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // function is called in Initialized function.
1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(
1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        *mock_bus_.get(),
1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        GetObjectProxy(ibus::kServiceName, dbus::ObjectPath(kObjectPath)))
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillOnce(Return(mock_proxy_.get()));
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Set expectations so mock_proxy's ConnectToSignal will use
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // OnConnectToSignal() to run the callback. The ConnectToSignal is called in
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Initialize function.
1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(*mock_proxy_.get(),
1137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                ConnectToSignal(ibus::input_context::kServiceInterface,
1147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                ibus::input_context::kCommitTextSignal,
1157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                _,
1167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                _))
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(
1187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)             Invoke(this, &IBusInputContextClientTest::OnConnectToSignal));
1197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(*mock_proxy_.get(),
1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                ConnectToSignal(ibus::input_context::kServiceInterface,
1217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                ibus::input_context::kForwardKeyEventSignal,
1227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                _,
1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                _))
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(
1257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)             Invoke(this, &IBusInputContextClientTest::OnConnectToSignal));
1267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(*mock_proxy_.get(),
1277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                ConnectToSignal(ibus::input_context::kServiceInterface,
1287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                ibus::input_context::kHidePreeditTextSignal,
1297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                _,
1307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                _))
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(
1327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)             Invoke(this, &IBusInputContextClientTest::OnConnectToSignal));
1337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(*mock_proxy_.get(),
1347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                ConnectToSignal(ibus::input_context::kServiceInterface,
1357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                ibus::input_context::kShowPreeditTextSignal,
1367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                _,
1377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                _))
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(
1397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)             Invoke(this, &IBusInputContextClientTest::OnConnectToSignal));
1407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(*mock_proxy_.get(),
1417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                ConnectToSignal(ibus::input_context::kServiceInterface,
1427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                ibus::input_context::kUpdatePreeditTextSignal,
1437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                _,
1447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                _))
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(
1467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)             Invoke(this, &IBusInputContextClientTest::OnConnectToSignal));
1477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(
1487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        *mock_proxy_.get(),
1497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        ConnectToSignal(ibus::input_context::kServiceInterface,
1507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        ibus::input_context::kDeleteSurroundingTextSignal,
1517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        _,
1527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        _))
15390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        .WillRepeatedly(
1547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)             Invoke(this, &IBusInputContextClientTest::OnConnectToSignal));
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Call Initialize to create object proxy and connect signals.
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    client_->Initialize(mock_bus_.get(), dbus::ObjectPath(kObjectPath));
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(client_->IsObjectProxyReady());
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    client_->ResetObjectProxy();
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(client_->IsObjectProxyReady());
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handles FocusIn method call.
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnFocusIn(dbus::MethodCall* method_call,
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 int timeout_ms,
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const dbus::ObjectProxy::ResponseCallback& callback,
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const dbus::ObjectProxy::ErrorCallback& error_callback) {
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ibus::input_context::kServiceInterface,
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              method_call->GetInterface());
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ibus::input_context::kFocusInMethod, method_call->GetMember());
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageReader reader(method_call);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(reader.HasMoreData());
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_.PostTask(FROM_HERE, base::Bind(callback, response_));
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handles FocusOut method call.
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnFocusOut(dbus::MethodCall* method_call,
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  int timeout_ms,
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const dbus::ObjectProxy::ResponseCallback& callback,
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const dbus::ObjectProxy::ErrorCallback& error_callback) {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ibus::input_context::kServiceInterface,
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              method_call->GetInterface());
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ibus::input_context::kFocusOutMethod, method_call->GetMember());
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageReader reader(method_call);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(reader.HasMoreData());
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_.PostTask(FROM_HERE, base::Bind(callback, response_));
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handles Reset method call.
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnReset(dbus::MethodCall* method_call,
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               int timeout_ms,
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               const dbus::ObjectProxy::ResponseCallback& callback,
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               const dbus::ObjectProxy::ErrorCallback& error_callback) {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ibus::input_context::kServiceInterface,
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              method_call->GetInterface());
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ibus::input_context::kResetMethod, method_call->GetMember());
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageReader reader(method_call);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(reader.HasMoreData());
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_.PostTask(FROM_HERE, base::Bind(callback, response_));
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handles SetCursorLocation method call.
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnSetCursorLocation(const ibus::Rect& cursor_location,
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           const ibus::Rect& composition_head) {
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++on_set_cursor_location_call_count_;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handles SetCapabilities method call.
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSetCapabilities(
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dbus::MethodCall* method_call,
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int timeout_ms,
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const dbus::ObjectProxy::ResponseCallback& callback,
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const dbus::ObjectProxy::ErrorCallback& error_callback) {
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ibus::input_context::kServiceInterface,
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              method_call->GetInterface());
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ibus::input_context::kSetCapabilitiesMethod,
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              method_call->GetMember());
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 capabilities;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageReader reader(method_call);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(reader.PopUint32(&capabilities));
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCapabilities, capabilities);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(reader.HasMoreData());
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_.PostTask(FROM_HERE, base::Bind(callback, response_));
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handles ProcessKeyEvent method call.
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnProcessKeyEvent(
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dbus::MethodCall* method_call,
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int timeout_ms,
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const dbus::ObjectProxy::ResponseCallback& callback,
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const dbus::ObjectProxy::ErrorCallback& error_callback) {
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ibus::input_context::kServiceInterface,
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              method_call->GetInterface());
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ibus::input_context::kProcessKeyEventMethod,
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              method_call->GetMember());
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 keyval, keycode, state;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageReader reader(method_call);
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(reader.PopUint32(&keyval));
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(reader.PopUint32(&keycode));
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(reader.PopUint32(&state));
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(reader.HasMoreData());
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_.PostTask(FROM_HERE, base::Bind(callback, response_));
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnProcessKeyEventFail(
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dbus::MethodCall* method_call,
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int timeout_ms,
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const dbus::ObjectProxy::ResponseCallback& callback,
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const dbus::ObjectProxy::ErrorCallback& error_callback) {
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ibus::input_context::kServiceInterface,
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              method_call->GetInterface());
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ibus::input_context::kProcessKeyEventMethod,
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              method_call->GetMember());
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 keyval, keycode, state;
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageReader reader(method_call);
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(reader.PopUint32(&keyval));
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(reader.PopUint32(&keycode));
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(reader.PopUint32(&state));
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(reader.HasMoreData());
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_.PostTask(FROM_HERE, base::Bind(error_callback,
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 error_response_));
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handles SetSurroudingText method call.
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSetSurroundingText(
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dbus::MethodCall* method_call,
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int timeout_ms,
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const dbus::ObjectProxy::ResponseCallback& callback,
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const dbus::ObjectProxy::ErrorCallback& error_callback) {
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ibus::input_context::kServiceInterface,
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              method_call->GetInterface());
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ibus::input_context::kSetSurroundingTextMethod,
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              method_call->GetMember());
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageReader reader(method_call);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string text;
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 cursor_pos = 0;
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 anchor_pos = 0;
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(PopStringFromIBusText(&reader, &text));
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(reader.PopUint32(&cursor_pos));
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(reader.PopUint32(&anchor_pos));
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(reader.HasMoreData());
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kSurroundingText, text);
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kCursorPos, cursor_pos);
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kAnchorPos, anchor_pos);
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_.PostTask(FROM_HERE, base::Bind(callback, response_));
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handles PropertyActivate method call.
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnPropertyActivate(
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dbus::MethodCall* method_call,
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int timeout_ms,
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const dbus::ObjectProxy::ResponseCallback& callback,
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const dbus::ObjectProxy::ErrorCallback& error_callback) {
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ibus::input_context::kServiceInterface,
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              method_call->GetInterface());
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ibus::input_context::kPropertyActivateMethod,
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              method_call->GetMember());
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageReader reader(method_call);
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string key;
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 state = 0;
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(reader.PopString(&key));
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(reader.PopUint32(&state));
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(reader.HasMoreData());
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kPropertyKey, key);
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kPropertyState, static_cast<ibus::IBusPropertyState>(state));
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_.PostTask(FROM_HERE, base::Bind(callback, response_));
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The client to be tested.
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<IBusInputContextClient> client_;
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The mock bus.
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<dbus::MockBus> mock_bus_;
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The mock object proxy.
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<dbus::MockObjectProxy> mock_proxy_;
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Response returned by mock methods.
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dbus::Response* response_;
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dbus::ErrorResponse* error_response_;
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A message loop to emulate asynchronous behavior.
335868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::MessageLoop message_loop_;
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The map from signal to signal handler.
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::map<std::string, dbus::ObjectProxy::SignalCallback> signal_callback_map_;
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Call count of OnSetCursorLocation.
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int on_set_cursor_location_call_count_;
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used to implement the mock proxy.
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnConnectToSignal(
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& interface_name,
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& signal_name,
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const dbus::ObjectProxy::SignalCallback& signal_callback,
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const dbus::ObjectProxy::OnConnectedCallback& on_connected_callback) {
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    signal_callback_map_[signal_name] = signal_callback;
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const bool success = true;
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_.PostTask(FROM_HERE, base::Bind(on_connected_callback,
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 interface_name,
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 signal_name,
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 success));
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(IBusInputContextClientTest, CommitTextHandler) {
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char kSampleText[] = "Sample Text";
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IBusText ibus_text;
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ibus_text.set_text(kSampleText);
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set handler expectations.
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockInputContextHandler mock_handler;
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(mock_handler, CommitText(IBusTextEq(&ibus_text)));
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  client_->SetInputContextHandler(&mock_handler);
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunUntilIdle();
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Emit signal.
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dbus::Signal signal(ibus::input_context::kServiceInterface,
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      ibus::input_context::kCommitTextSignal);
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dbus::MessageWriter writer(&signal);
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendIBusText(ibus_text, &writer);
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      signal_callback_map_[ibus::input_context::kCommitTextSignal].is_null());
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  signal_callback_map_[ibus::input_context::kCommitTextSignal].Run(&signal);
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unset the handler so expect not calling handler.
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  client_->SetInputContextHandler(NULL);
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  signal_callback_map_[ibus::input_context::kCommitTextSignal].Run(&signal);
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(IBusInputContextClientTest, ForwardKeyEventHandlerTest) {
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set handler expectations.
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockInputContextHandler mock_handler;
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(mock_handler, ForwardKeyEvent(kKeyval, kKeycode, kState));
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  client_->SetInputContextHandler(&mock_handler);
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunUntilIdle();
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Emit signal.
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dbus::Signal signal(ibus::input_context::kServiceInterface,
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      ibus::input_context::kForwardKeyEventSignal);
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dbus::MessageWriter writer(&signal);
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.AppendUint32(kKeyval);
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.AppendUint32(kKeycode);
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.AppendUint32(kState);
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      signal_callback_map_[ibus::input_context::kForwardKeyEventSignal]
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .is_null());
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  signal_callback_map_[ibus::input_context::kForwardKeyEventSignal].Run(
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &signal);
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unset the handler so expect not calling handler.
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  client_->SetInputContextHandler(NULL);
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  signal_callback_map_[ibus::input_context::kForwardKeyEventSignal].Run(
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &signal);
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(IBusInputContextClientTest, HidePreeditTextHandlerTest) {
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set handler expectations.
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockInputContextHandler mock_handler;
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(mock_handler, HidePreeditText());
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  client_->SetInputContextHandler(&mock_handler);
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunUntilIdle();
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Emit signal.
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dbus::Signal signal(ibus::input_context::kServiceInterface,
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      ibus::input_context::kHidePreeditTextSignal);
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      signal_callback_map_[ibus::input_context::kHidePreeditTextSignal]
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .is_null());
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  signal_callback_map_[ibus::input_context::kHidePreeditTextSignal].Run(
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &signal);
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unset the handler so expect not calling handler.
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  client_->SetInputContextHandler(NULL);
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  signal_callback_map_[ibus::input_context::kHidePreeditTextSignal].Run(
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &signal);
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(IBusInputContextClientTest, ShowPreeditTextHandlerTest) {
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set handler expectations.
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockInputContextHandler mock_handler;
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(mock_handler, ShowPreeditText());
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  client_->SetInputContextHandler(&mock_handler);
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunUntilIdle();
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Emit signal.
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dbus::Signal signal(ibus::input_context::kServiceInterface,
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      ibus::input_context::kShowPreeditTextSignal);
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      signal_callback_map_[ibus::input_context::kShowPreeditTextSignal]
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .is_null());
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  signal_callback_map_[ibus::input_context::kShowPreeditTextSignal].Run(
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &signal);
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unset the handler so expect not calling handler.
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  client_->SetInputContextHandler(NULL);
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  signal_callback_map_[ibus::input_context::kShowPreeditTextSignal].Run(
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &signal);
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(IBusInputContextClientTest, UpdatePreeditTextHandlerTest) {
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint32 kCursorPos = 20;
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const bool kVisible = false;
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char kSampleText[] = "Sample Text";
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IBusText ibus_text;
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ibus_text.set_text(kSampleText);
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set handler expectations.
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockInputContextHandler mock_handler;
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(mock_handler,
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              UpdatePreeditText(IBusTextEq(&ibus_text), kCursorPos, kVisible));
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  client_->SetInputContextHandler(&mock_handler);
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunUntilIdle();
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Emit signal.
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dbus::Signal signal(ibus::input_context::kServiceInterface,
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      ibus::input_context::kUpdatePreeditTextSignal);
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dbus::MessageWriter writer(&signal);
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendIBusText(ibus_text, &writer);
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.AppendUint32(kCursorPos);
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.AppendBool(kVisible);
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      signal_callback_map_[ibus::input_context::kUpdatePreeditTextSignal]
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .is_null());
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  signal_callback_map_[ibus::input_context::kUpdatePreeditTextSignal].Run(
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &signal);
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unset the handler so expect not calling handler.
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  client_->SetInputContextHandler(NULL);
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  signal_callback_map_[ibus::input_context::kUpdatePreeditTextSignal].Run(
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &signal);
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(IBusInputContextClientTest, FocusInTest) {
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set expectations.
4877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(*mock_proxy_.get(), CallMethodWithErrorCallback(_, _, _, _))
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(this, &IBusInputContextClientTest::OnFocusIn));
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create response.
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  response_ = response.get();
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Call FocusIn.
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client_->FocusIn();
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run the message loop.
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunUntilIdle();
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(IBusInputContextClientTest, FocusOutTest) {
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set expectations.
5017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(*mock_proxy_.get(), CallMethodWithErrorCallback(_, _, _, _))
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(this, &IBusInputContextClientTest::OnFocusOut));
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create response.
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  response_ = response.get();
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Call FocusOut.
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client_->FocusOut();
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run the message loop.
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunUntilIdle();
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(IBusInputContextClientTest, ResetTest) {
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set expectations.
5157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(*mock_proxy_.get(), CallMethodWithErrorCallback(_, _, _, _))
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(this, &IBusInputContextClientTest::OnReset));
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create response.
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  response_ = response.get();
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Call Reset.
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client_->Reset();
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run the message loop.
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunUntilIdle();
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(IBusInputContextClientTest, SetCapabilitiesTest) {
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set expectations.
5297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(*mock_proxy_.get(), CallMethodWithErrorCallback(_, _, _, _))
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(this, &IBusInputContextClientTest::OnSetCapabilities));
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create response.
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  response_ = response.get();
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Call SetCapabilities.
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client_->SetCapabilities(kCapabilities);
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run the message loop.
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunUntilIdle();
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(IBusInputContextClientTest, SetCursorLocationTest) {
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  on_set_cursor_location_call_count_ = 0;
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  client_->SetSetCursorLocationHandler(
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&IBusInputContextClientTest::OnSetCursorLocation,
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 base::Unretained(this)));
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const ibus::Rect cursor_location(kCursorX,
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   kCursorY,
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   kCursorWidth,
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   kCursorHeight);
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const ibus::Rect composition_location(kCompositionX,
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        kCompositionY,
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        kCompositionWidth,
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        kCompositionHeight);
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Call SetCursorLocation.
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  client_->SetCursorLocation(cursor_location, composition_location);
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, on_set_cursor_location_call_count_);
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  client_->UnsetSetCursorLocationHandler();
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(IBusInputContextClientTest, OnProcessKeyEvent) {
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set expectations.
5637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(*mock_proxy_.get(), CallMethodWithErrorCallback(_, _, _, _))
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(this, &IBusInputContextClientTest::OnProcessKeyEvent));
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockProcessKeyEventHandler callback;
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockProcessKeyEventErrorHandler error_callback;
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(callback, Run(kIsKeyHandled));
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(error_callback, Run()).Times(0);
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create response.
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dbus::MessageWriter writer(response.get());
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.AppendBool(kIsKeyHandled);
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  response_ = response.get();
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Call ProcessKeyEvent.
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client_->ProcessKeyEvent(kKeyval,
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           kKeycode,
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           kState,
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           base::Bind(&MockProcessKeyEventHandler::Run,
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      base::Unretained(&callback)),
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           base::Bind(&MockProcessKeyEventErrorHandler::Run,
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      base::Unretained(&error_callback)));
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run the message loop.
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunUntilIdle();
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(IBusInputContextClientTest, OnProcessKeyEventFail) {
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set expectations.
5907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(*mock_proxy_.get(), CallMethodWithErrorCallback(_, _, _, _))
5917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      .WillOnce(
5927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)           Invoke(this, &IBusInputContextClientTest::OnProcessKeyEventFail));
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockProcessKeyEventHandler callback;
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockProcessKeyEventErrorHandler error_callback;
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(callback, Run(_)).Times(0);
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(error_callback, Run());
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create response.
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dbus::MessageWriter writer(response.get());
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.AppendBool(kIsKeyHandled);
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  response_ = response.get();
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Call ProcessKeyEvent.
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client_->ProcessKeyEvent(kKeyval,
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           kKeycode,
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           kState,
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           base::Bind(&MockProcessKeyEventHandler::Run,
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      base::Unretained(&callback)),
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           base::Bind(&MockProcessKeyEventErrorHandler::Run,
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      base::Unretained(&error_callback)));
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run the message loop.
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunUntilIdle();
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(IBusInputContextClientTest, SetSurroundingTextTest) {
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set expectations.
6187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(*mock_proxy_.get(), CallMethodWithErrorCallback(_, _, _, _))
6197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      .WillOnce(
6207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)           Invoke(this, &IBusInputContextClientTest::OnSetSurroundingText));
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create response.
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  response_ = response.get();
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Call SetCursorLocation.
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client_->SetSurroundingText(kSurroundingText, kCursorPos, kAnchorPos);
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run the message loop.
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunUntilIdle();
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(IBusInputContextClientTest, PropertyActivateTest) {
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set expectations.
6337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(*mock_proxy_.get(), CallMethodWithErrorCallback(_, _, _, _))
6347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      .WillOnce(Invoke(this, &IBusInputContextClientTest::OnPropertyActivate));
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create response.
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  response_ = response.get();
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Call SetCursorLocation.
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client_->PropertyActivate(kPropertyKey, kPropertyState);
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run the message loop.
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunUntilIdle();
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
645