2 * Copyright 2008 James Hawkins
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 #define WIN32_NO_STATUS
21 #define COM_NO_WINDOWS_H
28 //#include <windows.h>
33 //#include <mscoree.h>
38 #include <wine/test.h>
40 /* ok-like statement which takes two unicode strings or one unicode and one ANSI string as arguments */
41 static CHAR string1
[MAX_PATH
];
43 #define ok_aw(aString, wString) \
44 WideCharToMultiByte(CP_ACP, 0, wString, -1, string1, MAX_PATH, NULL, NULL); \
45 if (lstrcmpA(string1, aString) != 0) \
46 ok(0, "Expected \"%s\", got \"%s\"\n", aString, string1);
48 static HRESULT (WINAPI
*pCreateAssemblyNameObject
)(IAssemblyName
**ppAssemblyNameObj
,
49 LPCWSTR szAssemblyName
, DWORD dwFlags
,
51 static HRESULT (WINAPI
*pLoadLibraryShim
)(LPCWSTR szDllName
, LPCWSTR szVersion
,
52 LPVOID pvReserved
, HMODULE
*phModDll
);
54 static BOOL
init_functionpointers(void)
60 static const WCHAR szFusion
[] = {'f','u','s','i','o','n','.','d','l','l',0};
62 hmscoree
= LoadLibraryA("mscoree.dll");
66 pLoadLibraryShim
= (void *)GetProcAddress(hmscoree
, "LoadLibraryShim");
67 if (!pLoadLibraryShim
)
69 FreeLibrary(hmscoree
);
73 hr
= pLoadLibraryShim(szFusion
, NULL
, NULL
, &hfusion
);
77 pCreateAssemblyNameObject
= (void *)GetProcAddress(hfusion
, "CreateAssemblyNameObject");
78 if (!pCreateAssemblyNameObject
)
84 typedef struct _tagASMPROP_RES
91 static const ASMPROP_RES defaults
[ASM_NAME_MAX_PARAMS
] =
108 {S_FALSE
, "", MAX_PATH
},
109 {S_FALSE
, "", MAX_PATH
},
111 {S_OK
, "", MAX_PATH
},
123 static const ASMPROP_RES emptyname
[ASM_NAME_MAX_PARAMS
] =
140 {S_FALSE
, "", MAX_PATH
},
141 {S_FALSE
, "", MAX_PATH
},
143 {S_OK
, "", MAX_PATH
},
155 static const ASMPROP_RES winename
[ASM_NAME_MAX_PARAMS
] =
172 {S_FALSE
, "", MAX_PATH
},
173 {S_FALSE
, "", MAX_PATH
},
175 {S_OK
, "", MAX_PATH
},
187 static const ASMPROP_RES vername
[ASM_NAME_MAX_PARAMS
] =
204 {S_FALSE
, "", MAX_PATH
},
205 {S_FALSE
, "", MAX_PATH
},
207 {S_OK
, "", MAX_PATH
},
219 static const ASMPROP_RES badvername
[ASM_NAME_MAX_PARAMS
] =
236 {S_FALSE
, "", MAX_PATH
},
237 {S_FALSE
, "", MAX_PATH
},
239 {S_OK
, "", MAX_PATH
},
251 static const ASMPROP_RES neutralname
[ASM_NAME_MAX_PARAMS
] =
268 {S_FALSE
, "", MAX_PATH
},
269 {S_FALSE
, "", MAX_PATH
},
271 {S_OK
, "", MAX_PATH
},
283 static const ASMPROP_RES enname
[ASM_NAME_MAX_PARAMS
] =
300 {S_FALSE
, "", MAX_PATH
},
301 {S_FALSE
, "", MAX_PATH
},
303 {S_OK
, "", MAX_PATH
},
315 static const ASMPROP_RES pubkeyname
[ASM_NAME_MAX_PARAMS
] =
318 {S_OK
, "\x01\x23\x45\x67\x89\x0a\xbc\xde", 8},
332 {S_OK
, "", MAX_PATH
},
333 {S_OK
, "", MAX_PATH
},
335 {S_OK
, "", MAX_PATH
},
347 static inline void to_widechar(LPWSTR dest
, LPCSTR src
)
349 MultiByteToWideChar(CP_ACP
, 0, src
, -1, dest
, MAX_PATH
);
352 static void test_assembly_name_props_line(IAssemblyName
*name
,
353 const ASMPROP_RES
*vals
, int line
)
357 WCHAR expect
[MAX_PATH
];
360 for (i
= 0; i
< ASM_NAME_MAX_PARAMS
; i
++)
362 to_widechar(expect
, vals
[i
].val
);
365 memset( str
, 0xcc, sizeof(str
) );
366 hr
= IAssemblyName_GetProperty(name
, i
, str
, &size
);
368 ok(hr
== vals
[i
].hr
||
369 broken(i
>= ASM_NAME_CONFIG_MASK
&& hr
== E_INVALIDARG
) || /* .NET 1.1 */
370 broken(i
>= ASM_NAME_FILE_MAJOR_VERSION
&& hr
== E_INVALIDARG
), /* .NET 1.0 */
371 "%d: prop %d: Expected %08x, got %08x\n", line
, i
, vals
[i
].hr
, hr
);
372 if (hr
!= E_INVALIDARG
)
374 ok(size
== vals
[i
].size
, "%d: prop %d: Expected %d, got %d\n", line
, i
, vals
[i
].size
, size
);
377 ok(str
[0] == 0xcccc, "%d: prop %d: str[0] = %x\n", line
, i
, str
[0]);
379 else if (size
!= MAX_PATH
)
381 if (i
!= ASM_NAME_NAME
&& i
!= ASM_NAME_CULTURE
)
382 ok( !memcmp( vals
[i
].val
, str
, size
), "%d: prop %d: wrong value\n", line
, i
);
384 ok( !lstrcmpW( expect
, str
), "%d: prop %d: Expected %s, got %s\n",
385 line
, i
, wine_dbgstr_w(expect
), wine_dbgstr_w(str
) );
388 if (size
!= 0 && size
!= MAX_PATH
)
391 hr
= IAssemblyName_GetProperty(name
, i
, str
, &size
);
392 ok(hr
== STRSAFE_E_INSUFFICIENT_BUFFER
,
393 "%d: prop %d: Expected STRSAFE_E_INSUFFICIENT_BUFFER, got %08x\n", line
, i
, hr
);
394 ok(size
== vals
[i
].size
, "%d: prop %d: Expected %d, got %d\n", line
, i
, vals
[i
].size
, size
);
400 #define test_assembly_name_props(name, vals) \
401 test_assembly_name_props_line(name, vals, __LINE__);
403 static void test_CreateAssemblyNameObject(void)
407 WCHAR namestr
[MAX_PATH
];
412 static const WCHAR empty
[] = {0};
414 /* NULL ppAssemblyNameObj */
415 to_widechar(namestr
, "wine.dll");
416 hr
= pCreateAssemblyNameObject(NULL
, namestr
, 0, NULL
);
417 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
419 /* NULL szAssemblyName, CANOF_PARSE_DISPLAY_NAME */
420 name
= (IAssemblyName
*)0xdeadbeef;
421 hr
= pCreateAssemblyNameObject(&name
, NULL
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
422 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
423 ok(name
== (IAssemblyName
*)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name
);
425 /* empty szAssemblyName, CANOF_PARSE_DISPLAY_NAME */
426 name
= (IAssemblyName
*)0xdeadbeef;
427 hr
= pCreateAssemblyNameObject(&name
, empty
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
428 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
429 ok(name
== (IAssemblyName
*)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name
);
431 /* check the contents of the AssemblyName for default values */
433 /* NULL szAssemblyName */
435 hr
= pCreateAssemblyNameObject(&name
, NULL
, CANOF_SET_DEFAULT_VALUES
, NULL
);
436 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
437 ok(name
!= NULL
, "Expected non-NULL name\n");
440 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
441 ok(hr
== FUSION_E_INVALID_NAME
||
442 broken(hr
== E_INVALIDARG
), /* .NET 1.x */
443 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
447 hr
= IAssemblyName_GetName(name
, &size
, str
);
448 ok(hr
== S_OK
, "got %08x\n", hr
);
449 ok(str
[0] == 'a', "got %c\n", str
[0]);
450 ok(!size
, "got %u\n", size
);
454 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
455 ok(hr
== FUSION_E_INVALID_NAME
||
456 broken(hr
== S_OK
), /* .NET 1.x */
457 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
458 ok(hi
== 0, "Expected 0, got %08x\n", hi
);
459 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
462 win_skip(".NET 1.x doesn't handle ASM_NAME_PROCESSOR_ID_ARRAY"
463 " and ASM_NAME_OSINFO_ARRAY correctly\n");
465 test_assembly_name_props(name
, defaults
);
467 IAssemblyName_Release(name
);
469 /* empty szAssemblyName */
471 hr
= pCreateAssemblyNameObject(&name
, empty
, CANOF_SET_DEFAULT_VALUES
, NULL
);
472 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
473 ok(name
!= NULL
, "Expected non-NULL name\n");
476 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
477 ok(hr
== FUSION_E_INVALID_NAME
||
478 broken(hr
== S_OK
), /* .NET 1.x */
479 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
482 hr
= IAssemblyName_GetName(name
, &size
, NULL
);
483 ok(hr
== E_NOT_SUFFICIENT_BUFFER
, "got %08x\n", hr
);
484 ok(size
== 1, "got %u\n", size
);
489 hr
= IAssemblyName_GetName(name
, NULL
, str
);
490 ok(hr
== E_NOT_SUFFICIENT_BUFFER
, "got %08x\n", hr
);
491 ok(!str
[0], "got %c\n", str
[0]);
496 hr
= IAssemblyName_GetName(name
, &size
, str
);
497 ok(hr
== E_NOT_SUFFICIENT_BUFFER
, "got %08x\n", hr
);
498 ok(!str
[0], "got %c\n", str
[0]);
499 ok(size
== 1, "got %u\n", size
);
503 hr
= IAssemblyName_GetName(name
, &size
, str
);
504 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
505 ok(!str
[0], "Expected empty name\n");
506 ok(size
== 1, "Expected 1, got %d\n", size
);
510 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
511 ok(hr
== FUSION_E_INVALID_NAME
||
512 broken(hr
== S_OK
), /* .NET 1.x */
513 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
514 ok(hi
== 0, "Expected 0, got %08x\n", hi
);
515 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
518 win_skip(".NET 1.x doesn't handle ASM_NAME_PROCESSOR_ID_ARRAY"
519 " and ASM_NAME_OSINFO_ARRAY correctly\n");
521 test_assembly_name_props(name
, emptyname
);
523 IAssemblyName_Release(name
);
526 to_widechar(namestr
, "wine");
528 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_SET_DEFAULT_VALUES
, NULL
);
529 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
530 ok(name
!= NULL
, "Expected non-NULL name\n");
533 hr
= IAssemblyName_GetDisplayName(name
, NULL
, &size
, 0);
534 ok(hr
== E_NOT_SUFFICIENT_BUFFER
, "got %08x\n", hr
);
535 ok(size
== 5, "got %u\n", size
);
538 hr
= IAssemblyName_GetDisplayName(name
, NULL
, &size
, 0);
539 ok(hr
== E_NOT_SUFFICIENT_BUFFER
|| broken(hr
== E_INVALIDARG
), "got %08x\n", hr
);
540 ok(size
== 5 || broken(size
== 3), "got %u\n", size
);
544 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, 0);
545 ok(hr
== E_NOT_SUFFICIENT_BUFFER
, "got %08x\n", hr
);
546 ok(str
[0] == 'a', "got %c\n", str
[0]);
547 ok(size
== 5, "got %u\n", size
);
551 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
552 ok(hr
== E_NOT_SUFFICIENT_BUFFER
, "got %08x\n", hr
);
553 ok(str
[0] == 'a', "got %c\n", str
[0]);
554 ok(size
== 5, "Wrong size %u\n", size
);
557 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
558 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
560 ok(size
== 5, "Expected 5, got %d\n", size
);
564 hr
= IAssemblyName_GetName(name
, &size
, str
);
565 ok(hr
== E_NOT_SUFFICIENT_BUFFER
, "got %08x\n", hr
);
566 ok(!str
[0], "got %c\n", str
[0]);
567 ok(size
== 5, "got %u\n", size
);
571 hr
= IAssemblyName_GetName(name
, &size
, str
);
572 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
574 ok(size
== 5, "Expected 5, got %d\n", size
);
578 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
579 ok(hr
== FUSION_E_INVALID_NAME
||
580 broken(hr
== S_OK
), /* .NET 1.x */
581 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
582 ok(hi
== 0, "Expected 0, got %08x\n", hi
);
583 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
586 win_skip(".NET 1.x doesn't handle ASM_NAME_PROCESSOR_ID_ARRAY"
587 " and ASM_NAME_OSINFO_ARRAY correctly\n");
589 test_assembly_name_props(name
, winename
);
591 IAssemblyName_Release(name
);
593 /* check the contents of the AssemblyName with parsing */
596 to_widechar(namestr
, "wine");
598 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
599 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
600 ok(name
!= NULL
, "Expected non-NULL name\n");
603 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
604 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
606 ok(size
== 5, "Expected 5, got %d\n", size
);
610 hr
= IAssemblyName_GetName(name
, &size
, str
);
611 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
613 ok(size
== 5, "Expected 5, got %d\n", size
);
617 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
618 ok(hr
== FUSION_E_INVALID_NAME
||
619 broken(hr
== S_OK
), /* .NET 1.x */
620 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
621 ok(hi
== 0, "Expected 0, got %08x\n", hi
);
622 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
624 test_assembly_name_props(name
, winename
);
626 IAssemblyName_Release(name
);
628 /* 'wine, Version=1.2.3.4' */
629 to_widechar(namestr
, "wine, Version=1.2.3.4");
631 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
632 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
633 ok(name
!= NULL
, "Expected non-NULL name\n");
636 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
637 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
638 ok_aw("wine, Version=1.2.3.4", str
);
639 ok(size
== 22, "Expected 22, got %d\n", size
);
643 hr
= IAssemblyName_GetName(name
, &size
, str
);
644 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
646 ok(size
== 5, "Expected 5, got %d\n", size
);
650 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
651 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
652 ok(hi
== 0x00010002, "Expected 0x00010002, got %08x\n", hi
);
653 ok(lo
== 0x00030004, "Expected 0x00030004, got %08x\n", lo
);
655 test_assembly_name_props(name
, vername
);
657 IAssemblyName_Release(name
);
659 /* Version isn't of the form 1.x.x.x */
660 to_widechar(namestr
, "wine, Version=1.5");
662 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
663 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
664 ok(name
!= NULL
, "Expected non-NULL name\n");
667 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
668 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
669 ok_aw("wine, Version=1.5", str
);
670 ok(size
== 18, "Expected 18, got %d\n", size
);
674 hr
= IAssemblyName_GetName(name
, &size
, str
);
675 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
677 ok(size
== 5, "Expected 5, got %d\n", size
);
681 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
682 ok(hr
== FUSION_E_INVALID_NAME
||
683 broken(hr
== S_OK
), /* .NET 1.x */
684 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
686 broken(hi
== 0x10005), /* .NET 1.x */
687 "Expected 0, got %08x\n", hi
);
688 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
690 test_assembly_name_props(name
, badvername
);
692 IAssemblyName_Release(name
);
694 /* 'wine, Culture=neutral' */
695 to_widechar(namestr
, "wine, Culture=neutral");
697 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
698 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
699 ok(name
!= NULL
, "Expected non-NULL name\n");
702 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
703 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
704 ok_aw("wine, Culture=neutral", str
);
705 ok(size
== 22, "Expected 22, got %d\n", size
);
709 hr
= IAssemblyName_GetName(name
, &size
, str
);
710 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
712 ok(size
== 5, "Expected 5, got %d\n", size
);
716 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
717 ok(hr
== FUSION_E_INVALID_NAME
||
718 broken(hr
== S_OK
), /* .NET 1.x */
719 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
720 ok(hi
== 0, "Expected 0, got %08x\n", hi
);
721 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
723 test_assembly_name_props(name
, neutralname
);
725 IAssemblyName_Release(name
);
727 /* 'wine, Culture=en' */
728 to_widechar(namestr
, "wine, Culture=en");
730 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
731 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
732 ok(name
!= NULL
, "Expected non-NULL name\n");
735 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
736 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
737 ok_aw("wine, Culture=en", str
);
738 ok(size
== 17, "Expected 17, got %d\n", size
);
742 hr
= IAssemblyName_GetName(name
, &size
, str
);
743 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
745 ok(size
== 5, "Expected 5, got %d\n", size
);
749 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
750 ok(hr
== FUSION_E_INVALID_NAME
||
751 broken(hr
== S_OK
), /* .NET 1.x */
752 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
753 ok(hi
== 0, "Expected 0, got %08x\n", hi
);
754 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
756 test_assembly_name_props(name
, enname
);
758 IAssemblyName_Release(name
);
760 /* 'wine, PublicKeyToken=01234567890abcde' */
761 to_widechar(namestr
, "wine, PublicKeyToken=01234567890abcde");
763 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
764 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
765 ok(name
!= NULL
, "Expected non-NULL name\n");
768 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
769 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
770 ok_aw("wine, PublicKeyToken=01234567890abcde", str
);
771 ok(size
== 38, "Expected 38, got %d\n", size
);
775 hr
= IAssemblyName_GetName(name
, &size
, str
);
776 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
778 ok(size
== 5, "Expected 5, got %d\n", size
);
782 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
783 ok(hr
== FUSION_E_INVALID_NAME
||
784 broken(hr
== S_OK
), /* .NET 1.x */
785 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
786 ok(hi
== 0, "Expected 0, got %08x\n", hi
);
787 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
789 test_assembly_name_props(name
, pubkeyname
);
791 IAssemblyName_Release(name
);
793 /* Processor architecture tests */
794 to_widechar(namestr
, "wine, processorArchitecture=x86");
796 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
797 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
799 ok(name
!= NULL
, "Expected non-NULL name\n");
802 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_PROCESSORARCHITECTURE
);
803 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
805 WideCharToMultiByte(CP_ACP
, 0, str
, -1, string1
, MAX_PATH
, NULL
, NULL
);
807 if (lstrcmpA(string1
, "wine") == 0)
808 win_skip("processorArchitecture not supported on .NET 1.x\n");
811 ok_aw("wine, processorArchitecture=x86", str
);
812 ok(size
== 32, "Expected 32, got %d\n", size
);
815 hr
= IAssemblyName_GetProperty(name
, ASM_NAME_ARCHITECTURE
, &arch
, &size
);
816 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
817 ok(arch
== peI386
, "Expected peI386, got %d\n", arch
);
818 ok(size
== sizeof(arch
), "Wrong size %d\n", size
);
820 IAssemblyName_Release(name
);
823 to_widechar(namestr
, "wine, processorArchitecture=AMD64");
825 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
826 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
829 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_PROCESSORARCHITECTURE
);
830 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
831 ok_aw("wine, processorArchitecture=AMD64", str
);
832 ok(size
== 34, "Expected 34, got %d\n", size
);
835 hr
= IAssemblyName_GetProperty(name
, ASM_NAME_ARCHITECTURE
, &arch
, &size
);
836 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
837 ok(arch
== peAMD64
, "Expected peAMD64, got %d\n", arch
);
838 ok(size
== sizeof(arch
), "Wrong size %d\n", size
);
840 IAssemblyName_Release(name
);
843 to_widechar(namestr
, "wine, processorArchitecture=IA64");
845 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
846 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
849 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_PROCESSORARCHITECTURE
);
850 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
851 ok_aw("wine, processorArchitecture=IA64", str
);
852 ok(size
== 33, "Expected 33, got %d\n", size
);
855 hr
= IAssemblyName_GetProperty(name
, ASM_NAME_ARCHITECTURE
, &arch
, &size
);
856 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
857 ok(arch
== peIA64
, "Expected peIA64, got %d\n", arch
);
858 ok(size
== sizeof(arch
), "Wrong size %d\n", size
);
860 IAssemblyName_Release(name
);
863 to_widechar(namestr
, "wine, processorArchitecture=MSIL");
865 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
866 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
869 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_PROCESSORARCHITECTURE
);
870 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
871 ok_aw("wine, processorArchitecture=MSIL", str
);
872 ok(size
== 33, "Expected 33, got %d\n", size
);
875 hr
= IAssemblyName_GetProperty(name
, ASM_NAME_ARCHITECTURE
, &arch
, &size
);
876 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
877 ok(arch
== peMSIL
, "Expected peMSIL, got %d\n", arch
);
878 ok(size
== sizeof(arch
), "Wrong size %d\n", size
);
880 IAssemblyName_Release(name
);
883 /* Pulling out various different values */
884 to_widechar(namestr
, "wine, Version=1.2.3.4, Culture=en, PublicKeyToken=1234567890abcdef");
886 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
887 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
888 ok(name
!= NULL
, "Expected non-NULL name\n");
891 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_VERSION
| ASM_DISPLAYF_CULTURE
);
892 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
893 ok_aw("wine, Version=1.2.3.4, Culture=en", str
);
894 ok(size
== 34, "Expected 34, got %d\n", size
);
897 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_CULTURE
| ASM_DISPLAYF_PUBLIC_KEY_TOKEN
);
898 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
899 ok_aw("wine, Culture=en, PublicKeyToken=1234567890abcdef", str
);
900 ok(size
== 50, "Expected 50, got %d\n", size
);
903 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
904 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
905 ok_aw("wine, Version=1.2.3.4, Culture=en, PublicKeyToken=1234567890abcdef", str
);
906 ok(size
== 67, "Expected 67, got %d\n", size
);
908 IAssemblyName_Release(name
);
910 /* invalid property */
911 to_widechar(namestr
, "wine, BadProp=42");
913 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
914 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
915 ok(name
!= NULL
, "Expected non-NULL name\n");
919 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
920 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
922 ok(size
== 5, "Expected 5, got %d\n", size
);
926 hr
= IAssemblyName_GetName(name
, &size
, str
);
927 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
929 ok(size
== 5, "Expected 5, got %d\n", size
);
933 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
934 ok(hr
== FUSION_E_INVALID_NAME
||
935 broken(hr
== S_OK
), /* .NET 1.x */
936 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
937 ok(hi
== 0, "Expected 0, got %08x\n", hi
);
938 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
940 test_assembly_name_props(name
, winename
);
942 IAssemblyName_Release(name
);
944 /* PublicKeyToken is not 16 chars long */
945 to_widechar(namestr
, "wine, PublicKeyToken=567890abcdef");
946 name
= (IAssemblyName
*)0xdeadbeef;
947 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
948 if (hr
== S_OK
&& name
!= (IAssemblyName
*)0xdeadbeef)
950 win_skip(".NET 1.x doesn't check PublicKeyToken correctly\n");
951 IAssemblyName_Release(name
);
954 ok(hr
== FUSION_E_INVALID_NAME
,
955 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
956 ok(name
== (IAssemblyName
*)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name
);
958 /* PublicKeyToken contains invalid chars */
959 to_widechar(namestr
, "wine, PublicKeyToken=1234567890ghijkl");
960 name
= (IAssemblyName
*)0xdeadbeef;
961 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
962 ok(hr
== FUSION_E_INVALID_NAME
,
963 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
964 ok(name
== (IAssemblyName
*)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name
);
966 /* no comma separator */
967 to_widechar(namestr
, "wine PublicKeyToken=1234567890abcdef");
968 name
= (IAssemblyName
*)0xdeadbeef;
969 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
970 ok(hr
== FUSION_E_INVALID_NAME
,
971 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
972 ok(name
== (IAssemblyName
*)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name
);
973 if(SUCCEEDED(hr
)) IAssemblyName_Release(name
);
976 to_widechar(namestr
, "wine, PublicKeyToken");
977 name
= (IAssemblyName
*)0xdeadbeef;
978 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
979 ok(hr
== FUSION_E_INVALID_NAME
,
980 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
981 ok(name
== (IAssemblyName
*)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name
);
984 to_widechar(namestr
, "wine, PublicKeyToken=");
985 name
= (IAssemblyName
*)0xdeadbeef;
986 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
987 ok(hr
== FUSION_E_INVALID_NAME
,
988 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
989 ok(name
== (IAssemblyName
*)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name
);
992 to_widechar(namestr
, "wine,version=1.0.0.0");
993 name
= (IAssemblyName
*)0xdeadbeef;
994 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
995 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
996 ok(name
!= NULL
, "Expected non-NULL name\n");
997 hi
= lo
= 0xdeadbeef;
998 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
999 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1000 ok(hi
== 65536, "Expected 536, got %u\n", hi
);
1001 ok(lo
== 0, "Expected 0, got %u\n", lo
);
1002 IAssemblyName_Release(name
);
1005 to_widechar(namestr
, "wine, version=\"1.0.0.0\",culture=\"en\"");
1006 name
= (IAssemblyName
*)0xdeadbeef;
1007 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
1008 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1009 ok(name
!= NULL
, "Expected non-NULL name\n");
1010 hi
= lo
= 0xdeadbeef;
1011 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
1012 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1013 ok(hi
== 65536, "Expected 65536, got %u\n", hi
);
1014 ok(lo
== 0, "Expected 0, got %u\n", lo
);
1015 IAssemblyName_Release(name
);
1018 static void test_IAssemblyName_IsEqual(void)
1020 static const WCHAR wine1
[] =
1021 {'w','i','n','e',0};
1022 static const WCHAR wine2
[] =
1023 {'w','i','n','e',',','v','e','r','s','i','o','n','=','1','.','0','.','0','.','0',0};
1024 static const WCHAR wine3
[] =
1025 {'w','i','n','e',',','v','e','r','s','i','o','n','=','1','.','0','.','0','.','0',',',
1026 'c','u','l','t','u','r','e','=','n','e','u','t','r','a','l',0};
1027 static const WCHAR wine4
[] =
1028 {'w','i','n','e',',','v','e','r','s','i','o','n','=','1','.','0','.','0','.','0',',',
1029 'c','u','l','t','u','r','e','=','e','n',0};
1030 static const WCHAR wine5
[] =
1031 {'w','i','n','e',',','v','e','r','s','i','o','n','=','1','.','0','.','0','.','0',',',
1032 'p','u','b','l','i','c','K','e','y','T','o','k','e','n','=','1','2','3','4','5','6',
1033 '7','8','9','0','a','b','c','d','e','f',0};
1035 IAssemblyName
*name1
, *name2
;
1037 hr
= pCreateAssemblyNameObject( &name1
, wine1
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
1038 ok( hr
== S_OK
, "got %08x\n", hr
);
1040 hr
= pCreateAssemblyNameObject( &name2
, wine1
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
1041 ok( hr
== S_OK
, "got %08x\n", hr
);
1043 if (0) { /* crashes on some old version */
1044 hr
= IAssemblyName_IsEqual( name1
, NULL
, 0 );
1045 ok( hr
== S_FALSE
, "got %08x\n", hr
);
1047 hr
= IAssemblyName_IsEqual( name1
, NULL
, ASM_CMPF_IL_ALL
);
1048 ok( hr
== S_FALSE
, "got %08x\n", hr
);
1051 hr
= IAssemblyName_IsEqual( name1
, name1
, ASM_CMPF_IL_ALL
);
1052 ok( hr
== S_OK
, "got %08x\n", hr
);
1054 hr
= IAssemblyName_IsEqual( name1
, name2
, ASM_CMPF_IL_ALL
);
1055 ok( hr
== S_OK
, "got %08x\n", hr
);
1057 IAssemblyName_Release( name2
);
1058 hr
= pCreateAssemblyNameObject( &name2
, wine2
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
1059 ok( hr
== S_OK
, "got %08x\n", hr
);
1061 hr
= IAssemblyName_IsEqual( name1
, name2
, ASM_CMPF_IL_ALL
);
1062 ok( hr
== S_OK
, "got %08x\n", hr
);
1064 IAssemblyName_Release( name2
);
1065 hr
= pCreateAssemblyNameObject( &name2
, wine3
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
1066 ok( hr
== S_OK
, "got %08x\n", hr
);
1068 hr
= IAssemblyName_IsEqual( name1
, name2
, ASM_CMPF_IL_ALL
);
1069 ok( hr
== S_OK
, "got %08x\n", hr
);
1071 IAssemblyName_Release( name1
);
1072 hr
= pCreateAssemblyNameObject( &name1
, wine4
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
1073 ok( hr
== S_OK
, "got %08x\n", hr
);
1075 hr
= IAssemblyName_IsEqual( name1
, name2
, ASM_CMPF_IL_ALL
);
1076 ok( hr
== S_FALSE
, "got %08x\n", hr
);
1078 IAssemblyName_Release( name1
);
1079 hr
= pCreateAssemblyNameObject( &name1
, wine1
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
1080 ok( hr
== S_OK
, "got %08x\n", hr
);
1082 IAssemblyName_Release( name2
);
1083 hr
= pCreateAssemblyNameObject( &name2
, wine5
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
1084 ok( hr
== S_OK
, "got %08x\n", hr
);
1086 hr
= IAssemblyName_IsEqual( name1
, name2
, ASM_CMPF_IL_ALL
);
1087 ok( hr
== S_OK
, "got %08x\n", hr
);
1089 IAssemblyName_Release( name1
);
1090 IAssemblyName_Release( name2
);
1095 if (!init_functionpointers())
1097 win_skip("fusion.dll not available\n");
1101 test_CreateAssemblyNameObject();
1102 test_IAssemblyName_IsEqual();