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 "ui/base/ime/win/tsf_text_store.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/scoped_com_initializer.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/ime/text_input_client.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_;
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Invoke;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Return;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockTextInputClient : public TextInputClient {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~MockTextInputClient() {}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(SetCompositionText, void(const ui::CompositionText&));
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(ConfirmCompositionText, void());
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(ClearCompositionText, void());
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(InsertText, void(const string16&));
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(InsertChar, void(char16, int));
29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  MOCK_CONST_METHOD0(GetAttachedWindow, gfx::NativeWindow());
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetTextInputType, ui::TextInputType());
314311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  MOCK_CONST_METHOD0(GetTextInputMode, ui::TextInputMode());
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(CanComposeInline, bool());
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(GetCaretBounds, gfx::Rect());
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(GetCompositionCharacterBounds, bool(uint32, gfx::Rect*));
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(HasCompositionText, bool());
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(GetTextRange, bool(ui::Range*));
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(GetCompositionTextRange, bool(ui::Range*));
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(GetSelectionRange, bool(ui::Range*));
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(SetSelectionRange, bool(const ui::Range&));
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(DeleteRange, bool(const ui::Range&));
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(GetTextFromRange, bool(const ui::Range&, string16*));
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(OnInputMethodChanged, void());
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(ChangeTextDirectionAndLayoutAlignment,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               bool(base::i18n::TextDirection));
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(ExtendSelectionAndDelete, void(size_t, size_t));
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MOCK_METHOD1(EnsureCaretInRect, void(const gfx::Rect&));
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockStoreACPSink : public ITextStoreACPSink {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockStoreACPSink() : ref_count_(0) {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IUnknown
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ULONG STDMETHODCALLTYPE AddRef() OVERRIDE {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return InterlockedIncrement(&ref_count_);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ULONG STDMETHODCALLTYPE Release() OVERRIDE {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const LONG count = InterlockedDecrement(&ref_count_);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!count) {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delete this;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 0;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return static_cast<ULONG>(count);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual HRESULT STDMETHODCALLTYPE QueryInterface(
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      REFIID iid, void** report) OVERRIDE {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (iid == IID_IUnknown || iid == IID_ITextStoreACPSink) {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *report = static_cast<ITextStoreACPSink*>(this);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *report = NULL;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return E_NOINTERFACE;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddRef();
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return S_OK;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ITextStoreACPSink
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, OnTextChange,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             HRESULT(DWORD, const TS_TEXTCHANGE*));
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, OnSelectionChange,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             HRESULT());
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, OnLayoutChange,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             HRESULT(TsLayoutCode, TsViewCookie));
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, OnStatusChange,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             HRESULT(DWORD));
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD4_WITH_CALLTYPE(STDMETHODCALLTYPE, OnAttrsChange,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             HRESULT(LONG, LONG, ULONG, const TS_ATTRID*));
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, OnLockGranted,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             HRESULT(DWORD));
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, OnStartEditTransaction,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             HRESULT());
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, OnEndEditTransaction,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             HRESULT());
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~MockStoreACPSink() {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  volatile LONG ref_count_;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TSFTextStoreTest : public testing::Test {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text_store_ = new TSFTextStore();
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text_store_->AddRef();
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sink_ = new MockStoreACPSink();
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sink_->AddRef();
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(S_OK, text_store_->AdviseSink(IID_ITextStoreACPSink,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            sink_, TS_AS_ALL_SINKS));
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text_store_->SetFocusedTextInputClient(0, &text_input_client_);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(S_OK, text_store_->UnadviseSink(sink_));
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sink_->Release();
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text_store_->Release();
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ScopedCOMInitializer com_initializer_;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockTextInputClient text_input_client_;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TSFTextStore* text_store_;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockStoreACPSink* sink_;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TSFTextStoreTestCallback {
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit TSFTextStoreTestCallback(TSFTextStore* text_store)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : text_store_(text_store) {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CHECK(text_store_);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TSFTextStoreTestCallback() {}
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Accessors to the internal state of TSFTextStore.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool* edit_flag() { return &text_store_->edit_flag_; }
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16* string_buffer() { return &text_store_->string_buffer_; }
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t* committed_size() { return &text_store_->committed_size_; }
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Range* selection() { return &text_store_->selection_; }
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CompositionUnderlines* composition_undelines() {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return &text_store_->composition_undelines_;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetInternalState(const string16& new_string_buffer,
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        LONG new_committed_size, LONG new_selection_start,
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        LONG new_selection_end) {
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_LE(0, new_committed_size);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_LE(new_committed_size, new_selection_start);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_LE(new_selection_start, new_selection_end);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_LE(new_selection_end, static_cast<LONG>(new_string_buffer.size()));
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *string_buffer() = new_string_buffer;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *committed_size() = new_committed_size;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    selection()->set_start(new_selection_start);
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    selection()->set_end(new_selection_end);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasReadLock() const { return text_store_->HasReadLock(); }
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasReadWriteLock() const { return text_store_->HasReadWriteLock(); }
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetSelectionTest(LONG expected_acp_start, LONG expected_acp_end) {
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TS_SELECTION_ACP selection;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ULONG fetched;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(S_OK, text_store_->GetSelection(0, 1, &selection, &fetched));
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, fetched);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected_acp_start, selection.acpStart);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected_acp_end, selection.acpEnd);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetSelectionTest(LONG acp_start, LONG acp_end, HRESULT expected_result) {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TS_SELECTION_ACP selection;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    selection.acpStart = acp_start;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    selection.acpEnd = acp_end;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    selection.style.ase = TS_AE_NONE;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    selection.style.fInterimChar = 0;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected_result, text_store_->SetSelection(1, &selection));
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (expected_result == S_OK) {
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetSelectionTest(acp_start, acp_end);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetTextTest(LONG acp_start, LONG acp_end,
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const string16& text, HRESULT error_code) {
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TS_TEXTCHANGE change;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(error_code,
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              text_store_->SetText(0, acp_start, acp_end,
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   text.c_str(), text.size(), &change));
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (error_code == S_OK) {
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(acp_start, change.acpStart);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(acp_end, change.acpOldEnd);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(acp_start + text.size(), change.acpNewEnd);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetTextTest(LONG acp_start, LONG acp_end,
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const string16& expected_string,
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   LONG expected_next_acp) {
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    wchar_t buffer[1024];
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ULONG text_buffer_copied;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TS_RUNINFO run_info;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ULONG run_info_buffer_copied;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LONG next_acp;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(S_OK,
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              text_store_->GetText(acp_start, acp_end, buffer, 1024,
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   &text_buffer_copied,
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   &run_info, 1, &run_info_buffer_copied,
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   &next_acp));
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(expected_string.size(), text_buffer_copied);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected_string, string16(buffer, buffer + text_buffer_copied));
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, run_info_buffer_copied);
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected_string.size(), run_info.uCount);
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(TS_RT_PLAIN, run_info.type);
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected_next_acp, next_acp);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetTextErrorTest(LONG acp_start, LONG acp_end, HRESULT error_code) {
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    wchar_t buffer[1024];
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ULONG text_buffer_copied;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TS_RUNINFO run_info;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ULONG run_info_buffer_copied;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LONG next_acp;
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(error_code,
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              text_store_->GetText(acp_start, acp_end, buffer, 1024,
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   &text_buffer_copied,
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   &run_info, 1, &run_info_buffer_copied,
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   &next_acp));
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void InsertTextAtSelectionTest(const wchar_t* buffer, ULONG buffer_size,
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 LONG expected_start, LONG expected_end,
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 LONG expected_change_start,
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 LONG expected_change_old_end,
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 LONG expected_change_new_end) {
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LONG start, end;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TS_TEXTCHANGE change;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(S_OK,
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              text_store_->InsertTextAtSelection(0, buffer, buffer_size,
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 &start, &end, &change));
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected_start, start);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected_end, end);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected_change_start, change.acpStart);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected_change_old_end, change.acpOldEnd);
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected_change_new_end, change.acpNewEnd);
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void InsertTextAtSelectionQueryOnlyTest(const wchar_t* buffer,
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          ULONG buffer_size,
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          LONG expected_start,
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          LONG expected_end) {
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LONG start, end;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(S_OK,
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              text_store_->InsertTextAtSelection(TS_IAS_QUERYONLY, buffer,
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 buffer_size, &start, &end,
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 NULL));
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected_start, start);
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected_end, end);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetTextExtTest(TsViewCookie view_cookie, LONG acp_start, LONG acp_end,
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      LONG expected_left, LONG expected_top,
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      LONG expected_right, LONG expected_bottom) {
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RECT rect;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BOOL clipped;
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(S_OK, text_store_->GetTextExt(view_cookie, acp_start, acp_end,
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            &rect, &clipped));
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected_left, rect.left);
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected_top, rect.top);
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected_right, rect.right);
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected_bottom, rect.bottom);
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(FALSE, clipped);
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetTextExtNoLayoutTest(TsViewCookie view_cookie, LONG acp_start,
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              LONG acp_end) {
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RECT rect;
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BOOL clipped;
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(TS_E_NOLAYOUT,
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              text_store_->GetTextExt(view_cookie, acp_start, acp_end,
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      &rect, &clipped));
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TSFTextStore* text_store_;
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TSFTextStoreTest, GetStatusTest) {
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TS_STATUS status;
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(S_OK, text_store_->GetStatus(&status));
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, status.dwDynamicFlags);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(TS_SS_TRANSITORY | TS_SS_NOHIDDENTEXT, status.dwStaticFlags);
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SyncRequestLockTestCallback : public TSFTextStoreTestCallback {
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit SyncRequestLockTestCallback(TSFTextStore* text_store)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : TSFTextStoreTestCallback(text_store) {
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT LockGranted1(DWORD flags) {
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(HasReadLock());
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(HasReadWriteLock());
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return S_OK;
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT LockGranted2(DWORD flags) {
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(HasReadLock());
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(HasReadWriteLock());
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return S_OK;
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT LockGranted3(DWORD flags) {
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(HasReadLock());
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(HasReadWriteLock());
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HRESULT result;
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READ | TS_LF_SYNC, &result));
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(TS_E_SYNCHRONOUS, result);
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return S_OK;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT LockGranted4(DWORD flags) {
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(HasReadLock());
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(HasReadWriteLock());
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HRESULT result;
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(S_OK,
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              text_store_->RequestLock(TS_LF_READWRITE | TS_LF_SYNC, &result));
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(TS_E_SYNCHRONOUS, result);
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return S_OK;
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT LockGranted5(DWORD flags) {
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(HasReadLock());
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(HasReadWriteLock());
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HRESULT result;
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READ | TS_LF_SYNC, &result));
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(TS_E_SYNCHRONOUS, result);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return S_OK;
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT LockGranted6(DWORD flags) {
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(HasReadLock());
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(HasReadWriteLock());
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HRESULT result;
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(S_OK,
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              text_store_->RequestLock(TS_LF_READWRITE | TS_LF_SYNC, &result));
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(TS_E_SYNCHRONOUS, result);
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return S_OK;
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TSFTextStoreTest, SynchronousRequestLockTest) {
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SyncRequestLockTestCallback callback(text_store_);
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*sink_, OnLockGranted(_))
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(&callback, &SyncRequestLockTestCallback::LockGranted1))
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(&callback, &SyncRequestLockTestCallback::LockGranted2))
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(&callback, &SyncRequestLockTestCallback::LockGranted3))
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(&callback, &SyncRequestLockTestCallback::LockGranted4))
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(&callback, &SyncRequestLockTestCallback::LockGranted5))
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(&callback, &SyncRequestLockTestCallback::LockGranted6));
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT result;
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READ | TS_LF_SYNC, &result));
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(S_OK, result);
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(S_OK,
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            text_store_->RequestLock(TS_LF_READWRITE | TS_LF_SYNC, &result));
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(S_OK, result);
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READ | TS_LF_SYNC, &result));
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(S_OK, result);
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READ | TS_LF_SYNC, &result));
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(S_OK, result);
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(S_OK,
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            text_store_->RequestLock(TS_LF_READWRITE | TS_LF_SYNC, &result));
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(S_OK, result);
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(S_OK,
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            text_store_->RequestLock(TS_LF_READWRITE | TS_LF_SYNC, &result));
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(S_OK, result);
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AsyncRequestLockTestCallback : public TSFTextStoreTestCallback {
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit AsyncRequestLockTestCallback(TSFTextStore* text_store)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : TSFTextStoreTestCallback(text_store),
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        state_(0) {
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT LockGranted1(DWORD flags) {
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, state_);
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state_ = 1;
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(HasReadLock());
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(HasReadWriteLock());
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HRESULT result;
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READ, &result));
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(TS_S_ASYNC, result);
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, state_);
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state_ = 2;
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return S_OK;
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT LockGranted2(DWORD flags) {
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, state_);
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(HasReadLock());
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(HasReadWriteLock());
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HRESULT result;
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READWRITE, &result));
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(TS_S_ASYNC, result);
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, state_);
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state_ = 3;
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return S_OK;
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT LockGranted3(DWORD flags) {
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(3, state_);
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(HasReadLock());
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(HasReadWriteLock());
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HRESULT result;
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READWRITE, &result));
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(TS_S_ASYNC, result);
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(3, state_);
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state_ = 4;
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return S_OK;
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT LockGranted4(DWORD flags) {
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(4, state_);
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(HasReadLock());
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(HasReadWriteLock());
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HRESULT result;
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READ, &result));
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(TS_S_ASYNC, result);
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(4, state_);
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state_ = 5;
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return S_OK;
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT LockGranted5(DWORD flags) {
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(5, state_);
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(HasReadLock());
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(HasReadWriteLock());
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state_ = 6;
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return S_OK;
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int state_;
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TSFTextStoreTest, AsynchronousRequestLockTest) {
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AsyncRequestLockTestCallback callback(text_store_);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*sink_, OnLockGranted(_))
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(&callback, &AsyncRequestLockTestCallback::LockGranted1))
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(&callback, &AsyncRequestLockTestCallback::LockGranted2))
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(&callback, &AsyncRequestLockTestCallback::LockGranted3))
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(&callback, &AsyncRequestLockTestCallback::LockGranted4))
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(&callback, &AsyncRequestLockTestCallback::LockGranted5));
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT result;
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READ, &result));
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(S_OK, result);
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RequestLockTextChangeTestCallback : public TSFTextStoreTestCallback {
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit RequestLockTextChangeTestCallback(TSFTextStore* text_store)
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : TSFTextStoreTestCallback(text_store),
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        state_(0) {
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT LockGranted1(DWORD flags) {
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, state_);
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state_ = 1;
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(HasReadLock());
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(HasReadWriteLock());
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *edit_flag() = true;
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetInternalState(L"012345", 6, 6, 6);
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    composition_undelines()->clear();
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state_ = 2;
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return S_OK;
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void InsertText(const string16& text) {
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, state_);
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(L"012345", text);
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state_ = 3;
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetCompositionText(const ui::CompositionText& composition) {
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(3, state_);
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(L"", composition.text);
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, composition.selection.start());
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, composition.selection.end());
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, composition.underlines.size());
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state_ = 4;
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT OnTextChange(DWORD flags, const TS_TEXTCHANGE* change) {
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(4, state_);
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HRESULT result;
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state_ = 5;
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READWRITE, &result));
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(S_OK, result);
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(6, state_);
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state_ = 7;
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return S_OK;
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT LockGranted2(DWORD flags) {
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(5, state_);
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(HasReadLock());
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(HasReadWriteLock());
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state_ = 6;
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return S_OK;
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int state_;
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TSFTextStoreTest, RequestLockOnTextChangeTest) {
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RequestLockTextChangeTestCallback callback(text_store_);
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*sink_, OnLockGranted(_))
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(&callback,
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       &RequestLockTextChangeTestCallback::LockGranted1))
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(&callback,
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       &RequestLockTextChangeTestCallback::LockGranted2));
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*sink_, OnSelectionChange())
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(S_OK));
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*sink_, OnLayoutChange(_, _))
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(S_OK));
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*sink_, OnTextChange(_, _))
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(&callback,
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       &RequestLockTextChangeTestCallback::OnTextChange));
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(text_input_client_, InsertText(_))
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(&callback,
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       &RequestLockTextChangeTestCallback::InsertText));
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(text_input_client_, SetCompositionText(_))
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(&callback,
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       &RequestLockTextChangeTestCallback::SetCompositionText));
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT result;
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READWRITE, &result));
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(S_OK, result);
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SelectionTestCallback : public TSFTextStoreTestCallback {
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit SelectionTestCallback(TSFTextStore* text_store)
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : TSFTextStoreTestCallback(text_store) {
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT ReadLockGranted(DWORD flags) {
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetInternalState(L"", 0, 0, 0);
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetSelectionTest(0, 0);
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSelectionTest(0, 0, TF_E_NOLOCK);
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetInternalState(L"012345", 0, 0, 3);
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetSelectionTest(0, 3);
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSelectionTest(0, 0, TF_E_NOLOCK);
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return S_OK;
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT ReadWriteLockGranted(DWORD flags) {
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetInternalState(L"", 0, 0, 0);
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSelectionTest(0, 0, S_OK);
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetSelectionTest(0, 0);
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSelectionTest(0, 1, TF_E_INVALIDPOS);
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSelectionTest(1, 0, TF_E_INVALIDPOS);
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSelectionTest(1, 1, TF_E_INVALIDPOS);
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetInternalState(L"0123456", 3, 3, 3);
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSelectionTest(0, 0, TF_E_INVALIDPOS);
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSelectionTest(0, 1, TF_E_INVALIDPOS);
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSelectionTest(0, 3, TF_E_INVALIDPOS);
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSelectionTest(0, 6, TF_E_INVALIDPOS);
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSelectionTest(0, 7, TF_E_INVALIDPOS);
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSelectionTest(0, 8, TF_E_INVALIDPOS);
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSelectionTest(1, 0, TF_E_INVALIDPOS);
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSelectionTest(1, 1, TF_E_INVALIDPOS);
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSelectionTest(1, 3, TF_E_INVALIDPOS);
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSelectionTest(1, 6, TF_E_INVALIDPOS);
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSelectionTest(1, 7, TF_E_INVALIDPOS);
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSelectionTest(1, 8, TF_E_INVALIDPOS);
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSelectionTest(3, 0, TF_E_INVALIDPOS);
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSelectionTest(3, 1, TF_E_INVALIDPOS);
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSelectionTest(3, 3, S_OK);
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSelectionTest(3, 6, S_OK);
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSelectionTest(3, 7, S_OK);
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSelectionTest(3, 8, TF_E_INVALIDPOS);
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSelectionTest(6, 0, TF_E_INVALIDPOS);
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSelectionTest(6, 1, TF_E_INVALIDPOS);
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSelectionTest(6, 3, TF_E_INVALIDPOS);
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSelectionTest(6, 6, S_OK);
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSelectionTest(6, 7, S_OK);
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSelectionTest(6, 8, TF_E_INVALIDPOS);
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSelectionTest(7, 0, TF_E_INVALIDPOS);
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSelectionTest(7, 1, TF_E_INVALIDPOS);
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSelectionTest(7, 3, TF_E_INVALIDPOS);
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSelectionTest(7, 6, TF_E_INVALIDPOS);
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSelectionTest(7, 7, S_OK);
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSelectionTest(7, 8, TF_E_INVALIDPOS);
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSelectionTest(8, 0, TF_E_INVALIDPOS);
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSelectionTest(8, 1, TF_E_INVALIDPOS);
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSelectionTest(8, 3, TF_E_INVALIDPOS);
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSelectionTest(8, 6, TF_E_INVALIDPOS);
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSelectionTest(8, 7, TF_E_INVALIDPOS);
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSelectionTest(8, 8, TF_E_INVALIDPOS);
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return S_OK;
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TSFTextStoreTest, SetGetSelectionTest) {
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SelectionTestCallback callback(text_store_);
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*sink_, OnLockGranted(_))
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(&callback, &SelectionTestCallback::ReadLockGranted))
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(&callback,
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       &SelectionTestCallback::ReadWriteLockGranted));
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TS_SELECTION_ACP selection_buffer;
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ULONG fetched_count;
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(TS_E_NOLOCK,
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            text_store_->GetSelection(0, 1, &selection_buffer,
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      &fetched_count));
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT result;
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READ, &result));
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READWRITE, &result));
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SetGetTextTestCallback : public TSFTextStoreTestCallback {
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit SetGetTextTestCallback(TSFTextStore* text_store)
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : TSFTextStoreTestCallback(text_store) {
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT ReadLockGranted(DWORD flags) {
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetTextTest(0, 0, L"", TF_E_NOLOCK);
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextTest(0, -1, L"", 0);
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextTest(0, 0, L"", 0);
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextErrorTest(0, 1, TF_E_INVALIDPOS);
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetInternalState(L"0123456", 3, 3, 3);
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextErrorTest(-1, -1, TF_E_INVALIDPOS);
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextErrorTest(-1, 0, TF_E_INVALIDPOS);
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextErrorTest(-1, 1, TF_E_INVALIDPOS);
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextErrorTest(-1, 3, TF_E_INVALIDPOS);
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextErrorTest(-1, 6, TF_E_INVALIDPOS);
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextErrorTest(-1, 7, TF_E_INVALIDPOS);
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextErrorTest(-1, 8, TF_E_INVALIDPOS);
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextTest(0, -1, L"0123456", 7);
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextTest(0, 0, L"", 0);
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextTest(0, 1, L"0", 1);
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextTest(0, 3, L"012", 3);
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextTest(0, 6, L"012345", 6);
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextTest(0, 7, L"0123456", 7);
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextErrorTest(0, 8, TF_E_INVALIDPOS);
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextTest(1, -1, L"123456", 7);
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextErrorTest(1, 0, TF_E_INVALIDPOS);
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextTest(1, 1, L"", 1);
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextTest(1, 3, L"12", 3);
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextTest(1, 6, L"12345", 6);
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextTest(1, 7, L"123456", 7);
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextErrorTest(1, 8, TF_E_INVALIDPOS);
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextTest(3, -1, L"3456", 7);
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextErrorTest(3, 0, TF_E_INVALIDPOS);
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextErrorTest(3, 1, TF_E_INVALIDPOS);
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextTest(3, 3, L"", 3);
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextTest(3, 6, L"345", 6);
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextTest(3, 7, L"3456", 7);
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextErrorTest(3, 8, TF_E_INVALIDPOS);
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextTest(6, -1, L"6", 7);
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextErrorTest(6, 0, TF_E_INVALIDPOS);
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextErrorTest(6, 1, TF_E_INVALIDPOS);
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextErrorTest(6, 3, TF_E_INVALIDPOS);
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextTest(6, 6, L"", 6);
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextTest(6, 7, L"6", 7);
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextErrorTest(6, 8, TF_E_INVALIDPOS);
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextTest(7, -1, L"", 7);
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextErrorTest(7, 0, TF_E_INVALIDPOS);
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextErrorTest(7, 1, TF_E_INVALIDPOS);
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextErrorTest(7, 3, TF_E_INVALIDPOS);
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextErrorTest(7, 6, TF_E_INVALIDPOS);
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextTest(7, 7, L"", 7);
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextErrorTest(7, 8, TF_E_INVALIDPOS);
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextErrorTest(8, -1, TF_E_INVALIDPOS);
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextErrorTest(8, 0, TF_E_INVALIDPOS);
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextErrorTest(8, 1, TF_E_INVALIDPOS);
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextErrorTest(8, 3, TF_E_INVALIDPOS);
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextErrorTest(8, 6, TF_E_INVALIDPOS);
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextErrorTest(8, 7, TF_E_INVALIDPOS);
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextErrorTest(8, 8, TF_E_INVALIDPOS);
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return S_OK;
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT ReadWriteLockGranted(DWORD flags) {
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetInternalState(L"", 0, 0, 0);
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetTextTest(0, 0, L"", S_OK);
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetInternalState(L"", 0, 0, 0);
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetTextTest(0, 1, L"", TS_E_INVALIDPOS);
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetInternalState(L"0123456", 3, 3, 3);
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetTextTest(0, 0, L"", TS_E_INVALIDPOS);
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetTextTest(0, 1, L"", TS_E_INVALIDPOS);
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetTextTest(0, 3, L"", TS_E_INVALIDPOS);
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetTextTest(0, 6, L"", TS_E_INVALIDPOS);
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetTextTest(0, 7, L"", TS_E_INVALIDPOS);
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetTextTest(0, 8, L"", TS_E_INVALIDPOS);
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetTextTest(1, 0, L"", TS_E_INVALIDPOS);
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetTextTest(1, 1, L"", TS_E_INVALIDPOS);
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetTextTest(1, 3, L"", TS_E_INVALIDPOS);
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetTextTest(1, 6, L"", TS_E_INVALIDPOS);
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetTextTest(1, 7, L"", TS_E_INVALIDPOS);
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetTextTest(1, 8, L"", TS_E_INVALIDPOS);
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetTextTest(3, 0, L"", TS_E_INVALIDPOS);
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetTextTest(3, 1, L"", TS_E_INVALIDPOS);
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetTextTest(3, 3, L"", S_OK);
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextTest(0, -1, L"0123456", 7);
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetSelectionTest(3, 3);
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetInternalState(L"0123456", 3, 3, 3);
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetTextTest(3, 6, L"", S_OK);
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextTest(0, -1, L"0126", 4);
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetSelectionTest(3, 3);
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetInternalState(L"0123456", 3, 3, 3);
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetTextTest(3, 7, L"", S_OK);
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextTest(0, -1, L"012", 3);
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetSelectionTest(3, 3);
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetInternalState(L"0123456", 3, 3, 3);
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetTextTest(3, 8, L"", TS_E_INVALIDPOS);
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetTextTest(6, 0, L"", TS_E_INVALIDPOS);
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetTextTest(6, 1, L"", TS_E_INVALIDPOS);
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetTextTest(6, 3, L"", TS_E_INVALIDPOS);
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetTextTest(6, 6, L"", S_OK);
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextTest(0, -1, L"0123456", 7);
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetSelectionTest(6, 6);
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetInternalState(L"0123456", 3, 3, 3);
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetTextTest(6, 7, L"", S_OK);
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextTest(0, -1, L"012345", 6);
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetSelectionTest(6, 6);
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetInternalState(L"0123456", 3, 3, 3);
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetTextTest(6, 8, L"", TS_E_INVALIDPOS);
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetTextTest(7, 0, L"", TS_E_INVALIDPOS);
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetTextTest(7, 1, L"", TS_E_INVALIDPOS);
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetTextTest(7, 3, L"", TS_E_INVALIDPOS);
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetTextTest(7, 6, L"", TS_E_INVALIDPOS);
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetTextTest(7, 7, L"", S_OK);
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextTest(0, -1, L"0123456", 7);
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetSelectionTest(7, 7);
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetInternalState(L"0123456", 3, 3, 3);
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetTextTest(7, 8, L"", TS_E_INVALIDPOS);
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetInternalState(L"0123456", 3, 3, 3);
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetTextTest(3, 3, L"abc", S_OK);
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextTest(0, -1, L"012abc3456", 10);
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetSelectionTest(3, 6);
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetInternalState(L"0123456", 3, 3, 3);
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetTextTest(3, 6, L"abc", S_OK);
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextTest(0, -1, L"012abc6", 7);
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetSelectionTest(3, 6);
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetInternalState(L"0123456", 3, 3, 3);
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetTextTest(3, 7, L"abc", S_OK);
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextTest(0, -1, L"012abc", 6);
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetSelectionTest(3, 6);
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetInternalState(L"0123456", 3, 3, 3);
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetTextTest(6, 6, L"abc", S_OK);
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextTest(0, -1, L"012345abc6", 10);
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetSelectionTest(6, 9);
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetInternalState(L"0123456", 3, 3, 3);
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetTextTest(6, 7, L"abc", S_OK);
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextTest(0, -1, L"012345abc", 9);
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetSelectionTest(6, 9);
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetInternalState(L"0123456", 3, 3, 3);
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetTextTest(7, 7, L"abc", S_OK);
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextTest(0, -1, L"0123456abc", 10);
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetSelectionTest(7, 10);
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return S_OK;
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TSFTextStoreTest, SetGetTextTest) {
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetGetTextTestCallback callback(text_store_);
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*sink_, OnLockGranted(_))
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(&callback, &SetGetTextTestCallback::ReadLockGranted))
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(&callback,
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       &SetGetTextTestCallback::ReadWriteLockGranted));
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wchar_t buffer[1024];
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ULONG text_buffer_copied;
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TS_RUNINFO run_info;
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ULONG run_info_buffer_copied;
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LONG next_acp;
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(TF_E_NOLOCK,
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            text_store_->GetText(0, -1, buffer, 1024, &text_buffer_copied,
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 &run_info, 1, &run_info_buffer_copied,
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 &next_acp));
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TS_TEXTCHANGE change;
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(TF_E_NOLOCK, text_store_->SetText(0, 0, 0, L"abc", 3, &change));
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT result;
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READ, &result));
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READWRITE, &result));
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class InsertTextAtSelectionTestCallback : public TSFTextStoreTestCallback {
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit InsertTextAtSelectionTestCallback(TSFTextStore* text_store)
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : TSFTextStoreTestCallback(text_store) {
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT ReadLockGranted(DWORD flags) {
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const wchar_t kBuffer[] = L"0123456789";
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetInternalState(L"abcedfg", 0, 0, 0);
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InsertTextAtSelectionQueryOnlyTest(kBuffer, 10, 0, 0);
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetSelectionTest(0, 0);
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InsertTextAtSelectionQueryOnlyTest(kBuffer, 0, 0, 0);
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetInternalState(L"abcedfg", 0, 2, 5);
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InsertTextAtSelectionQueryOnlyTest(kBuffer, 10, 2, 5);
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetSelectionTest(2, 5);
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InsertTextAtSelectionQueryOnlyTest(kBuffer, 0, 2, 5);
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LONG start, end;
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TS_TEXTCHANGE change;
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(TS_E_NOLOCK,
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              text_store_->InsertTextAtSelection(0, kBuffer, 10,
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 &start, &end, &change));
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return S_OK;
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT ReadWriteLockGranted(DWORD flags) {
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetInternalState(L"abcedfg", 0, 0, 0);
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const wchar_t kBuffer[] = L"0123456789";
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InsertTextAtSelectionQueryOnlyTest(kBuffer, 10, 0, 0);
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetSelectionTest(0, 0);
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InsertTextAtSelectionQueryOnlyTest(kBuffer, 0, 0, 0);
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetInternalState(L"", 0, 0, 0);
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InsertTextAtSelectionTest(kBuffer, 10, 0, 10, 0, 0, 10);
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetSelectionTest(0, 10);
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextTest(0, -1, L"0123456789", 10);
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetInternalState(L"abcedfg", 0, 0, 0);
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InsertTextAtSelectionTest(kBuffer, 10, 0, 10, 0, 0, 10);
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetSelectionTest(0, 10);
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextTest(0, -1, L"0123456789abcedfg", 17);
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetInternalState(L"abcedfg", 0, 0, 3);
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InsertTextAtSelectionTest(kBuffer, 0, 0, 0, 0, 3, 0);
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetSelectionTest(0, 0);
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextTest(0, -1, L"edfg", 4);
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetInternalState(L"abcedfg", 0, 3, 7);
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InsertTextAtSelectionTest(kBuffer, 10, 3, 13, 3, 7, 13);
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetSelectionTest(3, 13);
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextTest(0, -1, L"abc0123456789", 13);
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetInternalState(L"abcedfg", 0, 7, 7);
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InsertTextAtSelectionTest(kBuffer, 10, 7, 17, 7, 7, 17);
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetSelectionTest(7, 17);
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextTest(0, -1, L"abcedfg0123456789", 17);
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return S_OK;
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TSFTextStoreTest, InsertTextAtSelectionTest) {
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InsertTextAtSelectionTestCallback callback(text_store_);
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*sink_, OnLockGranted(_))
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(&callback,
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       &InsertTextAtSelectionTestCallback::ReadLockGranted))
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          Invoke(&callback,
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &InsertTextAtSelectionTestCallback::ReadWriteLockGranted));
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT result;
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READ, &result));
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READWRITE, &result));
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScenarioTestCallback : public TSFTextStoreTestCallback {
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit ScenarioTestCallback(TSFTextStore* text_store)
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : TSFTextStoreTestCallback(text_store) {
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT LockGranted1(DWORD flags) {
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSelectionTest(0, 0, S_OK);
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetTextTest(0, 0, L"abc", S_OK);
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetTextTest(1, 2, L"xyz", S_OK);
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextTest(0, -1, L"axyzc", 5);
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    composition_undelines()->clear();
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CompositionUnderline underline;
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    underline.start_offset = 0;
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    underline.end_offset = 5;
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    underline.color = SK_ColorBLACK;
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    underline.thick = false;
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    composition_undelines()->push_back(underline);
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *edit_flag() = true;
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *committed_size() = 0;
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return S_OK;
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetCompositionText1(const ui::CompositionText& composition) {
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(L"axyzc", composition.text);
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, composition.selection.start());
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(4, composition.selection.end());
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(1, composition.underlines.size());
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(SK_ColorBLACK, composition.underlines[0].color);
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, composition.underlines[0].start_offset);
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(5, composition.underlines[0].end_offset);
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(composition.underlines[0].thick);
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT LockGranted2(DWORD flags) {
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetTextTest(3, 4, L"ZCP", S_OK);
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextTest(0, -1, L"axyZCPc", 7);
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    composition_undelines()->clear();
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CompositionUnderline underline;
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    underline.start_offset = 3;
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    underline.end_offset = 5;
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    underline.color = SK_ColorBLACK;
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    underline.thick = true;
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    composition_undelines()->push_back(underline);
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    underline.start_offset = 5;
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    underline.end_offset = 7;
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    underline.color = SK_ColorBLACK;
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    underline.thick = false;
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    composition_undelines()->push_back(underline);
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *edit_flag() = true;
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *committed_size() = 3;
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return S_OK;
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void InsertText2(const string16& text) {
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(L"axy", text);
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetCompositionText2(const ui::CompositionText& composition) {
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(L"ZCPc", composition.text);
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, composition.selection.start());
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(3, composition.selection.end());
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(2, composition.underlines.size());
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(SK_ColorBLACK, composition.underlines[0].color);
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, composition.underlines[0].start_offset);
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, composition.underlines[0].end_offset);
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(composition.underlines[0].thick);
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(SK_ColorBLACK, composition.underlines[1].color);
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, composition.underlines[1].start_offset);
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(4, composition.underlines[1].end_offset);
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(composition.underlines[1].thick);
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT LockGranted3(DWORD flags) {
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextTest(0, -1, L"axyZCPc", 7);
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    composition_undelines()->clear();
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *edit_flag() = true;
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *committed_size() = 7;
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return S_OK;
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void InsertText3(const string16& text) {
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(L"ZCPc", text);
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetCompositionText3(const ui::CompositionText& composition) {
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(L"", composition.text);
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, composition.selection.start());
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, composition.selection.end());
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, composition.underlines.size());
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TSFTextStoreTest, ScenarioTest) {
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScenarioTestCallback callback(text_store_);
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(text_input_client_, SetCompositionText(_))
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(&callback, &ScenarioTestCallback::SetCompositionText1))
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(&callback, &ScenarioTestCallback::SetCompositionText2))
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(&callback, &ScenarioTestCallback::SetCompositionText3));
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(text_input_client_, InsertText(_))
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(&callback, &ScenarioTestCallback::InsertText2))
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(&callback, &ScenarioTestCallback::InsertText3));
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*sink_, OnLockGranted(_))
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(&callback, &ScenarioTestCallback::LockGranted1))
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(&callback, &ScenarioTestCallback::LockGranted2))
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(&callback, &ScenarioTestCallback::LockGranted3));
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // OnSelectionChange will be called once after LockGranted3().
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*sink_, OnSelectionChange())
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(S_OK));
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // OnLayoutChange will be called once after LockGranted3().
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*sink_, OnLayoutChange(_, _))
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(S_OK));
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // OnTextChange will be called once after LockGranted3().
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*sink_, OnTextChange(_, _))
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(S_OK));
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT result;
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READWRITE, &result));
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READWRITE, &result));
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READWRITE, &result));
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GetTextExtTestCallback : public TSFTextStoreTestCallback {
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit GetTextExtTestCallback(TSFTextStore* text_store)
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : TSFTextStoreTestCallback(text_store),
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        layout_prepared_character_num_(0) {
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT LockGranted(DWORD flags) {
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetInternalState(L"0123456789012", 0, 0, 0);
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    layout_prepared_character_num_ = 13;
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TsViewCookie view_cookie;
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(S_OK, text_store_->GetActiveView(&view_cookie));
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextExtTest(view_cookie, 0, 0, 11, 12, 11, 20);
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextExtTest(view_cookie, 0, 1, 11, 12, 20, 20);
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextExtTest(view_cookie, 0, 2, 11, 12, 30, 20);
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextExtTest(view_cookie, 9, 9, 100, 12, 100, 20);
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextExtTest(view_cookie, 9, 10, 101, 12, 110, 20);
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextExtTest(view_cookie, 10, 10, 110, 12, 110, 20);
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextExtTest(view_cookie, 11, 11, 20, 112, 20, 120);
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextExtTest(view_cookie, 11, 12, 21, 112, 30, 120);
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextExtTest(view_cookie, 9, 12, 101, 12, 30, 120);
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextExtTest(view_cookie, 9, 13, 101, 12, 40, 120);
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextExtTest(view_cookie, 0, 13, 11, 12, 40, 120);
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextExtTest(view_cookie, 13, 13, 40, 112, 40, 120);
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    layout_prepared_character_num_ = 12;
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextExtNoLayoutTest(view_cookie, 13, 13);
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    layout_prepared_character_num_ = 0;
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextExtNoLayoutTest(view_cookie, 0, 0);
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetInternalState(L"", 0, 0, 0);
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextExtTest(view_cookie, 0, 0, 1, 2, 4, 6);
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Last character is not availabe due to timing issue of async API.
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // In this case, we will get first character bounds instead of whole text
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // bounds.
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetInternalState(L"abc", 0, 0, 3);
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    layout_prepared_character_num_ = 2;
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextExtTest(view_cookie, 0, 0, 11, 12, 11, 20);
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(nona, kinaba): Remove following test case after PPAPI supporting
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // GetCompositionCharacterBounds.
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetInternalState(L"a", 0, 0, 1);
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    layout_prepared_character_num_ = 0;
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTextExtTest(view_cookie, 0, 1, 1, 2, 4, 6);
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return S_OK;
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetCompositionCharacterBounds(uint32 index, gfx::Rect* rect) {
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (index >= layout_prepared_character_num_)
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rect->set_x((index % 10) * 10 + 11);
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rect->set_y((index / 10) * 100 + 12);
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rect->set_width(9);
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rect->set_height(8);
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect GetCaretBounds() {
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return gfx::Rect(1, 2, 3, 4);
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 layout_prepared_character_num_;
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TSFTextStoreTest, GetTextExtTest) {
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetTextExtTestCallback callback(text_store_);
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(text_input_client_, GetCaretBounds())
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillRepeatedly(Invoke(&callback,
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             &GetTextExtTestCallback::GetCaretBounds));
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(text_input_client_, GetCompositionCharacterBounds(_, _))
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillRepeatedly(
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          Invoke(&callback,
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &GetTextExtTestCallback::GetCompositionCharacterBounds));
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*sink_, OnLockGranted(_))
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Invoke(&callback, &GetTextExtTestCallback::LockGranted));
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT result;
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READ, &result));
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ui
1149