[PATCH 4/4] windows.media.speech/tests: Add basic tests for the SpeechRecognizer class.
Rémi Bernon
rbernon at codeweavers.com
Thu Mar 10 11:55:15 CST 2022
On 3/10/22 18:35, Bernhard Kölbl wrote:
> Signed-off-by: Bernhard Kölbl <besentv at 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,
--
Rémi Bernon <rbernon at codeweavers.com>
More information about the wine-devel
mailing list