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 
13 DEFINE_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 
21 static 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     if (IsWindowsVistaOrGreater())
38         ok_int(ret, FALSE);
39     else
40         ok_int(ret, 0xDEADBEEF);
41     ok_int(memcmp(&guid, &invalid_guid, sizeof(guid)) == 0, TRUE);
42 
43     guid = invalid_guid;
44     ok_int(GUIDFromStringA("", &guid), FALSE);
45     ok_int(memcmp(&guid, &invalid_guid, sizeof(guid)) == 0, TRUE);
46 
47     guid = invalid_guid;
48     ok_int(GUIDFromStringA("{", &guid), FALSE);
49     ok_int(memcmp(&guid, &invalid_guid, sizeof(guid)) == 0, TRUE);
50 
51     guid = invalid_guid;
52     ok_int(GUIDFromStringA("{000214F9-0000-0000-C000-000000000046", &guid), FALSE);
53     //ok_int(memcmp(&guid, &IID_IShellLinkW_Invalid, sizeof(guid)) == 0, TRUE); // Ignorable corner case
54 
55     guid = invalid_guid;
56     ok_int(GUIDFromStringA("{000214F9-0000-0000-C000-000000000046}", &guid), TRUE);
57     ok_int(memcmp(&guid, &IID_IShellLinkW, sizeof(guid)) == 0, TRUE);
58 
59     guid = invalid_guid;
60     ok_int(GUIDFromStringA("{000214F9-0000-0000-C000-000000000046}g", &guid), TRUE);
61     ok_int(memcmp(&guid, &IID_IShellLinkW, sizeof(guid)) == 0, TRUE);
62 
63     guid = invalid_guid;
64     ok_int(GUIDFromStringA(" {000214F9-0000-0000-C000-000000000046}", &guid), FALSE);
65     ok_int(memcmp(&guid, &invalid_guid, sizeof(guid)) == 0, TRUE);
66 }
67 
68 static void TEST_GUIDFromStringW(void)
69 {
70     GUID guid;
71     BOOL ret;
72 
73     guid = invalid_guid;
74     _SEH2_TRY
75     {
76         ret = GUIDFromStringW(NULL, &guid);
77     }
78     _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
79     {
80         ret = 0xDEADBEEF;
81     }
82     _SEH2_END;
83 
84     if (IsWindowsVistaOrGreater())
85         ok_int(ret, 0xDEADBEEF);
86     else
87         ok_int(ret, FALSE);
88     ok_int(memcmp(&guid, &invalid_guid, sizeof(guid)) == 0, TRUE);
89 
90     guid = invalid_guid;
91     ok_int(GUIDFromStringW(L"", &guid), FALSE);
92     ok_int(memcmp(&guid, &invalid_guid, sizeof(guid)) == 0, TRUE);
93 
94     guid = invalid_guid;
95     ok_int(GUIDFromStringW(L"{", &guid), FALSE);
96     ok_int(memcmp(&guid, &invalid_guid, sizeof(guid)) == 0, TRUE);
97 
98     guid = invalid_guid;
99     ok_int(GUIDFromStringW(L"{000214F9-0000-0000-C000-000000000046", &guid), FALSE);
100     //ok_int(memcmp(&guid, &IID_IShellLinkW_Invalid, sizeof(guid)) == 0, TRUE); // Ignorable corner case
101 
102     guid = invalid_guid;
103     ok_int(GUIDFromStringW(L"{000214F9-0000-0000-C000-000000000046}", &guid), TRUE);
104     ok_int(memcmp(&guid, &IID_IShellLinkW, sizeof(guid)) == 0, TRUE);
105 
106     guid = invalid_guid;
107     ok_int(GUIDFromStringW(L"{000214F9-0000-0000-C000-000000000046}g", &guid), TRUE);
108     ok_int(memcmp(&guid, &IID_IShellLinkW, sizeof(guid)) == 0, TRUE);
109 
110     guid = invalid_guid;
111     ok_int(GUIDFromStringW(L" {000214F9-0000-0000-C000-000000000046}", &guid), FALSE);
112     ok_int(memcmp(&guid, &invalid_guid, sizeof(guid)) == 0, TRUE);
113 }
114 
115 START_TEST(GUIDFromString)
116 {
117     TEST_GUIDFromStringA();
118     TEST_GUIDFromStringW();
119 }
120