2017-09-28 09:40:47 +02:00
|
|
|
/*
|
|
|
|
* Speech API (SAPI) token tests.
|
|
|
|
*
|
|
|
|
* Copyright (C) 2017 Huw Davies
|
|
|
|
*
|
|
|
|
* 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
|
|
|
|
|
|
|
|
#include "initguid.h"
|
|
|
|
#include "sapiddk.h"
|
|
|
|
#include "sperror.h"
|
|
|
|
|
|
|
|
#include "wine/test.h"
|
|
|
|
|
|
|
|
static void test_data_key(void)
|
|
|
|
{
|
|
|
|
ISpRegDataKey *data_key;
|
|
|
|
HRESULT hr;
|
|
|
|
HKEY key;
|
|
|
|
LONG res;
|
|
|
|
|
|
|
|
hr = CoCreateInstance( &CLSID_SpDataKey, NULL, CLSCTX_INPROC_SERVER,
|
|
|
|
&IID_ISpRegDataKey, (void **)&data_key );
|
|
|
|
ok( hr == S_OK, "got %08x\n", hr );
|
|
|
|
|
|
|
|
res = RegCreateKeyExA( HKEY_CURRENT_USER, "Software\\Winetest\\sapi", 0, NULL, 0, KEY_ALL_ACCESS,
|
|
|
|
NULL, &key, NULL );
|
|
|
|
ok( res == ERROR_SUCCESS, "got %d\n", res );
|
|
|
|
|
|
|
|
hr = ISpRegDataKey_SetKey( data_key, key, FALSE );
|
|
|
|
ok( hr == S_OK, "got %08x\n", hr );
|
|
|
|
hr = ISpRegDataKey_SetKey( data_key, key, FALSE );
|
|
|
|
ok( hr == SPERR_ALREADY_INITIALIZED, "got %08x\n", hr );
|
|
|
|
|
|
|
|
ISpRegDataKey_Release( data_key );
|
|
|
|
}
|
|
|
|
|
2017-09-28 09:40:54 +02:00
|
|
|
static void test_token_category(void)
|
|
|
|
{
|
|
|
|
ISpObjectTokenCategory *cat;
|
|
|
|
IEnumSpObjectTokens *enum_tokens;
|
|
|
|
HRESULT hr;
|
|
|
|
WCHAR bogus[] = {'b','o','g','u','s',0};
|
|
|
|
ULONG count;
|
|
|
|
|
|
|
|
hr = CoCreateInstance( &CLSID_SpObjectTokenCategory, NULL, CLSCTX_INPROC_SERVER,
|
|
|
|
&IID_ISpObjectTokenCategory, (void **)&cat );
|
|
|
|
ok( hr == S_OK, "got %08x\n", hr );
|
|
|
|
|
|
|
|
hr = ISpObjectTokenCategory_EnumTokens( cat, NULL, NULL, &enum_tokens );
|
|
|
|
ok( hr == SPERR_UNINITIALIZED, "got %08x\n", hr );
|
|
|
|
|
|
|
|
hr = ISpObjectTokenCategory_SetId( cat, bogus, FALSE );
|
|
|
|
ok( hr == SPERR_INVALID_REGISTRY_KEY, "got %08x\n", hr );
|
|
|
|
|
|
|
|
hr = ISpObjectTokenCategory_SetId( cat, SPCAT_VOICES, FALSE );
|
|
|
|
ok( hr == S_OK, "got %08x\n", hr );
|
|
|
|
|
|
|
|
hr = ISpObjectTokenCategory_SetId( cat, SPCAT_VOICES, FALSE );
|
|
|
|
ok( hr == SPERR_ALREADY_INITIALIZED, "got %08x\n", hr );
|
|
|
|
|
|
|
|
hr = ISpObjectTokenCategory_EnumTokens( cat, NULL, NULL, &enum_tokens );
|
|
|
|
ok( hr == S_OK, "got %08x\n", hr );
|
|
|
|
|
|
|
|
hr = IEnumSpObjectTokens_GetCount( enum_tokens, &count );
|
|
|
|
ok( hr == S_OK, "got %08x\n", hr );
|
|
|
|
|
|
|
|
IEnumSpObjectTokens_Release( enum_tokens );
|
|
|
|
ISpObjectTokenCategory_Release( cat );
|
|
|
|
}
|
|
|
|
|
2017-09-28 09:40:51 +02:00
|
|
|
static void test_token_enum(void)
|
|
|
|
{
|
|
|
|
ISpObjectTokenEnumBuilder *token_enum;
|
|
|
|
HRESULT hr;
|
|
|
|
ISpObjectToken *token;
|
|
|
|
ULONG count;
|
|
|
|
|
|
|
|
hr = CoCreateInstance( &CLSID_SpObjectTokenEnum, NULL, CLSCTX_INPROC_SERVER,
|
|
|
|
&IID_ISpObjectTokenEnumBuilder, (void **)&token_enum );
|
|
|
|
ok( hr == S_OK, "got %08x\n", hr );
|
|
|
|
|
|
|
|
hr = ISpObjectTokenEnumBuilder_GetCount( token_enum, &count );
|
|
|
|
ok( hr == SPERR_UNINITIALIZED, "got %08x\n", hr );
|
|
|
|
|
|
|
|
hr = ISpObjectTokenEnumBuilder_Next( token_enum, 1, &token, &count );
|
|
|
|
ok( hr == SPERR_UNINITIALIZED, "got %08x\n", hr );
|
|
|
|
|
|
|
|
hr = ISpObjectTokenEnumBuilder_SetAttribs( token_enum, NULL, NULL );
|
|
|
|
ok( hr == S_OK, "got %08x\n", hr );
|
|
|
|
|
|
|
|
count = 0xdeadbeef;
|
|
|
|
hr = ISpObjectTokenEnumBuilder_GetCount( token_enum, &count );
|
|
|
|
ok( hr == S_OK, "got %08x\n", hr );
|
|
|
|
ok( count == 0, "got %u\n", count );
|
|
|
|
|
|
|
|
count = 0xdeadbeef;
|
|
|
|
hr = ISpObjectTokenEnumBuilder_Next( token_enum, 1, &token, &count );
|
|
|
|
ok( hr == S_FALSE, "got %08x\n", hr );
|
|
|
|
ok( count == 0, "got %u\n", count );
|
|
|
|
|
|
|
|
ISpObjectTokenEnumBuilder_Release( token_enum );
|
|
|
|
}
|
|
|
|
|
2020-09-11 21:42:50 +02:00
|
|
|
static void test_default_token_id(void)
|
|
|
|
{
|
|
|
|
ISpObjectTokenCategory *cat;
|
|
|
|
HRESULT hr;
|
|
|
|
LPWSTR token_id = NULL;
|
|
|
|
LONG res;
|
|
|
|
WCHAR regvalue[512];
|
|
|
|
DWORD regvalue_size;
|
|
|
|
|
|
|
|
hr = CoCreateInstance( &CLSID_SpObjectTokenCategory, NULL, CLSCTX_INPROC_SERVER,
|
|
|
|
&IID_ISpObjectTokenCategory, (void **)&cat );
|
|
|
|
ok( hr == S_OK, "got %08x\n", hr );
|
|
|
|
|
|
|
|
token_id = (LPWSTR)0xdeadbeef;
|
|
|
|
hr = ISpObjectTokenCategory_GetDefaultTokenId( cat, &token_id );
|
|
|
|
ok( hr == SPERR_UNINITIALIZED, "got %08x\n", hr );
|
|
|
|
ok( token_id == (LPWSTR)0xdeadbeef, "got %p\n", token_id );
|
|
|
|
|
|
|
|
hr = ISpObjectTokenCategory_GetDefaultTokenId( cat, NULL );
|
|
|
|
ok( hr == SPERR_UNINITIALIZED, "got %08x\n", hr );
|
|
|
|
|
|
|
|
hr = ISpObjectTokenCategory_SetId( cat, SPCAT_AUDIOOUT, FALSE );
|
|
|
|
ok( hr == S_OK, "got %08x\n", hr );
|
|
|
|
|
|
|
|
hr = ISpObjectTokenCategory_GetDefaultTokenId( cat, NULL );
|
|
|
|
ok( hr == E_POINTER, "got %08x\n", hr );
|
|
|
|
|
|
|
|
token_id = (LPWSTR)0xdeadbeef;
|
|
|
|
hr = ISpObjectTokenCategory_GetDefaultTokenId( cat, &token_id );
|
|
|
|
|
|
|
|
/* AudioOutput under windows server returns this error */
|
|
|
|
if (hr == SPERR_NOT_FOUND) {
|
|
|
|
/* also happens if TokenEnums/Tokens is empty or doesn't exist */
|
|
|
|
skip( "AudioOutput category not found for GetDefaultTokenId\n" );
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
ok( hr == S_OK, "got %08x\n", hr );
|
|
|
|
ok( token_id != (LPWSTR)0xdeadbeef && token_id != NULL, "got %p\n", token_id );
|
|
|
|
|
|
|
|
regvalue_size = sizeof( regvalue );
|
|
|
|
res = RegGetValueW( HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Speech\\AudioOutput",
|
|
|
|
L"DefaultDefaultTokenId", RRF_RT_REG_SZ, NULL,
|
|
|
|
(LPVOID)®value, ®value_size);
|
|
|
|
if (res == ERROR_FILE_NOT_FOUND) {
|
|
|
|
skip( "DefaultDefaultTokenId not found for AudioOutput category (%s)\n",
|
|
|
|
wine_dbgstr_w(token_id) );
|
|
|
|
} else {
|
|
|
|
ok( res == ERROR_SUCCESS, "got %08x\n", res );
|
|
|
|
ok( !wcscmp(regvalue, token_id),
|
|
|
|
"GetDefaultTokenId (%s) should be equal to the DefaultDefaultTokenId key (%s)\n",
|
|
|
|
wine_dbgstr_w(token_id), wine_dbgstr_w(regvalue) );
|
|
|
|
}
|
|
|
|
|
|
|
|
CoTaskMemFree( token_id );
|
|
|
|
ISpObjectTokenCategory_Release( cat );
|
|
|
|
}
|
|
|
|
|
2017-09-28 09:40:47 +02:00
|
|
|
START_TEST(token)
|
|
|
|
{
|
|
|
|
CoInitialize( NULL );
|
|
|
|
test_data_key();
|
2017-09-28 09:40:54 +02:00
|
|
|
test_token_category();
|
2017-09-28 09:40:51 +02:00
|
|
|
test_token_enum();
|
2020-09-11 21:42:50 +02:00
|
|
|
test_default_token_id();
|
2017-09-28 09:40:47 +02:00
|
|
|
CoUninitialize();
|
|
|
|
}
|