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