[FUSION_WINETEST] Sync with Wine Staging 1.7.47. CORE-9924
[reactos.git] / rostests / winetests / fusion / asmname.c
1 /*
2 * Copyright 2008 James Hawkins
3 *
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.
8 *
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.
13 *
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
17 */
18
19 #define WIN32_NO_STATUS
20 #define _INC_WINDOWS
21 #define COM_NO_WINDOWS_H
22
23 #define COBJMACROS
24
25 //#include <stdio.h>
26 #include <stdarg.h>
27
28 //#include <windows.h>
29 #include <windef.h>
30 #include <winbase.h>
31 #include <winnls.h>
32 #include <objbase.h>
33 //#include <mscoree.h>
34 #include <fusion.h>
35 #include <corerror.h>
36
37 #include <wine/test.h>
38
39 /* ok-like statement which takes two unicode strings or one unicode and one ANSI string as arguments */
40 static CHAR string1[MAX_PATH];
41
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);
46
47 static HRESULT (WINAPI *pCreateAssemblyNameObject)(LPASSEMBLYNAME *ppAssemblyNameObj,
48 LPCWSTR szAssemblyName, DWORD dwFlags,
49 LPVOID pvReserved);
50 static HRESULT (WINAPI *pLoadLibraryShim)(LPCWSTR szDllName, LPCWSTR szVersion,
51 LPVOID pvReserved, HMODULE *phModDll);
52
53 static BOOL init_functionpointers(void)
54 {
55 HRESULT hr;
56 HMODULE hfusion;
57 HMODULE hmscoree;
58
59 static const WCHAR szFusion[] = {'f','u','s','i','o','n','.','d','l','l',0};
60
61 hmscoree = LoadLibraryA("mscoree.dll");
62 if (!hmscoree)
63 return FALSE;
64
65 pLoadLibraryShim = (void *)GetProcAddress(hmscoree, "LoadLibraryShim");
66 if (!pLoadLibraryShim)
67 {
68 FreeLibrary(hmscoree);
69 return FALSE;
70 }
71
72 hr = pLoadLibraryShim(szFusion, NULL, NULL, &hfusion);
73 if (FAILED(hr))
74 return FALSE;
75
76 pCreateAssemblyNameObject = (void *)GetProcAddress(hfusion, "CreateAssemblyNameObject");
77 if (!pCreateAssemblyNameObject)
78 return FALSE;
79
80 return TRUE;
81 }
82
83 typedef struct _tagASMPROP_RES
84 {
85 HRESULT hr;
86 CHAR val[MAX_PATH];
87 DWORD size;
88 } ASMPROP_RES;
89
90 static const ASMPROP_RES defaults[ASM_NAME_MAX_PARAMS] =
91 {
92 {S_OK, "", 0},
93 {S_OK, "", 0},
94 {S_OK, "", 0},
95 {S_OK, "", 0},
96 {S_OK, "", 0},
97 {S_OK, "", 0},
98 {S_OK, "", 0},
99 {S_OK, "", 0},
100 {S_OK, "", 0},
101 {S_OK, "", 0},
102 {S_OK, "", 0},
103 {S_OK, "", 0},
104 {S_OK, "", 0},
105 {S_OK, "", 0},
106 {S_OK, "", 0},
107 {S_FALSE, "", MAX_PATH},
108 {S_FALSE, "", MAX_PATH},
109 {S_OK, "", 0},
110 {S_OK, "", MAX_PATH},
111 {S_OK, "", 0},
112 {S_OK, "", 0},
113 {S_OK, "", 0},
114 {S_OK, "", 0},
115 {S_OK, "", 0},
116 {S_OK, "", 0},
117 {S_OK, "", 0},
118 {S_OK, "", 0},
119 {S_OK, "", 0}
120 };
121
122 static const ASMPROP_RES emptyname[ASM_NAME_MAX_PARAMS] =
123 {
124 {S_OK, "", 0},
125 {S_OK, "", 0},
126 {S_OK, "", 0},
127 {S_OK, "", 2},
128 {S_OK, "", 0},
129 {S_OK, "", 0},
130 {S_OK, "", 0},
131 {S_OK, "", 0},
132 {S_OK, "", 0},
133 {S_OK, "", 0},
134 {S_OK, "", 0},
135 {S_OK, "", 0},
136 {S_OK, "", 0},
137 {S_OK, "", 0},
138 {S_OK, "", 0},
139 {S_FALSE, "", MAX_PATH},
140 {S_FALSE, "", MAX_PATH},
141 {S_OK, "", 0},
142 {S_OK, "", MAX_PATH},
143 {S_OK, "", 0},
144 {S_OK, "", 0},
145 {S_OK, "", 0},
146 {S_OK, "", 0},
147 {S_OK, "", 0},
148 {S_OK, "", 0},
149 {S_OK, "", 0},
150 {S_OK, "", 0},
151 {S_OK, "", 0}
152 };
153
154 static const ASMPROP_RES winename[ASM_NAME_MAX_PARAMS] =
155 {
156 {S_OK, "", 0},
157 {S_OK, "", 0},
158 {S_OK, "", 0},
159 {S_OK, "wine", 10},
160 {S_OK, "", 0},
161 {S_OK, "", 0},
162 {S_OK, "", 0},
163 {S_OK, "", 0},
164 {S_OK, "", 0},
165 {S_OK, "", 0},
166 {S_OK, "", 0},
167 {S_OK, "", 0},
168 {S_OK, "", 0},
169 {S_OK, "", 0},
170 {S_OK, "", 0},
171 {S_FALSE, "", MAX_PATH},
172 {S_FALSE, "", MAX_PATH},
173 {S_OK, "", 0},
174 {S_OK, "", MAX_PATH},
175 {S_OK, "", 0},
176 {S_OK, "", 0},
177 {S_OK, "", 0},
178 {S_OK, "", 0},
179 {S_OK, "", 0},
180 {S_OK, "", 0},
181 {S_OK, "", 0},
182 {S_OK, "", 0},
183 {S_OK, "", 0}
184 };
185
186 static const ASMPROP_RES vername[ASM_NAME_MAX_PARAMS] =
187 {
188 {S_OK, "", 0},
189 {S_OK, "", 0},
190 {S_OK, "", 0},
191 {S_OK, "wine", 10},
192 {S_OK, "\x01", 2},
193 {S_OK, "\x02", 2},
194 {S_OK, "\x03", 2},
195 {S_OK, "\x04", 2},
196 {S_OK, "", 0},
197 {S_OK, "", 0},
198 {S_OK, "", 0},
199 {S_OK, "", 0},
200 {S_OK, "", 0},
201 {S_OK, "", 0},
202 {S_OK, "", 0},
203 {S_FALSE, "", MAX_PATH},
204 {S_FALSE, "", MAX_PATH},
205 {S_OK, "", 0},
206 {S_OK, "", MAX_PATH},
207 {S_OK, "", 0},
208 {S_OK, "", 0},
209 {S_OK, "", 0},
210 {S_OK, "", 0},
211 {S_OK, "", 0},
212 {S_OK, "", 0},
213 {S_OK, "", 0},
214 {S_OK, "", 0},
215 {S_OK, "", 0}
216 };
217
218 static const ASMPROP_RES badvername[ASM_NAME_MAX_PARAMS] =
219 {
220 {S_OK, "", 0},
221 {S_OK, "", 0},
222 {S_OK, "", 0},
223 {S_OK, "wine", 10},
224 {S_OK, "\x01", 2},
225 {S_OK, "\x05", 2},
226 {S_OK, "", 0},
227 {S_OK, "", 0},
228 {S_OK, "", 0},
229 {S_OK, "", 0},
230 {S_OK, "", 0},
231 {S_OK, "", 0},
232 {S_OK, "", 0},
233 {S_OK, "", 0},
234 {S_OK, "", 0},
235 {S_FALSE, "", MAX_PATH},
236 {S_FALSE, "", MAX_PATH},
237 {S_OK, "", 0},
238 {S_OK, "", MAX_PATH},
239 {S_OK, "", 0},
240 {S_OK, "", 0},
241 {S_OK, "", 0},
242 {S_OK, "", 0},
243 {S_OK, "", 0},
244 {S_OK, "", 0},
245 {S_OK, "", 0},
246 {S_OK, "", 0},
247 {S_OK, "", 0}
248 };
249
250 static const ASMPROP_RES neutralname[ASM_NAME_MAX_PARAMS] =
251 {
252 {S_OK, "", 0},
253 {S_OK, "", 0},
254 {S_OK, "", 0},
255 {S_OK, "wine", 10},
256 {S_OK, "", 0},
257 {S_OK, "", 0},
258 {S_OK, "", 0},
259 {S_OK, "", 0},
260 {S_OK, "", 2},
261 {S_OK, "", 0},
262 {S_OK, "", 0},
263 {S_OK, "", 0},
264 {S_OK, "", 0},
265 {S_OK, "", 0},
266 {S_OK, "", 0},
267 {S_FALSE, "", MAX_PATH},
268 {S_FALSE, "", MAX_PATH},
269 {S_OK, "", 0},
270 {S_OK, "", MAX_PATH},
271 {S_OK, "", 0},
272 {S_OK, "", 0},
273 {S_OK, "", 0},
274 {S_OK, "", 0},
275 {S_OK, "", 0},
276 {S_OK, "", 0},
277 {S_OK, "", 0},
278 {S_OK, "", 0},
279 {S_OK, "", 0}
280 };
281
282 static const ASMPROP_RES enname[ASM_NAME_MAX_PARAMS] =
283 {
284 {S_OK, "", 0},
285 {S_OK, "", 0},
286 {S_OK, "", 0},
287 {S_OK, "wine", 10},
288 {S_OK, "", 0},
289 {S_OK, "", 0},
290 {S_OK, "", 0},
291 {S_OK, "", 0},
292 {S_OK, "en", 6},
293 {S_OK, "", 0},
294 {S_OK, "", 0},
295 {S_OK, "", 0},
296 {S_OK, "", 0},
297 {S_OK, "", 0},
298 {S_OK, "", 0},
299 {S_FALSE, "", MAX_PATH},
300 {S_FALSE, "", MAX_PATH},
301 {S_OK, "", 0},
302 {S_OK, "", MAX_PATH},
303 {S_OK, "", 0},
304 {S_OK, "", 0},
305 {S_OK, "", 0},
306 {S_OK, "", 0},
307 {S_OK, "", 0},
308 {S_OK, "", 0},
309 {S_OK, "", 0},
310 {S_OK, "", 0},
311 {S_OK, "", 0}
312 };
313
314 static const ASMPROP_RES pubkeyname[ASM_NAME_MAX_PARAMS] =
315 {
316 {S_OK, "", 0},
317 {S_OK, "\x12\x34\x56\x78\x90\xab\xcd\xef", 8},
318 {S_OK, "", 0},
319 {S_OK, "wine", 10},
320 {S_OK, "", 0},
321 {S_OK, "", 0},
322 {S_OK, "", 0},
323 {S_OK, "", 0},
324 {S_OK, "", 0},
325 {S_OK, "", 0},
326 {S_OK, "", 0},
327 {S_OK, "", 0},
328 {S_OK, "", 0},
329 {S_OK, "", 0},
330 {S_OK, "", 0},
331 {S_OK, "", MAX_PATH},
332 {S_OK, "", MAX_PATH},
333 {S_OK, "", 0},
334 {S_OK, "", MAX_PATH},
335 {S_OK, "", 0},
336 {S_OK, "", 0},
337 {S_OK, "", 0},
338 {S_OK, "", 0},
339 {S_OK, "", 0},
340 {S_OK, "", 0},
341 {S_OK, "", 0},
342 {S_OK, "", 0},
343 {S_OK, "", 0}
344 };
345
346 static inline void to_widechar(LPWSTR dest, LPCSTR src)
347 {
348 MultiByteToWideChar(CP_ACP, 0, src, -1, dest, MAX_PATH);
349 }
350
351 static inline void to_multibyte(LPSTR dest, LPWSTR src)
352 {
353 WideCharToMultiByte(CP_ACP, 0, src, -1, dest, MAX_PATH, NULL, NULL);
354 }
355
356 static void test_assembly_name_props_line(IAssemblyName *name,
357 const ASMPROP_RES *vals, int line)
358 {
359 HRESULT hr;
360 DWORD i, size;
361 WCHAR expect[MAX_PATH];
362 WCHAR str[MAX_PATH];
363 CHAR val[MAX_PATH];
364
365 for (i = 0; i < ASM_NAME_MAX_PARAMS; i++)
366 {
367 to_widechar(expect, vals[i].val);
368
369 size = MAX_PATH;
370 ZeroMemory(str, MAX_PATH);
371 hr = IAssemblyName_GetProperty(name, i, str, &size);
372 to_multibyte(val, str);
373
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)
379 {
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");
382 else
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);
385 }
386 }
387 }
388
389 #define test_assembly_name_props(name, vals) \
390 test_assembly_name_props_line(name, vals, __LINE__);
391
392 static void test_CreateAssemblyNameObject(void)
393 {
394 IAssemblyName *name;
395 WCHAR str[MAX_PATH];
396 WCHAR namestr[MAX_PATH];
397 DWORD size, hi, lo;
398 HRESULT hr;
399
400 static const WCHAR empty[] = {0};
401
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);
406
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);
412
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);
418
419 /* check the contents of the AssemblyName for default values */
420
421 /* NULL szAssemblyName */
422 name = NULL;
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");
426
427 size = MAX_PATH;
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);
432
433 str[0] = 'a';
434 size = MAX_PATH;
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);
439
440 hi = 0xbeefcace;
441 lo = 0xcafebabe;
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);
448
449 if (hr == S_OK)
450 win_skip(".NET 1.x doesn't handle ASM_NAME_PROCESSOR_ID_ARRAY"
451 " and ASM_NAME_OSINFO_ARRAY correctly\n");
452 else
453 test_assembly_name_props(name, defaults);
454
455 IAssemblyName_Release(name);
456
457 /* empty szAssemblyName */
458 name = NULL;
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");
462
463 size = MAX_PATH;
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);
468
469 size = 0;
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);
473
474 if (0) /* crash */
475 {
476 str[0] = '\0';
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]);
480 }
481
482 size = 0;
483 str[0] = '\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);
488
489 size = MAX_PATH;
490 str[0] = '\0';
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);
495
496 hi = 0xbeefcace;
497 lo = 0xcafebabe;
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);
504
505 if (hr == S_OK)
506 win_skip(".NET 1.x doesn't handle ASM_NAME_PROCESSOR_ID_ARRAY"
507 " and ASM_NAME_OSINFO_ARRAY correctly\n");
508 else
509 test_assembly_name_props(name, emptyname);
510
511 IAssemblyName_Release(name);
512
513 /* 'wine' */
514 to_widechar(namestr, "wine");
515 name = NULL;
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");
519
520 size = 0;
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);
524
525 size = 3;
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);
529
530 size = 3;
531 str[0] = 'a';
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);
536
537 size = MAX_PATH;
538 hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_FULL);
539 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
540 ok_aw("wine", str);
541 ok(size == 5, "Expected 5, got %d\n", size);
542
543 size = 0;
544 str[0] = 0;
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);
549
550 size = MAX_PATH;
551 str[0] = '\0';
552 hr = IAssemblyName_GetName(name, &size, str);
553 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
554 ok_aw("wine", str);
555 ok(size == 5, "Expected 5, got %d\n", size);
556
557 hi = 0xbeefcace;
558 lo = 0xcafebabe;
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);
565
566 if (hr == S_OK)
567 win_skip(".NET 1.x doesn't handle ASM_NAME_PROCESSOR_ID_ARRAY"
568 " and ASM_NAME_OSINFO_ARRAY correctly\n");
569 else
570 test_assembly_name_props(name, winename);
571
572 IAssemblyName_Release(name);
573
574 /* check the contents of the AssemblyName with parsing */
575
576 /* 'wine' */
577 to_widechar(namestr, "wine");
578 name = NULL;
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");
582
583 size = MAX_PATH;
584 hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_FULL);
585 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
586 ok_aw("wine", str);
587 ok(size == 5, "Expected 5, got %d\n", size);
588
589 size = MAX_PATH;
590 str[0] = '\0';
591 hr = IAssemblyName_GetName(name, &size, str);
592 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
593 ok_aw("wine", str);
594 ok(size == 5, "Expected 5, got %d\n", size);
595
596 hi = 0xbeefcace;
597 lo = 0xcafebabe;
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);
604
605 test_assembly_name_props(name, winename);
606
607 IAssemblyName_Release(name);
608
609 /* 'wine, Version=1.2.3.4' */
610 to_widechar(namestr, "wine, Version=1.2.3.4");
611 name = NULL;
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");
615
616 size = MAX_PATH;
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);
621
622 size = MAX_PATH;
623 str[0] = '\0';
624 hr = IAssemblyName_GetName(name, &size, str);
625 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
626 ok_aw("wine", str);
627 ok(size == 5, "Expected 5, got %d\n", size);
628
629 hi = 0xbeefcace;
630 lo = 0xcafebabe;
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);
635
636 test_assembly_name_props(name, vername);
637
638 IAssemblyName_Release(name);
639
640 /* Version isn't of the form 1.x.x.x */
641 to_widechar(namestr, "wine, Version=1.5");
642 name = NULL;
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");
646
647 size = MAX_PATH;
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);
652
653 size = MAX_PATH;
654 str[0] = '\0';
655 hr = IAssemblyName_GetName(name, &size, str);
656 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
657 ok_aw("wine", str);
658 ok(size == 5, "Expected 5, got %d\n", size);
659
660 hi = 0xbeefcace;
661 lo = 0xcafebabe;
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);
666 ok(hi == 0 ||
667 broken(hi == 0x10005), /* .NET 1.x */
668 "Expected 0, got %08x\n", hi);
669 ok(lo == 0, "Expected 0, got %08x\n", lo);
670
671 test_assembly_name_props(name, badvername);
672
673 IAssemblyName_Release(name);
674
675 /* 'wine, Culture=neutral' */
676 to_widechar(namestr, "wine, Culture=neutral");
677 name = NULL;
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");
681
682 size = MAX_PATH;
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);
687
688 size = MAX_PATH;
689 str[0] = '\0';
690 hr = IAssemblyName_GetName(name, &size, str);
691 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
692 ok_aw("wine", str);
693 ok(size == 5, "Expected 5, got %d\n", size);
694
695 hi = 0xbeefcace;
696 lo = 0xcafebabe;
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);
703
704 test_assembly_name_props(name, neutralname);
705
706 IAssemblyName_Release(name);
707
708 /* 'wine, Culture=en' */
709 to_widechar(namestr, "wine, Culture=en");
710 name = NULL;
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");
714
715 size = MAX_PATH;
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);
720
721 size = MAX_PATH;
722 str[0] = '\0';
723 hr = IAssemblyName_GetName(name, &size, str);
724 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
725 ok_aw("wine", str);
726 ok(size == 5, "Expected 5, got %d\n", size);
727
728 hi = 0xbeefcace;
729 lo = 0xcafebabe;
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);
736
737 test_assembly_name_props(name, enname);
738
739 IAssemblyName_Release(name);
740
741 /* 'wine, PublicKeyToken=1234567890abcdef' */
742 to_widechar(namestr, "wine, PublicKeyToken=1234567890abcdef");
743 name = NULL;
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");
747
748 size = MAX_PATH;
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);
753
754 size = MAX_PATH;
755 str[0] = '\0';
756 hr = IAssemblyName_GetName(name, &size, str);
757 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
758 ok_aw("wine", str);
759 ok(size == 5, "Expected 5, got %d\n", size);
760
761 hi = 0xbeefcace;
762 lo = 0xcafebabe;
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);
769
770 test_assembly_name_props(name, pubkeyname);
771
772 IAssemblyName_Release(name);
773
774 /* Processor architecture tests */
775 to_widechar(namestr, "wine, processorArchitecture=x86");
776 name = NULL;
777 hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL);
778 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
779
780 ok(name != NULL, "Expected non-NULL name\n");
781
782 size = MAX_PATH;
783 hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_PROCESSORARCHITECTURE);
784 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
785
786 WideCharToMultiByte(CP_ACP, 0, str, -1, string1, MAX_PATH, NULL, NULL);
787
788 if (lstrcmpA(string1, "wine") == 0)
789 win_skip("processorArchitecture not supported on .NET 1.x\n");
790 else
791 {
792 ok_aw("wine, processorArchitecture=x86", str);
793 ok(size == 32, "Expected 32, got %d\n", size);
794
795 IAssemblyName_Release(name);
796
797 /* amd64 */
798 to_widechar(namestr, "wine, processorArchitecture=AMD64");
799 name = NULL;
800 hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL);
801 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
802
803 size = MAX_PATH;
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);
808
809 IAssemblyName_Release(name);
810
811 /* ia64 */
812 to_widechar(namestr, "wine, processorArchitecture=IA64");
813 name = NULL;
814 hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL);
815 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
816
817 size = MAX_PATH;
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);
822
823 IAssemblyName_Release(name);
824
825 /* msil */
826 to_widechar(namestr, "wine, processorArchitecture=MSIL");
827 name = NULL;
828 hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL);
829 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
830
831 size = MAX_PATH;
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);
836
837 IAssemblyName_Release(name);
838 }
839
840 /* Pulling out various different values */
841 to_widechar(namestr, "wine, Version=1.2.3.4, Culture=en, PublicKeyToken=1234567890abcdef");
842 name = NULL;
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");
846
847 size = MAX_PATH;
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);
852
853 size = MAX_PATH;
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);
858
859 size = MAX_PATH;
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);
864
865 IAssemblyName_Release(name);
866
867 /* invalid property */
868 to_widechar(namestr, "wine, BadProp=42");
869 name = NULL;
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");
873
874 size = MAX_PATH;
875 str[0] = '\0';
876 hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_FULL);
877 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
878 ok_aw("wine", str);
879 ok(size == 5, "Expected 5, got %d\n", size);
880
881 size = MAX_PATH;
882 str[0] = '\0';
883 hr = IAssemblyName_GetName(name, &size, str);
884 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
885 ok_aw("wine", str);
886 ok(size == 5, "Expected 5, got %d\n", size);
887
888 hi = 0xbeefcace;
889 lo = 0xcafebabe;
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);
896
897 test_assembly_name_props(name, winename);
898
899 IAssemblyName_Release(name);
900
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)
906 {
907 win_skip(".NET 1.x doesn't check PublicKeyToken correctly\n");
908 IAssemblyName_Release(name);
909 return;
910 }
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);
914
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);
922
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);
931
932 /* no '=' */
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);
939
940 /* no value */
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);
947
948 /* no spaces */
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);
960
961 /* quoted values */
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);
973 }
974
975 static void test_IAssemblyName_IsEqual(void)
976 {
977 static const WCHAR wine1[] =
978 {'w','i','n','e',0};
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};
991 HRESULT hr;
992 IAssemblyName *name1, *name2;
993
994 hr = pCreateAssemblyNameObject( &name1, wine1, CANOF_PARSE_DISPLAY_NAME, NULL );
995 ok( hr == S_OK, "got %08x\n", hr );
996
997 hr = pCreateAssemblyNameObject( &name2, wine1, CANOF_PARSE_DISPLAY_NAME, NULL );
998 ok( hr == S_OK, "got %08x\n", hr );
999
1000 if (0) { /* crashes on some old version */
1001 hr = IAssemblyName_IsEqual( name1, NULL, 0 );
1002 ok( hr == S_FALSE, "got %08x\n", hr );
1003
1004 hr = IAssemblyName_IsEqual( name1, NULL, ASM_CMPF_IL_ALL );
1005 ok( hr == S_FALSE, "got %08x\n", hr );
1006 }
1007
1008 hr = IAssemblyName_IsEqual( name1, name1, ASM_CMPF_IL_ALL );
1009 ok( hr == S_OK, "got %08x\n", hr );
1010
1011 hr = IAssemblyName_IsEqual( name1, name2, ASM_CMPF_IL_ALL );
1012 ok( hr == S_OK, "got %08x\n", hr );
1013
1014 IAssemblyName_Release( name2 );
1015 hr = pCreateAssemblyNameObject( &name2, wine2, CANOF_PARSE_DISPLAY_NAME, NULL );
1016 ok( hr == S_OK, "got %08x\n", hr );
1017
1018 hr = IAssemblyName_IsEqual( name1, name2, ASM_CMPF_IL_ALL );
1019 ok( hr == S_OK, "got %08x\n", hr );
1020
1021 IAssemblyName_Release( name2 );
1022 hr = pCreateAssemblyNameObject( &name2, wine3, CANOF_PARSE_DISPLAY_NAME, NULL );
1023 ok( hr == S_OK, "got %08x\n", hr );
1024
1025 hr = IAssemblyName_IsEqual( name1, name2, ASM_CMPF_IL_ALL );
1026 ok( hr == S_OK, "got %08x\n", hr );
1027
1028 IAssemblyName_Release( name1 );
1029 hr = pCreateAssemblyNameObject( &name1, wine4, CANOF_PARSE_DISPLAY_NAME, NULL );
1030 ok( hr == S_OK, "got %08x\n", hr );
1031
1032 hr = IAssemblyName_IsEqual( name1, name2, ASM_CMPF_IL_ALL );
1033 ok( hr == S_FALSE, "got %08x\n", hr );
1034
1035 IAssemblyName_Release( name1 );
1036 hr = pCreateAssemblyNameObject( &name1, wine1, CANOF_PARSE_DISPLAY_NAME, NULL );
1037 ok( hr == S_OK, "got %08x\n", hr );
1038
1039 IAssemblyName_Release( name2 );
1040 hr = pCreateAssemblyNameObject( &name2, wine5, CANOF_PARSE_DISPLAY_NAME, NULL );
1041 ok( hr == S_OK, "got %08x\n", hr );
1042
1043 hr = IAssemblyName_IsEqual( name1, name2, ASM_CMPF_IL_ALL );
1044 ok( hr == S_OK, "got %08x\n", hr );
1045
1046 IAssemblyName_Release( name1 );
1047 IAssemblyName_Release( name2 );
1048 }
1049
1050 START_TEST(asmname)
1051 {
1052 if (!init_functionpointers())
1053 {
1054 win_skip("fusion.dll not available\n");
1055 return;
1056 }
1057
1058 test_CreateAssemblyNameObject();
1059 test_IAssemblyName_IsEqual();
1060 }