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
];
364 for (i
= 0; i
< ASM_NAME_MAX_PARAMS
; i
++)
366 to_widechar(expect
, vals
[i
].val
);
369 memset( str
, 0xcc, sizeof(str
) );
370 hr
= IAssemblyName_GetProperty(name
, i
, str
, &size
);
372 ok(hr
== vals
[i
].hr
||
373 broken(i
>= ASM_NAME_CONFIG_MASK
&& hr
== E_INVALIDARG
) || /* .NET 1.1 */
374 broken(i
>= ASM_NAME_FILE_MAJOR_VERSION
&& hr
== E_INVALIDARG
), /* .NET 1.0 */
375 "%d: prop %d: Expected %08x, got %08x\n", line
, i
, vals
[i
].hr
, hr
);
376 if (hr
!= E_INVALIDARG
)
378 ok(size
== vals
[i
].size
, "%d: prop %d: Expected %d, got %d\n", line
, i
, vals
[i
].size
, size
);
379 if (size
&& 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
) );
391 #define test_assembly_name_props(name, vals) \
392 test_assembly_name_props_line(name, vals, __LINE__);
394 static void test_CreateAssemblyNameObject(void)
398 WCHAR namestr
[MAX_PATH
];
402 static const WCHAR empty
[] = {0};
404 /* NULL ppAssemblyNameObj */
405 to_widechar(namestr
, "wine.dll");
406 hr
= pCreateAssemblyNameObject(NULL
, namestr
, 0, NULL
);
407 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
409 /* NULL szAssemblyName, CANOF_PARSE_DISPLAY_NAME */
410 name
= (IAssemblyName
*)0xdeadbeef;
411 hr
= pCreateAssemblyNameObject(&name
, NULL
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
412 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
413 ok(name
== (IAssemblyName
*)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name
);
415 /* empty szAssemblyName, CANOF_PARSE_DISPLAY_NAME */
416 name
= (IAssemblyName
*)0xdeadbeef;
417 hr
= pCreateAssemblyNameObject(&name
, empty
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
418 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
419 ok(name
== (IAssemblyName
*)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name
);
421 /* check the contents of the AssemblyName for default values */
423 /* NULL szAssemblyName */
425 hr
= pCreateAssemblyNameObject(&name
, NULL
, CANOF_SET_DEFAULT_VALUES
, NULL
);
426 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
427 ok(name
!= NULL
, "Expected non-NULL name\n");
430 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
431 ok(hr
== FUSION_E_INVALID_NAME
||
432 broken(hr
== E_INVALIDARG
), /* .NET 1.x */
433 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
437 hr
= IAssemblyName_GetName(name
, &size
, str
);
438 ok(hr
== S_OK
, "got %08x\n", hr
);
439 ok(str
[0] == 'a', "got %c\n", str
[0]);
440 ok(!size
, "got %u\n", size
);
444 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
445 ok(hr
== FUSION_E_INVALID_NAME
||
446 broken(hr
== S_OK
), /* .NET 1.x */
447 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
448 ok(hi
== 0, "Expected 0, got %08x\n", hi
);
449 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
452 win_skip(".NET 1.x doesn't handle ASM_NAME_PROCESSOR_ID_ARRAY"
453 " and ASM_NAME_OSINFO_ARRAY correctly\n");
455 test_assembly_name_props(name
, defaults
);
457 IAssemblyName_Release(name
);
459 /* empty szAssemblyName */
461 hr
= pCreateAssemblyNameObject(&name
, empty
, CANOF_SET_DEFAULT_VALUES
, NULL
);
462 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
463 ok(name
!= NULL
, "Expected non-NULL name\n");
466 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
467 ok(hr
== FUSION_E_INVALID_NAME
||
468 broken(hr
== S_OK
), /* .NET 1.x */
469 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
472 hr
= IAssemblyName_GetName(name
, &size
, NULL
);
473 ok(hr
== E_NOT_SUFFICIENT_BUFFER
, "got %08x\n", hr
);
474 ok(size
== 1, "got %u\n", size
);
479 hr
= IAssemblyName_GetName(name
, NULL
, str
);
480 ok(hr
== E_NOT_SUFFICIENT_BUFFER
, "got %08x\n", hr
);
481 ok(!str
[0], "got %c\n", str
[0]);
486 hr
= IAssemblyName_GetName(name
, &size
, str
);
487 ok(hr
== E_NOT_SUFFICIENT_BUFFER
, "got %08x\n", hr
);
488 ok(!str
[0], "got %c\n", str
[0]);
489 ok(size
== 1, "got %u\n", size
);
493 hr
= IAssemblyName_GetName(name
, &size
, str
);
494 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
495 ok(!str
[0], "Expected empty name\n");
496 ok(size
== 1, "Expected 1, got %d\n", size
);
500 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
501 ok(hr
== FUSION_E_INVALID_NAME
||
502 broken(hr
== S_OK
), /* .NET 1.x */
503 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
504 ok(hi
== 0, "Expected 0, got %08x\n", hi
);
505 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
508 win_skip(".NET 1.x doesn't handle ASM_NAME_PROCESSOR_ID_ARRAY"
509 " and ASM_NAME_OSINFO_ARRAY correctly\n");
511 test_assembly_name_props(name
, emptyname
);
513 IAssemblyName_Release(name
);
516 to_widechar(namestr
, "wine");
518 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_SET_DEFAULT_VALUES
, NULL
);
519 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
520 ok(name
!= NULL
, "Expected non-NULL name\n");
523 hr
= IAssemblyName_GetDisplayName(name
, NULL
, &size
, 0);
524 ok(hr
== E_NOT_SUFFICIENT_BUFFER
, "got %08x\n", hr
);
525 ok(size
== 5, "got %u\n", size
);
528 hr
= IAssemblyName_GetDisplayName(name
, NULL
, &size
, 0);
529 ok(hr
== E_NOT_SUFFICIENT_BUFFER
|| broken(hr
== E_INVALIDARG
), "got %08x\n", hr
);
530 ok(size
== 5 || broken(size
== 3), "got %u\n", size
);
534 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, 0);
535 ok(hr
== E_NOT_SUFFICIENT_BUFFER
, "got %08x\n", hr
);
536 ok(str
[0] == 'a', "got %c\n", str
[0]);
537 ok(size
== 5, "got %u\n", size
);
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
== E_NOT_SUFFICIENT_BUFFER
, "got %08x\n", hr
);
549 ok(!str
[0], "got %c\n", str
[0]);
550 ok(size
== 5, "got %u\n", size
);
554 hr
= IAssemblyName_GetName(name
, &size
, str
);
555 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
557 ok(size
== 5, "Expected 5, got %d\n", size
);
561 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
562 ok(hr
== FUSION_E_INVALID_NAME
||
563 broken(hr
== S_OK
), /* .NET 1.x */
564 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
565 ok(hi
== 0, "Expected 0, got %08x\n", hi
);
566 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
569 win_skip(".NET 1.x doesn't handle ASM_NAME_PROCESSOR_ID_ARRAY"
570 " and ASM_NAME_OSINFO_ARRAY correctly\n");
572 test_assembly_name_props(name
, winename
);
574 IAssemblyName_Release(name
);
576 /* check the contents of the AssemblyName with parsing */
579 to_widechar(namestr
, "wine");
581 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
582 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
583 ok(name
!= NULL
, "Expected non-NULL name\n");
586 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
587 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
589 ok(size
== 5, "Expected 5, got %d\n", size
);
593 hr
= IAssemblyName_GetName(name
, &size
, str
);
594 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
596 ok(size
== 5, "Expected 5, got %d\n", size
);
600 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
601 ok(hr
== FUSION_E_INVALID_NAME
||
602 broken(hr
== S_OK
), /* .NET 1.x */
603 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
604 ok(hi
== 0, "Expected 0, got %08x\n", hi
);
605 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
607 test_assembly_name_props(name
, winename
);
609 IAssemblyName_Release(name
);
611 /* 'wine, Version=1.2.3.4' */
612 to_widechar(namestr
, "wine, Version=1.2.3.4");
614 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
615 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
616 ok(name
!= NULL
, "Expected non-NULL name\n");
619 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
620 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
621 ok_aw("wine, Version=1.2.3.4", str
);
622 ok(size
== 22, "Expected 22, got %d\n", size
);
626 hr
= IAssemblyName_GetName(name
, &size
, str
);
627 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
629 ok(size
== 5, "Expected 5, got %d\n", size
);
633 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
634 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
635 ok(hi
== 0x00010002, "Expected 0x00010002, got %08x\n", hi
);
636 ok(lo
== 0x00030004, "Expected 0x00030004, got %08x\n", lo
);
638 test_assembly_name_props(name
, vername
);
640 IAssemblyName_Release(name
);
642 /* Version isn't of the form 1.x.x.x */
643 to_widechar(namestr
, "wine, Version=1.5");
645 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
646 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
647 ok(name
!= NULL
, "Expected non-NULL name\n");
650 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
651 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
652 ok_aw("wine, Version=1.5", str
);
653 ok(size
== 18, "Expected 18, got %d\n", size
);
657 hr
= IAssemblyName_GetName(name
, &size
, str
);
658 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
660 ok(size
== 5, "Expected 5, got %d\n", size
);
664 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
665 ok(hr
== FUSION_E_INVALID_NAME
||
666 broken(hr
== S_OK
), /* .NET 1.x */
667 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
669 broken(hi
== 0x10005), /* .NET 1.x */
670 "Expected 0, got %08x\n", hi
);
671 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
673 test_assembly_name_props(name
, badvername
);
675 IAssemblyName_Release(name
);
677 /* 'wine, Culture=neutral' */
678 to_widechar(namestr
, "wine, Culture=neutral");
680 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
681 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
682 ok(name
!= NULL
, "Expected non-NULL name\n");
685 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
686 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
687 ok_aw("wine, Culture=neutral", str
);
688 ok(size
== 22, "Expected 22, got %d\n", size
);
692 hr
= IAssemblyName_GetName(name
, &size
, str
);
693 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
695 ok(size
== 5, "Expected 5, got %d\n", size
);
699 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
700 ok(hr
== FUSION_E_INVALID_NAME
||
701 broken(hr
== S_OK
), /* .NET 1.x */
702 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
703 ok(hi
== 0, "Expected 0, got %08x\n", hi
);
704 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
706 test_assembly_name_props(name
, neutralname
);
708 IAssemblyName_Release(name
);
710 /* 'wine, Culture=en' */
711 to_widechar(namestr
, "wine, Culture=en");
713 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
714 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
715 ok(name
!= NULL
, "Expected non-NULL name\n");
718 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
719 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
720 ok_aw("wine, Culture=en", str
);
721 ok(size
== 17, "Expected 17, got %d\n", size
);
725 hr
= IAssemblyName_GetName(name
, &size
, str
);
726 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
728 ok(size
== 5, "Expected 5, got %d\n", size
);
732 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
733 ok(hr
== FUSION_E_INVALID_NAME
||
734 broken(hr
== S_OK
), /* .NET 1.x */
735 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
736 ok(hi
== 0, "Expected 0, got %08x\n", hi
);
737 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
739 test_assembly_name_props(name
, enname
);
741 IAssemblyName_Release(name
);
743 /* 'wine, PublicKeyToken=1234567890abcdef' */
744 to_widechar(namestr
, "wine, PublicKeyToken=1234567890abcdef");
746 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
747 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
748 ok(name
!= NULL
, "Expected non-NULL name\n");
751 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
752 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
753 ok_aw("wine, PublicKeyToken=1234567890abcdef", str
);
754 ok(size
== 38, "Expected 38, got %d\n", size
);
758 hr
= IAssemblyName_GetName(name
, &size
, str
);
759 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
761 ok(size
== 5, "Expected 5, got %d\n", size
);
765 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
766 ok(hr
== FUSION_E_INVALID_NAME
||
767 broken(hr
== S_OK
), /* .NET 1.x */
768 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
769 ok(hi
== 0, "Expected 0, got %08x\n", hi
);
770 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
772 test_assembly_name_props(name
, pubkeyname
);
774 IAssemblyName_Release(name
);
776 /* Processor architecture tests */
777 to_widechar(namestr
, "wine, processorArchitecture=x86");
779 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
780 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
782 ok(name
!= NULL
, "Expected non-NULL name\n");
785 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_PROCESSORARCHITECTURE
);
786 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
788 WideCharToMultiByte(CP_ACP
, 0, str
, -1, string1
, MAX_PATH
, NULL
, NULL
);
790 if (lstrcmpA(string1
, "wine") == 0)
791 win_skip("processorArchitecture not supported on .NET 1.x\n");
794 ok_aw("wine, processorArchitecture=x86", str
);
795 ok(size
== 32, "Expected 32, got %d\n", size
);
797 IAssemblyName_Release(name
);
800 to_widechar(namestr
, "wine, processorArchitecture=AMD64");
802 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
803 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
806 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_PROCESSORARCHITECTURE
);
807 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
808 ok_aw("wine, processorArchitecture=AMD64", str
);
809 ok(size
== 34, "Expected 34, got %d\n", size
);
811 IAssemblyName_Release(name
);
814 to_widechar(namestr
, "wine, processorArchitecture=IA64");
816 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
817 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
820 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_PROCESSORARCHITECTURE
);
821 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
822 ok_aw("wine, processorArchitecture=IA64", str
);
823 ok(size
== 33, "Expected 33, got %d\n", size
);
825 IAssemblyName_Release(name
);
828 to_widechar(namestr
, "wine, processorArchitecture=MSIL");
830 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
831 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
834 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_PROCESSORARCHITECTURE
);
835 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
836 ok_aw("wine, processorArchitecture=MSIL", str
);
837 ok(size
== 33, "Expected 33, got %d\n", size
);
839 IAssemblyName_Release(name
);
842 /* Pulling out various different values */
843 to_widechar(namestr
, "wine, Version=1.2.3.4, Culture=en, PublicKeyToken=1234567890abcdef");
845 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
846 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
847 ok(name
!= NULL
, "Expected non-NULL name\n");
850 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_VERSION
| ASM_DISPLAYF_CULTURE
);
851 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
852 ok_aw("wine, Version=1.2.3.4, Culture=en", str
);
853 ok(size
== 34, "Expected 34, got %d\n", size
);
856 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_CULTURE
| ASM_DISPLAYF_PUBLIC_KEY_TOKEN
);
857 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
858 ok_aw("wine, Culture=en, PublicKeyToken=1234567890abcdef", str
);
859 ok(size
== 50, "Expected 50, got %d\n", size
);
862 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
863 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
864 ok_aw("wine, Version=1.2.3.4, Culture=en, PublicKeyToken=1234567890abcdef", str
);
865 ok(size
== 67, "Expected 67, got %d\n", size
);
867 IAssemblyName_Release(name
);
869 /* invalid property */
870 to_widechar(namestr
, "wine, BadProp=42");
872 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
873 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
874 ok(name
!= NULL
, "Expected non-NULL name\n");
878 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
879 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
881 ok(size
== 5, "Expected 5, got %d\n", size
);
885 hr
= IAssemblyName_GetName(name
, &size
, str
);
886 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
888 ok(size
== 5, "Expected 5, got %d\n", size
);
892 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
893 ok(hr
== FUSION_E_INVALID_NAME
||
894 broken(hr
== S_OK
), /* .NET 1.x */
895 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
896 ok(hi
== 0, "Expected 0, got %08x\n", hi
);
897 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
899 test_assembly_name_props(name
, winename
);
901 IAssemblyName_Release(name
);
903 /* PublicKeyToken is not 16 chars long */
904 to_widechar(namestr
, "wine, PublicKeyToken=567890abcdef");
905 name
= (IAssemblyName
*)0xdeadbeef;
906 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
907 if (hr
== S_OK
&& name
!= (IAssemblyName
*)0xdeadbeef)
909 win_skip(".NET 1.x doesn't check PublicKeyToken correctly\n");
910 IAssemblyName_Release(name
);
913 ok(hr
== FUSION_E_INVALID_NAME
,
914 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
915 ok(name
== (IAssemblyName
*)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name
);
917 /* PublicKeyToken contains invalid chars */
918 to_widechar(namestr
, "wine, PublicKeyToken=1234567890ghijkl");
919 name
= (IAssemblyName
*)0xdeadbeef;
920 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
921 ok(hr
== FUSION_E_INVALID_NAME
,
922 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
923 ok(name
== (IAssemblyName
*)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name
);
925 /* no comma separator */
926 to_widechar(namestr
, "wine PublicKeyToken=1234567890abcdef");
927 name
= (IAssemblyName
*)0xdeadbeef;
928 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
929 ok(hr
== FUSION_E_INVALID_NAME
,
930 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
931 ok(name
== (IAssemblyName
*)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name
);
932 if(SUCCEEDED(hr
)) IAssemblyName_Release(name
);
935 to_widechar(namestr
, "wine, PublicKeyToken");
936 name
= (IAssemblyName
*)0xdeadbeef;
937 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
938 ok(hr
== FUSION_E_INVALID_NAME
,
939 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
940 ok(name
== (IAssemblyName
*)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name
);
943 to_widechar(namestr
, "wine, PublicKeyToken=");
944 name
= (IAssemblyName
*)0xdeadbeef;
945 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
946 ok(hr
== FUSION_E_INVALID_NAME
,
947 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
948 ok(name
== (IAssemblyName
*)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name
);
951 to_widechar(namestr
, "wine,version=1.0.0.0");
952 name
= (IAssemblyName
*)0xdeadbeef;
953 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
954 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
955 ok(name
!= NULL
, "Expected non-NULL name\n");
956 hi
= lo
= 0xdeadbeef;
957 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
958 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
959 ok(hi
== 65536, "Expected 536, got %u\n", hi
);
960 ok(lo
== 0, "Expected 0, got %u\n", lo
);
961 IAssemblyName_Release(name
);
964 to_widechar(namestr
, "wine, version=\"1.0.0.0\",culture=\"en\"");
965 name
= (IAssemblyName
*)0xdeadbeef;
966 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
967 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
968 ok(name
!= NULL
, "Expected non-NULL name\n");
969 hi
= lo
= 0xdeadbeef;
970 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
971 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
972 ok(hi
== 65536, "Expected 65536, got %u\n", hi
);
973 ok(lo
== 0, "Expected 0, got %u\n", lo
);
974 IAssemblyName_Release(name
);
977 static void test_IAssemblyName_IsEqual(void)
979 static const WCHAR wine1
[] =
981 static const WCHAR wine2
[] =
982 {'w','i','n','e',',','v','e','r','s','i','o','n','=','1','.','0','.','0','.','0',0};
983 static const WCHAR wine3
[] =
984 {'w','i','n','e',',','v','e','r','s','i','o','n','=','1','.','0','.','0','.','0',',',
985 'c','u','l','t','u','r','e','=','n','e','u','t','r','a','l',0};
986 static const WCHAR wine4
[] =
987 {'w','i','n','e',',','v','e','r','s','i','o','n','=','1','.','0','.','0','.','0',',',
988 'c','u','l','t','u','r','e','=','e','n',0};
989 static const WCHAR wine5
[] =
990 {'w','i','n','e',',','v','e','r','s','i','o','n','=','1','.','0','.','0','.','0',',',
991 'p','u','b','l','i','c','K','e','y','T','o','k','e','n','=','1','2','3','4','5','6',
992 '7','8','9','0','a','b','c','d','e','f',0};
994 IAssemblyName
*name1
, *name2
;
996 hr
= pCreateAssemblyNameObject( &name1
, wine1
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
997 ok( hr
== S_OK
, "got %08x\n", hr
);
999 hr
= pCreateAssemblyNameObject( &name2
, wine1
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
1000 ok( hr
== S_OK
, "got %08x\n", hr
);
1002 if (0) { /* crashes on some old version */
1003 hr
= IAssemblyName_IsEqual( name1
, NULL
, 0 );
1004 ok( hr
== S_FALSE
, "got %08x\n", hr
);
1006 hr
= IAssemblyName_IsEqual( name1
, NULL
, ASM_CMPF_IL_ALL
);
1007 ok( hr
== S_FALSE
, "got %08x\n", hr
);
1010 hr
= IAssemblyName_IsEqual( name1
, name1
, ASM_CMPF_IL_ALL
);
1011 ok( hr
== S_OK
, "got %08x\n", hr
);
1013 hr
= IAssemblyName_IsEqual( name1
, name2
, ASM_CMPF_IL_ALL
);
1014 ok( hr
== S_OK
, "got %08x\n", hr
);
1016 IAssemblyName_Release( name2
);
1017 hr
= pCreateAssemblyNameObject( &name2
, wine2
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
1018 ok( hr
== S_OK
, "got %08x\n", hr
);
1020 hr
= IAssemblyName_IsEqual( name1
, name2
, ASM_CMPF_IL_ALL
);
1021 ok( hr
== S_OK
, "got %08x\n", hr
);
1023 IAssemblyName_Release( name2
);
1024 hr
= pCreateAssemblyNameObject( &name2
, wine3
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
1025 ok( hr
== S_OK
, "got %08x\n", hr
);
1027 hr
= IAssemblyName_IsEqual( name1
, name2
, ASM_CMPF_IL_ALL
);
1028 ok( hr
== S_OK
, "got %08x\n", hr
);
1030 IAssemblyName_Release( name1
);
1031 hr
= pCreateAssemblyNameObject( &name1
, wine4
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
1032 ok( hr
== S_OK
, "got %08x\n", hr
);
1034 hr
= IAssemblyName_IsEqual( name1
, name2
, ASM_CMPF_IL_ALL
);
1035 ok( hr
== S_FALSE
, "got %08x\n", hr
);
1037 IAssemblyName_Release( name1
);
1038 hr
= pCreateAssemblyNameObject( &name1
, wine1
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
1039 ok( hr
== S_OK
, "got %08x\n", hr
);
1041 IAssemblyName_Release( name2
);
1042 hr
= pCreateAssemblyNameObject( &name2
, wine5
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
1043 ok( hr
== S_OK
, "got %08x\n", hr
);
1045 hr
= IAssemblyName_IsEqual( name1
, name2
, ASM_CMPF_IL_ALL
);
1046 ok( hr
== S_OK
, "got %08x\n", hr
);
1048 IAssemblyName_Release( name1
);
1049 IAssemblyName_Release( name2
);
1054 if (!init_functionpointers())
1056 win_skip("fusion.dll not available\n");
1060 test_CreateAssemblyNameObject();
1061 test_IAssemblyName_IsEqual();