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
29 #include "wine/test.h"
31 /* ok-like statement which takes two unicode strings or one unicode and one ANSI string as arguments */
32 static CHAR string1
[MAX_PATH
];
34 #define ok_aw(aString, wString) \
35 WideCharToMultiByte(CP_ACP, 0, wString, -1, string1, MAX_PATH, NULL, NULL); \
36 if (lstrcmpA(string1, aString) != 0) \
37 ok(0, "Expected \"%s\", got \"%s\"\n", aString, string1);
39 static HRESULT (WINAPI
*pCreateAssemblyNameObject
)(IAssemblyName
**ppAssemblyNameObj
,
40 LPCWSTR szAssemblyName
, DWORD dwFlags
,
42 static HRESULT (WINAPI
*pLoadLibraryShim
)(LPCWSTR szDllName
, LPCWSTR szVersion
,
43 LPVOID pvReserved
, HMODULE
*phModDll
);
45 static BOOL
init_functionpointers(void)
51 static const WCHAR szFusion
[] = {'f','u','s','i','o','n','.','d','l','l',0};
53 hmscoree
= LoadLibraryA("mscoree.dll");
57 pLoadLibraryShim
= (void *)GetProcAddress(hmscoree
, "LoadLibraryShim");
58 if (!pLoadLibraryShim
)
60 FreeLibrary(hmscoree
);
64 hr
= pLoadLibraryShim(szFusion
, NULL
, NULL
, &hfusion
);
68 pCreateAssemblyNameObject
= (void *)GetProcAddress(hfusion
, "CreateAssemblyNameObject");
69 if (!pCreateAssemblyNameObject
)
75 typedef struct _tagASMPROP_RES
82 static const ASMPROP_RES defaults
[ASM_NAME_MAX_PARAMS
] =
99 {S_FALSE
, "", MAX_PATH
},
100 {S_FALSE
, "", MAX_PATH
},
102 {S_OK
, "", MAX_PATH
},
114 static const ASMPROP_RES emptyname
[ASM_NAME_MAX_PARAMS
] =
131 {S_FALSE
, "", MAX_PATH
},
132 {S_FALSE
, "", MAX_PATH
},
134 {S_OK
, "", MAX_PATH
},
146 static const ASMPROP_RES winename
[ASM_NAME_MAX_PARAMS
] =
163 {S_FALSE
, "", MAX_PATH
},
164 {S_FALSE
, "", MAX_PATH
},
166 {S_OK
, "", MAX_PATH
},
178 static const ASMPROP_RES vername
[ASM_NAME_MAX_PARAMS
] =
195 {S_FALSE
, "", MAX_PATH
},
196 {S_FALSE
, "", MAX_PATH
},
198 {S_OK
, "", MAX_PATH
},
210 static const ASMPROP_RES badvername
[ASM_NAME_MAX_PARAMS
] =
227 {S_FALSE
, "", MAX_PATH
},
228 {S_FALSE
, "", MAX_PATH
},
230 {S_OK
, "", MAX_PATH
},
242 static const ASMPROP_RES neutralname
[ASM_NAME_MAX_PARAMS
] =
259 {S_FALSE
, "", MAX_PATH
},
260 {S_FALSE
, "", MAX_PATH
},
262 {S_OK
, "", MAX_PATH
},
274 static const ASMPROP_RES enname
[ASM_NAME_MAX_PARAMS
] =
291 {S_FALSE
, "", MAX_PATH
},
292 {S_FALSE
, "", MAX_PATH
},
294 {S_OK
, "", MAX_PATH
},
306 static const ASMPROP_RES pubkeyname
[ASM_NAME_MAX_PARAMS
] =
309 {S_OK
, "\x01\x23\x45\x67\x89\x0a\xbc\xde", 8},
323 {S_OK
, "", MAX_PATH
},
324 {S_OK
, "", MAX_PATH
},
326 {S_OK
, "", MAX_PATH
},
338 static inline void to_widechar(LPWSTR dest
, LPCSTR src
)
340 MultiByteToWideChar(CP_ACP
, 0, src
, -1, dest
, MAX_PATH
);
343 static void test_assembly_name_props_line(IAssemblyName
*name
,
344 const ASMPROP_RES
*vals
, int line
)
348 WCHAR expect
[MAX_PATH
];
351 for (i
= 0; i
< ASM_NAME_MAX_PARAMS
; i
++)
353 to_widechar(expect
, vals
[i
].val
);
356 memset( str
, 0xcc, sizeof(str
) );
357 hr
= IAssemblyName_GetProperty(name
, i
, str
, &size
);
359 ok(hr
== vals
[i
].hr
||
360 broken(i
>= ASM_NAME_CONFIG_MASK
&& hr
== E_INVALIDARG
) || /* .NET 1.1 */
361 broken(i
>= ASM_NAME_FILE_MAJOR_VERSION
&& hr
== E_INVALIDARG
), /* .NET 1.0 */
362 "%d: prop %d: Expected %08x, got %08x\n", line
, i
, vals
[i
].hr
, hr
);
363 if (hr
!= E_INVALIDARG
)
365 ok(size
== vals
[i
].size
, "%d: prop %d: Expected %d, got %d\n", line
, i
, vals
[i
].size
, size
);
368 ok(str
[0] == 0xcccc, "%d: prop %d: str[0] = %x\n", line
, i
, str
[0]);
370 else if (size
!= MAX_PATH
)
372 if (i
!= ASM_NAME_NAME
&& i
!= ASM_NAME_CULTURE
)
373 ok( !memcmp( vals
[i
].val
, str
, size
), "%d: prop %d: wrong value\n", line
, i
);
375 ok( !lstrcmpW( expect
, str
), "%d: prop %d: Expected %s, got %s\n",
376 line
, i
, wine_dbgstr_w(expect
), wine_dbgstr_w(str
) );
379 if (size
!= 0 && size
!= MAX_PATH
)
382 hr
= IAssemblyName_GetProperty(name
, i
, str
, &size
);
383 ok(hr
== STRSAFE_E_INSUFFICIENT_BUFFER
,
384 "%d: prop %d: Expected STRSAFE_E_INSUFFICIENT_BUFFER, got %08x\n", line
, i
, hr
);
385 ok(size
== vals
[i
].size
, "%d: prop %d: Expected %d, got %d\n", line
, i
, vals
[i
].size
, size
);
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
];
403 static const WCHAR empty
[] = {0};
405 /* NULL ppAssemblyNameObj */
406 to_widechar(namestr
, "wine.dll");
407 hr
= pCreateAssemblyNameObject(NULL
, namestr
, 0, NULL
);
408 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
410 /* NULL szAssemblyName, CANOF_PARSE_DISPLAY_NAME */
411 name
= (IAssemblyName
*)0xdeadbeef;
412 hr
= pCreateAssemblyNameObject(&name
, NULL
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
413 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
414 ok(name
== (IAssemblyName
*)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name
);
416 /* empty szAssemblyName, CANOF_PARSE_DISPLAY_NAME */
417 name
= (IAssemblyName
*)0xdeadbeef;
418 hr
= pCreateAssemblyNameObject(&name
, empty
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
419 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
420 ok(name
== (IAssemblyName
*)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name
);
422 /* check the contents of the AssemblyName for default values */
424 /* NULL szAssemblyName */
426 hr
= pCreateAssemblyNameObject(&name
, NULL
, CANOF_SET_DEFAULT_VALUES
, NULL
);
427 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
428 ok(name
!= NULL
, "Expected non-NULL name\n");
431 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
432 ok(hr
== FUSION_E_INVALID_NAME
||
433 broken(hr
== E_INVALIDARG
), /* .NET 1.x */
434 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
438 hr
= IAssemblyName_GetName(name
, &size
, str
);
439 ok(hr
== S_OK
, "got %08x\n", hr
);
440 ok(str
[0] == 'a', "got %c\n", str
[0]);
441 ok(!size
, "got %u\n", size
);
445 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
446 ok(hr
== FUSION_E_INVALID_NAME
||
447 broken(hr
== S_OK
), /* .NET 1.x */
448 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
449 ok(hi
== 0, "Expected 0, got %08x\n", hi
);
450 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
453 win_skip(".NET 1.x doesn't handle ASM_NAME_PROCESSOR_ID_ARRAY"
454 " and ASM_NAME_OSINFO_ARRAY correctly\n");
456 test_assembly_name_props(name
, defaults
);
458 IAssemblyName_Release(name
);
460 /* empty szAssemblyName */
462 hr
= pCreateAssemblyNameObject(&name
, empty
, CANOF_SET_DEFAULT_VALUES
, NULL
);
463 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
464 ok(name
!= NULL
, "Expected non-NULL name\n");
467 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
468 ok(hr
== FUSION_E_INVALID_NAME
||
469 broken(hr
== S_OK
), /* .NET 1.x */
470 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
473 hr
= IAssemblyName_GetName(name
, &size
, NULL
);
474 ok(hr
== E_NOT_SUFFICIENT_BUFFER
, "got %08x\n", hr
);
475 ok(size
== 1, "got %u\n", size
);
480 hr
= IAssemblyName_GetName(name
, NULL
, str
);
481 ok(hr
== E_NOT_SUFFICIENT_BUFFER
, "got %08x\n", hr
);
482 ok(!str
[0], "got %c\n", str
[0]);
487 hr
= IAssemblyName_GetName(name
, &size
, str
);
488 ok(hr
== E_NOT_SUFFICIENT_BUFFER
, "got %08x\n", hr
);
489 ok(!str
[0], "got %c\n", str
[0]);
490 ok(size
== 1, "got %u\n", size
);
494 hr
= IAssemblyName_GetName(name
, &size
, str
);
495 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
496 ok(!str
[0], "Expected empty name\n");
497 ok(size
== 1, "Expected 1, got %d\n", size
);
501 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
502 ok(hr
== FUSION_E_INVALID_NAME
||
503 broken(hr
== S_OK
), /* .NET 1.x */
504 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
505 ok(hi
== 0, "Expected 0, got %08x\n", hi
);
506 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
509 win_skip(".NET 1.x doesn't handle ASM_NAME_PROCESSOR_ID_ARRAY"
510 " and ASM_NAME_OSINFO_ARRAY correctly\n");
512 test_assembly_name_props(name
, emptyname
);
514 IAssemblyName_Release(name
);
517 to_widechar(namestr
, "wine");
519 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_SET_DEFAULT_VALUES
, NULL
);
520 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
521 ok(name
!= NULL
, "Expected non-NULL name\n");
524 hr
= IAssemblyName_GetDisplayName(name
, NULL
, &size
, 0);
525 ok(hr
== E_NOT_SUFFICIENT_BUFFER
, "got %08x\n", hr
);
526 ok(size
== 5, "got %u\n", size
);
529 hr
= IAssemblyName_GetDisplayName(name
, NULL
, &size
, 0);
530 ok(hr
== E_NOT_SUFFICIENT_BUFFER
|| broken(hr
== E_INVALIDARG
), "got %08x\n", hr
);
531 ok(size
== 5 || broken(size
== 3), "got %u\n", size
);
535 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, 0);
536 ok(hr
== E_NOT_SUFFICIENT_BUFFER
, "got %08x\n", hr
);
537 ok(str
[0] == 'a', "got %c\n", str
[0]);
538 ok(size
== 5, "got %u\n", size
);
542 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
543 ok(hr
== E_NOT_SUFFICIENT_BUFFER
, "got %08x\n", hr
);
544 ok(str
[0] == 'a', "got %c\n", str
[0]);
545 ok(size
== 5, "Wrong size %u\n", size
);
548 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
549 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
551 ok(size
== 5, "Expected 5, got %d\n", size
);
555 hr
= IAssemblyName_GetName(name
, &size
, str
);
556 ok(hr
== E_NOT_SUFFICIENT_BUFFER
, "got %08x\n", hr
);
557 ok(!str
[0], "got %c\n", str
[0]);
558 ok(size
== 5, "got %u\n", size
);
562 hr
= IAssemblyName_GetName(name
, &size
, str
);
563 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
565 ok(size
== 5, "Expected 5, got %d\n", size
);
569 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
570 ok(hr
== FUSION_E_INVALID_NAME
||
571 broken(hr
== S_OK
), /* .NET 1.x */
572 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
573 ok(hi
== 0, "Expected 0, got %08x\n", hi
);
574 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
577 win_skip(".NET 1.x doesn't handle ASM_NAME_PROCESSOR_ID_ARRAY"
578 " and ASM_NAME_OSINFO_ARRAY correctly\n");
580 test_assembly_name_props(name
, winename
);
582 IAssemblyName_Release(name
);
584 /* check the contents of the AssemblyName with parsing */
587 to_widechar(namestr
, "wine");
589 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
590 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
591 ok(name
!= NULL
, "Expected non-NULL name\n");
594 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
595 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
597 ok(size
== 5, "Expected 5, got %d\n", size
);
601 hr
= IAssemblyName_GetName(name
, &size
, str
);
602 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
604 ok(size
== 5, "Expected 5, got %d\n", size
);
608 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
609 ok(hr
== FUSION_E_INVALID_NAME
||
610 broken(hr
== S_OK
), /* .NET 1.x */
611 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
612 ok(hi
== 0, "Expected 0, got %08x\n", hi
);
613 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
615 test_assembly_name_props(name
, winename
);
617 IAssemblyName_Release(name
);
619 /* 'wine, Version=1.2.3.4' */
620 to_widechar(namestr
, "wine, Version=1.2.3.4");
622 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
623 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
624 ok(name
!= NULL
, "Expected non-NULL name\n");
627 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
628 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
629 ok_aw("wine, Version=1.2.3.4", str
);
630 ok(size
== 22, "Expected 22, got %d\n", size
);
634 hr
= IAssemblyName_GetName(name
, &size
, str
);
635 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
637 ok(size
== 5, "Expected 5, got %d\n", size
);
641 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
642 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
643 ok(hi
== 0x00010002, "Expected 0x00010002, got %08x\n", hi
);
644 ok(lo
== 0x00030004, "Expected 0x00030004, got %08x\n", lo
);
646 test_assembly_name_props(name
, vername
);
648 IAssemblyName_Release(name
);
650 /* Version isn't of the form 1.x.x.x */
651 to_widechar(namestr
, "wine, Version=1.5");
653 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
654 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
655 ok(name
!= NULL
, "Expected non-NULL name\n");
658 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
659 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
660 ok_aw("wine, Version=1.5", str
);
661 ok(size
== 18, "Expected 18, got %d\n", size
);
665 hr
= IAssemblyName_GetName(name
, &size
, str
);
666 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
668 ok(size
== 5, "Expected 5, got %d\n", size
);
672 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
673 ok(hr
== FUSION_E_INVALID_NAME
||
674 broken(hr
== S_OK
), /* .NET 1.x */
675 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
677 broken(hi
== 0x10005), /* .NET 1.x */
678 "Expected 0, got %08x\n", hi
);
679 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
681 test_assembly_name_props(name
, badvername
);
683 IAssemblyName_Release(name
);
685 /* 'wine, Culture=neutral' */
686 to_widechar(namestr
, "wine, Culture=neutral");
688 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
689 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
690 ok(name
!= NULL
, "Expected non-NULL name\n");
693 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
694 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
695 ok_aw("wine, Culture=neutral", str
);
696 ok(size
== 22, "Expected 22, got %d\n", size
);
700 hr
= IAssemblyName_GetName(name
, &size
, str
);
701 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
703 ok(size
== 5, "Expected 5, got %d\n", size
);
707 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
708 ok(hr
== FUSION_E_INVALID_NAME
||
709 broken(hr
== S_OK
), /* .NET 1.x */
710 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
711 ok(hi
== 0, "Expected 0, got %08x\n", hi
);
712 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
714 test_assembly_name_props(name
, neutralname
);
716 IAssemblyName_Release(name
);
718 /* 'wine, Culture=en' */
719 to_widechar(namestr
, "wine, Culture=en");
721 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
722 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
723 ok(name
!= NULL
, "Expected non-NULL name\n");
726 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
727 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
728 ok_aw("wine, Culture=en", str
);
729 ok(size
== 17, "Expected 17, got %d\n", size
);
733 hr
= IAssemblyName_GetName(name
, &size
, str
);
734 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
736 ok(size
== 5, "Expected 5, got %d\n", size
);
740 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
741 ok(hr
== FUSION_E_INVALID_NAME
||
742 broken(hr
== S_OK
), /* .NET 1.x */
743 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
744 ok(hi
== 0, "Expected 0, got %08x\n", hi
);
745 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
747 test_assembly_name_props(name
, enname
);
749 IAssemblyName_Release(name
);
751 /* 'wine, PublicKeyToken=01234567890abcde' */
752 to_widechar(namestr
, "wine, PublicKeyToken=01234567890abcde");
754 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
755 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
756 ok(name
!= NULL
, "Expected non-NULL name\n");
759 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
760 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
761 ok_aw("wine, PublicKeyToken=01234567890abcde", str
);
762 ok(size
== 38, "Expected 38, got %d\n", size
);
766 hr
= IAssemblyName_GetName(name
, &size
, str
);
767 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
769 ok(size
== 5, "Expected 5, got %d\n", size
);
773 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
774 ok(hr
== FUSION_E_INVALID_NAME
||
775 broken(hr
== S_OK
), /* .NET 1.x */
776 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
777 ok(hi
== 0, "Expected 0, got %08x\n", hi
);
778 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
780 test_assembly_name_props(name
, pubkeyname
);
782 IAssemblyName_Release(name
);
784 /* Processor architecture tests */
785 to_widechar(namestr
, "wine, processorArchitecture=x86");
787 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
788 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
790 ok(name
!= NULL
, "Expected non-NULL name\n");
793 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_PROCESSORARCHITECTURE
);
794 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
796 WideCharToMultiByte(CP_ACP
, 0, str
, -1, string1
, MAX_PATH
, NULL
, NULL
);
798 if (lstrcmpA(string1
, "wine") == 0)
799 win_skip("processorArchitecture not supported on .NET 1.x\n");
802 ok_aw("wine, processorArchitecture=x86", str
);
803 ok(size
== 32, "Expected 32, got %d\n", size
);
806 hr
= IAssemblyName_GetProperty(name
, ASM_NAME_ARCHITECTURE
, &arch
, &size
);
807 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
808 ok(arch
== peI386
, "Expected peI386, got %d\n", arch
);
809 ok(size
== sizeof(arch
), "Wrong size %d\n", size
);
811 IAssemblyName_Release(name
);
814 to_widechar(namestr
, "wine, processorArchitecture=AMD64");
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=AMD64", str
);
823 ok(size
== 34, "Expected 34, got %d\n", size
);
826 hr
= IAssemblyName_GetProperty(name
, ASM_NAME_ARCHITECTURE
, &arch
, &size
);
827 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
828 ok(arch
== peAMD64
, "Expected peAMD64, got %d\n", arch
);
829 ok(size
== sizeof(arch
), "Wrong size %d\n", size
);
831 IAssemblyName_Release(name
);
834 to_widechar(namestr
, "wine, processorArchitecture=IA64");
836 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
837 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
840 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_PROCESSORARCHITECTURE
);
841 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
842 ok_aw("wine, processorArchitecture=IA64", str
);
843 ok(size
== 33, "Expected 33, got %d\n", size
);
846 hr
= IAssemblyName_GetProperty(name
, ASM_NAME_ARCHITECTURE
, &arch
, &size
);
847 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
848 ok(arch
== peIA64
, "Expected peIA64, got %d\n", arch
);
849 ok(size
== sizeof(arch
), "Wrong size %d\n", size
);
851 IAssemblyName_Release(name
);
854 to_widechar(namestr
, "wine, processorArchitecture=MSIL");
856 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
857 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
860 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_PROCESSORARCHITECTURE
);
861 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
862 ok_aw("wine, processorArchitecture=MSIL", str
);
863 ok(size
== 33, "Expected 33, got %d\n", size
);
866 hr
= IAssemblyName_GetProperty(name
, ASM_NAME_ARCHITECTURE
, &arch
, &size
);
867 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
868 ok(arch
== peMSIL
, "Expected peMSIL, got %d\n", arch
);
869 ok(size
== sizeof(arch
), "Wrong size %d\n", size
);
871 IAssemblyName_Release(name
);
874 /* Pulling out various different values */
875 to_widechar(namestr
, "wine, Version=1.2.3.4, Culture=en, PublicKeyToken=1234567890abcdef");
877 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
878 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
879 ok(name
!= NULL
, "Expected non-NULL name\n");
882 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_VERSION
| ASM_DISPLAYF_CULTURE
);
883 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
884 ok_aw("wine, Version=1.2.3.4, Culture=en", str
);
885 ok(size
== 34, "Expected 34, got %d\n", size
);
888 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_CULTURE
| ASM_DISPLAYF_PUBLIC_KEY_TOKEN
);
889 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
890 ok_aw("wine, Culture=en, PublicKeyToken=1234567890abcdef", str
);
891 ok(size
== 50, "Expected 50, got %d\n", size
);
894 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
895 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
896 ok_aw("wine, Version=1.2.3.4, Culture=en, PublicKeyToken=1234567890abcdef", str
);
897 ok(size
== 67, "Expected 67, got %d\n", size
);
899 IAssemblyName_Release(name
);
901 /* invalid property */
902 to_widechar(namestr
, "wine, BadProp=42");
904 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
905 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
906 ok(name
!= NULL
, "Expected non-NULL name\n");
910 hr
= IAssemblyName_GetDisplayName(name
, str
, &size
, ASM_DISPLAYF_FULL
);
911 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
913 ok(size
== 5, "Expected 5, got %d\n", size
);
917 hr
= IAssemblyName_GetName(name
, &size
, str
);
918 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
920 ok(size
== 5, "Expected 5, got %d\n", size
);
924 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
925 ok(hr
== FUSION_E_INVALID_NAME
||
926 broken(hr
== S_OK
), /* .NET 1.x */
927 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
928 ok(hi
== 0, "Expected 0, got %08x\n", hi
);
929 ok(lo
== 0, "Expected 0, got %08x\n", lo
);
931 test_assembly_name_props(name
, winename
);
933 IAssemblyName_Release(name
);
935 /* PublicKeyToken is not 16 chars long */
936 to_widechar(namestr
, "wine, PublicKeyToken=567890abcdef");
937 name
= (IAssemblyName
*)0xdeadbeef;
938 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
939 if (hr
== S_OK
&& name
!= (IAssemblyName
*)0xdeadbeef)
941 win_skip(".NET 1.x doesn't check PublicKeyToken correctly\n");
942 IAssemblyName_Release(name
);
945 ok(hr
== FUSION_E_INVALID_NAME
,
946 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
947 ok(name
== (IAssemblyName
*)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name
);
949 /* PublicKeyToken contains invalid chars */
950 to_widechar(namestr
, "wine, PublicKeyToken=1234567890ghijkl");
951 name
= (IAssemblyName
*)0xdeadbeef;
952 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
953 ok(hr
== FUSION_E_INVALID_NAME
,
954 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
955 ok(name
== (IAssemblyName
*)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name
);
957 /* no comma separator */
958 to_widechar(namestr
, "wine PublicKeyToken=1234567890abcdef");
959 name
= (IAssemblyName
*)0xdeadbeef;
960 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
961 ok(hr
== FUSION_E_INVALID_NAME
,
962 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
963 ok(name
== (IAssemblyName
*)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name
);
964 if(SUCCEEDED(hr
)) IAssemblyName_Release(name
);
967 to_widechar(namestr
, "wine, PublicKeyToken");
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
);
975 to_widechar(namestr
, "wine, PublicKeyToken=");
976 name
= (IAssemblyName
*)0xdeadbeef;
977 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
978 ok(hr
== FUSION_E_INVALID_NAME
,
979 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr
);
980 ok(name
== (IAssemblyName
*)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name
);
983 to_widechar(namestr
, "wine,version=1.0.0.0");
984 name
= (IAssemblyName
*)0xdeadbeef;
985 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
986 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
987 ok(name
!= NULL
, "Expected non-NULL name\n");
988 hi
= lo
= 0xdeadbeef;
989 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
990 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
991 ok(hi
== 65536, "Expected 536, got %u\n", hi
);
992 ok(lo
== 0, "Expected 0, got %u\n", lo
);
993 IAssemblyName_Release(name
);
996 to_widechar(namestr
, "wine, version=\"1.0.0.0\",culture=\"en\"");
997 name
= (IAssemblyName
*)0xdeadbeef;
998 hr
= pCreateAssemblyNameObject(&name
, namestr
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
999 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1000 ok(name
!= NULL
, "Expected non-NULL name\n");
1001 hi
= lo
= 0xdeadbeef;
1002 hr
= IAssemblyName_GetVersion(name
, &hi
, &lo
);
1003 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1004 ok(hi
== 65536, "Expected 65536, got %u\n", hi
);
1005 ok(lo
== 0, "Expected 0, got %u\n", lo
);
1006 IAssemblyName_Release(name
);
1009 static void test_IAssemblyName_IsEqual(void)
1011 static const WCHAR wine1
[] =
1012 {'w','i','n','e',0};
1013 static const WCHAR wine2
[] =
1014 {'w','i','n','e',',','v','e','r','s','i','o','n','=','1','.','0','.','0','.','0',0};
1015 static const WCHAR wine3
[] =
1016 {'w','i','n','e',',','v','e','r','s','i','o','n','=','1','.','0','.','0','.','0',',',
1017 'c','u','l','t','u','r','e','=','n','e','u','t','r','a','l',0};
1018 static const WCHAR wine4
[] =
1019 {'w','i','n','e',',','v','e','r','s','i','o','n','=','1','.','0','.','0','.','0',',',
1020 'c','u','l','t','u','r','e','=','e','n',0};
1021 static const WCHAR wine5
[] =
1022 {'w','i','n','e',',','v','e','r','s','i','o','n','=','1','.','0','.','0','.','0',',',
1023 'p','u','b','l','i','c','K','e','y','T','o','k','e','n','=','1','2','3','4','5','6',
1024 '7','8','9','0','a','b','c','d','e','f',0};
1026 IAssemblyName
*name1
, *name2
;
1028 hr
= pCreateAssemblyNameObject( &name1
, wine1
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
1029 ok( hr
== S_OK
, "got %08x\n", hr
);
1031 hr
= pCreateAssemblyNameObject( &name2
, wine1
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
1032 ok( hr
== S_OK
, "got %08x\n", hr
);
1034 if (0) { /* crashes on some old version */
1035 hr
= IAssemblyName_IsEqual( name1
, NULL
, 0 );
1036 ok( hr
== S_FALSE
, "got %08x\n", hr
);
1038 hr
= IAssemblyName_IsEqual( name1
, NULL
, ASM_CMPF_IL_ALL
);
1039 ok( hr
== S_FALSE
, "got %08x\n", hr
);
1042 hr
= IAssemblyName_IsEqual( name1
, name1
, ASM_CMPF_IL_ALL
);
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( name2
);
1049 hr
= pCreateAssemblyNameObject( &name2
, wine2
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
1050 ok( hr
== S_OK
, "got %08x\n", hr
);
1052 hr
= IAssemblyName_IsEqual( name1
, name2
, ASM_CMPF_IL_ALL
);
1053 ok( hr
== S_OK
, "got %08x\n", hr
);
1055 IAssemblyName_Release( name2
);
1056 hr
= pCreateAssemblyNameObject( &name2
, wine3
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
1057 ok( hr
== S_OK
, "got %08x\n", hr
);
1059 hr
= IAssemblyName_IsEqual( name1
, name2
, ASM_CMPF_IL_ALL
);
1060 ok( hr
== S_OK
, "got %08x\n", hr
);
1062 IAssemblyName_Release( name1
);
1063 hr
= pCreateAssemblyNameObject( &name1
, wine4
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
1064 ok( hr
== S_OK
, "got %08x\n", hr
);
1066 hr
= IAssemblyName_IsEqual( name1
, name2
, ASM_CMPF_IL_ALL
);
1067 ok( hr
== S_FALSE
, "got %08x\n", hr
);
1069 IAssemblyName_Release( name1
);
1070 hr
= pCreateAssemblyNameObject( &name1
, wine1
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
1071 ok( hr
== S_OK
, "got %08x\n", hr
);
1073 IAssemblyName_Release( name2
);
1074 hr
= pCreateAssemblyNameObject( &name2
, wine5
, CANOF_PARSE_DISPLAY_NAME
, NULL
);
1075 ok( hr
== S_OK
, "got %08x\n", hr
);
1077 hr
= IAssemblyName_IsEqual( name1
, name2
, ASM_CMPF_IL_ALL
);
1078 ok( hr
== S_OK
, "got %08x\n", hr
);
1080 IAssemblyName_Release( name1
);
1081 IAssemblyName_Release( name2
);
1086 if (!init_functionpointers())
1088 win_skip("fusion.dll not available\n");
1092 test_CreateAssemblyNameObject();
1093 test_IAssemblyName_IsEqual();