Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
3a456d51
Commit
3a456d51
authored
Mar 22, 2023
by
Connor McAdams
Committed by
Alexandre Julliard
Apr 04, 2023
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
uiautomationcore/tests: Add tests for default ProviderType_BaseHwnd clientside provider.
Signed-off-by:
Connor McAdams
<
cmcadams@codeweavers.com
>
parent
f197125c
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
133 additions
and
0 deletions
+133
-0
uiautomation.c
dlls/uiautomationcore/tests/uiautomation.c
+133
-0
No files found.
dlls/uiautomationcore/tests/uiautomation.c
View file @
3a456d51
...
@@ -20,6 +20,7 @@
...
@@ -20,6 +20,7 @@
#define COBJMACROS
#define COBJMACROS
#include <assert.h>
#include "windows.h"
#include "windows.h"
#include "initguid.h"
#include "initguid.h"
#include "uiautomation.h"
#include "uiautomation.h"
...
@@ -1291,10 +1292,14 @@ static void flush_method_sequence(void)
...
@@ -1291,10 +1292,14 @@ static void flush_method_sequence(void)
sequence_cnt
=
sequence_size
=
0
;
sequence_cnt
=
sequence_size
=
0
;
}
}
static
BOOL
method_sequences_enabled
=
TRUE
;
static
void
add_method_call
(
struct
Provider
*
prov
,
int
method
)
static
void
add_method_call
(
struct
Provider
*
prov
,
int
method
)
{
{
struct
prov_method_sequence
prov_method
=
{
0
};
struct
prov_method_sequence
prov_method
=
{
0
};
if
(
!
method_sequences_enabled
)
return
;
if
(
!
sequence
)
if
(
!
sequence
)
{
{
sequence_size
=
10
;
sequence_size
=
10
;
...
@@ -1321,6 +1326,7 @@ static void ok_method_sequence_(const struct prov_method_sequence *expected_list
...
@@ -1321,6 +1326,7 @@ static void ok_method_sequence_(const struct prov_method_sequence *expected_list
const
struct
prov_method_sequence
*
actual
;
const
struct
prov_method_sequence
*
actual
;
unsigned
int
count
=
0
;
unsigned
int
count
=
0
;
assert
(
method_sequences_enabled
);
add_method_call
(
NULL
,
0
);
add_method_call
(
NULL
,
0
);
actual
=
sequence
;
actual
=
sequence
;
...
@@ -12297,6 +12303,132 @@ static void test_CUIAutomation(void)
...
@@ -12297,6 +12303,132 @@ static void test_CUIAutomation(void)
CoUninitialize
();
CoUninitialize
();
}
}
static
const
struct
prov_method_sequence
default_hwnd_prov_props_seq
[]
=
{
{
&
Provider
,
PROV_GET_PROPERTY_VALUE
},
/* UIA_NativeWindowHandlePropertyId */
{
&
Provider
,
PROV_GET_PROVIDER_OPTIONS
,
METHOD_OPTIONAL
},
/* Only done on Windows 7. */
{
&
Provider_nc
,
PROV_GET_PROPERTY_VALUE
},
/* UIA_NativeWindowHandlePropertyId */
{
&
Provider_nc
,
PROV_GET_PROVIDER_OPTIONS
,
METHOD_OPTIONAL
},
/* Only done on Windows 7. */
{
&
Provider
,
PROV_GET_PROPERTY_VALUE
},
/* UIA_NamePropertyId */
{
&
Provider
,
PROV_GET_PROVIDER_OPTIONS
,
METHOD_OPTIONAL
},
/* Only done on Windows 7. */
{
&
Provider_nc
,
PROV_GET_PROPERTY_VALUE
},
/* UIA_NamePropertyId */
{
&
Provider_nc
,
PROV_GET_PROVIDER_OPTIONS
,
METHOD_OPTIONAL
},
/* Only done on Windows 7. */
{
&
Provider
,
PROV_GET_PROPERTY_VALUE
},
/* UIA_ClassNamePropertyId */
{
&
Provider
,
PROV_GET_PROVIDER_OPTIONS
,
METHOD_OPTIONAL
},
/* Only done on Windows 7. */
{
&
Provider_nc
,
PROV_GET_PROPERTY_VALUE
},
/* UIA_ClassNamePropertyId */
{
&
Provider_nc
,
PROV_GET_PROVIDER_OPTIONS
,
METHOD_OPTIONAL
},
/* Only done on Windows 7. */
{
&
Provider
,
PROV_GET_PROPERTY_VALUE
},
/* UIA_ProcessIdPropertyId */
{
&
Provider
,
PROV_GET_PROVIDER_OPTIONS
,
METHOD_TODO
},
{
&
Provider_nc
,
PROV_GET_PROPERTY_VALUE
},
/* UIA_ProcessIdPropertyId */
{
&
Provider_nc
,
PROV_GET_PROVIDER_OPTIONS
,
METHOD_TODO
},
{
0
}
};
#define test_node_hwnd_provider( node, hwnd ) \
test_node_hwnd_provider_( (node), (hwnd), __FILE__, __LINE__)
static
void
test_node_hwnd_provider_
(
HUIANODE
node
,
HWND
hwnd
,
const
char
*
file
,
int
line
)
{
WCHAR
buf
[
1024
]
=
{
0
};
HRESULT
hr
;
VARIANT
v
;
DWORD
pid
;
winetest_push_context
(
"UIA_NativeWindowHandlePropertyId"
);
hr
=
UiaGetPropertyValue
(
node
,
UIA_NativeWindowHandlePropertyId
,
&
v
);
ok_
(
file
,
line
)(
hr
==
S_OK
,
"Unexpected hr %#lx
\n
"
,
hr
);
todo_wine
ok_
(
file
,
line
)(
V_VT
(
&
v
)
==
VT_I4
,
"Unexpected VT %d
\n
"
,
V_VT
(
&
v
));
if
(
V_VT
(
&
v
)
==
VT_I4
)
ok_
(
file
,
line
)(
V_I4
(
&
v
)
==
HandleToUlong
(
hwnd
),
"V_I4(&v) = %#lx, expected %#lx
\n
"
,
V_I4
(
&
v
),
HandleToUlong
(
hwnd
));
VariantClear
(
&
v
);
winetest_pop_context
();
winetest_push_context
(
"UIA_NamePropertyId"
);
SendMessageW
(
hwnd
,
WM_GETTEXT
,
ARRAY_SIZE
(
buf
),
(
LPARAM
)
buf
);
hr
=
UiaGetPropertyValue
(
node
,
UIA_NamePropertyId
,
&
v
);
ok_
(
file
,
line
)(
hr
==
S_OK
,
"Unexpected hr %#lx
\n
"
,
hr
);
todo_wine
ok_
(
file
,
line
)(
V_VT
(
&
v
)
==
VT_BSTR
,
"Unexpected VT %d
\n
"
,
V_VT
(
&
v
));
if
(
V_VT
(
&
v
)
==
VT_BSTR
)
ok
(
!
lstrcmpW
(
V_BSTR
(
&
v
),
buf
),
"Unexpected BSTR %s
\n
"
,
wine_dbgstr_w
(
V_BSTR
(
&
v
)));
VariantClear
(
&
v
);
winetest_pop_context
();
winetest_push_context
(
"UIA_ClassNamePropertyId"
);
memset
(
buf
,
0
,
sizeof
(
buf
));
GetClassNameW
(
hwnd
,
buf
,
ARRAY_SIZE
(
buf
));
hr
=
UiaGetPropertyValue
(
node
,
UIA_ClassNamePropertyId
,
&
v
);
ok_
(
file
,
line
)(
hr
==
S_OK
,
"Unexpected hr %#lx
\n
"
,
hr
);
todo_wine
ok_
(
file
,
line
)(
V_VT
(
&
v
)
==
VT_BSTR
,
"Unexpected VT %d
\n
"
,
V_VT
(
&
v
));
if
(
V_VT
(
&
v
)
==
VT_BSTR
)
ok
(
!
lstrcmpW
(
V_BSTR
(
&
v
),
buf
),
"Unexpected BSTR %s
\n
"
,
wine_dbgstr_w
(
V_BSTR
(
&
v
)));
VariantClear
(
&
v
);
winetest_pop_context
();
GetWindowThreadProcessId
(
hwnd
,
&
pid
);
winetest_push_context
(
"UIA_ProcessIdPropertyId"
);
hr
=
UiaGetPropertyValue
(
node
,
UIA_ProcessIdPropertyId
,
&
v
);
ok_
(
file
,
line
)(
hr
==
S_OK
,
"Unexpected hr %#lx
\n
"
,
hr
);
todo_wine
ok_
(
file
,
line
)(
V_VT
(
&
v
)
==
VT_I4
,
"Unexpected VT %d
\n
"
,
V_VT
(
&
v
));
if
(
V_VT
(
&
v
)
==
VT_I4
)
ok_
(
file
,
line
)(
V_I4
(
&
v
)
==
pid
,
"V_I4(&v) = %#lx, expected %#lx
\n
"
,
V_I4
(
&
v
),
pid
);
VariantClear
(
&
v
);
winetest_pop_context
();
}
static
void
test_default_clientside_providers
(
void
)
{
HUIANODE
node
;
HRESULT
hr
;
HWND
hwnd
;
VARIANT
v
;
CoInitializeEx
(
NULL
,
COINIT_MULTITHREADED
);
hwnd
=
create_test_hwnd
(
"test_default_clientside_providers class"
);
method_sequences_enabled
=
FALSE
;
/*
* Test default BaseHwnd provider. Unlike the other default providers, the
* default BaseHwnd IRawElementProviderSimple is not available to test
* directly. To isolate the BaseHwnd provider, we set the node's nonclient
* provider to Provider_nc, and its Main provider to Provider. These
* providers will return nothing so that we can isolate properties coming
* from the BaseHwnd provider.
*/
initialize_provider
(
&
Provider_nc
,
ProviderOptions_ClientSideProvider
|
ProviderOptions_NonClientAreaProvider
,
hwnd
,
TRUE
);
initialize_provider
(
&
Provider
,
ProviderOptions_ClientSideProvider
,
hwnd
,
TRUE
);
Provider_nc
.
ignore_hwnd_prop
=
Provider
.
ignore_hwnd_prop
=
TRUE
;
prov_root
=
&
Provider
.
IRawElementProviderSimple_iface
;
SET_EXPECT
(
winproc_GETOBJECT_UiaRoot
);
/* Only sent on Win7. */
SET_EXPECT
(
winproc_GETOBJECT_CLIENT
);
hr
=
UiaNodeFromProvider
(
&
Provider_nc
.
IRawElementProviderSimple_iface
,
&
node
);
ok
(
hr
==
S_OK
,
"Unexpected hr %#lx.
\n
"
,
hr
);
ok
(
Provider
.
ref
==
2
,
"Unexpected refcnt %ld
\n
"
,
Provider
.
ref
);
ok
(
Provider_nc
.
ref
==
2
,
"Unexpected refcnt %ld
\n
"
,
Provider_nc
.
ref
);
CHECK_CALLED
(
winproc_GETOBJECT_UiaRoot
);
called_winproc_GETOBJECT_CLIENT
=
expect_winproc_GETOBJECT_CLIENT
=
0
;
hr
=
UiaGetPropertyValue
(
node
,
UIA_ProviderDescriptionPropertyId
,
&
v
);
ok
(
hr
==
S_OK
,
"Unexpected hr %#lx
\n
"
,
hr
);
check_node_provider_desc_prefix
(
V_BSTR
(
&
v
),
GetCurrentProcessId
(),
hwnd
);
check_node_provider_desc
(
V_BSTR
(
&
v
),
L"Nonclient"
,
L"Provider_nc"
,
FALSE
);
check_node_provider_desc_todo
(
V_BSTR
(
&
v
),
L"Main"
,
L"Provider"
,
FALSE
);
check_node_provider_desc_todo
(
V_BSTR
(
&
v
),
L"Hwnd"
,
NULL
,
TRUE
);
VariantClear
(
&
v
);
method_sequences_enabled
=
TRUE
;
Provider
.
ret_invalid_prop_type
=
Provider_nc
.
ret_invalid_prop_type
=
TRUE
;
test_node_hwnd_provider
(
node
,
hwnd
);
ok_method_sequence
(
default_hwnd_prov_props_seq
,
"default_hwnd_prov_props_seq"
);
UiaNodeRelease
(
node
);
ok
(
Provider
.
ref
==
1
,
"Unexpected refcnt %ld
\n
"
,
Provider
.
ref
);
ok
(
Provider_nc
.
ref
==
1
,
"Unexpected refcnt %ld
\n
"
,
Provider_nc
.
ref
);
DestroyWindow
(
hwnd
);
UnregisterClassA
(
"test_default_clientside_providers class"
,
NULL
);
CoUninitialize
();
}
/*
/*
* Once a process returns a UI Automation provider with
* Once a process returns a UI Automation provider with
* UiaReturnRawElementProvider it ends up in an implicit MTA until exit. This
* UiaReturnRawElementProvider it ends up in an implicit MTA until exit. This
...
@@ -12364,6 +12496,7 @@ START_TEST(uiautomation)
...
@@ -12364,6 +12496,7 @@ START_TEST(uiautomation)
test_UiaNavigate
();
test_UiaNavigate
();
test_UiaFind
();
test_UiaFind
();
test_CUIAutomation
();
test_CUIAutomation
();
test_default_clientside_providers
();
if
(
uia_dll
)
if
(
uia_dll
)
{
{
pUiaProviderFromIAccessible
=
(
void
*
)
GetProcAddress
(
uia_dll
,
"UiaProviderFromIAccessible"
);
pUiaProviderFromIAccessible
=
(
void
*
)
GetProcAddress
(
uia_dll
,
"UiaProviderFromIAccessible"
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment