| /* | |
| * tests for the language neutral word breaker | |
| * | |
| * Copyright 2006 Mike McCormack for CodeWeavers | |
| * | |
| * This library is free software; you can redistribute it and/or | |
| * modify it under the terms of the GNU Lesser General Public | |
| * License as published by the Free Software Foundation; either | |
| * version 2.1 of the License, or (at your option) any later version. | |
| * | |
| * This library is distributed in the hope that it will be useful, | |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| * Lesser General Public License for more details. | |
| * | |
| * You should have received a copy of the GNU Lesser General Public | |
| * License along with this library; if not, write to the Free Software | |
| * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA | |
| */ | |
| #define COBJMACROS | |
| #define CONST_VTABLE | |
| #include <stdio.h> | |
| #include <ole2.h> | |
| #include "indexsrv.h" | |
| #include "wine/test.h" | |
| #include <initguid.h> | |
| DEFINE_GUID(CLSID_wb_neutral, 0x369647e0,0x17b0,0x11ce,0x99,0x50,0x00,0xaa,0x00,0x4b,0xbb,0x1f); | |
| DEFINE_GUID(_IID_IWordBreaker, 0xD53552C8,0x77E3,0x101A,0xB5,0x52,0x08,0x00,0x2B,0x33,0xB0,0xE6); | |
| static const WCHAR teststring[] = { | |
| 's','q','u','a','r','e',' ', | |
| 'c','i','r','c','l','e',' ', | |
| 't','r','i','a','n','g','l','e',' ', | |
| 'b','o','x',0 | |
| }; | |
| struct expected { | |
| UINT ofs; | |
| UINT len; | |
| WCHAR data[10]; | |
| }; | |
| static int wordnum; | |
| static struct expected testres[] = { | |
| { 0, 6, {'s','q','u','a','r','e',0 }}, | |
| { 7, 6, {'c','i','r','c','l','e',0 }}, | |
| { 14, 8, {'t','r','i','a','n','g','l','e',0 }}, | |
| { 23, 3, {'b','o','x',0}}, | |
| }; | |
| static HRESULT WINAPI ws_QueryInterface(IWordSink *iface, REFIID riid, void **ppvObject) | |
| { | |
| ok(0, "not expected\n"); | |
| return E_NOINTERFACE; | |
| } | |
| static ULONG WINAPI ws_AddRef(IWordSink *iface) | |
| { | |
| ok(0, "not expected\n"); | |
| return 2; | |
| } | |
| static ULONG WINAPI ws_Release(IWordSink *iface) | |
| { | |
| ok(0, "not expected\n"); | |
| return 1; | |
| } | |
| static HRESULT WINAPI ws_PutWord(IWordSink *iface, ULONG cwc, const WCHAR *pwcInBuf, | |
| ULONG cwcSrcLen, ULONG cwcSrcPos) | |
| { | |
| ok(testres[wordnum].len == cwcSrcLen, "wrong length\n"); | |
| ok(!cwcSrcPos ||(testres[wordnum].ofs == cwcSrcPos), "wrong offset\n"); | |
| ok(!memcmp(testres[wordnum].data, pwcInBuf, cwcSrcLen), "wrong data\n"); | |
| wordnum++; | |
| return S_OK; | |
| } | |
| static HRESULT WINAPI ws_PutAltWord(IWordSink *iface, ULONG cwc, const WCHAR *pwcInBuf, | |
| ULONG cwcSrcLen, ULONG cwcSrcPos) | |
| { | |
| ok(0, "not expected\n"); | |
| return S_OK; | |
| } | |
| static HRESULT WINAPI ws_StartAltPhrase(IWordSink *iface) | |
| { | |
| ok(0, "not expected\n"); | |
| return S_OK; | |
| } | |
| static HRESULT WINAPI ws_EndAltPhrase(IWordSink *iface) | |
| { | |
| ok(0, "not expected\n"); | |
| return S_OK; | |
| } | |
| static HRESULT WINAPI ws_PutBreak(IWordSink *iface, WORDREP_BREAK_TYPE breakType) | |
| { | |
| ok(0, "not expected\n"); | |
| return S_OK; | |
| } | |
| static const IWordSinkVtbl wsvt = | |
| { | |
| ws_QueryInterface, | |
| ws_AddRef, | |
| ws_Release, | |
| ws_PutWord, | |
| ws_PutAltWord, | |
| ws_StartAltPhrase, | |
| ws_EndAltPhrase, | |
| ws_PutBreak, | |
| }; | |
| typedef struct _wordsink_impl | |
| { | |
| IWordSink IWordSink_iface; | |
| } wordsink_impl; | |
| static wordsink_impl wordsink = { { &wsvt } }; | |
| static HRESULT WINAPI fillbuf_none(TEXT_SOURCE *ts) | |
| { | |
| return E_FAIL; | |
| } | |
| static HRESULT WINAPI fillbuf_many(TEXT_SOURCE *ts) | |
| { | |
| int i; | |
| if (ts->awcBuffer == NULL) | |
| ts->awcBuffer = teststring; | |
| else | |
| ts->awcBuffer += ts->iCur; | |
| if (!ts->awcBuffer[0]) | |
| return E_FAIL; | |
| for( i=0; ts->awcBuffer[i] && ts->awcBuffer[i] != ' '; i++) | |
| ; | |
| if (ts->awcBuffer[i] == ' ') | |
| i++; | |
| ts->iCur = 0; | |
| ts->iEnd = i; | |
| return S_OK; | |
| } | |
| START_TEST(infosoft) | |
| { | |
| HRESULT r; | |
| BOOL license; | |
| IWordBreaker *wb = NULL; | |
| TEXT_SOURCE ts; | |
| r = CoInitialize(NULL); | |
| ok( r == S_OK, "failed\n"); | |
| r = CoCreateInstance( &CLSID_wb_neutral, NULL, CLSCTX_INPROC_SERVER, | |
| &_IID_IWordBreaker, (LPVOID)&wb); | |
| if (FAILED(r)) | |
| return; | |
| r = IWordBreaker_Init( wb, FALSE, 0x100, &license ); | |
| ok( r == S_OK, "failed to init the wordbreaker\n"); | |
| /* ok( license == TRUE, "should be no license\n"); */ | |
| wordnum = 0; | |
| ts.pfnFillTextBuffer = fillbuf_none; | |
| ts.awcBuffer = teststring; | |
| ts.iEnd = lstrlenW(ts.awcBuffer); | |
| ts.iCur = 0; | |
| r = IWordBreaker_BreakText(wb, &ts, &wordsink.IWordSink_iface, NULL); | |
| ok( r == S_OK, "failed\n"); | |
| ok(wordnum == 4, "words not processed\n"); | |
| wordnum = 0; | |
| ts.pfnFillTextBuffer = fillbuf_many; | |
| ts.awcBuffer = teststring; | |
| ts.iEnd = 0; | |
| ts.iCur = 0; | |
| r = fillbuf_many(&ts); | |
| ok( r == S_OK, "failed\n"); | |
| r = IWordBreaker_BreakText(wb, &ts, &wordsink.IWordSink_iface, NULL); | |
| ok( r == S_OK, "failed\n"); | |
| ok(wordnum == 4, "words not processed\n"); | |
| IWordBreaker_Release( wb ); | |
| CoUninitialize(); | |
| } |