Reactos
1/*
2 * PROJECT: ReactOS api tests
3 * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
4 * PURPOSE: Tests for GUIDFromStringA/W
5 * COPYRIGHT: Copyright 2024 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
6 */
7
8#include <shelltest.h>
9#include <initguid.h>
10#include <undocshell.h>
11#include <versionhelpers.h>
12
13DEFINE_GUID(invalid_guid, 0xDEADDEAD, 0xDEAD, 0xDEAD, 0xED, 0xED, 0xED, 0xED,
14 0xED, 0xED, 0xED, 0xED);
15
16//DEFINE_GUID(IID_IShellLinkW, 0x000214F9, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00,
17// 0x00, 0x00, 0x00, 0x46);
18//DEFINE_GUID(IID_IShellLinkW_Invalid, 0x000214F9, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00,
19// 0x00, 0x00, 0x00, 0xED);
20
21static void TEST_GUIDFromStringA(void)
22{
23 GUID guid;
24 BOOL ret;
25
26 guid = invalid_guid;
27 _SEH2_TRY
28 {
29 ret = GUIDFromStringA(NULL, &guid);
30 }
31 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
32 {
33 ret = 0xDEADBEEF;
34 }
35 _SEH2_END;
36
37 ok(ret == FALSE || // Win8+
38 ret == (int)(0xDEADBEEF), // Win2k3-Win7
39 "Wrong value for ret (0x%X)\n", ret);
40 ok_int(memcmp(&guid, &invalid_guid, sizeof(guid)) == 0, TRUE);
41
42 guid = invalid_guid;
43 ok_int(GUIDFromStringA("", &guid), FALSE);
44 ok_int(memcmp(&guid, &invalid_guid, sizeof(guid)) == 0, TRUE);
45
46 guid = invalid_guid;
47 ok_int(GUIDFromStringA("{", &guid), FALSE);
48 ok_int(memcmp(&guid, &invalid_guid, sizeof(guid)) == 0, TRUE);
49
50 guid = invalid_guid;
51 ok_int(GUIDFromStringA("{000214F9-0000-0000-C000-000000000046", &guid), FALSE);
52 //ok_int(memcmp(&guid, &IID_IShellLinkW_Invalid, sizeof(guid)) == 0, TRUE); // Ignorable corner case
53
54 guid = invalid_guid;
55 ok_int(GUIDFromStringA("{000214F9-0000-0000-C000-000000000046}", &guid), TRUE);
56 ok_int(memcmp(&guid, &IID_IShellLinkW, sizeof(guid)) == 0, TRUE);
57
58 guid = invalid_guid;
59 ok_int(GUIDFromStringA("{000214F9-0000-0000-C000-000000000046}g", &guid), TRUE);
60 ok_int(memcmp(&guid, &IID_IShellLinkW, sizeof(guid)) == 0, TRUE);
61
62 guid = invalid_guid;
63 ok_int(GUIDFromStringA(" {000214F9-0000-0000-C000-000000000046}", &guid), FALSE);
64 ok_int(memcmp(&guid, &invalid_guid, sizeof(guid)) == 0, TRUE);
65}
66
67static void TEST_GUIDFromStringW(void)
68{
69 GUID guid;
70 BOOL ret;
71
72 guid = invalid_guid;
73 _SEH2_TRY
74 {
75 ret = GUIDFromStringW(NULL, &guid);
76 }
77 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
78 {
79 ret = 0xDEADBEEF;
80 }
81 _SEH2_END;
82
83 ok(ret == (int)(0xDEADBEEF) || // Win8+
84 ret == FALSE, // Win2k3-Win7
85 "Wrong value for ret (0x%X)\n", ret);
86 ok_int(memcmp(&guid, &invalid_guid, sizeof(guid)) == 0, TRUE);
87
88 guid = invalid_guid;
89 ok_int(GUIDFromStringW(L"", &guid), FALSE);
90 ok_int(memcmp(&guid, &invalid_guid, sizeof(guid)) == 0, TRUE);
91
92 guid = invalid_guid;
93 ok_int(GUIDFromStringW(L"{", &guid), FALSE);
94 ok_int(memcmp(&guid, &invalid_guid, sizeof(guid)) == 0, TRUE);
95
96 guid = invalid_guid;
97 ok_int(GUIDFromStringW(L"{000214F9-0000-0000-C000-000000000046", &guid), FALSE);
98 //ok_int(memcmp(&guid, &IID_IShellLinkW_Invalid, sizeof(guid)) == 0, TRUE); // Ignorable corner case
99
100 guid = invalid_guid;
101 ok_int(GUIDFromStringW(L"{000214F9-0000-0000-C000-000000000046}", &guid), TRUE);
102 ok_int(memcmp(&guid, &IID_IShellLinkW, sizeof(guid)) == 0, TRUE);
103
104 guid = invalid_guid;
105 ok_int(GUIDFromStringW(L"{000214F9-0000-0000-C000-000000000046}g", &guid), TRUE);
106 ok_int(memcmp(&guid, &IID_IShellLinkW, sizeof(guid)) == 0, TRUE);
107
108 guid = invalid_guid;
109 ok_int(GUIDFromStringW(L" {000214F9-0000-0000-C000-000000000046}", &guid), FALSE);
110 ok_int(memcmp(&guid, &invalid_guid, sizeof(guid)) == 0, TRUE);
111}
112
113START_TEST(GUIDFromString)
114{
115 TEST_GUIDFromStringA();
116 TEST_GUIDFromStringW();
117}