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
)(IAssemblyName
**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
, "got %08x\n", hr
);
437 ok(str
[0] == 'a', "got %c\n", str
[0]);
438 ok(!size
, "got %u\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
);
470 hr
= IAssemblyName_GetName(name
, &size
, NULL
);
471 ok(hr
== E_NOT_SUFFICIENT_BUFFER
, "got %08x\n", hr
);
472 ok(size
== 1, "got %u\n", size
);
477 hr
= IAssemblyName_GetName(name
, NULL
, str
);
478 ok(hr
== E_NOT_SUFFICIENT_BUFFER
, "got %08x\n", hr
);
479 ok(!str
[0], "got %c\n", str
[0]);
484 hr
= IAssemblyName_GetName(name
, &size
, str
);
485 ok(hr
== E_NOT_SUFFICIENT_BUFFER
, "got %08x\n", hr
);
486 ok(!str
[0], "got %c\n", str
[0]);
487 ok(size
== 1, "got %u\n", size
);
491 hr
= IAssemblyName_GetName(name
, &size
, str
);
492 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
493 ok(!str
[0], "Expected empty name\n");
494 ok(size
== 1, "Expected 1, got %d\n", size
);
498 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
499 ok(hr
== FUSION_E_INVALID_NAME
||
500 broken(hr
== S_OK
), /* .NET 1.x */
501 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
502 ok(hi
== 0, "Expected 0, got %08x\n", hi
);
503 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
506 win_skip(".NET 1.x doesn't handle ASM_NAME_PROCESSOR_ID_ARRAY"
507 " and ASM_NAME_OSINFO_ARRAY correctly\n");
509 test_assembly_name_props(name
, emptyname
);
511 IAssemblyName_Release(name
);
514 to_widechar(namestr
, "wine");
516 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_SET_DEFAULT_VALUES
, NULL
);
517 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
518 ok(name
!= NULL
, "Expected non-NULL name\n");
521 hr
= IAssemblyName_GetDisplayName(name
, NULL
, &size
, 0);
522 ok(hr
== E_NOT_SUFFICIENT_BUFFER
, "got %08x\n", hr
);
523 ok(size
== 5, "got %u\n", size
);
526 hr
= IAssemblyName_GetDisplayName(name
, NULL
, &size
, 0);
527 ok(hr
== E_NOT_SUFFICIENT_BUFFER
|| broken(hr
== E_INVALIDARG
), "got %08x\n", hr
);
528 ok(size
== 5 || broken(size
== 3), "got %u\n", size
);
532 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, 0);
533 ok(hr
== E_NOT_SUFFICIENT_BUFFER
, "got %08x\n", hr
);
534 ok(str
[0] == 'a', "got %c\n", str
[0]);
535 ok(size
== 5, "got %u\n", size
);
538 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
539 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
541 ok(size
== 5, "Expected 5, got %d\n", size
);
545 hr
= IAssemblyName_GetName(name
, &size
, str
);
546 ok(hr
== E_NOT_SUFFICIENT_BUFFER
, "got %08x\n", hr
);
547 ok(!str
[0], "got %c\n", str
[0]);
548 ok(size
== 5, "got %u\n", size
);
552 hr
= IAssemblyName_GetName(name
, &size
, str
);
553 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
555 ok(size
== 5, "Expected 5, got %d\n", size
);
559 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
560 ok(hr
== FUSION_E_INVALID_NAME
||
561 broken(hr
== S_OK
), /* .NET 1.x */
562 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
563 ok(hi
== 0, "Expected 0, got %08x\n", hi
);
564 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
567 win_skip(".NET 1.x doesn't handle ASM_NAME_PROCESSOR_ID_ARRAY"
568 " and ASM_NAME_OSINFO_ARRAY correctly\n");
570 test_assembly_name_props(name
, winename
);
572 IAssemblyName_Release(name
);
574 /* check the contents of the AssemblyName with parsing */
577 to_widechar(namestr
, "wine");
579 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
580 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
581 ok(name
!= NULL
, "Expected non-NULL name\n");
584 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
585 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
587 ok(size
== 5, "Expected 5, got %d\n", size
);
591 hr
= IAssemblyName_GetName(name
, &size
, str
);
592 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
594 ok(size
== 5, "Expected 5, got %d\n", size
);
598 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
599 ok(hr
== FUSION_E_INVALID_NAME
||
600 broken(hr
== S_OK
), /* .NET 1.x */
601 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
602 ok(hi
== 0, "Expected 0, got %08x\n", hi
);
603 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
605 test_assembly_name_props(name
, winename
);
607 IAssemblyName_Release(name
);
609 /* 'wine, Version=1.2.3.4' */
610 to_widechar(namestr
, "wine, Version=1.2.3.4");
612 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
613 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
614 ok(name
!= NULL
, "Expected non-NULL name\n");
617 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
618 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
619 ok_aw("wine, Version=1.2.3.4", str
);
620 ok(size
== 22, "Expected 22, got %d\n", size
);
624 hr
= IAssemblyName_GetName(name
, &size
, str
);
625 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
627 ok(size
== 5, "Expected 5, got %d\n", size
);
631 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
632 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
633 ok(hi
== 0x00010002, "Expected 0x00010002, got %08x\n", hi
);
634 ok(lo
== 0x00030004, "Expected 0x00030004, got %08x\n", lo
);
636 test_assembly_name_props(name
, vername
);
638 IAssemblyName_Release(name
);
640 /* Version isn't of the form 1.x.x.x */
641 to_widechar(namestr
, "wine, Version=1.5");
643 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
644 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
645 ok(name
!= NULL
, "Expected non-NULL name\n");
648 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
649 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
650 ok_aw("wine, Version=1.5", str
);
651 ok(size
== 18, "Expected 18, got %d\n", size
);
655 hr
= IAssemblyName_GetName(name
, &size
, str
);
656 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
658 ok(size
== 5, "Expected 5, got %d\n", size
);
662 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
663 ok(hr
== FUSION_E_INVALID_NAME
||
664 broken(hr
== S_OK
), /* .NET 1.x */
665 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
667 broken(hi
== 0x10005), /* .NET 1.x */
668 "Expected 0, got %08x\n", hi
);
669 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
671 test_assembly_name_props(name
, badvername
);
673 IAssemblyName_Release(name
);
675 /* 'wine, Culture=neutral' */
676 to_widechar(namestr
, "wine, Culture=neutral");
678 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
679 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
680 ok(name
!= NULL
, "Expected non-NULL name\n");
683 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
684 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
685 ok_aw("wine, Culture=neutral", str
);
686 ok(size
== 22, "Expected 22, got %d\n", size
);
690 hr
= IAssemblyName_GetName(name
, &size
, str
);
691 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
693 ok(size
== 5, "Expected 5, got %d\n", size
);
697 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
698 ok(hr
== FUSION_E_INVALID_NAME
||
699 broken(hr
== S_OK
), /* .NET 1.x */
700 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
701 ok(hi
== 0, "Expected 0, got %08x\n", hi
);
702 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
704 test_assembly_name_props(name
, neutralname
);
706 IAssemblyName_Release(name
);
708 /* 'wine, Culture=en' */
709 to_widechar(namestr
, "wine, Culture=en");
711 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
712 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
713 ok(name
!= NULL
, "Expected non-NULL name\n");
716 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
717 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
718 ok_aw("wine, Culture=en", str
);
719 ok(size
== 17, "Expected 17, got %d\n", size
);
723 hr
= IAssemblyName_GetName(name
, &size
, str
);
724 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
726 ok(size
== 5, "Expected 5, got %d\n", size
);
730 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
731 ok(hr
== FUSION_E_INVALID_NAME
||
732 broken(hr
== S_OK
), /* .NET 1.x */
733 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
734 ok(hi
== 0, "Expected 0, got %08x\n", hi
);
735 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
737 test_assembly_name_props(name
, enname
);
739 IAssemblyName_Release(name
);
741 /* 'wine, PublicKeyToken=1234567890abcdef' */
742 to_widechar(namestr
, "wine, PublicKeyToken=1234567890abcdef");
744 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
745 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
746 ok(name
!= NULL
, "Expected non-NULL name\n");
749 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
750 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
751 ok_aw("wine, PublicKeyToken=1234567890abcdef", str
);
752 ok(size
== 38, "Expected 38, got %d\n", size
);
756 hr
= IAssemblyName_GetName(name
, &size
, str
);
757 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
759 ok(size
== 5, "Expected 5, got %d\n", size
);
763 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
764 ok(hr
== FUSION_E_INVALID_NAME
||
765 broken(hr
== S_OK
), /* .NET 1.x */
766 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
767 ok(hi
== 0, "Expected 0, got %08x\n", hi
);
768 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
770 test_assembly_name_props(name
, pubkeyname
);
772 IAssemblyName_Release(name
);
774 /* Processor architecture tests */
775 to_widechar(namestr
, "wine, processorArchitecture=x86");
777 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
778 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
780 ok(name
!= NULL
, "Expected non-NULL name\n");
783 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_PROCESSORARCHITECTURE
);
784 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
786 WideCharToMultiByte(CP_ACP
, 0, str
, -1, string1
, MAX_PATH
, NULL
, NULL
);
788 if (lstrcmpA(string1
, "wine") == 0)
789 win_skip("processorArchitecture not supported on .NET 1.x\n");
792 ok_aw("wine, processorArchitecture=x86", str
);
793 ok(size
== 32, "Expected 32, got %d\n", size
);
795 IAssemblyName_Release(name
);
798 to_widechar(namestr
, "wine, processorArchitecture=AMD64");
800 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
801 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
804 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_PROCESSORARCHITECTURE
);
805 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
806 ok_aw("wine, processorArchitecture=AMD64", str
);
807 ok(size
== 34, "Expected 34, got %d\n", size
);
809 IAssemblyName_Release(name
);
812 to_widechar(namestr
, "wine, processorArchitecture=IA64");
814 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
815 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
818 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_PROCESSORARCHITECTURE
);
819 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
820 ok_aw("wine, processorArchitecture=IA64", str
);
821 ok(size
== 33, "Expected 33, got %d\n", size
);
823 IAssemblyName_Release(name
);
826 to_widechar(namestr
, "wine, processorArchitecture=MSIL");
828 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
829 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
832 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_PROCESSORARCHITECTURE
);
833 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
834 ok_aw("wine, processorArchitecture=MSIL", str
);
835 ok(size
== 33, "Expected 33, got %d\n", size
);
837 IAssemblyName_Release(name
);
840 /* Pulling out various different values */
841 to_widechar(namestr
, "wine, Version=1.2.3.4, Culture=en, PublicKeyToken=1234567890abcdef");
843 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
844 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
845 ok(name
!= NULL
, "Expected non-NULL name\n");
848 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_VERSION
| ASM_DISPLAYF_CULTURE
);
849 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
850 ok_aw("wine, Version=1.2.3.4, Culture=en", str
);
851 ok(size
== 34, "Expected 34, got %d\n", size
);
854 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_CULTURE
| ASM_DISPLAYF_PUBLIC_KEY_TOKEN
);
855 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
856 ok_aw("wine, Culture=en, PublicKeyToken=1234567890abcdef", str
);
857 ok(size
== 50, "Expected 50, got %d\n", size
);
860 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
861 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
862 ok_aw("wine, Version=1.2.3.4, Culture=en, PublicKeyToken=1234567890abcdef", str
);
863 ok(size
== 67, "Expected 67, got %d\n", size
);
865 IAssemblyName_Release(name
);
867 /* invalid property */
868 to_widechar(namestr
, "wine, BadProp=42");
870 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
871 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
872 ok(name
!= NULL
, "Expected non-NULL name\n");
876 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
877 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
879 ok(size
== 5, "Expected 5, got %d\n", size
);
883 hr
= IAssemblyName_GetName(name
, &size
, str
);
884 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
886 ok(size
== 5, "Expected 5, got %d\n", size
);
890 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
891 ok(hr
== FUSION_E_INVALID_NAME
||
892 broken(hr
== S_OK
), /* .NET 1.x */
893 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
894 ok(hi
== 0, "Expected 0, got %08x\n", hi
);
895 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
897 test_assembly_name_props(name
, winename
);
899 IAssemblyName_Release(name
);
901 /* PublicKeyToken is not 16 chars long */
902 to_widechar(namestr
, "wine, PublicKeyToken=567890abcdef");
903 name
= (IAssemblyName
*)0xdeadbeef;
904 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
905 if (hr
== S_OK
&& name
!= (IAssemblyName
*)0xdeadbeef)
907 win_skip(".NET 1.x doesn't check PublicKeyToken correctly\n");
908 IAssemblyName_Release(name
);
911 ok(hr
== FUSION_E_INVALID_NAME
,
912 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
913 ok(name
== (IAssemblyName
*)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name
);
915 /* PublicKeyToken contains invalid chars */
916 to_widechar(namestr
, "wine, PublicKeyToken=1234567890ghijkl");
917 name
= (IAssemblyName
*)0xdeadbeef;
918 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
919 ok(hr
== FUSION_E_INVALID_NAME
,
920 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
921 ok(name
== (IAssemblyName
*)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name
);
923 /* no comma separator */
924 to_widechar(namestr
, "wine PublicKeyToken=1234567890abcdef");
925 name
= (IAssemblyName
*)0xdeadbeef;
926 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
927 ok(hr
== FUSION_E_INVALID_NAME
,
928 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
929 ok(name
== (IAssemblyName
*)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name
);
930 if(SUCCEEDED(hr
)) IAssemblyName_Release(name
);
933 to_widechar(namestr
, "wine, PublicKeyToken");
934 name
= (IAssemblyName
*)0xdeadbeef;
935 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
936 ok(hr
== FUSION_E_INVALID_NAME
,
937 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
938 ok(name
== (IAssemblyName
*)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name
);
941 to_widechar(namestr
, "wine, PublicKeyToken=");
942 name
= (IAssemblyName
*)0xdeadbeef;
943 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
944 ok(hr
== FUSION_E_INVALID_NAME
,
945 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
946 ok(name
== (IAssemblyName
*)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name
);
949 to_widechar(namestr
, "wine,version=1.0.0.0");
950 name
= (IAssemblyName
*)0xdeadbeef;
951 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
952 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
953 ok(name
!= NULL
, "Expected non-NULL name\n");
954 hi
= lo
= 0xdeadbeef;
955 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
956 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
957 ok(hi
== 65536, "Expected 536, got %u\n", hi
);
958 ok(lo
== 0, "Expected 0, got %u\n", lo
);
959 IAssemblyName_Release(name
);
962 to_widechar(namestr
, "wine, version=\"1.0.0.0\",culture=\"en\"");
963 name
= (IAssemblyName
*)0xdeadbeef;
964 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
965 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
966 ok(name
!= NULL
, "Expected non-NULL name\n");
967 hi
= lo
= 0xdeadbeef;
968 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
969 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
970 ok(hi
== 65536, "Expected 65536, got %u\n", hi
);
971 ok(lo
== 0, "Expected 0, got %u\n", lo
);
972 IAssemblyName_Release(name
);
975 static void test_IAssemblyName_IsEqual(void)
977 static const WCHAR wine1
[] =
979 static const WCHAR wine2
[] =
980 {'w','i','n','e',',','v','e','r','s','i','o','n','=','1','.','0','.','0','.','0',0};
981 static const WCHAR wine3
[] =
982 {'w','i','n','e',',','v','e','r','s','i','o','n','=','1','.','0','.','0','.','0',',',
983 'c','u','l','t','u','r','e','=','n','e','u','t','r','a','l',0};
984 static const WCHAR wine4
[] =
985 {'w','i','n','e',',','v','e','r','s','i','o','n','=','1','.','0','.','0','.','0',',',
986 'c','u','l','t','u','r','e','=','e','n',0};
987 static const WCHAR wine5
[] =
988 {'w','i','n','e',',','v','e','r','s','i','o','n','=','1','.','0','.','0','.','0',',',
989 'p','u','b','l','i','c','K','e','y','T','o','k','e','n','=','1','2','3','4','5','6',
990 '7','8','9','0','a','b','c','d','e','f',0};
992 IAssemblyName
*name1
, *name2
;
994 hr
= pCreateAssemblyNameObject( &name1
, wine1
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
995 ok( hr
== S_OK
, "got %08x\n", hr
);
997 hr
= pCreateAssemblyNameObject( &name2
, wine1
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
998 ok( hr
== S_OK
, "got %08x\n", hr
);
1000 if (0) { /* crashes on some old version */
1001 hr
= IAssemblyName_IsEqual( name1
, NULL
, 0 );
1002 ok( hr
== S_FALSE
, "got %08x\n", hr
);
1004 hr
= IAssemblyName_IsEqual( name1
, NULL
, ASM_CMPF_IL_ALL
);
1005 ok( hr
== S_FALSE
, "got %08x\n", hr
);
1008 hr
= IAssemblyName_IsEqual( name1
, name1
, ASM_CMPF_IL_ALL
);
1009 ok( hr
== S_OK
, "got %08x\n", hr
);
1011 hr
= IAssemblyName_IsEqual( name1
, name2
, ASM_CMPF_IL_ALL
);
1012 ok( hr
== S_OK
, "got %08x\n", hr
);
1014 IAssemblyName_Release( name2
);
1015 hr
= pCreateAssemblyNameObject( &name2
, wine2
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
1016 ok( hr
== S_OK
, "got %08x\n", hr
);
1018 hr
= IAssemblyName_IsEqual( name1
, name2
, ASM_CMPF_IL_ALL
);
1019 ok( hr
== S_OK
, "got %08x\n", hr
);
1021 IAssemblyName_Release( name2
);
1022 hr
= pCreateAssemblyNameObject( &name2
, wine3
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
1023 ok( hr
== S_OK
, "got %08x\n", hr
);
1025 hr
= IAssemblyName_IsEqual( name1
, name2
, ASM_CMPF_IL_ALL
);
1026 ok( hr
== S_OK
, "got %08x\n", hr
);
1028 IAssemblyName_Release( name1
);
1029 hr
= pCreateAssemblyNameObject( &name1
, wine4
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
1030 ok( hr
== S_OK
, "got %08x\n", hr
);
1032 hr
= IAssemblyName_IsEqual( name1
, name2
, ASM_CMPF_IL_ALL
);
1033 ok( hr
== S_FALSE
, "got %08x\n", hr
);
1035 IAssemblyName_Release( name1
);
1036 hr
= pCreateAssemblyNameObject( &name1
, wine1
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
1037 ok( hr
== S_OK
, "got %08x\n", hr
);
1039 IAssemblyName_Release( name2
);
1040 hr
= pCreateAssemblyNameObject( &name2
, wine5
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
1041 ok( hr
== S_OK
, "got %08x\n", hr
);
1043 hr
= IAssemblyName_IsEqual( name1
, name2
, ASM_CMPF_IL_ALL
);
1044 ok( hr
== S_OK
, "got %08x\n", hr
);
1046 IAssemblyName_Release( name1
);
1047 IAssemblyName_Release( name2
);
1052 if (!init_functionpointers())
1054 win_skip("fusion.dll not available\n");
1058 test_CreateAssemblyNameObject();
1059 test_IAssemblyName_IsEqual();