2 * Unit tests for IDxDiagContainer
4 * Copyright 2010 Andrew Nguyen
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
26 #include "wine/test.h"
28 static IDxDiagProvider
*pddp
;
29 static IDxDiagContainer
*pddc
;
31 static BOOL
create_root_IDxDiagContainer(void)
34 DXDIAG_INIT_PARAMS params
;
36 hr
= CoCreateInstance(&CLSID_DxDiagProvider
, NULL
, CLSCTX_INPROC_SERVER
,
37 &IID_IDxDiagProvider
, (LPVOID
*)&pddp
);
40 params
.dwSize
= sizeof(params
);
41 params
.dwDxDiagHeaderVersion
= DXDIAG_DX9_SDK_VERSION
;
42 params
.bAllowWHQLChecks
= FALSE
;
43 params
.pReserved
= NULL
;
44 hr
= IDxDiagProvider_Initialize(pddp
, ¶ms
);
47 hr
= IDxDiagProvider_GetRootContainer(pddp
, &pddc
);
51 IDxDiagProvider_Release(pddp
);
56 static void test_GetNumberOfChildContainers(void)
61 if (!create_root_IDxDiagContainer())
63 skip("Unable to create the root IDxDiagContainer\n");
67 hr
= IDxDiagContainer_GetNumberOfChildContainers(pddc
, NULL
);
68 ok(hr
== E_INVALIDARG
,
69 "Expected IDxDiagContainer::GetNumberOfChildContainers to return E_INVALIDARG, got 0x%08x\n", hr
);
71 hr
= IDxDiagContainer_GetNumberOfChildContainers(pddc
, &count
);
73 "Expected IDxDiagContainer::GetNumberOfChildContainers to return S_OK, got 0x%08x\n", hr
);
75 ok(count
!= 0, "Expected the number of child containers for the root container to be non-zero\n");
77 IDxDiagContainer_Release(pddc
);
78 IDxDiagProvider_Release(pddp
);
81 static void test_GetNumberOfProps(void)
86 if (!create_root_IDxDiagContainer())
88 skip("Unable to create the root IDxDiagContainer\n");
92 hr
= IDxDiagContainer_GetNumberOfProps(pddc
, NULL
);
93 ok(hr
== E_INVALIDARG
, "Expected IDxDiagContainer::GetNumberOfProps to return E_INVALIDARG, got 0x%08x\n", hr
);
95 hr
= IDxDiagContainer_GetNumberOfProps(pddc
, &count
);
96 ok(hr
== S_OK
, "Expected IDxDiagContainer::GetNumberOfProps to return S_OK, got 0x%08x\n", hr
);
98 ok(count
== 0, "Expected the number of properties for the root container to be zero\n");
100 IDxDiagContainer_Release(pddc
);
101 IDxDiagProvider_Release(pddp
);
104 static void test_EnumChildContainerNames(void)
107 WCHAR container
[256];
108 DWORD maxcount
, index
;
109 static const WCHAR testW
[] = {'t','e','s','t',0};
110 static const WCHAR zerotestW
[] = {0,'e','s','t',0};
112 if (!create_root_IDxDiagContainer())
114 skip("Unable to create the root IDxDiagContainer\n");
118 /* Test various combinations of invalid parameters. */
119 hr
= IDxDiagContainer_EnumChildContainerNames(pddc
, 0, NULL
, 0);
120 ok(hr
== E_INVALIDARG
,
121 "Expected IDxDiagContainer::EnumChildContainerNames to return E_INVALIDARG, got 0x%08x\n", hr
);
123 hr
= IDxDiagContainer_EnumChildContainerNames(pddc
, 0, NULL
, sizeof(container
)/sizeof(WCHAR
));
124 ok(hr
== E_INVALIDARG
,
125 "Expected IDxDiagContainer::EnumChildContainerNames to return E_INVALIDARG, got 0x%08x\n", hr
);
127 /* Test the conditions in which the output buffer can be modified. */
128 memcpy(container
, testW
, sizeof(testW
));
129 hr
= IDxDiagContainer_EnumChildContainerNames(pddc
, 0, container
, 0);
130 ok(hr
== E_INVALIDARG
,
131 "Expected IDxDiagContainer::EnumChildContainerNames to return E_INVALIDARG, got 0x%08x\n", hr
);
132 ok(!memcmp(container
, testW
, sizeof(testW
)),
133 "Expected the container buffer to be untouched, got %s\n", wine_dbgstr_w(container
));
135 memcpy(container
, testW
, sizeof(testW
));
136 hr
= IDxDiagContainer_EnumChildContainerNames(pddc
, ~0, container
, 0);
137 ok(hr
== E_INVALIDARG
,
138 "Expected IDxDiagContainer::EnumChildContainerNames to return E_INVALIDARG, got 0x%08x\n", hr
);
139 ok(!memcmp(container
, testW
, sizeof(testW
)),
140 "Expected the container buffer to be untouched, got %s\n", wine_dbgstr_w(container
));
142 memcpy(container
, testW
, sizeof(testW
));
143 hr
= IDxDiagContainer_EnumChildContainerNames(pddc
, ~0, container
, sizeof(container
)/sizeof(WCHAR
));
144 ok(hr
== E_INVALIDARG
,
145 "Expected IDxDiagContainer::EnumChildContainerNames to return E_INVALIDARG, got 0x%08x\n", hr
);
146 ok(!memcmp(container
, zerotestW
, sizeof(zerotestW
)),
147 "Expected the container buffer string to be empty, got %s\n", wine_dbgstr_w(container
));
149 hr
= IDxDiagContainer_GetNumberOfChildContainers(pddc
, &maxcount
);
150 ok(hr
== S_OK
, "Expected IDxDiagContainer::GetNumberOfChildContainers to return S_OK, got 0x%08x\n", hr
);
153 skip("IDxDiagContainer::GetNumberOfChildContainers failed\n");
157 trace("Starting child container enumeration of the root container:\n");
159 /* We should be able to enumerate as many child containers as the value
160 * that IDxDiagContainer::GetNumberOfChildContainers returns. */
161 for (index
= 0; index
<= maxcount
; index
++)
163 /* A buffer size of 1 is unlikely to be valid, as only a null terminator
164 * could be stored, and it is unlikely that a container name could be empty. */
165 DWORD buffersize
= 1;
166 memcpy(container
, testW
, sizeof(testW
));
167 hr
= IDxDiagContainer_EnumChildContainerNames(pddc
, index
, container
, buffersize
);
168 if (hr
== E_INVALIDARG
)
170 /* We should get here when index is one more than the maximum index value. */
171 ok(maxcount
== index
,
172 "Expected IDxDiagContainer::EnumChildContainerNames to return E_INVALIDARG "
173 "on the last index %d, got 0x%08x\n", index
, hr
);
174 ok(container
[0] == '\0',
175 "Expected the container buffer string to be empty, got %s\n", wine_dbgstr_w(container
));
178 else if (hr
== DXDIAG_E_INSUFFICIENT_BUFFER
)
182 ok(container
[0] == '\0',
183 "Expected the container buffer string to be empty, got %s\n", wine_dbgstr_w(container
));
185 /* Get the container name to compare against. */
186 hr
= IDxDiagContainer_EnumChildContainerNames(pddc
, index
, temp
, sizeof(temp
)/sizeof(WCHAR
));
188 "Expected IDxDiagContainer::EnumChildContainerNames to return S_OK, got 0x%08x\n", hr
);
190 /* Show that the DirectX SDK's stipulation that the buffer be at
191 * least 256 characters long is a mere suggestion, and smaller sizes
192 * can be acceptable also. IDxDiagContainer::EnumChildContainerNames
193 * doesn't provide a way of getting the exact size required, so the
194 * buffersize value will be iterated to at most 256 characters. */
195 for (buffersize
= 2; buffersize
<= 256; buffersize
++)
197 memcpy(container
, testW
, sizeof(testW
));
198 hr
= IDxDiagContainer_EnumChildContainerNames(pddc
, index
, container
, buffersize
);
199 if (hr
!= DXDIAG_E_INSUFFICIENT_BUFFER
)
202 ok(!memcmp(temp
, container
, sizeof(WCHAR
)*(buffersize
- 1)),
203 "Expected truncated container name string, got %s\n", wine_dbgstr_w(container
));
207 "Expected IDxDiagContainer::EnumChildContainerNames to return S_OK, "
208 "got hr = 0x%08x, buffersize = %d\n", hr
, buffersize
);
210 trace("pddc[%d] = %s, length = %d\n", index
, wine_dbgstr_w(container
), buffersize
);
214 ok(0, "IDxDiagContainer::EnumChildContainerNames unexpectedly returned 0x%08x\n", hr
);
220 IDxDiagContainer_Release(pddc
);
221 IDxDiagProvider_Release(pddp
);
224 static void test_GetChildContainer(void)
227 WCHAR container
[256] = {0};
228 IDxDiagContainer
*child
;
230 if (!create_root_IDxDiagContainer())
232 skip("Unable to create the root IDxDiagContainer\n");
236 /* Test various combinations of invalid parameters. */
237 hr
= IDxDiagContainer_GetChildContainer(pddc
, NULL
, NULL
);
238 ok(hr
== E_INVALIDARG
,
239 "Expected IDxDiagContainer::GetChildContainer to return E_INVALIDARG, got 0x%08x\n", hr
);
241 child
= (void*)0xdeadbeef;
242 hr
= IDxDiagContainer_GetChildContainer(pddc
, NULL
, &child
);
243 ok(hr
== E_INVALIDARG
,
244 "Expected IDxDiagContainer::GetChildContainer to return E_INVALIDARG, got 0x%08x\n", hr
);
245 ok(child
== (void*)0xdeadbeef, "Expected output pointer to be unchanged, got %p\n", child
);
247 hr
= IDxDiagContainer_GetChildContainer(pddc
, container
, NULL
);
248 ok(hr
== E_INVALIDARG
,
249 "Expected IDxDiagContainer::GetChildContainer to return E_INVALIDARG, got 0x%08x\n", hr
);
251 child
= (void*)0xdeadbeef;
252 hr
= IDxDiagContainer_GetChildContainer(pddc
, container
, &child
);
253 ok(hr
== E_INVALIDARG
,
254 "Expected IDxDiagContainer::GetChildContainer to return E_INVALIDARG, got 0x%08x\n", hr
);
255 ok(child
== NULL
, "Expected output pointer to be NULL, got %p\n", child
);
257 /* Get the name of a suitable child container. */
258 hr
= IDxDiagContainer_EnumChildContainerNames(pddc
, 0, container
, sizeof(container
)/sizeof(WCHAR
));
260 "Expected IDxDiagContainer::EnumChildContainerNames to return S_OK, got 0x%08x\n", hr
);
263 skip("IDxDiagContainer::EnumChildContainerNames failed\n");
267 child
= (void*)0xdeadbeef;
268 hr
= IDxDiagContainer_GetChildContainer(pddc
, container
, &child
);
270 "Expected IDxDiagContainer::GetChildContainer to return S_OK, got 0x%08x\n", hr
);
271 ok(child
!= NULL
&& child
!= (void*)0xdeadbeef, "Expected a valid output pointer, got %p\n", child
);
275 IDxDiagContainer
*ptr
;
277 /* Show that IDxDiagContainer::GetChildContainer returns a different pointer
278 * for multiple calls for the same container name. */
279 hr
= IDxDiagContainer_GetChildContainer(pddc
, container
, &ptr
);
281 "Expected IDxDiagContainer::GetChildContainer to return S_OK, got 0x%08x\n", hr
);
283 ok(ptr
!= child
, "Expected the two pointers (%p vs. %p) to be unequal\n", child
, ptr
);
285 IDxDiagContainer_Release(ptr
);
286 IDxDiagContainer_Release(child
);
290 IDxDiagContainer_Release(pddc
);
291 IDxDiagProvider_Release(pddp
);
294 static void test_dot_parsing(void)
297 WCHAR containerbufW
[256] = {0}, childbufW
[256] = {0};
303 const HRESULT expect
;
307 { ".%s.%s", E_INVALIDARG
},
308 { "%s.%s..", E_INVALIDARG
},
309 { ".%s.%s.", E_INVALIDARG
},
310 { "..%s.%s", E_INVALIDARG
},
313 if (!create_root_IDxDiagContainer())
315 skip("Unable to create the root IDxDiagContainer\n");
319 /* Find a container with a child container of its own. */
320 hr
= IDxDiagContainer_GetNumberOfChildContainers(pddc
, &count
);
321 ok(hr
== S_OK
, "Expected IDxDiagContainer::GetNumberOfChildContainers to return S_OK, got 0x%08x\n", hr
);
324 skip("IDxDiagContainer::GetNumberOfChildContainers failed\n");
328 for (index
= 0; index
< count
; index
++)
330 IDxDiagContainer
*child
;
332 hr
= IDxDiagContainer_EnumChildContainerNames(pddc
, index
, containerbufW
, sizeof(containerbufW
)/sizeof(WCHAR
));
333 ok(hr
== S_OK
, "Expected IDxDiagContainer_EnumChildContainerNames to return S_OK, got 0x%08x\n", hr
);
336 skip("IDxDiagContainer::EnumChildContainerNames failed\n");
340 hr
= IDxDiagContainer_GetChildContainer(pddc
, containerbufW
, &child
);
341 ok(hr
== S_OK
, "Expected IDxDiagContainer::GetChildContainer to return S_OK, got 0x%08x\n", hr
);
345 hr
= IDxDiagContainer_EnumChildContainerNames(child
, 0, childbufW
, sizeof(childbufW
)/sizeof(WCHAR
));
346 ok(hr
== S_OK
|| hr
== E_INVALIDARG
,
347 "Expected IDxDiagContainer::EnumChildContainerNames to return S_OK or E_INVALIDARG, got 0x%08x\n", hr
);
348 IDxDiagContainer_Release(child
);
355 if (!*containerbufW
|| !*childbufW
)
357 skip("Unable to find a suitable container\n");
361 trace("Testing IDxDiagContainer::GetChildContainer dot parsing with container %s and child container %s.\n",
362 wine_dbgstr_w(containerbufW
), wine_dbgstr_w(childbufW
));
364 for (i
= 0; i
< sizeof(test_strings
)/sizeof(test_strings
[0]); i
++)
366 IDxDiagContainer
*child
;
367 char containerbufA
[256];
369 char dotbufferA
[255 + 255 + 3 + 1];
370 WCHAR dotbufferW
[255 + 255 + 3 + 1]; /* containerbuf + childbuf + dots + null terminator */
372 WideCharToMultiByte(CP_ACP
, 0, containerbufW
, -1, containerbufA
, sizeof(containerbufA
), NULL
, NULL
);
373 WideCharToMultiByte(CP_ACP
, 0, childbufW
, -1, childbufA
, sizeof(childbufA
), NULL
, NULL
);
374 sprintf(dotbufferA
, test_strings
[i
].format
, containerbufA
, childbufA
);
375 MultiByteToWideChar(CP_ACP
, 0, dotbufferA
, -1, dotbufferW
, sizeof(dotbufferW
)/sizeof(WCHAR
));
377 trace("Trying container name %s\n", wine_dbgstr_w(dotbufferW
));
378 hr
= IDxDiagContainer_GetChildContainer(pddc
, dotbufferW
, &child
);
379 ok(hr
== test_strings
[i
].expect
,
380 "Expected IDxDiagContainer::GetChildContainer to return 0x%08x for %s, got 0x%08x\n",
381 test_strings
[i
].expect
, wine_dbgstr_w(dotbufferW
), hr
);
383 IDxDiagContainer_Release(child
);
387 IDxDiagContainer_Release(pddc
);
388 IDxDiagProvider_Release(pddp
);
391 static void test_EnumPropNames(void)
394 WCHAR container
[256], property
[256];
395 IDxDiagContainer
*child
= NULL
;
396 DWORD count
, index
, propcount
;
397 static const WCHAR testW
[] = {'t','e','s','t',0};
399 if (!create_root_IDxDiagContainer())
401 skip("Unable to create the root IDxDiagContainer\n");
405 /* Find a container with a non-zero number of properties. */
406 hr
= IDxDiagContainer_GetNumberOfChildContainers(pddc
, &count
);
407 ok(hr
== S_OK
, "Expected IDxDiagContainer::GetNumberOfChildContainers to return S_OK, got 0x%08x\n", hr
);
410 skip("IDxDiagContainer::GetNumberOfChildContainers failed\n");
414 for (index
= 0; index
< count
; index
++)
416 hr
= IDxDiagContainer_EnumChildContainerNames(pddc
, index
, container
, sizeof(container
)/sizeof(WCHAR
));
417 ok(hr
== S_OK
, "Expected IDxDiagContainer_EnumChildContainerNames to return S_OK, got 0x%08x\n", hr
);
420 skip("IDxDiagContainer::EnumChildContainerNames failed\n");
424 hr
= IDxDiagContainer_GetChildContainer(pddc
, container
, &child
);
425 ok(hr
== S_OK
, "Expected IDxDiagContainer::GetChildContainer to return S_OK, got 0x%08x\n", hr
);
429 hr
= IDxDiagContainer_GetNumberOfProps(child
, &propcount
);
430 ok(hr
== S_OK
, "Expected IDxDiagContainer::GetNumberOfProps to return S_OK, got 0x%08x\n", hr
);
434 IDxDiagContainer_Release(child
);
444 skip("Unable to find a container with non-zero property count\n");
448 hr
= IDxDiagContainer_EnumPropNames(child
, ~0, NULL
, 0);
449 ok(hr
== E_INVALIDARG
, "Expected IDxDiagContainer::EnumPropNames to return E_INVALIDARG, got 0x%08x\n", hr
);
451 memcpy(property
, testW
, sizeof(testW
));
452 hr
= IDxDiagContainer_EnumPropNames(child
, ~0, property
, 0);
453 ok(hr
== E_INVALIDARG
, "Expected IDxDiagContainer::EnumPropNames to return E_INVALIDARG, got 0x%08x\n", hr
);
454 ok(!memcmp(property
, testW
, sizeof(testW
)),
455 "Expected the property buffer to be unchanged, got %s\n", wine_dbgstr_w(property
));
457 memcpy(property
, testW
, sizeof(testW
));
458 hr
= IDxDiagContainer_EnumPropNames(child
, ~0, property
, sizeof(property
)/sizeof(WCHAR
));
459 ok(hr
== E_INVALIDARG
, "Expected IDxDiagContainer::EnumPropNames to return E_INVALIDARG, got 0x%08x\n", hr
);
460 ok(!memcmp(property
, testW
, sizeof(testW
)),
461 "Expected the property buffer to be unchanged, got %s\n", wine_dbgstr_w(property
));
463 trace("Starting property enumeration of the %s container:\n", wine_dbgstr_w(container
));
465 /* We should be able to enumerate as many properties as the value that
466 * IDxDiagContainer::GetNumberOfProps returns. */
467 for (index
= 0; index
<= propcount
; index
++)
469 /* A buffer size of 1 is unlikely to be valid, as only a null terminator
470 * could be stored, and it is unlikely that a property name could be empty. */
471 DWORD buffersize
= 1;
473 memcpy(property
, testW
, sizeof(testW
));
474 hr
= IDxDiagContainer_EnumPropNames(child
, index
, property
, buffersize
);
475 if (hr
== E_INVALIDARG
)
477 /* We should get here when index is one more than the maximum index value. */
478 ok(propcount
== index
,
479 "Expected IDxDiagContainer::EnumPropNames to return E_INVALIDARG "
480 "on the last index %d, got 0x%08x\n", index
, hr
);
481 ok(!memcmp(property
, testW
, sizeof(testW
)),
482 "Expected the property buffer to be unchanged, got %s\n", wine_dbgstr_w(property
));
485 else if (hr
== DXDIAG_E_INSUFFICIENT_BUFFER
)
489 ok(property
[0] == '\0',
490 "Expected the property buffer string to be empty, got %s\n", wine_dbgstr_w(property
));
491 hr
= IDxDiagContainer_EnumPropNames(child
, index
, temp
, sizeof(temp
)/sizeof(WCHAR
));
493 "Expected IDxDiagContainer::EnumPropNames to return S_OK, got 0x%08x\n", hr
);
495 /* Show that the DirectX SDK's stipulation that the buffer be at
496 * least 256 characters long is a mere suggestion, and smaller sizes
497 * can be acceptable also. IDxDiagContainer::EnumPropNames doesn't
498 * provide a way of getting the exact size required, so the buffersize
499 * value will be iterated to at most 256 characters. */
500 for (buffersize
= 2; buffersize
<= 256; buffersize
++)
502 memcpy(property
, testW
, sizeof(testW
));
503 hr
= IDxDiagContainer_EnumPropNames(child
, index
, property
, buffersize
);
504 if (hr
!= DXDIAG_E_INSUFFICIENT_BUFFER
)
507 ok(!memcmp(temp
, property
, sizeof(WCHAR
)*(buffersize
- 1)),
508 "Expected truncated property name string, got %s\n", wine_dbgstr_w(property
));
512 "Expected IDxDiagContainer::EnumPropNames to return S_OK, "
513 "got hr = 0x%08x, buffersize = %d\n", hr
, buffersize
);
515 trace("child[%d] = %s, length = %d\n", index
, wine_dbgstr_w(property
), buffersize
);
519 ok(0, "IDxDiagContainer::EnumPropNames unexpectedly returned 0x%08x\n", hr
);
524 IDxDiagContainer_Release(child
);
527 IDxDiagContainer_Release(pddc
);
528 IDxDiagProvider_Release(pddp
);
531 static void test_GetProp(void)
534 WCHAR container
[256], property
[256];
535 IDxDiagContainer
*child
= NULL
;
539 SAFEARRAYBOUND bound
;
540 static const WCHAR emptyW
[] = {0};
541 static const WCHAR testW
[] = {'t','e','s','t',0};
543 if (!create_root_IDxDiagContainer())
545 skip("Unable to create the root IDxDiagContainer\n");
549 /* Find a container with a property. */
550 hr
= IDxDiagContainer_GetNumberOfChildContainers(pddc
, &count
);
551 ok(hr
== S_OK
, "Expected IDxDiagContainer::GetNumberOfChildContainers to return S_OK, got 0x%08x\n", hr
);
554 skip("IDxDiagContainer::GetNumberOfChildContainers failed\n");
558 for (index
= 0; index
< count
; index
++)
560 hr
= IDxDiagContainer_EnumChildContainerNames(pddc
, index
, container
, sizeof(container
)/sizeof(WCHAR
));
561 ok(hr
== S_OK
, "Expected IDxDiagContainer_EnumChildContainerNames to return S_OK, got 0x%08x\n", hr
);
564 skip("IDxDiagContainer::EnumChildContainerNames failed\n");
568 hr
= IDxDiagContainer_GetChildContainer(pddc
, container
, &child
);
569 ok(hr
== S_OK
, "Expected IDxDiagContainer::GetChildContainer to return S_OK, got 0x%08x\n", hr
);
573 hr
= IDxDiagContainer_EnumPropNames(child
, 0, property
, sizeof(property
)/sizeof(WCHAR
));
574 ok(hr
== S_OK
|| hr
== E_INVALIDARG
,
575 "Expected IDxDiagContainer::EnumPropNames to return S_OK or E_INVALIDARG, got 0x%08x\n", hr
);
581 IDxDiagContainer_Release(child
);
589 skip("Unable to find a suitable container\n");
593 hr
= IDxDiagContainer_GetProp(child
, NULL
, NULL
);
594 ok(hr
== E_INVALIDARG
, "Expected IDxDiagContainer::GetProp to return E_INVALIDARG, got 0x%08x\n", hr
);
597 hr
= IDxDiagContainer_GetProp(child
, NULL
, &var
);
598 ok(hr
== E_INVALIDARG
, "Expected IDxDiagContainer::GetProp to return E_INVALIDARG, got 0x%08x\n", hr
);
599 ok(V_VT(&var
) == 0xdead, "Expected the variant to be untouched, got %u\n", V_VT(&var
));
601 hr
= IDxDiagContainer_GetProp(child
, emptyW
, NULL
);
602 ok(hr
== E_INVALIDARG
, "Expected IDxDiagContainer::GetProp to return E_INVALIDARG, got 0x%08x\n", hr
);
605 hr
= IDxDiagContainer_GetProp(child
, emptyW
, &var
);
606 ok(hr
== E_INVALIDARG
, "Expected IDxDiagContainer::GetProp to return E_INVALIDARG, got 0x%08x\n", hr
);
607 ok(V_VT(&var
) == 0xdead, "Expected the variant to be untouched, got %u\n", V_VT(&var
));
609 hr
= IDxDiagContainer_GetProp(child
, testW
, NULL
);
610 ok(hr
== E_INVALIDARG
, "Expected IDxDiagContainer::GetProp to return E_INVALIDARG, got 0x%08x\n", hr
);
613 hr
= IDxDiagContainer_GetProp(child
, testW
, &var
);
614 ok(hr
== E_INVALIDARG
, "Expected IDxDiagContainer::GetProp to return E_INVALIDARG, got 0x%08x\n", hr
);
615 ok(V_VT(&var
) == 0xdead, "Expected the variant to be untouched, got %u\n", V_VT(&var
));
618 hr
= IDxDiagContainer_GetProp(child
, property
, &var
);
619 ok(hr
== S_OK
, "Expected IDxDiagContainer::GetProp to return S_OK, got 0x%08x\n", hr
);
620 ok(V_VT(&var
) != VT_EMPTY
, "Expected the variant to be modified, got %d\n", V_VT(&var
));
622 /* Since the documentation for IDxDiagContainer::GetProp claims that the
623 * function reports return values from VariantCopy, try to exercise failure
624 * paths in handling the destination variant. */
626 /* Try an invalid variant type. */
628 hr
= IDxDiagContainer_GetProp(child
, property
, &var
);
629 ok(hr
== S_OK
, "Expected IDxDiagContainer::GetProp to return S_OK, got 0x%08x\n", hr
);
630 ok(V_VT(&var
) != 0xdead, "Expected the variant to be modified, got %d\n", V_VT(&var
));
632 /* Try passing a variant with a locked SAFEARRAY. */
635 sa
= SafeArrayCreate(VT_UI1
, 1, &bound
);
636 ok(sa
!= NULL
, "Expected SafeArrayCreate to return a valid pointer\n");
638 V_VT(&var
) = (VT_ARRAY
| VT_UI1
);
641 hr
= SafeArrayLock(sa
);
642 ok(hr
== S_OK
, "Expected SafeArrayLock to return S_OK, got 0x%08x\n", hr
);
644 hr
= IDxDiagContainer_GetProp(child
, property
, &var
);
645 ok(hr
== S_OK
, "Expected IDxDiagContainer::GetProp to return S_OK, got 0x%08x\n", hr
);
646 ok(V_VT(&var
) != (VT_ARRAY
| VT_UI1
), "Expected the variant to be modified\n");
648 hr
= SafeArrayUnlock(sa
);
649 ok(hr
== S_OK
, "Expected SafeArrayUnlock to return S_OK, got 0x%08x\n", hr
);
650 hr
= SafeArrayDestroy(sa
);
651 ok(hr
== S_OK
, "Expected SafeArrayDestroy to return S_OK, got 0x%08x\n", hr
);
652 IDxDiagContainer_Release(child
);
655 IDxDiagContainer_Release(pddc
);
656 IDxDiagProvider_Release(pddp
);
659 static void test_root_children(void)
661 static const WCHAR DxDiag_SystemInfo
[] = {'D','x','D','i','a','g','_','S','y','s','t','e','m','I','n','f','o',0};
662 static const WCHAR DxDiag_DisplayDevices
[] = {'D','x','D','i','a','g','_','D','i','s','p','l','a','y','D','e','v','i','c','e','s',0};
663 static const WCHAR DxDiag_DirectSound
[] = {'D','x','D','i','a','g','_','D','i','r','e','c','t','S','o','u','n','d',0};
664 static const WCHAR DxDiag_DirectMusic
[] = {'D','x','D','i','a','g','_','D','i','r','e','c','t','M','u','s','i','c',0};
665 static const WCHAR DxDiag_DirectInput
[] = {'D','x','D','i','a','g','_','D','i','r','e','c','t','I','n','p','u','t',0};
666 static const WCHAR DxDiag_DirectPlay
[] = {'D','x','D','i','a','g','_','D','i','r','e','c','t','P','l','a','y',0};
667 static const WCHAR DxDiag_SystemDevices
[] = {'D','x','D','i','a','g','_','S','y','s','t','e','m','D','e','v','i','c','e','s',0};
668 static const WCHAR DxDiag_DirectXFiles
[] = {'D','x','D','i','a','g','_','D','i','r','e','c','t','X','F','i','l','e','s',0};
669 static const WCHAR DxDiag_DirectShowFilters
[] = {'D','x','D','i','a','g','_','D','i','r','e','c','t','S','h','o','w','F','i','l','t','e','r','s',0};
670 static const WCHAR DxDiag_LogicalDisks
[] = {'D','x','D','i','a','g','_','L','o','g','i','c','a','l','D','i','s','k','s',0};
675 static const WCHAR
*root_children
[] = {
676 DxDiag_SystemInfo
, DxDiag_DisplayDevices
, DxDiag_DirectSound
,
677 DxDiag_DirectMusic
, DxDiag_DirectInput
, DxDiag_DirectPlay
,
678 DxDiag_SystemDevices
, DxDiag_DirectXFiles
, DxDiag_DirectShowFilters
,
682 if (!create_root_IDxDiagContainer())
684 skip("Unable to create the root IDxDiagContainer\n");
688 /* Verify the identity and ordering of the root container's children. */
689 hr
= IDxDiagContainer_GetNumberOfChildContainers(pddc
, &count
);
690 ok(hr
== S_OK
, "Expected IDxDiagContainer::GetNumberOfChildContainers to return S_OK, got 0x%08x\n", hr
);
693 skip("IDxDiagContainer::GetNumberOfChildContainers failed\n");
697 ok(count
== sizeof(root_children
)/sizeof(root_children
[0]),
698 "Got unexpected count %u for the number of child containers\n", count
);
700 if (count
!= sizeof(root_children
)/sizeof(root_children
[0]))
702 skip("Received unexpected number of child containers\n");
706 for (index
= 0; index
<= count
; index
++)
708 WCHAR container
[256];
710 hr
= IDxDiagContainer_EnumChildContainerNames(pddc
, index
, container
, sizeof(container
)/sizeof(WCHAR
));
711 if (hr
== E_INVALIDARG
)
714 "Expected IDxDiagContainer::EnumChildContainerNames to return "
715 "E_INVALIDARG on the last index %u\n", count
);
720 ok(!lstrcmpW(container
, root_children
[index
]),
721 "Expected container %s for index %u, got %s\n",
722 wine_dbgstr_w(root_children
[index
]), index
, wine_dbgstr_w(container
));
726 ok(0, "IDxDiagContainer::EnumChildContainerNames unexpectedly returned 0x%08x\n", hr
);
732 IDxDiagContainer_Release(pddc
);
733 IDxDiagProvider_Release(pddp
);
736 START_TEST(container
)
739 test_GetNumberOfChildContainers();
740 test_GetNumberOfProps();
741 test_EnumChildContainerNames();
742 test_GetChildContainer();
744 test_EnumPropNames();
747 test_root_children();