On 3/10/22 18:35, Bernhard Kölbl wrote:
Signed-off-by: Bernhard Kölbl besentv@gmail.com
dlls/windows.media.speech/tests/speech.c | 117 +++++++++++++++++++++++ 1 file changed, 117 insertions(+)
diff --git a/dlls/windows.media.speech/tests/speech.c b/dlls/windows.media.speech/tests/speech.c index 23e36f1e0a8..9e4f031a55f 100644 --- a/dlls/windows.media.speech/tests/speech.c +++ b/dlls/windows.media.speech/tests/speech.c @@ -29,6 +29,8 @@ #define WIDL_using_Windows_Foundation #define WIDL_using_Windows_Foundation_Collections #include "windows.foundation.h" +#define WIDL_using_Windows_Globalization +#include "windows.globalization.h" #define WIDL_using_Windows_Media_SpeechRecognition #include "windows.media.speechrecognition.h" #define WIDL_using_Windows_Media_SpeechSynthesis @@ -66,6 +68,15 @@ static void check_interface_(unsigned int line, void *obj, const IID *iid, BOOL IUnknown_Release(unk); }
+static const char *debugstr_hstring(HSTRING hstr) +{
- const WCHAR *str;
- UINT32 len;
- if (hstr && !((ULONG_PTR)hstr >> 16)) return "(invalid)";
- str = WindowsGetStringRawBuffer(hstr, &len);
- return wine_dbgstr_wn(str, len);
+}
- static void test_ActivationFactory(void) { static const WCHAR *synthesizer_name = L"Windows.Media.SpeechSynthesis.SpeechSynthesizer";
@@ -328,9 +339,115 @@ static void test_VoiceInformation(void) RoUninitialize(); }
+static void test_SpeechRecognizer(void) +{
- static const WCHAR *speech_recognition_name = L"Windows.Media.SpeechRecognition.SpeechRecognizer";
- ISpeechRecognizerFactory *sr_factory = NULL;
- ISpeechRecognizerStatics *sr_statics = NULL;
- ISpeechRecognizerStatics2 *sr_statics2 = NULL;
- ISpeechRecognizer *recognizer = NULL;
- ISpeechRecognizer2 *recognizer2 = NULL;
- IActivationFactory *factory = NULL;
- IInspectable *inspectable = NULL;
- IClosable *closable = NULL;
- ILanguage *language = NULL;
- HSTRING hstr, hstr_lang;
- HRESULT hr;
- LONG ref;
- hr = RoInitialize(RO_INIT_MULTITHREADED);
- ok(hr == S_OK, "RoInitialize failed, hr %#lx.\n", hr);
- hr = WindowsCreateString(speech_recognition_name, wcslen(speech_recognition_name), &hstr);
- ok(hr == S_OK, "WindowsCreateString failed, hr %#lx.n", hr);
- hr = RoGetActivationFactory(hstr, &IID_IActivationFactory, (void **)&factory);
- ok(hr == S_OK || broken(hr == REGDB_E_CLASSNOTREG), "RoGetActivationFactory failed, hr %#lx.\n", hr);
- if(hr == REGDB_E_CLASSNOTREG) /* Win 8 and 8.1 */
- {
win_skip("SpeechRecognizer activation factory not available!\n");
goto done;
- }
- hr = IActivationFactory_QueryInterface(factory, &IID_ISpeechRecognizerFactory, (void **)&sr_factory);
- ok(hr == S_OK, "IActivationFactory_QueryInterface IID_ISpeechRecognizer failed, hr %#lx.\n", hr);
- hr = IActivationFactory_QueryInterface(factory, &IID_ISpeechRecognizerStatics, (void **)&sr_statics);
- ok(hr == S_OK, "IActivationFactory_QueryInterface IID_ISpeechRecognizerStatics failed, hr %#lx.\n", hr);
- hr = ISpeechRecognizerStatics_get_SystemSpeechLanguage(sr_statics, &language);
- todo_wine ok(hr == S_OK, "ISpeechRecognizerStatics_SystemSpeechLanguage failed, hr %#lx.\n", hr);
- if(hr == S_OK)
- {
hr = ILanguage_get_LanguageTag(language, &hstr_lang);
ok(hr == S_OK, "ILanguage_get_LanguageTag failed, hr %#lx.\n", hr);
trace("SpeechRecognizer default language %s.\n", debugstr_hstring(hstr_lang));
ILanguage_Release(language);
- }
- ref = ISpeechRecognizerStatics_Release(sr_statics);
- ok(ref == 3, "Got unexpected ref %lu.\n", ref);
- hr = IActivationFactory_QueryInterface(factory, &IID_ISpeechRecognizerStatics2, (void **)&sr_statics2);
- ok(hr == S_OK || broken(hr == E_NOINTERFACE), "IActivationFactory_QueryInterface IID_ISpeechRecognizerStatics2 failed, hr %#lx.\n", hr);
- if(hr == S_OK) /* SpeechRecognizerStatics2 not implemented on Win10 1507 */
- {
ref = ISpeechRecognizerStatics2_Release(sr_statics2);
ok(ref == 3, "Got unexpected ref %lu.\n", ref);
- }
- ref = ISpeechRecognizerFactory_Release(sr_factory);
- ok(ref == 2, "Got unexpected ref %lu.\n", ref);
- ref = IActivationFactory_Release(factory);
- ok(ref == 1, "Got unexpected ref %lu.\n", ref);
- hr = RoActivateInstance(hstr, &inspectable);
- ok(hr == S_OK || broken(hr == 0x800455a0), "Got unexpected hr %#lx.\n", hr);
- if(hr == S_OK)
- {
hr = IInspectable_QueryInterface(inspectable, &IID_ISpeechRecognizer, (void **)&recognizer);
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
hr = IInspectable_QueryInterface(inspectable, &IID_ISpeechRecognizer2, (void **)&recognizer2);
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
hr = IInspectable_QueryInterface(inspectable, &IID_IClosable, (void **)&closable);
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
ref = IClosable_Release(closable);
ok(ref == 3, "Got unexpected ref %lu.\n", ref);
ref = ISpeechRecognizer2_Release(recognizer2);
ok(ref == 2, "Got unexpected ref %lu.\n", ref);
ref = ISpeechRecognizer_Release(recognizer);
ok(ref == 1, "Got unexpected ref %lu.\n", ref);
ref = IInspectable_Release(inspectable);
ok(!ref, "Got unexpected ref %lu.\n", ref);
- }
- else if(hr == 0x800455a0) /* Not sure what this hr is... Probably if a language pack is not installed. */
- {
win_skip("Could not init SpeechRecognizer with default language!\n");
- }
+done:
- WindowsDeleteString(hstr);
- RoUninitialize();
+}
- START_TEST(speech) { test_ActivationFactory(); test_SpeechSynthesizer(); test_VoiceInformation();
- test_SpeechRecognizer(); }
Looks like 0x800455a0 is some kind of generic error, google results suggest SPERR_WINRT_INTERNAL_ERROR though it's probably not worth defining it.
Also, it's usually preferred to add tests first, then add the implementation. This makes sure that the implementation gets a bit tested as soon as it is introduced, and with todo_wine addition/removal it gets clear what is now implemented and what isn't.
Cheers,