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>
37 #include <wine/test.h>
39 /* ok-like statement which takes two unicode strings or one unicode and one ANSI string as arguments */
40 static CHAR string1
[MAX_PATH
];
42 #define ok_aw(aString, wString) \
43 WideCharToMultiByte(CP_ACP, 0, wString, -1, string1, MAX_PATH, NULL, NULL); \
44 if (lstrcmpA(string1, aString) != 0) \
45 ok(0, "Expected \"%s\", got \"%s\"\n", aString, string1);
47 static HRESULT (WINAPI
*pCreateAssemblyNameObject
)(LPASSEMBLYNAME
*ppAssemblyNameObj
,
48 LPCWSTR szAssemblyName
, DWORD dwFlags
,
50 static HRESULT (WINAPI
*pLoadLibraryShim
)(LPCWSTR szDllName
, LPCWSTR szVersion
,
51 LPVOID pvReserved
, HMODULE
*phModDll
);
53 static BOOL
init_functionpointers(void)
59 static const WCHAR szFusion
[] = {'f','u','s','i','o','n','.','d','l','l',0};
61 hmscoree
= LoadLibraryA("mscoree.dll");
65 pLoadLibraryShim
= (void *)GetProcAddress(hmscoree
, "LoadLibraryShim");
66 if (!pLoadLibraryShim
)
68 FreeLibrary(hmscoree
);
72 hr
= pLoadLibraryShim(szFusion
, NULL
, NULL
, &hfusion
);
76 pCreateAssemblyNameObject
= (void *)GetProcAddress(hfusion
, "CreateAssemblyNameObject");
77 if (!pCreateAssemblyNameObject
)
83 typedef struct _tagASMPROP_RES
90 static const ASMPROP_RES defaults
[ASM_NAME_MAX_PARAMS
] =
107 {S_FALSE
, "", MAX_PATH
},
108 {S_FALSE
, "", MAX_PATH
},
110 {S_OK
, "", MAX_PATH
},
122 static const ASMPROP_RES emptyname
[ASM_NAME_MAX_PARAMS
] =
139 {S_FALSE
, "", MAX_PATH
},
140 {S_FALSE
, "", MAX_PATH
},
142 {S_OK
, "", MAX_PATH
},
154 static const ASMPROP_RES winename
[ASM_NAME_MAX_PARAMS
] =
171 {S_FALSE
, "", MAX_PATH
},
172 {S_FALSE
, "", MAX_PATH
},
174 {S_OK
, "", MAX_PATH
},
186 static const ASMPROP_RES vername
[ASM_NAME_MAX_PARAMS
] =
203 {S_FALSE
, "", MAX_PATH
},
204 {S_FALSE
, "", MAX_PATH
},
206 {S_OK
, "", MAX_PATH
},
218 static const ASMPROP_RES badvername
[ASM_NAME_MAX_PARAMS
] =
235 {S_FALSE
, "", MAX_PATH
},
236 {S_FALSE
, "", MAX_PATH
},
238 {S_OK
, "", MAX_PATH
},
250 static const ASMPROP_RES neutralname
[ASM_NAME_MAX_PARAMS
] =
267 {S_FALSE
, "", MAX_PATH
},
268 {S_FALSE
, "", MAX_PATH
},
270 {S_OK
, "", MAX_PATH
},
282 static const ASMPROP_RES enname
[ASM_NAME_MAX_PARAMS
] =
299 {S_FALSE
, "", MAX_PATH
},
300 {S_FALSE
, "", MAX_PATH
},
302 {S_OK
, "", MAX_PATH
},
314 static const ASMPROP_RES pubkeyname
[ASM_NAME_MAX_PARAMS
] =
317 {S_OK
, "\x12\x34\x56\x78\x90\xab\xcd\xef", 8},
331 {S_OK
, "", MAX_PATH
},
332 {S_OK
, "", MAX_PATH
},
334 {S_OK
, "", MAX_PATH
},
346 static inline void to_widechar(LPWSTR dest
, LPCSTR src
)
348 MultiByteToWideChar(CP_ACP
, 0, src
, -1, dest
, MAX_PATH
);
351 static inline void to_multibyte(LPSTR dest
, LPWSTR src
)
353 WideCharToMultiByte(CP_ACP
, 0, src
, -1, dest
, MAX_PATH
, NULL
, NULL
);
356 static void test_assembly_name_props_line(IAssemblyName
*name
,
357 const ASMPROP_RES
*vals
, int line
)
361 WCHAR expect
[MAX_PATH
];
365 for (i
= 0; i
< ASM_NAME_MAX_PARAMS
; i
++)
367 to_widechar(expect
, vals
[i
].val
);
370 ZeroMemory(str
, MAX_PATH
);
371 hr
= IAssemblyName_GetProperty(name
, i
, str
, &size
);
372 to_multibyte(val
, str
);
374 ok(hr
== vals
[i
].hr
||
375 broken(i
>= ASM_NAME_CONFIG_MASK
&& hr
== E_INVALIDARG
) || /* .NET 1.1 */
376 broken(i
>= ASM_NAME_FILE_MAJOR_VERSION
&& hr
== E_INVALIDARG
), /* .NET 1.0 */
377 "%d: prop %d: Expected %08x, got %08x\n", line
, i
, vals
[i
].hr
, hr
);
378 if (hr
!= E_INVALIDARG
)
380 if (i
== ASM_NAME_PUBLIC_KEY_TOKEN
)
381 ok(!memcmp(vals
[i
].val
, str
, size
), "Expected a correct ASM_NAME_PUBLIC_KEY_TOKEN\n");
383 ok(!lstrcmpA(vals
[i
].val
, val
), "%d: prop %d: Expected \"%s\", got \"%s\"\n", line
, i
, vals
[i
].val
, val
);
384 ok(size
== vals
[i
].size
, "%d: prop %d: Expected %d, got %d\n", line
, i
, vals
[i
].size
, size
);
389 #define test_assembly_name_props(name, vals) \
390 test_assembly_name_props_line(name, vals, __LINE__);
392 static void test_CreateAssemblyNameObject(void)
396 WCHAR namestr
[MAX_PATH
];
400 static const WCHAR empty
[] = {0};
402 /* NULL ppAssemblyNameObj */
403 to_widechar(namestr
, "wine.dll");
404 hr
= pCreateAssemblyNameObject(NULL
, namestr
, 0, NULL
);
405 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
407 /* NULL szAssemblyName, CANOF_PARSE_DISPLAY_NAME */
408 name
= (IAssemblyName
*)0xdeadbeef;
409 hr
= pCreateAssemblyNameObject(&name
, NULL
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
410 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
411 ok(name
== (IAssemblyName
*)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name
);
413 /* empty szAssemblyName, CANOF_PARSE_DISPLAY_NAME */
414 name
= (IAssemblyName
*)0xdeadbeef;
415 hr
= pCreateAssemblyNameObject(&name
, empty
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
416 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
417 ok(name
== (IAssemblyName
*)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name
);
419 /* check the contents of the AssemblyName for default values */
421 /* NULL szAssemblyName */
423 hr
= pCreateAssemblyNameObject(&name
, NULL
, CANOF_SET_DEFAULT_VALUES
, NULL
);
424 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
425 ok(name
!= NULL
, "Expected non-NULL name\n");
428 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
429 ok(hr
== FUSION_E_INVALID_NAME
||
430 broken(hr
== E_INVALIDARG
), /* .NET 1.x */
431 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
435 hr
= IAssemblyName_GetName(name
, &size
, str
);
436 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
437 ok(!str
[0], "Expected empty name\n");
438 ok(size
== 0, "Expected 0, got %d\n", size
);
442 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
443 ok(hr
== FUSION_E_INVALID_NAME
||
444 broken(hr
== S_OK
), /* .NET 1.x */
445 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
446 ok(hi
== 0, "Expected 0, got %08x\n", hi
);
447 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
450 win_skip(".NET 1.x doesn't handle ASM_NAME_PROCESSOR_ID_ARRAY"
451 " and ASM_NAME_OSINFO_ARRAY correctly\n");
453 test_assembly_name_props(name
, defaults
);
455 IAssemblyName_Release(name
);
457 /* empty szAssemblyName */
459 hr
= pCreateAssemblyNameObject(&name
, empty
, CANOF_SET_DEFAULT_VALUES
, NULL
);
460 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
461 ok(name
!= NULL
, "Expected non-NULL name\n");
464 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
465 ok(hr
== FUSION_E_INVALID_NAME
||
466 broken(hr
== S_OK
), /* .NET 1.x */
467 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
471 hr
= IAssemblyName_GetName(name
, &size
, str
);
472 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
473 ok(!str
[0], "Expected empty name\n");
474 ok(size
== 1, "Expected 1, got %d\n", size
);
478 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
479 ok(hr
== FUSION_E_INVALID_NAME
||
480 broken(hr
== S_OK
), /* .NET 1.x */
481 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
482 ok(hi
== 0, "Expected 0, got %08x\n", hi
);
483 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
486 win_skip(".NET 1.x doesn't handle ASM_NAME_PROCESSOR_ID_ARRAY"
487 " and ASM_NAME_OSINFO_ARRAY correctly\n");
489 test_assembly_name_props(name
, emptyname
);
491 IAssemblyName_Release(name
);
494 to_widechar(namestr
, "wine");
496 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_SET_DEFAULT_VALUES
, NULL
);
497 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
498 ok(name
!= NULL
, "Expected non-NULL name\n");
501 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
502 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
504 ok(size
== 5, "Expected 5, got %d\n", size
);
508 hr
= IAssemblyName_GetName(name
, &size
, str
);
509 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
511 ok(size
== 5, "Expected 5, got %d\n", size
);
515 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
516 ok(hr
== FUSION_E_INVALID_NAME
||
517 broken(hr
== S_OK
), /* .NET 1.x */
518 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
519 ok(hi
== 0, "Expected 0, got %08x\n", hi
);
520 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
523 win_skip(".NET 1.x doesn't handle ASM_NAME_PROCESSOR_ID_ARRAY"
524 " and ASM_NAME_OSINFO_ARRAY correctly\n");
526 test_assembly_name_props(name
, winename
);
528 IAssemblyName_Release(name
);
530 /* check the contents of the AssemblyName with parsing */
533 to_widechar(namestr
, "wine");
535 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
536 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
537 ok(name
!= NULL
, "Expected non-NULL name\n");
540 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
541 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
543 ok(size
== 5, "Expected 5, got %d\n", size
);
547 hr
= IAssemblyName_GetName(name
, &size
, str
);
548 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
550 ok(size
== 5, "Expected 5, got %d\n", size
);
554 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
555 ok(hr
== FUSION_E_INVALID_NAME
||
556 broken(hr
== S_OK
), /* .NET 1.x */
557 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
558 ok(hi
== 0, "Expected 0, got %08x\n", hi
);
559 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
561 test_assembly_name_props(name
, winename
);
563 IAssemblyName_Release(name
);
565 /* 'wine, Version=1.2.3.4' */
566 to_widechar(namestr
, "wine, Version=1.2.3.4");
568 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
569 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
570 ok(name
!= NULL
, "Expected non-NULL name\n");
573 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
574 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
575 ok_aw("wine, Version=1.2.3.4", str
);
576 ok(size
== 22, "Expected 22, got %d\n", size
);
580 hr
= IAssemblyName_GetName(name
, &size
, str
);
581 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
583 ok(size
== 5, "Expected 5, got %d\n", size
);
587 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
588 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
589 ok(hi
== 0x00010002, "Expected 0x00010002, got %08x\n", hi
);
590 ok(lo
== 0x00030004, "Expected 0x00030004, got %08x\n", lo
);
592 test_assembly_name_props(name
, vername
);
594 IAssemblyName_Release(name
);
596 /* Version isn't of the form 1.x.x.x */
597 to_widechar(namestr
, "wine, Version=1.5");
599 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
600 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
601 ok(name
!= NULL
, "Expected non-NULL name\n");
604 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
605 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
606 ok_aw("wine, Version=1.5", str
);
607 ok(size
== 18, "Expected 18, got %d\n", size
);
611 hr
= IAssemblyName_GetName(name
, &size
, str
);
612 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
614 ok(size
== 5, "Expected 5, got %d\n", size
);
618 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
619 ok(hr
== FUSION_E_INVALID_NAME
||
620 broken(hr
== S_OK
), /* .NET 1.x */
621 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
623 broken(hi
== 0x10005), /* .NET 1.x */
624 "Expected 0, got %08x\n", hi
);
625 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
627 test_assembly_name_props(name
, badvername
);
629 IAssemblyName_Release(name
);
631 /* 'wine, Culture=neutral' */
632 to_widechar(namestr
, "wine, Culture=neutral");
634 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
635 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
636 ok(name
!= NULL
, "Expected non-NULL name\n");
639 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
640 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
641 ok_aw("wine, Culture=neutral", str
);
642 ok(size
== 22, "Expected 22, got %d\n", size
);
646 hr
= IAssemblyName_GetName(name
, &size
, str
);
647 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
649 ok(size
== 5, "Expected 5, got %d\n", size
);
653 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
654 ok(hr
== FUSION_E_INVALID_NAME
||
655 broken(hr
== S_OK
), /* .NET 1.x */
656 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
657 ok(hi
== 0, "Expected 0, got %08x\n", hi
);
658 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
660 test_assembly_name_props(name
, neutralname
);
662 IAssemblyName_Release(name
);
664 /* 'wine, Culture=en' */
665 to_widechar(namestr
, "wine, Culture=en");
667 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
668 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
669 ok(name
!= NULL
, "Expected non-NULL name\n");
672 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
673 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
674 ok_aw("wine, Culture=en", str
);
675 ok(size
== 17, "Expected 17, got %d\n", size
);
679 hr
= IAssemblyName_GetName(name
, &size
, str
);
680 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
682 ok(size
== 5, "Expected 5, got %d\n", size
);
686 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
687 ok(hr
== FUSION_E_INVALID_NAME
||
688 broken(hr
== S_OK
), /* .NET 1.x */
689 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
690 ok(hi
== 0, "Expected 0, got %08x\n", hi
);
691 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
693 test_assembly_name_props(name
, enname
);
695 IAssemblyName_Release(name
);
697 /* 'wine, PublicKeyToken=1234567890abcdef' */
698 to_widechar(namestr
, "wine, PublicKeyToken=1234567890abcdef");
700 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
701 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
702 ok(name
!= NULL
, "Expected non-NULL name\n");
705 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
706 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
707 ok_aw("wine, PublicKeyToken=1234567890abcdef", str
);
708 ok(size
== 38, "Expected 38, got %d\n", size
);
712 hr
= IAssemblyName_GetName(name
, &size
, str
);
713 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
715 ok(size
== 5, "Expected 5, got %d\n", size
);
719 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
720 ok(hr
== FUSION_E_INVALID_NAME
||
721 broken(hr
== S_OK
), /* .NET 1.x */
722 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
723 ok(hi
== 0, "Expected 0, got %08x\n", hi
);
724 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
726 test_assembly_name_props(name
, pubkeyname
);
728 IAssemblyName_Release(name
);
730 /* Processor architecture tests */
731 to_widechar(namestr
, "wine, processorArchitecture=x86");
733 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
734 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
736 ok(name
!= NULL
, "Expected non-NULL name\n");
739 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_PROCESSORARCHITECTURE
);
740 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
742 WideCharToMultiByte(CP_ACP
, 0, str
, -1, string1
, MAX_PATH
, NULL
, NULL
);
744 if (lstrcmpA(string1
, "wine") == 0)
745 win_skip("processorArchitecture not supported on .NET 1.x\n");
748 ok_aw("wine, processorArchitecture=x86", str
);
749 ok(size
== 32, "Expected 32, got %d\n", size
);
751 IAssemblyName_Release(name
);
754 to_widechar(namestr
, "wine, processorArchitecture=AMD64");
756 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
757 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
760 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_PROCESSORARCHITECTURE
);
761 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
762 ok_aw("wine, processorArchitecture=AMD64", str
);
763 ok(size
== 34, "Expected 34, got %d\n", size
);
765 IAssemblyName_Release(name
);
768 to_widechar(namestr
, "wine, processorArchitecture=IA64");
770 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
771 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
774 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_PROCESSORARCHITECTURE
);
775 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
776 ok_aw("wine, processorArchitecture=IA64", str
);
777 ok(size
== 33, "Expected 33, got %d\n", size
);
779 IAssemblyName_Release(name
);
782 to_widechar(namestr
, "wine, processorArchitecture=MSIL");
784 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
785 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
788 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_PROCESSORARCHITECTURE
);
789 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
790 ok_aw("wine, processorArchitecture=MSIL", str
);
791 ok(size
== 33, "Expected 33, got %d\n", size
);
793 IAssemblyName_Release(name
);
796 /* Pulling out various different values */
797 to_widechar(namestr
, "wine, Version=1.2.3.4, Culture=en, PublicKeyToken=1234567890abcdef");
799 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
800 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
801 ok(name
!= NULL
, "Expected non-NULL name\n");
804 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_VERSION
| ASM_DISPLAYF_CULTURE
);
805 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
806 ok_aw("wine, Version=1.2.3.4, Culture=en", str
);
807 ok(size
== 34, "Expected 34, got %d\n", size
);
810 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_CULTURE
| ASM_DISPLAYF_PUBLIC_KEY_TOKEN
);
811 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
812 ok_aw("wine, Culture=en, PublicKeyToken=1234567890abcdef", str
);
813 ok(size
== 50, "Expected 50, got %d\n", size
);
816 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
817 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
818 ok_aw("wine, Version=1.2.3.4, Culture=en, PublicKeyToken=1234567890abcdef", str
);
819 ok(size
== 67, "Expected 67, got %d\n", size
);
821 IAssemblyName_Release(name
);
823 /* invalid property */
824 to_widechar(namestr
, "wine, BadProp=42");
826 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
827 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
828 ok(name
!= NULL
, "Expected non-NULL name\n");
832 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
833 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
835 ok(size
== 5, "Expected 5, got %d\n", size
);
839 hr
= IAssemblyName_GetName(name
, &size
, str
);
840 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
842 ok(size
== 5, "Expected 5, got %d\n", size
);
846 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
847 ok(hr
== FUSION_E_INVALID_NAME
||
848 broken(hr
== S_OK
), /* .NET 1.x */
849 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
850 ok(hi
== 0, "Expected 0, got %08x\n", hi
);
851 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
853 test_assembly_name_props(name
, winename
);
855 IAssemblyName_Release(name
);
857 /* PublicKeyToken is not 16 chars long */
858 to_widechar(namestr
, "wine, PublicKeyToken=567890abcdef");
859 name
= (IAssemblyName
*)0xdeadbeef;
860 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
861 if (hr
== S_OK
&& name
!= (IAssemblyName
*)0xdeadbeef)
863 win_skip(".NET 1.x doesn't check PublicKeyToken correctly\n");
864 IAssemblyName_Release(name
);
867 ok(hr
== FUSION_E_INVALID_NAME
,
868 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
869 ok(name
== (IAssemblyName
*)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name
);
871 /* PublicKeyToken contains invalid chars */
872 to_widechar(namestr
, "wine, PublicKeyToken=1234567890ghijkl");
873 name
= (IAssemblyName
*)0xdeadbeef;
874 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
875 ok(hr
== FUSION_E_INVALID_NAME
,
876 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
877 ok(name
== (IAssemblyName
*)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name
);
879 /* no comma separator */
880 to_widechar(namestr
, "wine PublicKeyToken=1234567890abcdef");
881 name
= (IAssemblyName
*)0xdeadbeef;
882 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
883 ok(hr
== FUSION_E_INVALID_NAME
,
884 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
885 ok(name
== (IAssemblyName
*)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name
);
886 if(SUCCEEDED(hr
)) IAssemblyName_Release(name
);
889 to_widechar(namestr
, "wine, PublicKeyToken");
890 name
= (IAssemblyName
*)0xdeadbeef;
891 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
892 ok(hr
== FUSION_E_INVALID_NAME
,
893 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
894 ok(name
== (IAssemblyName
*)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name
);
897 to_widechar(namestr
, "wine, PublicKeyToken=");
898 name
= (IAssemblyName
*)0xdeadbeef;
899 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
900 ok(hr
== FUSION_E_INVALID_NAME
,
901 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
902 ok(name
== (IAssemblyName
*)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name
);
905 to_widechar(namestr
, "wine,version=1.0.0.0");
906 name
= (IAssemblyName
*)0xdeadbeef;
907 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
908 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
909 ok(name
!= NULL
, "Expected non-NULL name\n");
910 hi
= lo
= 0xdeadbeef;
911 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
912 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
913 ok(hi
== 65536, "Expected 536, got %u\n", hi
);
914 ok(lo
== 0, "Expected 0, got %u\n", lo
);
915 IAssemblyName_Release(name
);
918 to_widechar(namestr
, "wine, version=\"1.0.0.0\",culture=\"en\"");
919 name
= (IAssemblyName
*)0xdeadbeef;
920 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
921 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
922 ok(name
!= NULL
, "Expected non-NULL name\n");
923 hi
= lo
= 0xdeadbeef;
924 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
925 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
926 ok(hi
== 65536, "Expected 65536, got %u\n", hi
);
927 ok(lo
== 0, "Expected 0, got %u\n", lo
);
928 IAssemblyName_Release(name
);
931 static void test_IAssemblyName_IsEqual(void)
933 static const WCHAR wine1
[] =
935 static const WCHAR wine2
[] =
936 {'w','i','n','e',',','v','e','r','s','i','o','n','=','1','.','0','.','0','.','0',0};
937 static const WCHAR wine3
[] =
938 {'w','i','n','e',',','v','e','r','s','i','o','n','=','1','.','0','.','0','.','0',',',
939 'c','u','l','t','u','r','e','=','n','e','u','t','r','a','l',0};
940 static const WCHAR wine4
[] =
941 {'w','i','n','e',',','v','e','r','s','i','o','n','=','1','.','0','.','0','.','0',',',
942 'c','u','l','t','u','r','e','=','e','n',0};
943 static const WCHAR wine5
[] =
944 {'w','i','n','e',',','v','e','r','s','i','o','n','=','1','.','0','.','0','.','0',',',
945 'p','u','b','l','i','c','K','e','y','T','o','k','e','n','=','1','2','3','4','5','6',
946 '7','8','9','0','a','b','c','d','e','f',0};
948 IAssemblyName
*name1
, *name2
;
950 hr
= pCreateAssemblyNameObject( &name1
, wine1
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
951 ok( hr
== S_OK
, "got %08x\n", hr
);
953 hr
= pCreateAssemblyNameObject( &name2
, wine1
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
954 ok( hr
== S_OK
, "got %08x\n", hr
);
956 if (0) { /* crashes on some old version */
957 hr
= IAssemblyName_IsEqual( name1
, NULL
, 0 );
958 ok( hr
== S_FALSE
, "got %08x\n", hr
);
960 hr
= IAssemblyName_IsEqual( name1
, NULL
, ASM_CMPF_IL_ALL
);
961 ok( hr
== S_FALSE
, "got %08x\n", hr
);
964 hr
= IAssemblyName_IsEqual( name1
, name1
, ASM_CMPF_IL_ALL
);
965 ok( hr
== S_OK
, "got %08x\n", hr
);
967 hr
= IAssemblyName_IsEqual( name1
, name2
, ASM_CMPF_IL_ALL
);
968 ok( hr
== S_OK
, "got %08x\n", hr
);
970 IAssemblyName_Release( name2
);
971 hr
= pCreateAssemblyNameObject( &name2
, wine2
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
972 ok( hr
== S_OK
, "got %08x\n", hr
);
974 hr
= IAssemblyName_IsEqual( name1
, name2
, ASM_CMPF_IL_ALL
);
975 ok( hr
== S_OK
, "got %08x\n", hr
);
977 IAssemblyName_Release( name2
);
978 hr
= pCreateAssemblyNameObject( &name2
, wine3
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
979 ok( hr
== S_OK
, "got %08x\n", hr
);
981 hr
= IAssemblyName_IsEqual( name1
, name2
, ASM_CMPF_IL_ALL
);
982 ok( hr
== S_OK
, "got %08x\n", hr
);
984 IAssemblyName_Release( name1
);
985 hr
= pCreateAssemblyNameObject( &name1
, wine4
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
986 ok( hr
== S_OK
, "got %08x\n", hr
);
988 hr
= IAssemblyName_IsEqual( name1
, name2
, ASM_CMPF_IL_ALL
);
989 ok( hr
== S_FALSE
, "got %08x\n", hr
);
991 IAssemblyName_Release( name1
);
992 hr
= pCreateAssemblyNameObject( &name1
, wine1
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
993 ok( hr
== S_OK
, "got %08x\n", hr
);
995 IAssemblyName_Release( name2
);
996 hr
= pCreateAssemblyNameObject( &name2
, wine5
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
997 ok( hr
== S_OK
, "got %08x\n", hr
);
999 hr
= IAssemblyName_IsEqual( name1
, name2
, ASM_CMPF_IL_ALL
);
1000 ok( hr
== S_OK
, "got %08x\n", hr
);
1002 IAssemblyName_Release( name1
);
1003 IAssemblyName_Release( name2
);
1008 if (!init_functionpointers())
1010 win_skip("fusion.dll not available\n");
1014 test_CreateAssemblyNameObject();
1015 test_IAssemblyName_IsEqual();