OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/base/ime/win/tsf_text_store.h" | 5 #include "ui/base/ime/win/tsf_text_store.h" |
6 | 6 |
| 7 #include "base/memory/ref_counted.h" |
7 #include "base/win/scoped_com_initializer.h" | 8 #include "base/win/scoped_com_initializer.h" |
8 #include "testing/gtest/include/gtest/gtest.h" | 9 #include "testing/gtest/include/gtest/gtest.h" |
9 #include "testing/gmock/include/gmock/gmock.h" | 10 #include "testing/gmock/include/gmock/gmock.h" |
10 #include "ui/base/ime/text_input_client.h" | 11 #include "ui/base/ime/text_input_client.h" |
11 #include "ui/gfx/rect.h" | 12 #include "ui/gfx/rect.h" |
12 | 13 |
13 using testing::_; | 14 using testing::_; |
14 using testing::Invoke; | 15 using testing::Invoke; |
15 using testing::Return; | 16 using testing::Return; |
16 | 17 |
17 namespace ui { | 18 namespace ui { |
18 | |
19 namespace { | 19 namespace { |
20 | 20 |
21 class MockTextInputClient : public TextInputClient { | 21 class MockTextInputClient : public TextInputClient { |
22 public: | 22 public: |
23 ~MockTextInputClient() {} | 23 ~MockTextInputClient() {} |
24 MOCK_METHOD1(SetCompositionText, void(const ui::CompositionText&)); | 24 MOCK_METHOD1(SetCompositionText, void(const ui::CompositionText&)); |
25 MOCK_METHOD0(ConfirmCompositionText, void()); | 25 MOCK_METHOD0(ConfirmCompositionText, void()); |
26 MOCK_METHOD0(ClearCompositionText, void()); | 26 MOCK_METHOD0(ClearCompositionText, void()); |
27 MOCK_METHOD1(InsertText, void(const string16&)); | 27 MOCK_METHOD1(InsertText, void(const string16&)); |
28 MOCK_METHOD2(InsertChar, void(char16, int)); | 28 MOCK_METHOD2(InsertChar, void(char16, int)); |
(...skipping 12 matching lines...) Expand all Loading... |
41 MOCK_METHOD2(GetTextFromRange, bool(const gfx::Range&, string16*)); | 41 MOCK_METHOD2(GetTextFromRange, bool(const gfx::Range&, string16*)); |
42 MOCK_METHOD0(OnInputMethodChanged, void()); | 42 MOCK_METHOD0(OnInputMethodChanged, void()); |
43 MOCK_METHOD1(ChangeTextDirectionAndLayoutAlignment, | 43 MOCK_METHOD1(ChangeTextDirectionAndLayoutAlignment, |
44 bool(base::i18n::TextDirection)); | 44 bool(base::i18n::TextDirection)); |
45 MOCK_METHOD2(ExtendSelectionAndDelete, void(size_t, size_t)); | 45 MOCK_METHOD2(ExtendSelectionAndDelete, void(size_t, size_t)); |
46 MOCK_METHOD1(EnsureCaretInRect, void(const gfx::Rect&)); | 46 MOCK_METHOD1(EnsureCaretInRect, void(const gfx::Rect&)); |
47 }; | 47 }; |
48 | 48 |
49 class MockStoreACPSink : public ITextStoreACPSink { | 49 class MockStoreACPSink : public ITextStoreACPSink { |
50 public: | 50 public: |
51 MockStoreACPSink() : ref_count_(0) { | 51 MockStoreACPSink() : ref_count_(0) {} |
52 } | |
53 | 52 |
54 // IUnknown | 53 // IUnknown |
55 virtual ULONG STDMETHODCALLTYPE AddRef() OVERRIDE { | 54 virtual ULONG STDMETHODCALLTYPE AddRef() OVERRIDE { |
56 return InterlockedIncrement(&ref_count_); | 55 return InterlockedIncrement(&ref_count_); |
57 } | 56 } |
58 virtual ULONG STDMETHODCALLTYPE Release() OVERRIDE { | 57 virtual ULONG STDMETHODCALLTYPE Release() OVERRIDE { |
59 const LONG count = InterlockedDecrement(&ref_count_); | 58 const LONG count = InterlockedDecrement(&ref_count_); |
60 if (!count) { | 59 if (!count) { |
61 delete this; | 60 delete this; |
62 return 0; | 61 return 0; |
(...skipping 24 matching lines...) Expand all Loading... |
87 MOCK_METHOD4_WITH_CALLTYPE(STDMETHODCALLTYPE, OnAttrsChange, | 86 MOCK_METHOD4_WITH_CALLTYPE(STDMETHODCALLTYPE, OnAttrsChange, |
88 HRESULT(LONG, LONG, ULONG, const TS_ATTRID*)); | 87 HRESULT(LONG, LONG, ULONG, const TS_ATTRID*)); |
89 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, OnLockGranted, | 88 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, OnLockGranted, |
90 HRESULT(DWORD)); | 89 HRESULT(DWORD)); |
91 MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, OnStartEditTransaction, | 90 MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, OnStartEditTransaction, |
92 HRESULT()); | 91 HRESULT()); |
93 MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, OnEndEditTransaction, | 92 MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, OnEndEditTransaction, |
94 HRESULT()); | 93 HRESULT()); |
95 | 94 |
96 private: | 95 private: |
97 ~MockStoreACPSink() { | 96 virtual ~MockStoreACPSink() {} |
98 } | |
99 | 97 |
100 volatile LONG ref_count_; | 98 volatile LONG ref_count_; |
101 }; | 99 }; |
102 | 100 |
| 101 const HWND kWindowHandle = reinterpret_cast<HWND>(1); |
| 102 |
103 } // namespace | 103 } // namespace |
104 | 104 |
105 class TSFTextStoreTest : public testing::Test { | 105 class TSFTextStoreTest : public testing::Test { |
106 protected: | 106 protected: |
107 virtual void SetUp() OVERRIDE { | 107 virtual void SetUp() OVERRIDE { |
108 text_store_ = new TSFTextStore(); | 108 text_store_ = new TSFTextStore(); |
109 text_store_->AddRef(); | |
110 sink_ = new MockStoreACPSink(); | 109 sink_ = new MockStoreACPSink(); |
111 sink_->AddRef(); | |
112 EXPECT_EQ(S_OK, text_store_->AdviseSink(IID_ITextStoreACPSink, | 110 EXPECT_EQ(S_OK, text_store_->AdviseSink(IID_ITextStoreACPSink, |
113 sink_, TS_AS_ALL_SINKS)); | 111 sink_, TS_AS_ALL_SINKS)); |
114 text_store_->SetFocusedTextInputClient(0, &text_input_client_); | 112 text_store_->SetFocusedTextInputClient(kWindowHandle, |
| 113 &text_input_client_); |
115 } | 114 } |
116 | 115 |
117 virtual void TearDown() OVERRIDE { | 116 virtual void TearDown() OVERRIDE { |
118 EXPECT_EQ(S_OK, text_store_->UnadviseSink(sink_)); | 117 EXPECT_EQ(S_OK, text_store_->UnadviseSink(sink_)); |
119 sink_->Release(); | 118 sink_ = NULL; |
120 text_store_->Release(); | 119 text_store_ = NULL; |
121 } | 120 } |
122 | 121 |
123 base::win::ScopedCOMInitializer com_initializer_; | 122 base::win::ScopedCOMInitializer com_initializer_; |
124 MockTextInputClient text_input_client_; | 123 MockTextInputClient text_input_client_; |
125 TSFTextStore* text_store_; | 124 scoped_refptr<TSFTextStore> text_store_; |
126 MockStoreACPSink* sink_; | 125 scoped_refptr<MockStoreACPSink> sink_; |
127 }; | 126 }; |
128 | 127 |
129 class TSFTextStoreTestCallback { | 128 class TSFTextStoreTestCallback { |
130 public: | 129 public: |
131 explicit TSFTextStoreTestCallback(TSFTextStore* text_store) | 130 explicit TSFTextStoreTestCallback(TSFTextStore* text_store) |
132 : text_store_(text_store) { | 131 : text_store_(text_store) { |
133 CHECK(text_store_); | 132 CHECK(text_store_); |
134 } | 133 } |
135 virtual ~TSFTextStoreTestCallback() {} | 134 virtual ~TSFTextStoreTestCallback() {} |
136 | 135 |
(...skipping 17 matching lines...) Expand all Loading... |
154 *string_buffer() = new_string_buffer; | 153 *string_buffer() = new_string_buffer; |
155 *committed_size() = new_committed_size; | 154 *committed_size() = new_committed_size; |
156 selection()->set_start(new_selection_start); | 155 selection()->set_start(new_selection_start); |
157 selection()->set_end(new_selection_end); | 156 selection()->set_end(new_selection_end); |
158 } | 157 } |
159 | 158 |
160 bool HasReadLock() const { return text_store_->HasReadLock(); } | 159 bool HasReadLock() const { return text_store_->HasReadLock(); } |
161 bool HasReadWriteLock() const { return text_store_->HasReadWriteLock(); } | 160 bool HasReadWriteLock() const { return text_store_->HasReadWriteLock(); } |
162 | 161 |
163 void GetSelectionTest(LONG expected_acp_start, LONG expected_acp_end) { | 162 void GetSelectionTest(LONG expected_acp_start, LONG expected_acp_end) { |
164 TS_SELECTION_ACP selection; | 163 TS_SELECTION_ACP selection = {}; |
165 ULONG fetched; | 164 ULONG fetched = 0; |
166 EXPECT_EQ(S_OK, text_store_->GetSelection(0, 1, &selection, &fetched)); | 165 EXPECT_EQ(S_OK, text_store_->GetSelection(0, 1, &selection, &fetched)); |
167 EXPECT_EQ(1, fetched); | 166 EXPECT_EQ(1, fetched); |
168 EXPECT_EQ(expected_acp_start, selection.acpStart); | 167 EXPECT_EQ(expected_acp_start, selection.acpStart); |
169 EXPECT_EQ(expected_acp_end, selection.acpEnd); | 168 EXPECT_EQ(expected_acp_end, selection.acpEnd); |
170 } | 169 } |
171 | 170 |
172 void SetSelectionTest(LONG acp_start, LONG acp_end, HRESULT expected_result) { | 171 void SetSelectionTest(LONG acp_start, LONG acp_end, HRESULT expected_result) { |
173 TS_SELECTION_ACP selection; | 172 TS_SELECTION_ACP selection = {}; |
174 selection.acpStart = acp_start; | 173 selection.acpStart = acp_start; |
175 selection.acpEnd = acp_end; | 174 selection.acpEnd = acp_end; |
176 selection.style.ase = TS_AE_NONE; | 175 selection.style.ase = TS_AE_NONE; |
177 selection.style.fInterimChar = 0; | 176 selection.style.fInterimChar = 0; |
178 EXPECT_EQ(expected_result, text_store_->SetSelection(1, &selection)); | 177 EXPECT_EQ(expected_result, text_store_->SetSelection(1, &selection)); |
179 if (expected_result == S_OK) { | 178 if (expected_result == S_OK) { |
180 GetSelectionTest(acp_start, acp_end); | 179 GetSelectionTest(acp_start, acp_end); |
181 } | 180 } |
182 } | 181 } |
183 | 182 |
184 void SetTextTest(LONG acp_start, LONG acp_end, | 183 void SetTextTest(LONG acp_start, LONG acp_end, |
185 const string16& text, HRESULT error_code) { | 184 const string16& text, HRESULT error_code) { |
186 TS_TEXTCHANGE change; | 185 TS_TEXTCHANGE change = {}; |
187 ASSERT_EQ(error_code, | 186 ASSERT_EQ(error_code, |
188 text_store_->SetText(0, acp_start, acp_end, | 187 text_store_->SetText(0, acp_start, acp_end, |
189 text.c_str(), text.size(), &change)); | 188 text.c_str(), text.size(), &change)); |
190 if (error_code == S_OK) { | 189 if (error_code == S_OK) { |
191 EXPECT_EQ(acp_start, change.acpStart); | 190 EXPECT_EQ(acp_start, change.acpStart); |
192 EXPECT_EQ(acp_end, change.acpOldEnd); | 191 EXPECT_EQ(acp_end, change.acpOldEnd); |
193 EXPECT_EQ(acp_start + text.size(), change.acpNewEnd); | 192 EXPECT_EQ(acp_start + text.size(), change.acpNewEnd); |
194 } | 193 } |
195 } | 194 } |
196 | 195 |
197 void GetTextTest(LONG acp_start, LONG acp_end, | 196 void GetTextTest(LONG acp_start, LONG acp_end, |
198 const string16& expected_string, | 197 const string16& expected_string, |
199 LONG expected_next_acp) { | 198 LONG expected_next_acp) { |
200 wchar_t buffer[1024]; | 199 wchar_t buffer[1024] = {}; |
201 ULONG text_buffer_copied; | 200 ULONG text_buffer_copied = 0; |
202 TS_RUNINFO run_info; | 201 TS_RUNINFO run_info = {}; |
203 ULONG run_info_buffer_copied; | 202 ULONG run_info_buffer_copied = 0; |
204 LONG next_acp; | 203 LONG next_acp = 0; |
205 ASSERT_EQ(S_OK, | 204 ASSERT_EQ(S_OK, |
206 text_store_->GetText(acp_start, acp_end, buffer, 1024, | 205 text_store_->GetText(acp_start, acp_end, buffer, 1024, |
207 &text_buffer_copied, | 206 &text_buffer_copied, |
208 &run_info, 1, &run_info_buffer_copied, | 207 &run_info, 1, &run_info_buffer_copied, |
209 &next_acp)); | 208 &next_acp)); |
210 ASSERT_EQ(expected_string.size(), text_buffer_copied); | 209 ASSERT_EQ(expected_string.size(), text_buffer_copied); |
211 EXPECT_EQ(expected_string, string16(buffer, buffer + text_buffer_copied)); | 210 EXPECT_EQ(expected_string, string16(buffer, buffer + text_buffer_copied)); |
212 EXPECT_EQ(1, run_info_buffer_copied); | 211 EXPECT_EQ(1, run_info_buffer_copied); |
213 EXPECT_EQ(expected_string.size(), run_info.uCount); | 212 EXPECT_EQ(expected_string.size(), run_info.uCount); |
214 EXPECT_EQ(TS_RT_PLAIN, run_info.type); | 213 EXPECT_EQ(TS_RT_PLAIN, run_info.type); |
215 EXPECT_EQ(expected_next_acp, next_acp); | 214 EXPECT_EQ(expected_next_acp, next_acp); |
216 } | 215 } |
217 | 216 |
218 void GetTextErrorTest(LONG acp_start, LONG acp_end, HRESULT error_code) { | 217 void GetTextErrorTest(LONG acp_start, LONG acp_end, HRESULT error_code) { |
219 wchar_t buffer[1024]; | 218 wchar_t buffer[1024] = {}; |
220 ULONG text_buffer_copied; | 219 ULONG text_buffer_copied = 0; |
221 TS_RUNINFO run_info; | 220 TS_RUNINFO run_info = {}; |
222 ULONG run_info_buffer_copied; | 221 ULONG run_info_buffer_copied = 0; |
223 LONG next_acp; | 222 LONG next_acp = 0; |
224 EXPECT_EQ(error_code, | 223 EXPECT_EQ(error_code, |
225 text_store_->GetText(acp_start, acp_end, buffer, 1024, | 224 text_store_->GetText(acp_start, acp_end, buffer, 1024, |
226 &text_buffer_copied, | 225 &text_buffer_copied, |
227 &run_info, 1, &run_info_buffer_copied, | 226 &run_info, 1, &run_info_buffer_copied, |
228 &next_acp)); | 227 &next_acp)); |
229 } | 228 } |
230 | 229 |
231 void InsertTextAtSelectionTest(const wchar_t* buffer, ULONG buffer_size, | 230 void InsertTextAtSelectionTest(const wchar_t* buffer, ULONG buffer_size, |
232 LONG expected_start, LONG expected_end, | 231 LONG expected_start, LONG expected_end, |
233 LONG expected_change_start, | 232 LONG expected_change_start, |
234 LONG expected_change_old_end, | 233 LONG expected_change_old_end, |
235 LONG expected_change_new_end) { | 234 LONG expected_change_new_end) { |
236 LONG start, end; | 235 LONG start = 0; |
237 TS_TEXTCHANGE change; | 236 LONG end = 0; |
| 237 TS_TEXTCHANGE change = {}; |
238 EXPECT_EQ(S_OK, | 238 EXPECT_EQ(S_OK, |
239 text_store_->InsertTextAtSelection(0, buffer, buffer_size, | 239 text_store_->InsertTextAtSelection(0, buffer, buffer_size, |
240 &start, &end, &change)); | 240 &start, &end, &change)); |
241 EXPECT_EQ(expected_start, start); | 241 EXPECT_EQ(expected_start, start); |
242 EXPECT_EQ(expected_end, end); | 242 EXPECT_EQ(expected_end, end); |
243 EXPECT_EQ(expected_change_start, change.acpStart); | 243 EXPECT_EQ(expected_change_start, change.acpStart); |
244 EXPECT_EQ(expected_change_old_end, change.acpOldEnd); | 244 EXPECT_EQ(expected_change_old_end, change.acpOldEnd); |
245 EXPECT_EQ(expected_change_new_end, change.acpNewEnd); | 245 EXPECT_EQ(expected_change_new_end, change.acpNewEnd); |
246 } | 246 } |
247 | 247 |
248 void InsertTextAtSelectionQueryOnlyTest(const wchar_t* buffer, | 248 void InsertTextAtSelectionQueryOnlyTest(const wchar_t* buffer, |
249 ULONG buffer_size, | 249 ULONG buffer_size, |
250 LONG expected_start, | 250 LONG expected_start, |
251 LONG expected_end) { | 251 LONG expected_end) { |
252 LONG start, end; | 252 LONG start = 0; |
| 253 LONG end = 0; |
253 EXPECT_EQ(S_OK, | 254 EXPECT_EQ(S_OK, |
254 text_store_->InsertTextAtSelection(TS_IAS_QUERYONLY, buffer, | 255 text_store_->InsertTextAtSelection(TS_IAS_QUERYONLY, buffer, |
255 buffer_size, &start, &end, | 256 buffer_size, &start, &end, |
256 NULL)); | 257 NULL)); |
257 EXPECT_EQ(expected_start, start); | 258 EXPECT_EQ(expected_start, start); |
258 EXPECT_EQ(expected_end, end); | 259 EXPECT_EQ(expected_end, end); |
259 } | 260 } |
260 | 261 |
261 void GetTextExtTest(TsViewCookie view_cookie, LONG acp_start, LONG acp_end, | 262 void GetTextExtTest(TsViewCookie view_cookie, LONG acp_start, LONG acp_end, |
262 LONG expected_left, LONG expected_top, | 263 LONG expected_left, LONG expected_top, |
263 LONG expected_right, LONG expected_bottom) { | 264 LONG expected_right, LONG expected_bottom) { |
264 RECT rect; | 265 RECT rect = {}; |
265 BOOL clipped; | 266 BOOL clipped = FALSE; |
266 EXPECT_EQ(S_OK, text_store_->GetTextExt(view_cookie, acp_start, acp_end, | 267 EXPECT_EQ(S_OK, text_store_->GetTextExt(view_cookie, acp_start, acp_end, |
267 &rect, &clipped)); | 268 &rect, &clipped)); |
268 EXPECT_EQ(expected_left, rect.left); | 269 EXPECT_EQ(expected_left, rect.left); |
269 EXPECT_EQ(expected_top, rect.top); | 270 EXPECT_EQ(expected_top, rect.top); |
270 EXPECT_EQ(expected_right, rect.right); | 271 EXPECT_EQ(expected_right, rect.right); |
271 EXPECT_EQ(expected_bottom, rect.bottom); | 272 EXPECT_EQ(expected_bottom, rect.bottom); |
272 EXPECT_EQ(FALSE, clipped); | 273 EXPECT_EQ(FALSE, clipped); |
273 } | 274 } |
274 | 275 |
275 void GetTextExtNoLayoutTest(TsViewCookie view_cookie, LONG acp_start, | 276 void GetTextExtNoLayoutTest(TsViewCookie view_cookie, LONG acp_start, |
276 LONG acp_end) { | 277 LONG acp_end) { |
277 RECT rect; | 278 RECT rect = {}; |
278 BOOL clipped; | 279 BOOL clipped = FALSE; |
279 EXPECT_EQ(TS_E_NOLAYOUT, | 280 EXPECT_EQ(TS_E_NOLAYOUT, |
280 text_store_->GetTextExt(view_cookie, acp_start, acp_end, | 281 text_store_->GetTextExt(view_cookie, acp_start, acp_end, |
281 &rect, &clipped)); | 282 &rect, &clipped)); |
282 } | 283 } |
283 | 284 |
284 TSFTextStore* text_store_; | 285 scoped_refptr<TSFTextStore> text_store_; |
| 286 |
| 287 private: |
| 288 DISALLOW_COPY_AND_ASSIGN(TSFTextStoreTestCallback); |
285 }; | 289 }; |
286 | 290 |
| 291 namespace { |
| 292 |
| 293 const HRESULT kInvalidResult = 0x12345678; |
| 294 |
287 TEST_F(TSFTextStoreTest, GetStatusTest) { | 295 TEST_F(TSFTextStoreTest, GetStatusTest) { |
288 TS_STATUS status; | 296 TS_STATUS status = {}; |
289 EXPECT_EQ(S_OK, text_store_->GetStatus(&status)); | 297 EXPECT_EQ(S_OK, text_store_->GetStatus(&status)); |
290 EXPECT_EQ(0, status.dwDynamicFlags); | 298 EXPECT_EQ(0, status.dwDynamicFlags); |
291 EXPECT_EQ(TS_SS_TRANSITORY | TS_SS_NOHIDDENTEXT, status.dwStaticFlags); | 299 EXPECT_EQ(TS_SS_TRANSITORY | TS_SS_NOHIDDENTEXT, status.dwStaticFlags); |
292 } | 300 } |
293 | 301 |
294 | |
295 class SyncRequestLockTestCallback : public TSFTextStoreTestCallback { | 302 class SyncRequestLockTestCallback : public TSFTextStoreTestCallback { |
296 public: | 303 public: |
297 explicit SyncRequestLockTestCallback(TSFTextStore* text_store) | 304 explicit SyncRequestLockTestCallback(TSFTextStore* text_store) |
298 : TSFTextStoreTestCallback(text_store) { | 305 : TSFTextStoreTestCallback(text_store) {} |
299 } | |
300 | 306 |
301 HRESULT LockGranted1(DWORD flags) { | 307 HRESULT LockGranted1(DWORD flags) { |
302 EXPECT_TRUE(HasReadLock()); | 308 EXPECT_TRUE(HasReadLock()); |
303 EXPECT_FALSE(HasReadWriteLock()); | 309 EXPECT_FALSE(HasReadWriteLock()); |
304 return S_OK; | 310 return S_OK; |
305 } | 311 } |
306 | 312 |
307 HRESULT LockGranted2(DWORD flags) { | 313 HRESULT LockGranted2(DWORD flags) { |
308 EXPECT_TRUE(HasReadLock()); | 314 EXPECT_TRUE(HasReadLock()); |
309 EXPECT_TRUE(HasReadWriteLock()); | 315 EXPECT_TRUE(HasReadWriteLock()); |
310 return S_OK; | 316 return S_OK; |
311 } | 317 } |
312 | 318 |
313 HRESULT LockGranted3(DWORD flags) { | 319 HRESULT LockGranted3(DWORD flags) { |
314 EXPECT_TRUE(HasReadLock()); | 320 EXPECT_TRUE(HasReadLock()); |
315 EXPECT_FALSE(HasReadWriteLock()); | 321 EXPECT_FALSE(HasReadWriteLock()); |
316 HRESULT result; | 322 HRESULT result = kInvalidResult; |
317 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READ | TS_LF_SYNC, &result)); | 323 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READ | TS_LF_SYNC, &result)); |
318 EXPECT_EQ(TS_E_SYNCHRONOUS, result); | 324 EXPECT_EQ(TS_E_SYNCHRONOUS, result); |
319 return S_OK; | 325 return S_OK; |
320 } | 326 } |
321 | 327 |
322 HRESULT LockGranted4(DWORD flags) { | 328 HRESULT LockGranted4(DWORD flags) { |
323 EXPECT_TRUE(HasReadLock()); | 329 EXPECT_TRUE(HasReadLock()); |
324 EXPECT_FALSE(HasReadWriteLock()); | 330 EXPECT_FALSE(HasReadWriteLock()); |
325 HRESULT result; | 331 HRESULT result = kInvalidResult; |
326 EXPECT_EQ(S_OK, | 332 EXPECT_EQ(S_OK, |
327 text_store_->RequestLock(TS_LF_READWRITE | TS_LF_SYNC, &result)); | 333 text_store_->RequestLock(TS_LF_READWRITE | TS_LF_SYNC, &result)); |
328 EXPECT_EQ(TS_E_SYNCHRONOUS, result); | 334 EXPECT_EQ(TS_E_SYNCHRONOUS, result); |
329 return S_OK; | 335 return S_OK; |
330 } | 336 } |
331 | 337 |
332 HRESULT LockGranted5(DWORD flags) { | 338 HRESULT LockGranted5(DWORD flags) { |
333 EXPECT_TRUE(HasReadLock()); | 339 EXPECT_TRUE(HasReadLock()); |
334 EXPECT_TRUE(HasReadWriteLock()); | 340 EXPECT_TRUE(HasReadWriteLock()); |
335 HRESULT result; | 341 HRESULT result = kInvalidResult; |
336 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READ | TS_LF_SYNC, &result)); | 342 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READ | TS_LF_SYNC, &result)); |
337 EXPECT_EQ(TS_E_SYNCHRONOUS, result); | 343 EXPECT_EQ(TS_E_SYNCHRONOUS, result); |
338 return S_OK; | 344 return S_OK; |
339 } | 345 } |
340 | 346 |
341 HRESULT LockGranted6(DWORD flags) { | 347 HRESULT LockGranted6(DWORD flags) { |
342 EXPECT_TRUE(HasReadLock()); | 348 EXPECT_TRUE(HasReadLock()); |
343 EXPECT_TRUE(HasReadWriteLock()); | 349 EXPECT_TRUE(HasReadWriteLock()); |
344 HRESULT result; | 350 HRESULT result = kInvalidResult; |
345 EXPECT_EQ(S_OK, | 351 EXPECT_EQ(S_OK, |
346 text_store_->RequestLock(TS_LF_READWRITE | TS_LF_SYNC, &result)); | 352 text_store_->RequestLock(TS_LF_READWRITE | TS_LF_SYNC, &result)); |
347 EXPECT_EQ(TS_E_SYNCHRONOUS, result); | 353 EXPECT_EQ(TS_E_SYNCHRONOUS, result); |
348 return S_OK; | 354 return S_OK; |
349 } | 355 } |
| 356 |
| 357 private: |
| 358 DISALLOW_COPY_AND_ASSIGN(SyncRequestLockTestCallback); |
350 }; | 359 }; |
351 | 360 |
352 TEST_F(TSFTextStoreTest, SynchronousRequestLockTest) { | 361 TEST_F(TSFTextStoreTest, SynchronousRequestLockTest) { |
353 SyncRequestLockTestCallback callback(text_store_); | 362 SyncRequestLockTestCallback callback(text_store_); |
354 EXPECT_CALL(*sink_, OnLockGranted(_)) | 363 EXPECT_CALL(*sink_, OnLockGranted(_)) |
355 .WillOnce(Invoke(&callback, &SyncRequestLockTestCallback::LockGranted1)) | 364 .WillOnce(Invoke(&callback, &SyncRequestLockTestCallback::LockGranted1)) |
356 .WillOnce(Invoke(&callback, &SyncRequestLockTestCallback::LockGranted2)) | 365 .WillOnce(Invoke(&callback, &SyncRequestLockTestCallback::LockGranted2)) |
357 .WillOnce(Invoke(&callback, &SyncRequestLockTestCallback::LockGranted3)) | 366 .WillOnce(Invoke(&callback, &SyncRequestLockTestCallback::LockGranted3)) |
358 .WillOnce(Invoke(&callback, &SyncRequestLockTestCallback::LockGranted4)) | 367 .WillOnce(Invoke(&callback, &SyncRequestLockTestCallback::LockGranted4)) |
359 .WillOnce(Invoke(&callback, &SyncRequestLockTestCallback::LockGranted5)) | 368 .WillOnce(Invoke(&callback, &SyncRequestLockTestCallback::LockGranted5)) |
360 .WillOnce(Invoke(&callback, &SyncRequestLockTestCallback::LockGranted6)); | 369 .WillOnce(Invoke(&callback, &SyncRequestLockTestCallback::LockGranted6)); |
361 | 370 |
362 HRESULT result; | 371 HRESULT result = kInvalidResult; |
363 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READ | TS_LF_SYNC, &result)); | 372 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READ | TS_LF_SYNC, &result)); |
364 EXPECT_EQ(S_OK, result); | 373 EXPECT_EQ(S_OK, result); |
| 374 result = kInvalidResult; |
365 EXPECT_EQ(S_OK, | 375 EXPECT_EQ(S_OK, |
366 text_store_->RequestLock(TS_LF_READWRITE | TS_LF_SYNC, &result)); | 376 text_store_->RequestLock(TS_LF_READWRITE | TS_LF_SYNC, &result)); |
367 EXPECT_EQ(S_OK, result); | 377 EXPECT_EQ(S_OK, result); |
368 | 378 |
369 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READ | TS_LF_SYNC, &result)); | 379 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READ | TS_LF_SYNC, &result)); |
370 EXPECT_EQ(S_OK, result); | 380 EXPECT_EQ(S_OK, result); |
| 381 result = kInvalidResult; |
371 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READ | TS_LF_SYNC, &result)); | 382 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READ | TS_LF_SYNC, &result)); |
372 EXPECT_EQ(S_OK, result); | 383 EXPECT_EQ(S_OK, result); |
373 | 384 |
| 385 result = kInvalidResult; |
374 EXPECT_EQ(S_OK, | 386 EXPECT_EQ(S_OK, |
375 text_store_->RequestLock(TS_LF_READWRITE | TS_LF_SYNC, &result)); | 387 text_store_->RequestLock(TS_LF_READWRITE | TS_LF_SYNC, &result)); |
376 EXPECT_EQ(S_OK, result); | 388 EXPECT_EQ(S_OK, result); |
| 389 result = kInvalidResult; |
377 EXPECT_EQ(S_OK, | 390 EXPECT_EQ(S_OK, |
378 text_store_->RequestLock(TS_LF_READWRITE | TS_LF_SYNC, &result)); | 391 text_store_->RequestLock(TS_LF_READWRITE | TS_LF_SYNC, &result)); |
379 EXPECT_EQ(S_OK, result); | 392 EXPECT_EQ(S_OK, result); |
380 } | 393 } |
381 | 394 |
382 class AsyncRequestLockTestCallback : public TSFTextStoreTestCallback { | 395 class AsyncRequestLockTestCallback : public TSFTextStoreTestCallback { |
383 public: | 396 public: |
384 explicit AsyncRequestLockTestCallback(TSFTextStore* text_store) | 397 explicit AsyncRequestLockTestCallback(TSFTextStore* text_store) |
385 : TSFTextStoreTestCallback(text_store), | 398 : TSFTextStoreTestCallback(text_store), |
386 state_(0) { | 399 state_(0) {} |
387 } | |
388 | 400 |
389 HRESULT LockGranted1(DWORD flags) { | 401 HRESULT LockGranted1(DWORD flags) { |
390 EXPECT_EQ(0, state_); | 402 EXPECT_EQ(0, state_); |
391 state_ = 1; | 403 state_ = 1; |
392 EXPECT_TRUE(HasReadLock()); | 404 EXPECT_TRUE(HasReadLock()); |
393 EXPECT_FALSE(HasReadWriteLock()); | 405 EXPECT_FALSE(HasReadWriteLock()); |
394 HRESULT result; | 406 HRESULT result = kInvalidResult; |
395 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READ, &result)); | 407 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READ, &result)); |
396 EXPECT_EQ(TS_S_ASYNC, result); | 408 EXPECT_EQ(TS_S_ASYNC, result); |
397 EXPECT_EQ(1, state_); | 409 EXPECT_EQ(1, state_); |
398 state_ = 2; | 410 state_ = 2; |
399 return S_OK; | 411 return S_OK; |
400 } | 412 } |
401 | 413 |
402 HRESULT LockGranted2(DWORD flags) { | 414 HRESULT LockGranted2(DWORD flags) { |
403 EXPECT_EQ(2, state_); | 415 EXPECT_EQ(2, state_); |
404 EXPECT_TRUE(HasReadLock()); | 416 EXPECT_TRUE(HasReadLock()); |
405 EXPECT_FALSE(HasReadWriteLock()); | 417 EXPECT_FALSE(HasReadWriteLock()); |
406 HRESULT result; | 418 HRESULT result = kInvalidResult; |
407 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READWRITE, &result)); | 419 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READWRITE, &result)); |
408 EXPECT_EQ(TS_S_ASYNC, result); | 420 EXPECT_EQ(TS_S_ASYNC, result); |
409 EXPECT_EQ(2, state_); | 421 EXPECT_EQ(2, state_); |
410 state_ = 3; | 422 state_ = 3; |
411 return S_OK; | 423 return S_OK; |
412 } | 424 } |
413 | 425 |
414 HRESULT LockGranted3(DWORD flags) { | 426 HRESULT LockGranted3(DWORD flags) { |
415 EXPECT_EQ(3, state_); | 427 EXPECT_EQ(3, state_); |
416 EXPECT_TRUE(HasReadLock()); | 428 EXPECT_TRUE(HasReadLock()); |
417 EXPECT_TRUE(HasReadWriteLock()); | 429 EXPECT_TRUE(HasReadWriteLock()); |
418 HRESULT result; | 430 HRESULT result = kInvalidResult; |
419 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READWRITE, &result)); | 431 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READWRITE, &result)); |
420 EXPECT_EQ(TS_S_ASYNC, result); | 432 EXPECT_EQ(TS_S_ASYNC, result); |
421 EXPECT_EQ(3, state_); | 433 EXPECT_EQ(3, state_); |
422 state_ = 4; | 434 state_ = 4; |
423 return S_OK; | 435 return S_OK; |
424 } | 436 } |
425 | 437 |
426 HRESULT LockGranted4(DWORD flags) { | 438 HRESULT LockGranted4(DWORD flags) { |
427 EXPECT_EQ(4, state_); | 439 EXPECT_EQ(4, state_); |
428 EXPECT_TRUE(HasReadLock()); | 440 EXPECT_TRUE(HasReadLock()); |
429 EXPECT_TRUE(HasReadWriteLock()); | 441 EXPECT_TRUE(HasReadWriteLock()); |
430 HRESULT result; | 442 HRESULT result = kInvalidResult; |
431 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READ, &result)); | 443 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READ, &result)); |
432 EXPECT_EQ(TS_S_ASYNC, result); | 444 EXPECT_EQ(TS_S_ASYNC, result); |
433 EXPECT_EQ(4, state_); | 445 EXPECT_EQ(4, state_); |
434 state_ = 5; | 446 state_ = 5; |
435 return S_OK; | 447 return S_OK; |
436 } | 448 } |
437 | 449 |
438 HRESULT LockGranted5(DWORD flags) { | 450 HRESULT LockGranted5(DWORD flags) { |
439 EXPECT_EQ(5, state_); | 451 EXPECT_EQ(5, state_); |
440 EXPECT_TRUE(HasReadLock()); | 452 EXPECT_TRUE(HasReadLock()); |
441 EXPECT_FALSE(HasReadWriteLock()); | 453 EXPECT_FALSE(HasReadWriteLock()); |
442 state_ = 6; | 454 state_ = 6; |
443 return S_OK; | 455 return S_OK; |
444 } | 456 } |
445 | 457 |
446 private: | 458 private: |
447 int state_; | 459 int state_; |
| 460 |
| 461 DISALLOW_COPY_AND_ASSIGN(AsyncRequestLockTestCallback); |
448 }; | 462 }; |
449 | 463 |
450 TEST_F(TSFTextStoreTest, AsynchronousRequestLockTest) { | 464 TEST_F(TSFTextStoreTest, AsynchronousRequestLockTest) { |
451 AsyncRequestLockTestCallback callback(text_store_); | 465 AsyncRequestLockTestCallback callback(text_store_); |
452 EXPECT_CALL(*sink_, OnLockGranted(_)) | 466 EXPECT_CALL(*sink_, OnLockGranted(_)) |
453 .WillOnce(Invoke(&callback, &AsyncRequestLockTestCallback::LockGranted1)) | 467 .WillOnce(Invoke(&callback, &AsyncRequestLockTestCallback::LockGranted1)) |
454 .WillOnce(Invoke(&callback, &AsyncRequestLockTestCallback::LockGranted2)) | 468 .WillOnce(Invoke(&callback, &AsyncRequestLockTestCallback::LockGranted2)) |
455 .WillOnce(Invoke(&callback, &AsyncRequestLockTestCallback::LockGranted3)) | 469 .WillOnce(Invoke(&callback, &AsyncRequestLockTestCallback::LockGranted3)) |
456 .WillOnce(Invoke(&callback, &AsyncRequestLockTestCallback::LockGranted4)) | 470 .WillOnce(Invoke(&callback, &AsyncRequestLockTestCallback::LockGranted4)) |
457 .WillOnce(Invoke(&callback, &AsyncRequestLockTestCallback::LockGranted5)); | 471 .WillOnce(Invoke(&callback, &AsyncRequestLockTestCallback::LockGranted5)); |
458 | 472 |
459 HRESULT result; | 473 HRESULT result = kInvalidResult; |
460 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READ, &result)); | 474 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READ, &result)); |
461 EXPECT_EQ(S_OK, result); | 475 EXPECT_EQ(S_OK, result); |
462 } | 476 } |
463 | 477 |
464 class RequestLockTextChangeTestCallback : public TSFTextStoreTestCallback { | 478 class RequestLockTextChangeTestCallback : public TSFTextStoreTestCallback { |
465 public: | 479 public: |
466 explicit RequestLockTextChangeTestCallback(TSFTextStore* text_store) | 480 explicit RequestLockTextChangeTestCallback(TSFTextStore* text_store) |
467 : TSFTextStoreTestCallback(text_store), | 481 : TSFTextStoreTestCallback(text_store), |
468 state_(0) { | 482 state_(0) {} |
469 } | |
470 | 483 |
471 HRESULT LockGranted1(DWORD flags) { | 484 HRESULT LockGranted1(DWORD flags) { |
472 EXPECT_EQ(0, state_); | 485 EXPECT_EQ(0, state_); |
473 state_ = 1; | 486 state_ = 1; |
474 EXPECT_TRUE(HasReadLock()); | 487 EXPECT_TRUE(HasReadLock()); |
475 EXPECT_TRUE(HasReadWriteLock()); | 488 EXPECT_TRUE(HasReadWriteLock()); |
476 | 489 |
477 *edit_flag() = true; | 490 *edit_flag() = true; |
478 SetInternalState(L"012345", 6, 6, 6); | 491 SetInternalState(L"012345", 6, 6, 6); |
479 composition_undelines()->clear(); | 492 composition_undelines()->clear(); |
(...skipping 12 matching lines...) Expand all Loading... |
492 EXPECT_EQ(3, state_); | 505 EXPECT_EQ(3, state_); |
493 EXPECT_EQ(L"", composition.text); | 506 EXPECT_EQ(L"", composition.text); |
494 EXPECT_EQ(0, composition.selection.start()); | 507 EXPECT_EQ(0, composition.selection.start()); |
495 EXPECT_EQ(0, composition.selection.end()); | 508 EXPECT_EQ(0, composition.selection.end()); |
496 EXPECT_EQ(0, composition.underlines.size()); | 509 EXPECT_EQ(0, composition.underlines.size()); |
497 state_ = 4; | 510 state_ = 4; |
498 } | 511 } |
499 | 512 |
500 HRESULT OnTextChange(DWORD flags, const TS_TEXTCHANGE* change) { | 513 HRESULT OnTextChange(DWORD flags, const TS_TEXTCHANGE* change) { |
501 EXPECT_EQ(4, state_); | 514 EXPECT_EQ(4, state_); |
502 HRESULT result; | 515 HRESULT result = kInvalidResult; |
503 state_ = 5; | 516 state_ = 5; |
504 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READWRITE, &result)); | 517 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READWRITE, &result)); |
505 EXPECT_EQ(S_OK, result); | 518 EXPECT_EQ(S_OK, result); |
506 EXPECT_EQ(6, state_); | 519 EXPECT_EQ(6, state_); |
507 state_ = 7; | 520 state_ = 7; |
508 return S_OK; | 521 return S_OK; |
509 } | 522 } |
510 | 523 |
511 HRESULT LockGranted2(DWORD flags) { | 524 HRESULT LockGranted2(DWORD flags) { |
512 EXPECT_EQ(5, state_); | 525 EXPECT_EQ(5, state_); |
513 EXPECT_TRUE(HasReadLock()); | 526 EXPECT_TRUE(HasReadLock()); |
514 EXPECT_TRUE(HasReadWriteLock()); | 527 EXPECT_TRUE(HasReadWriteLock()); |
515 state_ = 6; | 528 state_ = 6; |
516 return S_OK; | 529 return S_OK; |
517 } | 530 } |
518 | 531 |
519 private: | 532 private: |
520 int state_; | 533 int state_; |
| 534 |
| 535 DISALLOW_COPY_AND_ASSIGN(RequestLockTextChangeTestCallback); |
521 }; | 536 }; |
522 | 537 |
523 TEST_F(TSFTextStoreTest, RequestLockOnTextChangeTest) { | 538 TEST_F(TSFTextStoreTest, RequestLockOnTextChangeTest) { |
524 RequestLockTextChangeTestCallback callback(text_store_); | 539 RequestLockTextChangeTestCallback callback(text_store_); |
525 EXPECT_CALL(*sink_, OnLockGranted(_)) | 540 EXPECT_CALL(*sink_, OnLockGranted(_)) |
526 .WillOnce(Invoke(&callback, | 541 .WillOnce(Invoke(&callback, |
527 &RequestLockTextChangeTestCallback::LockGranted1)) | 542 &RequestLockTextChangeTestCallback::LockGranted1)) |
528 .WillOnce(Invoke(&callback, | 543 .WillOnce(Invoke(&callback, |
529 &RequestLockTextChangeTestCallback::LockGranted2)); | 544 &RequestLockTextChangeTestCallback::LockGranted2)); |
530 | 545 |
531 EXPECT_CALL(*sink_, OnSelectionChange()) | 546 EXPECT_CALL(*sink_, OnSelectionChange()) |
532 .WillOnce(Return(S_OK)); | 547 .WillOnce(Return(S_OK)); |
533 EXPECT_CALL(*sink_, OnLayoutChange(_, _)) | 548 EXPECT_CALL(*sink_, OnLayoutChange(_, _)) |
534 .WillOnce(Return(S_OK)); | 549 .WillOnce(Return(S_OK)); |
535 EXPECT_CALL(*sink_, OnTextChange(_, _)) | 550 EXPECT_CALL(*sink_, OnTextChange(_, _)) |
536 .WillOnce(Invoke(&callback, | 551 .WillOnce(Invoke(&callback, |
537 &RequestLockTextChangeTestCallback::OnTextChange)); | 552 &RequestLockTextChangeTestCallback::OnTextChange)); |
538 EXPECT_CALL(text_input_client_, InsertText(_)) | 553 EXPECT_CALL(text_input_client_, InsertText(_)) |
539 .WillOnce(Invoke(&callback, | 554 .WillOnce(Invoke(&callback, |
540 &RequestLockTextChangeTestCallback::InsertText)); | 555 &RequestLockTextChangeTestCallback::InsertText)); |
541 EXPECT_CALL(text_input_client_, SetCompositionText(_)) | 556 EXPECT_CALL(text_input_client_, SetCompositionText(_)) |
542 .WillOnce(Invoke(&callback, | 557 .WillOnce(Invoke(&callback, |
543 &RequestLockTextChangeTestCallback::SetCompositionText)); | 558 &RequestLockTextChangeTestCallback::SetCompositionText)); |
544 | 559 |
545 HRESULT result; | 560 HRESULT result = kInvalidResult; |
546 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READWRITE, &result)); | 561 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READWRITE, &result)); |
547 EXPECT_EQ(S_OK, result); | 562 EXPECT_EQ(S_OK, result); |
548 } | 563 } |
549 | 564 |
550 class SelectionTestCallback : public TSFTextStoreTestCallback { | 565 class SelectionTestCallback : public TSFTextStoreTestCallback { |
551 public: | 566 public: |
552 explicit SelectionTestCallback(TSFTextStore* text_store) | 567 explicit SelectionTestCallback(TSFTextStore* text_store) |
553 : TSFTextStoreTestCallback(text_store) { | 568 : TSFTextStoreTestCallback(text_store) {} |
554 } | |
555 | 569 |
556 HRESULT ReadLockGranted(DWORD flags) { | 570 HRESULT ReadLockGranted(DWORD flags) { |
557 SetInternalState(L"", 0, 0, 0); | 571 SetInternalState(L"", 0, 0, 0); |
558 | 572 |
559 GetSelectionTest(0, 0); | 573 GetSelectionTest(0, 0); |
560 SetSelectionTest(0, 0, TF_E_NOLOCK); | 574 SetSelectionTest(0, 0, TF_E_NOLOCK); |
561 | 575 |
562 SetInternalState(L"012345", 0, 0, 3); | 576 SetInternalState(L"012345", 0, 0, 3); |
563 | 577 |
564 GetSelectionTest(0, 3); | 578 GetSelectionTest(0, 3); |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
624 } | 638 } |
625 }; | 639 }; |
626 | 640 |
627 TEST_F(TSFTextStoreTest, SetGetSelectionTest) { | 641 TEST_F(TSFTextStoreTest, SetGetSelectionTest) { |
628 SelectionTestCallback callback(text_store_); | 642 SelectionTestCallback callback(text_store_); |
629 EXPECT_CALL(*sink_, OnLockGranted(_)) | 643 EXPECT_CALL(*sink_, OnLockGranted(_)) |
630 .WillOnce(Invoke(&callback, &SelectionTestCallback::ReadLockGranted)) | 644 .WillOnce(Invoke(&callback, &SelectionTestCallback::ReadLockGranted)) |
631 .WillOnce(Invoke(&callback, | 645 .WillOnce(Invoke(&callback, |
632 &SelectionTestCallback::ReadWriteLockGranted)); | 646 &SelectionTestCallback::ReadWriteLockGranted)); |
633 | 647 |
634 TS_SELECTION_ACP selection_buffer; | 648 TS_SELECTION_ACP selection_buffer = {}; |
635 ULONG fetched_count; | 649 ULONG fetched_count = 0; |
636 EXPECT_EQ(TS_E_NOLOCK, | 650 EXPECT_EQ(TS_E_NOLOCK, |
637 text_store_->GetSelection(0, 1, &selection_buffer, | 651 text_store_->GetSelection(0, 1, &selection_buffer, |
638 &fetched_count)); | 652 &fetched_count)); |
639 | 653 |
640 HRESULT result; | 654 HRESULT result = kInvalidResult; |
641 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READ, &result)); | 655 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READ, &result)); |
642 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READWRITE, &result)); | 656 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READWRITE, &result)); |
643 } | 657 } |
644 | 658 |
645 | |
646 class SetGetTextTestCallback : public TSFTextStoreTestCallback { | 659 class SetGetTextTestCallback : public TSFTextStoreTestCallback { |
647 public: | 660 public: |
648 explicit SetGetTextTestCallback(TSFTextStore* text_store) | 661 explicit SetGetTextTestCallback(TSFTextStore* text_store) |
649 : TSFTextStoreTestCallback(text_store) { | 662 : TSFTextStoreTestCallback(text_store) {} |
650 } | |
651 | 663 |
652 HRESULT ReadLockGranted(DWORD flags) { | 664 HRESULT ReadLockGranted(DWORD flags) { |
653 SetTextTest(0, 0, L"", TF_E_NOLOCK); | 665 SetTextTest(0, 0, L"", TF_E_NOLOCK); |
654 | 666 |
655 GetTextTest(0, -1, L"", 0); | 667 GetTextTest(0, -1, L"", 0); |
656 GetTextTest(0, 0, L"", 0); | 668 GetTextTest(0, 0, L"", 0); |
657 GetTextErrorTest(0, 1, TF_E_INVALIDPOS); | 669 GetTextErrorTest(0, 1, TF_E_INVALIDPOS); |
658 | 670 |
659 SetInternalState(L"0123456", 3, 3, 3); | 671 SetInternalState(L"0123456", 3, 3, 3); |
660 | 672 |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
813 GetTextTest(0, -1, L"012345abc", 9); | 825 GetTextTest(0, -1, L"012345abc", 9); |
814 GetSelectionTest(6, 9); | 826 GetSelectionTest(6, 9); |
815 | 827 |
816 SetInternalState(L"0123456", 3, 3, 3); | 828 SetInternalState(L"0123456", 3, 3, 3); |
817 SetTextTest(7, 7, L"abc", S_OK); | 829 SetTextTest(7, 7, L"abc", S_OK); |
818 GetTextTest(0, -1, L"0123456abc", 10); | 830 GetTextTest(0, -1, L"0123456abc", 10); |
819 GetSelectionTest(7, 10); | 831 GetSelectionTest(7, 10); |
820 | 832 |
821 return S_OK; | 833 return S_OK; |
822 } | 834 } |
| 835 |
| 836 private: |
| 837 DISALLOW_COPY_AND_ASSIGN(SetGetTextTestCallback); |
823 }; | 838 }; |
824 | 839 |
825 TEST_F(TSFTextStoreTest, SetGetTextTest) { | 840 TEST_F(TSFTextStoreTest, SetGetTextTest) { |
826 SetGetTextTestCallback callback(text_store_); | 841 SetGetTextTestCallback callback(text_store_); |
827 EXPECT_CALL(*sink_, OnLockGranted(_)) | 842 EXPECT_CALL(*sink_, OnLockGranted(_)) |
828 .WillOnce(Invoke(&callback, &SetGetTextTestCallback::ReadLockGranted)) | 843 .WillOnce(Invoke(&callback, &SetGetTextTestCallback::ReadLockGranted)) |
829 .WillOnce(Invoke(&callback, | 844 .WillOnce(Invoke(&callback, |
830 &SetGetTextTestCallback::ReadWriteLockGranted)); | 845 &SetGetTextTestCallback::ReadWriteLockGranted)); |
831 | 846 |
832 wchar_t buffer[1024]; | 847 wchar_t buffer[1024] = {}; |
833 ULONG text_buffer_copied; | 848 ULONG text_buffer_copied = 0; |
834 TS_RUNINFO run_info; | 849 TS_RUNINFO run_info = {}; |
835 ULONG run_info_buffer_copied; | 850 ULONG run_info_buffer_copied = 0; |
836 LONG next_acp; | 851 LONG next_acp = 0; |
837 EXPECT_EQ(TF_E_NOLOCK, | 852 EXPECT_EQ(TF_E_NOLOCK, |
838 text_store_->GetText(0, -1, buffer, 1024, &text_buffer_copied, | 853 text_store_->GetText(0, -1, buffer, 1024, &text_buffer_copied, |
839 &run_info, 1, &run_info_buffer_copied, | 854 &run_info, 1, &run_info_buffer_copied, |
840 &next_acp)); | 855 &next_acp)); |
841 TS_TEXTCHANGE change; | 856 TS_TEXTCHANGE change = {}; |
842 EXPECT_EQ(TF_E_NOLOCK, text_store_->SetText(0, 0, 0, L"abc", 3, &change)); | 857 EXPECT_EQ(TF_E_NOLOCK, text_store_->SetText(0, 0, 0, L"abc", 3, &change)); |
843 | 858 |
844 HRESULT result; | 859 HRESULT result = kInvalidResult; |
845 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READ, &result)); | 860 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READ, &result)); |
846 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READWRITE, &result)); | 861 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READWRITE, &result)); |
847 } | 862 } |
848 | 863 |
849 class InsertTextAtSelectionTestCallback : public TSFTextStoreTestCallback { | 864 class InsertTextAtSelectionTestCallback : public TSFTextStoreTestCallback { |
850 public: | 865 public: |
851 explicit InsertTextAtSelectionTestCallback(TSFTextStore* text_store) | 866 explicit InsertTextAtSelectionTestCallback(TSFTextStore* text_store) |
852 : TSFTextStoreTestCallback(text_store) { | 867 : TSFTextStoreTestCallback(text_store) {} |
853 } | |
854 | 868 |
855 HRESULT ReadLockGranted(DWORD flags) { | 869 HRESULT ReadLockGranted(DWORD flags) { |
856 const wchar_t kBuffer[] = L"0123456789"; | 870 const wchar_t kBuffer[] = L"0123456789"; |
857 | 871 |
858 SetInternalState(L"abcedfg", 0, 0, 0); | 872 SetInternalState(L"abcedfg", 0, 0, 0); |
859 InsertTextAtSelectionQueryOnlyTest(kBuffer, 10, 0, 0); | 873 InsertTextAtSelectionQueryOnlyTest(kBuffer, 10, 0, 0); |
860 GetSelectionTest(0, 0); | 874 GetSelectionTest(0, 0); |
861 InsertTextAtSelectionQueryOnlyTest(kBuffer, 0, 0, 0); | 875 InsertTextAtSelectionQueryOnlyTest(kBuffer, 0, 0, 0); |
862 | 876 |
863 SetInternalState(L"abcedfg", 0, 2, 5); | 877 SetInternalState(L"abcedfg", 0, 2, 5); |
864 InsertTextAtSelectionQueryOnlyTest(kBuffer, 10, 2, 5); | 878 InsertTextAtSelectionQueryOnlyTest(kBuffer, 10, 2, 5); |
865 GetSelectionTest(2, 5); | 879 GetSelectionTest(2, 5); |
866 InsertTextAtSelectionQueryOnlyTest(kBuffer, 0, 2, 5); | 880 InsertTextAtSelectionQueryOnlyTest(kBuffer, 0, 2, 5); |
867 | 881 |
868 LONG start, end; | 882 LONG start = 0; |
869 TS_TEXTCHANGE change; | 883 LONG end = 0; |
| 884 TS_TEXTCHANGE change = {}; |
870 EXPECT_EQ(TS_E_NOLOCK, | 885 EXPECT_EQ(TS_E_NOLOCK, |
871 text_store_->InsertTextAtSelection(0, kBuffer, 10, | 886 text_store_->InsertTextAtSelection(0, kBuffer, 10, |
872 &start, &end, &change)); | 887 &start, &end, &change)); |
873 return S_OK; | 888 return S_OK; |
874 } | 889 } |
875 | 890 |
876 HRESULT ReadWriteLockGranted(DWORD flags) { | 891 HRESULT ReadWriteLockGranted(DWORD flags) { |
877 SetInternalState(L"abcedfg", 0, 0, 0); | 892 SetInternalState(L"abcedfg", 0, 0, 0); |
878 | 893 |
879 const wchar_t kBuffer[] = L"0123456789"; | 894 const wchar_t kBuffer[] = L"0123456789"; |
(...skipping 21 matching lines...) Expand all Loading... |
901 GetSelectionTest(3, 13); | 916 GetSelectionTest(3, 13); |
902 GetTextTest(0, -1, L"abc0123456789", 13); | 917 GetTextTest(0, -1, L"abc0123456789", 13); |
903 | 918 |
904 SetInternalState(L"abcedfg", 0, 7, 7); | 919 SetInternalState(L"abcedfg", 0, 7, 7); |
905 InsertTextAtSelectionTest(kBuffer, 10, 7, 17, 7, 7, 17); | 920 InsertTextAtSelectionTest(kBuffer, 10, 7, 17, 7, 7, 17); |
906 GetSelectionTest(7, 17); | 921 GetSelectionTest(7, 17); |
907 GetTextTest(0, -1, L"abcedfg0123456789", 17); | 922 GetTextTest(0, -1, L"abcedfg0123456789", 17); |
908 | 923 |
909 return S_OK; | 924 return S_OK; |
910 } | 925 } |
| 926 |
| 927 private: |
| 928 DISALLOW_COPY_AND_ASSIGN(InsertTextAtSelectionTestCallback); |
911 }; | 929 }; |
912 | 930 |
913 TEST_F(TSFTextStoreTest, InsertTextAtSelectionTest) { | 931 TEST_F(TSFTextStoreTest, InsertTextAtSelectionTest) { |
914 InsertTextAtSelectionTestCallback callback(text_store_); | 932 InsertTextAtSelectionTestCallback callback(text_store_); |
915 EXPECT_CALL(*sink_, OnLockGranted(_)) | 933 EXPECT_CALL(*sink_, OnLockGranted(_)) |
916 .WillOnce(Invoke(&callback, | 934 .WillOnce(Invoke(&callback, |
917 &InsertTextAtSelectionTestCallback::ReadLockGranted)) | 935 &InsertTextAtSelectionTestCallback::ReadLockGranted)) |
918 .WillOnce( | 936 .WillOnce( |
919 Invoke(&callback, | 937 Invoke(&callback, |
920 &InsertTextAtSelectionTestCallback::ReadWriteLockGranted)); | 938 &InsertTextAtSelectionTestCallback::ReadWriteLockGranted)); |
921 | 939 |
922 HRESULT result; | 940 HRESULT result = kInvalidResult; |
923 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READ, &result)); | 941 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READ, &result)); |
| 942 EXPECT_EQ(S_OK, result); |
| 943 result = kInvalidResult; |
924 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READWRITE, &result)); | 944 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READWRITE, &result)); |
| 945 EXPECT_EQ(S_OK, result); |
925 } | 946 } |
926 | 947 |
927 class ScenarioTestCallback : public TSFTextStoreTestCallback { | 948 class ScenarioTestCallback : public TSFTextStoreTestCallback { |
928 public: | 949 public: |
929 explicit ScenarioTestCallback(TSFTextStore* text_store) | 950 explicit ScenarioTestCallback(TSFTextStore* text_store) |
930 : TSFTextStoreTestCallback(text_store) { | 951 : TSFTextStoreTestCallback(text_store) {} |
931 } | |
932 | 952 |
933 HRESULT LockGranted1(DWORD flags) { | 953 HRESULT LockGranted1(DWORD flags) { |
934 SetSelectionTest(0, 0, S_OK); | 954 SetSelectionTest(0, 0, S_OK); |
935 | 955 |
936 SetTextTest(0, 0, L"abc", S_OK); | 956 SetTextTest(0, 0, L"abc", S_OK); |
937 SetTextTest(1, 2, L"xyz", S_OK); | 957 SetTextTest(1, 2, L"xyz", S_OK); |
938 | 958 |
939 GetTextTest(0, -1, L"axyzc", 5); | 959 GetTextTest(0, -1, L"axyzc", 5); |
940 | 960 |
941 composition_undelines()->clear(); | 961 composition_undelines()->clear(); |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1016 void InsertText3(const string16& text) { | 1036 void InsertText3(const string16& text) { |
1017 EXPECT_EQ(L"ZCPc", text); | 1037 EXPECT_EQ(L"ZCPc", text); |
1018 } | 1038 } |
1019 | 1039 |
1020 void SetCompositionText3(const ui::CompositionText& composition) { | 1040 void SetCompositionText3(const ui::CompositionText& composition) { |
1021 EXPECT_EQ(L"", composition.text); | 1041 EXPECT_EQ(L"", composition.text); |
1022 EXPECT_EQ(0, composition.selection.start()); | 1042 EXPECT_EQ(0, composition.selection.start()); |
1023 EXPECT_EQ(0, composition.selection.end()); | 1043 EXPECT_EQ(0, composition.selection.end()); |
1024 EXPECT_EQ(0, composition.underlines.size()); | 1044 EXPECT_EQ(0, composition.underlines.size()); |
1025 } | 1045 } |
| 1046 |
| 1047 private: |
| 1048 DISALLOW_COPY_AND_ASSIGN(ScenarioTestCallback); |
1026 }; | 1049 }; |
1027 | 1050 |
1028 TEST_F(TSFTextStoreTest, ScenarioTest) { | 1051 TEST_F(TSFTextStoreTest, ScenarioTest) { |
1029 ScenarioTestCallback callback(text_store_); | 1052 ScenarioTestCallback callback(text_store_); |
1030 EXPECT_CALL(text_input_client_, SetCompositionText(_)) | 1053 EXPECT_CALL(text_input_client_, SetCompositionText(_)) |
1031 .WillOnce(Invoke(&callback, &ScenarioTestCallback::SetCompositionText1)) | 1054 .WillOnce(Invoke(&callback, &ScenarioTestCallback::SetCompositionText1)) |
1032 .WillOnce(Invoke(&callback, &ScenarioTestCallback::SetCompositionText2)) | 1055 .WillOnce(Invoke(&callback, &ScenarioTestCallback::SetCompositionText2)) |
1033 .WillOnce(Invoke(&callback, &ScenarioTestCallback::SetCompositionText3)); | 1056 .WillOnce(Invoke(&callback, &ScenarioTestCallback::SetCompositionText3)); |
1034 | 1057 |
1035 EXPECT_CALL(text_input_client_, InsertText(_)) | 1058 EXPECT_CALL(text_input_client_, InsertText(_)) |
(...skipping 10 matching lines...) Expand all Loading... |
1046 .WillOnce(Return(S_OK)); | 1069 .WillOnce(Return(S_OK)); |
1047 | 1070 |
1048 // OnLayoutChange will be called once after LockGranted3(). | 1071 // OnLayoutChange will be called once after LockGranted3(). |
1049 EXPECT_CALL(*sink_, OnLayoutChange(_, _)) | 1072 EXPECT_CALL(*sink_, OnLayoutChange(_, _)) |
1050 .WillOnce(Return(S_OK)); | 1073 .WillOnce(Return(S_OK)); |
1051 | 1074 |
1052 // OnTextChange will be called once after LockGranted3(). | 1075 // OnTextChange will be called once after LockGranted3(). |
1053 EXPECT_CALL(*sink_, OnTextChange(_, _)) | 1076 EXPECT_CALL(*sink_, OnTextChange(_, _)) |
1054 .WillOnce(Return(S_OK)); | 1077 .WillOnce(Return(S_OK)); |
1055 | 1078 |
1056 HRESULT result; | 1079 HRESULT result = kInvalidResult; |
1057 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READWRITE, &result)); | 1080 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READWRITE, &result)); |
| 1081 EXPECT_EQ(S_OK, result); |
| 1082 result = kInvalidResult; |
1058 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READWRITE, &result)); | 1083 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READWRITE, &result)); |
| 1084 EXPECT_EQ(S_OK, result); |
| 1085 result = kInvalidResult; |
1059 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READWRITE, &result)); | 1086 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READWRITE, &result)); |
| 1087 EXPECT_EQ(S_OK, result); |
1060 } | 1088 } |
1061 | 1089 |
1062 class GetTextExtTestCallback : public TSFTextStoreTestCallback { | 1090 class GetTextExtTestCallback : public TSFTextStoreTestCallback { |
1063 public: | 1091 public: |
1064 explicit GetTextExtTestCallback(TSFTextStore* text_store) | 1092 explicit GetTextExtTestCallback(TSFTextStore* text_store) |
1065 : TSFTextStoreTestCallback(text_store), | 1093 : TSFTextStoreTestCallback(text_store), |
1066 layout_prepared_character_num_(0) { | 1094 layout_prepared_character_num_(0) {} |
1067 } | |
1068 | 1095 |
1069 HRESULT LockGranted(DWORD flags) { | 1096 HRESULT LockGranted(DWORD flags) { |
1070 SetInternalState(L"0123456789012", 0, 0, 0); | 1097 SetInternalState(L"0123456789012", 0, 0, 0); |
1071 layout_prepared_character_num_ = 13; | 1098 layout_prepared_character_num_ = 13; |
1072 | 1099 |
1073 TsViewCookie view_cookie; | 1100 TsViewCookie view_cookie = 0; |
1074 EXPECT_EQ(S_OK, text_store_->GetActiveView(&view_cookie)); | 1101 EXPECT_EQ(S_OK, text_store_->GetActiveView(&view_cookie)); |
1075 GetTextExtTest(view_cookie, 0, 0, 11, 12, 11, 20); | 1102 GetTextExtTest(view_cookie, 0, 0, 11, 12, 11, 20); |
1076 GetTextExtTest(view_cookie, 0, 1, 11, 12, 20, 20); | 1103 GetTextExtTest(view_cookie, 0, 1, 11, 12, 20, 20); |
1077 GetTextExtTest(view_cookie, 0, 2, 11, 12, 30, 20); | 1104 GetTextExtTest(view_cookie, 0, 2, 11, 12, 30, 20); |
1078 GetTextExtTest(view_cookie, 9, 9, 100, 12, 100, 20); | 1105 GetTextExtTest(view_cookie, 9, 9, 100, 12, 100, 20); |
1079 GetTextExtTest(view_cookie, 9, 10, 101, 12, 110, 20); | 1106 GetTextExtTest(view_cookie, 9, 10, 101, 12, 110, 20); |
1080 GetTextExtTest(view_cookie, 10, 10, 110, 12, 110, 20); | 1107 GetTextExtTest(view_cookie, 10, 10, 110, 12, 110, 20); |
1081 GetTextExtTest(view_cookie, 11, 11, 20, 112, 20, 120); | 1108 GetTextExtTest(view_cookie, 11, 11, 20, 112, 20, 120); |
1082 GetTextExtTest(view_cookie, 11, 12, 21, 112, 30, 120); | 1109 GetTextExtTest(view_cookie, 11, 12, 21, 112, 30, 120); |
1083 GetTextExtTest(view_cookie, 9, 12, 101, 12, 30, 120); | 1110 GetTextExtTest(view_cookie, 9, 12, 101, 12, 30, 120); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1118 rect->set_height(8); | 1145 rect->set_height(8); |
1119 return true; | 1146 return true; |
1120 } | 1147 } |
1121 | 1148 |
1122 gfx::Rect GetCaretBounds() { | 1149 gfx::Rect GetCaretBounds() { |
1123 return gfx::Rect(1, 2, 3, 4); | 1150 return gfx::Rect(1, 2, 3, 4); |
1124 } | 1151 } |
1125 | 1152 |
1126 private: | 1153 private: |
1127 uint32 layout_prepared_character_num_; | 1154 uint32 layout_prepared_character_num_; |
| 1155 |
| 1156 DISALLOW_COPY_AND_ASSIGN(GetTextExtTestCallback); |
1128 }; | 1157 }; |
1129 | 1158 |
1130 TEST_F(TSFTextStoreTest, GetTextExtTest) { | 1159 TEST_F(TSFTextStoreTest, GetTextExtTest) { |
1131 GetTextExtTestCallback callback(text_store_); | 1160 GetTextExtTestCallback callback(text_store_); |
1132 EXPECT_CALL(text_input_client_, GetCaretBounds()) | 1161 EXPECT_CALL(text_input_client_, GetCaretBounds()) |
1133 .WillRepeatedly(Invoke(&callback, | 1162 .WillRepeatedly(Invoke(&callback, |
1134 &GetTextExtTestCallback::GetCaretBounds)); | 1163 &GetTextExtTestCallback::GetCaretBounds)); |
1135 | 1164 |
1136 EXPECT_CALL(text_input_client_, GetCompositionCharacterBounds(_, _)) | 1165 EXPECT_CALL(text_input_client_, GetCompositionCharacterBounds(_, _)) |
1137 .WillRepeatedly( | 1166 .WillRepeatedly( |
1138 Invoke(&callback, | 1167 Invoke(&callback, |
1139 &GetTextExtTestCallback::GetCompositionCharacterBounds)); | 1168 &GetTextExtTestCallback::GetCompositionCharacterBounds)); |
1140 | 1169 |
1141 EXPECT_CALL(*sink_, OnLockGranted(_)) | 1170 EXPECT_CALL(*sink_, OnLockGranted(_)) |
1142 .WillOnce(Invoke(&callback, &GetTextExtTestCallback::LockGranted)); | 1171 .WillOnce(Invoke(&callback, &GetTextExtTestCallback::LockGranted)); |
1143 | 1172 |
1144 HRESULT result; | 1173 HRESULT result = kInvalidResult; |
1145 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READ, &result)); | 1174 EXPECT_EQ(S_OK, text_store_->RequestLock(TS_LF_READ, &result)); |
| 1175 EXPECT_EQ(S_OK, result); |
1146 } | 1176 } |
1147 | 1177 |
| 1178 } // namespace |
1148 } // namespace ui | 1179 } // namespace ui |
OLD | NEW |