urlmon: Improve IUri support for mk: URIs.
[wine.git] / dlls / urlmon / tests / uri.c
blob04534413bda8f5e797db878d75a79c6939781b12
1 /*
2 * UrlMon IUri tests
4 * Copyright 2010 Thomas Mullaly
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 #include <wine/test.h>
22 #include <stdarg.h>
23 #include <stddef.h>
25 #define COBJMACROS
27 #include "windef.h"
28 #include "winbase.h"
29 #include "urlmon.h"
30 #include "shlwapi.h"
32 #define URI_STR_PROPERTY_COUNT Uri_PROPERTY_STRING_LAST+1
33 #define URI_DWORD_PROPERTY_COUNT (Uri_PROPERTY_DWORD_LAST - Uri_PROPERTY_DWORD_START)+1
34 #define URI_BUILDER_STR_PROPERTY_COUNT 7
36 static HRESULT (WINAPI *pCreateUri)(LPCWSTR, DWORD, DWORD_PTR, IUri**);
37 static HRESULT (WINAPI *pCreateUriWithFragment)(LPCWSTR, LPCWSTR, DWORD, DWORD_PTR, IUri**);
38 static HRESULT (WINAPI *pCreateIUriBuilder)(IUri*, DWORD, DWORD_PTR, IUriBuilder**);
40 static const WCHAR http_urlW[] = { 'h','t','t','p',':','/','/','w','w','w','.','w','i','n','e','h','q',
41 '.','o','r','g','/',0};
42 static const WCHAR http_url_fragW[] = { 'h','t','t','p',':','/','/','w','w','w','.','w','i','n','e','h','q',
43 '.','o','r','g','/','#','F','r','a','g',0};
45 typedef struct _uri_create_flag_test {
46 DWORD flags;
47 HRESULT expected;
48 } uri_create_flag_test;
50 static const uri_create_flag_test invalid_flag_tests[] = {
51 /* Set of invalid flag combinations to test for. */
52 {Uri_CREATE_DECODE_EXTRA_INFO | Uri_CREATE_NO_DECODE_EXTRA_INFO, E_INVALIDARG},
53 {Uri_CREATE_CANONICALIZE | Uri_CREATE_NO_CANONICALIZE, E_INVALIDARG},
54 {Uri_CREATE_CRACK_UNKNOWN_SCHEMES | Uri_CREATE_NO_CRACK_UNKNOWN_SCHEMES, E_INVALIDARG},
55 {Uri_CREATE_PRE_PROCESS_HTML_URI | Uri_CREATE_NO_PRE_PROCESS_HTML_URI, E_INVALIDARG},
56 {Uri_CREATE_IE_SETTINGS | Uri_CREATE_NO_IE_SETTINGS, E_INVALIDARG}
59 typedef struct _uri_str_property {
60 const char* value;
61 HRESULT expected;
62 BOOL todo;
63 const char* broken_value;
64 } uri_str_property;
66 typedef struct _uri_dword_property {
67 DWORD value;
68 HRESULT expected;
69 BOOL todo;
70 } uri_dword_property;
72 typedef struct _uri_properties {
73 const char* uri;
74 DWORD create_flags;
75 HRESULT create_expected;
76 BOOL create_todo;
77 DWORD props;
78 BOOL props_todo;
80 uri_str_property str_props[URI_STR_PROPERTY_COUNT];
81 uri_dword_property dword_props[URI_DWORD_PROPERTY_COUNT];
82 } uri_properties;
84 static const uri_properties uri_tests[] = {
85 { "http://www.winehq.org/tests/../tests/../..", 0, S_OK, FALSE,
86 /* A flag bitmap containing all the Uri_HAS_* flags that correspond to this uri. */
87 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_HOST|
88 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|
89 Uri_HAS_PORT|Uri_HAS_SCHEME,
90 FALSE,
92 {"http://www.winehq.org/",S_OK,FALSE}, /* ABSOLUTE_URI */
93 {"www.winehq.org",S_OK,FALSE}, /* AUTHORITY */
94 {"http://www.winehq.org/",S_OK,FALSE}, /* DISPLAY_URI */
95 {"winehq.org",S_OK,FALSE}, /* DOMAIN */
96 {"",S_FALSE,FALSE}, /* EXTENSION */
97 {"",S_FALSE,FALSE}, /* FRAGMENT */
98 {"www.winehq.org",S_OK,FALSE}, /* HOST */
99 {"",S_FALSE,FALSE}, /* PASSWORD */
100 {"/",S_OK,FALSE}, /* PATH */
101 {"/",S_OK,FALSE}, /* PATH_AND_QUERY */
102 {"",S_FALSE,FALSE}, /* QUERY */
103 {"http://www.winehq.org/tests/../tests/../..",S_OK,FALSE}, /* RAW_URI */
104 {"http",S_OK,FALSE}, /* SCHEME_NAME */
105 {"",S_FALSE,FALSE}, /* USER_INFO */
106 {"",S_FALSE,FALSE} /* USER_NAME */
109 {Uri_HOST_DNS,S_OK,FALSE}, /* HOST_TYPE */
110 {80,S_OK,FALSE}, /* PORT */
111 {URL_SCHEME_HTTP,S_OK,FALSE}, /* SCHEME */
112 {URLZONE_INVALID,E_NOTIMPL,FALSE} /* ZONE */
115 { "http://winehq.org/tests/.././tests", 0, S_OK, FALSE,
116 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_HOST|
117 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|
118 Uri_HAS_PORT|Uri_HAS_SCHEME,
119 FALSE,
121 {"http://winehq.org/tests",S_OK,FALSE},
122 {"winehq.org",S_OK,FALSE},
123 {"http://winehq.org/tests",S_OK,FALSE},
124 {"winehq.org",S_OK,FALSE},
125 {"",S_FALSE,FALSE},
126 {"",S_FALSE,FALSE},
127 {"winehq.org",S_OK,FALSE},
128 {"",S_FALSE,FALSE},
129 {"/tests",S_OK,FALSE},
130 {"/tests",S_OK,FALSE},
131 {"",S_FALSE,FALSE},
132 {"http://winehq.org/tests/.././tests",S_OK,FALSE},
133 {"http",S_OK,FALSE},
134 {"",S_FALSE,FALSE},
135 {"",S_FALSE,FALSE}
138 {Uri_HOST_DNS,S_OK,FALSE},
139 {80,S_OK,FALSE},
140 {URL_SCHEME_HTTP,S_OK,FALSE},
141 {URLZONE_INVALID,E_NOTIMPL,FALSE}
144 { "HtTp://www.winehq.org/tests/..?query=x&return=y", 0, S_OK, FALSE,
145 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_HOST|
146 Uri_HAS_DOMAIN|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_QUERY|Uri_HAS_RAW_URI|
147 Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
148 FALSE,
150 {"http://www.winehq.org/?query=x&return=y",S_OK,FALSE},
151 {"www.winehq.org",S_OK,FALSE},
152 {"http://www.winehq.org/?query=x&return=y",S_OK,FALSE},
153 {"winehq.org",S_OK,FALSE},
154 {"",S_FALSE,FALSE},
155 {"",S_FALSE,FALSE},
156 {"www.winehq.org",S_OK,FALSE},
157 {"",S_FALSE,FALSE},
158 {"/",S_OK,FALSE},
159 {"/?query=x&return=y",S_OK,FALSE},
160 {"?query=x&return=y",S_OK,FALSE},
161 {"HtTp://www.winehq.org/tests/..?query=x&return=y",S_OK,FALSE},
162 {"http",S_OK,FALSE},
163 {"",S_FALSE,FALSE},
164 {"",S_FALSE,FALSE}
167 {Uri_HOST_DNS,S_OK,FALSE},
168 {80,S_OK,FALSE},
169 {URL_SCHEME_HTTP,S_OK,FALSE},
170 {URLZONE_INVALID,E_NOTIMPL,FALSE},
173 { "hTTp://us%45r%3Ainfo@examp%4CE.com:80/path/a/b/./c/../%2E%2E/Forbidden'<|> Characters", 0, S_OK, FALSE,
174 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_HOST|Uri_HAS_PATH|
175 Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_USER_INFO|Uri_HAS_USER_NAME|
176 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
177 FALSE,
179 {"http://usEr%3Ainfo@example.com/path/a/Forbidden'%3C%7C%3E%20Characters",S_OK,FALSE},
180 {"usEr%3Ainfo@example.com",S_OK,FALSE},
181 {"http://example.com/path/a/Forbidden'%3C%7C%3E%20Characters",S_OK,FALSE},
182 {"example.com",S_OK,FALSE},
183 {"",S_FALSE,FALSE},
184 {"",S_FALSE,FALSE},
185 {"example.com",S_OK,FALSE},
186 {"",S_FALSE,FALSE},
187 {"/path/a/Forbidden'%3C%7C%3E%20Characters",S_OK,FALSE},
188 {"/path/a/Forbidden'%3C%7C%3E%20Characters",S_OK,FALSE},
189 {"",S_FALSE,FALSE},
190 {"hTTp://us%45r%3Ainfo@examp%4CE.com:80/path/a/b/./c/../%2E%2E/Forbidden'<|> Characters",S_OK,FALSE},
191 {"http",S_OK,FALSE},
192 {"usEr%3Ainfo",S_OK,FALSE},
193 {"usEr%3Ainfo",S_OK,FALSE}
196 {Uri_HOST_DNS,S_OK,FALSE},
197 {80,S_OK,FALSE},
198 {URL_SCHEME_HTTP,S_OK,FALSE},
199 {URLZONE_INVALID,E_NOTIMPL,FALSE},
202 { "ftp://winepass:wine@ftp.winehq.org:9999/dir/foo bar.txt", 0, S_OK, FALSE,
203 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_EXTENSION|
204 Uri_HAS_HOST|Uri_HAS_PASSWORD|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
205 Uri_HAS_SCHEME_NAME|Uri_HAS_USER_INFO|Uri_HAS_USER_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|
206 Uri_HAS_SCHEME,
207 FALSE,
209 {"ftp://winepass:wine@ftp.winehq.org:9999/dir/foo%20bar.txt",S_OK,FALSE},
210 {"winepass:wine@ftp.winehq.org:9999",S_OK,FALSE},
211 {"ftp://ftp.winehq.org:9999/dir/foo%20bar.txt",S_OK,FALSE},
212 {"winehq.org",S_OK,FALSE},
213 {".txt",S_OK,FALSE},
214 {"",S_FALSE,FALSE},
215 {"ftp.winehq.org",S_OK,FALSE},
216 {"wine",S_OK,FALSE},
217 {"/dir/foo%20bar.txt",S_OK,FALSE},
218 {"/dir/foo%20bar.txt",S_OK,FALSE},
219 {"",S_FALSE,FALSE},
220 {"ftp://winepass:wine@ftp.winehq.org:9999/dir/foo bar.txt",S_OK,FALSE},
221 {"ftp",S_OK,FALSE},
222 {"winepass:wine",S_OK,FALSE},
223 {"winepass",S_OK,FALSE}
226 {Uri_HOST_DNS,S_OK,FALSE},
227 {9999,S_OK,FALSE},
228 {URL_SCHEME_FTP,S_OK,FALSE},
229 {URLZONE_INVALID,E_NOTIMPL,FALSE}
232 { "file://c:\\tests\\../tests/foo%20bar.mp3", 0, S_OK, FALSE,
233 Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH|
234 Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
235 FALSE,
237 {"file:///c:/tests/foo%2520bar.mp3",S_OK,FALSE},
238 {"",S_FALSE,FALSE},
239 {"file:///c:/tests/foo%2520bar.mp3",S_OK,FALSE},
240 {"",S_FALSE,FALSE},
241 {".mp3",S_OK,FALSE},
242 {"",S_FALSE,FALSE},
243 {"",S_FALSE,FALSE},
244 {"",S_FALSE,FALSE},
245 {"/c:/tests/foo%2520bar.mp3",S_OK,FALSE},
246 {"/c:/tests/foo%2520bar.mp3",S_OK,FALSE},
247 {"",S_FALSE,FALSE},
248 {"file://c:\\tests\\../tests/foo%20bar.mp3",S_OK,FALSE},
249 {"file",S_OK,FALSE},
250 {"",S_FALSE,FALSE},
251 {"",S_FALSE,FALSE}
254 {Uri_HOST_UNKNOWN,S_OK,FALSE},
255 {0,S_FALSE,FALSE},
256 {URL_SCHEME_FILE,S_OK,FALSE},
257 {URLZONE_INVALID,E_NOTIMPL,FALSE}
260 { "FILE://localhost/test dir\\../tests/test%20file.README.txt", 0, S_OK, FALSE,
261 Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH|
262 Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
263 FALSE,
265 {"file:///tests/test%20file.README.txt",S_OK,FALSE},
266 {"",S_FALSE,FALSE},
267 {"file:///tests/test%20file.README.txt",S_OK,FALSE},
268 {"",S_FALSE,FALSE},
269 {".txt",S_OK,FALSE},
270 {"",S_FALSE,FALSE},
271 {"",S_FALSE,FALSE},
272 {"",S_FALSE,FALSE},
273 {"/tests/test%20file.README.txt",S_OK,FALSE},
274 {"/tests/test%20file.README.txt",S_OK,FALSE},
275 {"",S_FALSE,FALSE},
276 {"FILE://localhost/test dir\\../tests/test%20file.README.txt",S_OK,FALSE},
277 {"file",S_OK,FALSE},
278 {"",S_FALSE,FALSE},
279 {"",S_FALSE,FALSE}
282 {Uri_HOST_UNKNOWN,S_OK,FALSE},
283 {0,S_FALSE,FALSE},
284 {URL_SCHEME_FILE,S_OK,FALSE},
285 {URLZONE_INVALID,E_NOTIMPL,FALSE}
288 { "urn:nothing:should:happen here", 0, S_OK, FALSE,
289 Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|
290 Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
291 FALSE,
293 {"urn:nothing:should:happen here",S_OK,FALSE},
294 {"",S_FALSE,FALSE},
295 {"urn:nothing:should:happen here",S_OK,FALSE},
296 {"",S_FALSE,FALSE},
297 {"",S_FALSE,FALSE},
298 {"",S_FALSE,FALSE},
299 {"",S_FALSE,FALSE},
300 {"",S_FALSE,FALSE},
301 {"nothing:should:happen here",S_OK,FALSE},
302 {"nothing:should:happen here",S_OK,FALSE},
303 {"",S_FALSE,FALSE},
304 {"urn:nothing:should:happen here",S_OK,FALSE},
305 {"urn",S_OK,FALSE},
306 {"",S_FALSE,FALSE},
307 {"",S_FALSE,FALSE}
310 {Uri_HOST_UNKNOWN,S_OK,FALSE},
311 {0,S_FALSE,FALSE},
312 {URL_SCHEME_UNKNOWN,S_OK,FALSE},
313 {URLZONE_INVALID,E_NOTIMPL,FALSE}
316 { "http://127.0.0.1/tests/../test dir/./test.txt", 0, S_OK, FALSE,
317 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|
318 Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
319 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
320 FALSE,
322 {"http://127.0.0.1/test%20dir/test.txt",S_OK,FALSE},
323 {"127.0.0.1",S_OK,FALSE},
324 {"http://127.0.0.1/test%20dir/test.txt",S_OK,FALSE},
325 {"",S_FALSE,FALSE},
326 {".txt",S_OK,FALSE},
327 {"",S_FALSE,FALSE},
328 {"127.0.0.1",S_OK,FALSE},
329 {"",S_FALSE,FALSE},
330 {"/test%20dir/test.txt",S_OK,FALSE},
331 {"/test%20dir/test.txt",S_OK,FALSE},
332 {"",S_FALSE,FALSE},
333 {"http://127.0.0.1/tests/../test dir/./test.txt",S_OK,FALSE},
334 {"http",S_OK,FALSE},
335 {"",S_FALSE,FALSE},
336 {"",S_FALSE,FALSE}
339 {Uri_HOST_IPV4,S_OK,FALSE},
340 {80,S_OK,FALSE},
341 {URL_SCHEME_HTTP,S_OK,FALSE},
342 {URLZONE_INVALID,E_NOTIMPL,FALSE}
345 { "http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]", 0, S_OK, FALSE,
346 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
347 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
348 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
349 FALSE,
351 {"http://[fedc:ba98:7654:3210:fedc:ba98:7654:3210]/",S_OK,FALSE},
352 {"[fedc:ba98:7654:3210:fedc:ba98:7654:3210]",S_OK,FALSE},
353 {"http://[fedc:ba98:7654:3210:fedc:ba98:7654:3210]/",S_OK,FALSE},
354 {"",S_FALSE,FALSE},
355 {"",S_FALSE,FALSE},
356 {"",S_FALSE,FALSE},
357 {"fedc:ba98:7654:3210:fedc:ba98:7654:3210",S_OK,FALSE},
358 {"",S_FALSE,FALSE},
359 {"/",S_OK,FALSE},
360 {"/",S_OK,FALSE},
361 {"",S_FALSE,FALSE},
362 {"http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]",S_OK,FALSE},
363 {"http",S_OK,FALSE},
364 {"",S_FALSE,FALSE},
365 {"",S_FALSE,FALSE}
368 {Uri_HOST_IPV6,S_OK,FALSE},
369 {80,S_OK,FALSE},
370 {URL_SCHEME_HTTP,S_OK,FALSE},
371 {URLZONE_INVALID,E_NOTIMPL,FALSE}
374 { "ftp://[::13.1.68.3]", 0, S_OK, FALSE,
375 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
376 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
377 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
378 FALSE,
380 {"ftp://[::13.1.68.3]/",S_OK,FALSE},
381 {"[::13.1.68.3]",S_OK,FALSE},
382 {"ftp://[::13.1.68.3]/",S_OK,FALSE},
383 {"",S_FALSE,FALSE},
384 {"",S_FALSE,FALSE},
385 {"",S_FALSE,FALSE},
386 {"::13.1.68.3",S_OK,FALSE},
387 {"",S_FALSE,FALSE},
388 {"/",S_OK,FALSE},
389 {"/",S_OK,FALSE},
390 {"",S_FALSE,FALSE},
391 {"ftp://[::13.1.68.3]",S_OK,FALSE},
392 {"ftp",S_OK,FALSE},
393 {"",S_FALSE,FALSE},
394 {"",S_FALSE,FALSE}
397 {Uri_HOST_IPV6,S_OK,FALSE},
398 {21,S_OK,FALSE},
399 {URL_SCHEME_FTP,S_OK,FALSE},
400 {URLZONE_INVALID,E_NOTIMPL,FALSE}
403 { "http://[FEDC:BA98:0:0:0:0:0:3210]", 0, S_OK, FALSE,
404 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
405 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
406 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
407 FALSE,
409 {"http://[fedc:ba98::3210]/",S_OK,FALSE},
410 {"[fedc:ba98::3210]",S_OK,FALSE},
411 {"http://[fedc:ba98::3210]/",S_OK,FALSE},
412 {"",S_FALSE,FALSE},
413 {"",S_FALSE,FALSE},
414 {"",S_FALSE,FALSE},
415 {"fedc:ba98::3210",S_OK,FALSE},
416 {"",S_FALSE,FALSE},
417 {"/",S_OK,FALSE},
418 {"/",S_OK,FALSE},
419 {"",S_FALSE,FALSE},
420 {"http://[FEDC:BA98:0:0:0:0:0:3210]",S_OK,FALSE},
421 {"http",S_OK,FALSE},
422 {"",S_FALSE,FALSE},
423 {"",S_FALSE,FALSE},
426 {Uri_HOST_IPV6,S_OK,FALSE},
427 {80,S_OK,FALSE},
428 {URL_SCHEME_HTTP,S_OK,FALSE},
429 {URLZONE_INVALID,E_NOTIMPL,FALSE}
432 { "1234://www.winehq.org", 0, S_OK, FALSE,
433 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
434 Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
435 Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
436 FALSE,
438 {"1234://www.winehq.org/",S_OK,FALSE},
439 {"www.winehq.org",S_OK,FALSE},
440 {"1234://www.winehq.org/",S_OK,FALSE},
441 {"winehq.org",S_OK,FALSE},
442 {"",S_FALSE,FALSE},
443 {"",S_FALSE,FALSE},
444 {"www.winehq.org",S_OK,FALSE},
445 {"",S_FALSE,FALSE},
446 {"/",S_OK,FALSE},
447 {"/",S_OK,FALSE},
448 {"",S_FALSE,FALSE},
449 {"1234://www.winehq.org",S_OK,FALSE},
450 {"1234",S_OK,FALSE},
451 {"",S_FALSE,FALSE},
452 {"",S_FALSE,FALSE}
455 {Uri_HOST_DNS,S_OK,FALSE},
456 {0,S_FALSE,FALSE},
457 {URL_SCHEME_UNKNOWN,S_OK,FALSE},
458 {URLZONE_INVALID,E_NOTIMPL,FALSE}
461 /* Test's to make sure the parser/canonicalizer handles implicit file schemes correctly. */
462 { "C:/test/test.mp3", Uri_CREATE_ALLOW_IMPLICIT_FILE_SCHEME, S_OK, FALSE,
463 Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH|
464 Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
465 FALSE,
467 {"file:///C:/test/test.mp3",S_OK,FALSE},
468 {"",S_FALSE,FALSE},
469 {"file:///C:/test/test.mp3",S_OK,FALSE},
470 {"",S_FALSE,FALSE},
471 {".mp3",S_OK,FALSE},
472 {"",S_FALSE,FALSE},
473 {"",S_FALSE,FALSE},
474 {"",S_FALSE,FALSE},
475 {"/C:/test/test.mp3",S_OK,FALSE},
476 {"/C:/test/test.mp3",S_OK,FALSE},
477 {"",S_FALSE,FALSE},
478 {"C:/test/test.mp3",S_OK,FALSE},
479 {"file",S_OK,FALSE},
480 {"",S_FALSE,FALSE},
481 {"",S_FALSE,FALSE}
484 {Uri_HOST_UNKNOWN,S_OK,FALSE},
485 {0,S_FALSE,FALSE},
486 {URL_SCHEME_FILE,S_OK,FALSE},
487 {URLZONE_INVALID,E_NOTIMPL,FALSE}
490 /* Test's to make sure the parser/canonicalizer handles implicit file schemes correctly. */
491 { "\\\\Server/test.mp3", Uri_CREATE_ALLOW_IMPLICIT_FILE_SCHEME, S_OK, FALSE,
492 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|
493 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_HOST|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
494 Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
495 FALSE,
497 {"file://server/test.mp3",S_OK,FALSE},
498 {"server",S_OK,FALSE},
499 {"file://server/test.mp3",S_OK,FALSE},
500 {"",S_FALSE,FALSE},
501 {".mp3",S_OK,FALSE},
502 {"",S_FALSE,FALSE},
503 {"server",S_OK,FALSE},
504 {"",S_FALSE,FALSE},
505 {"/test.mp3",S_OK,FALSE},
506 {"/test.mp3",S_OK,FALSE},
507 {"",S_FALSE,FALSE},
508 {"\\\\Server/test.mp3",S_OK,FALSE},
509 {"file",S_OK,FALSE},
510 {"",S_FALSE,FALSE},
511 {"",S_FALSE,FALSE}
514 {Uri_HOST_DNS,S_OK,FALSE},
515 {0,S_FALSE,FALSE},
516 {URL_SCHEME_FILE,S_OK,FALSE},
517 {URLZONE_INVALID,E_NOTIMPL,FALSE}
520 { "www.winehq.org/test", Uri_CREATE_ALLOW_IMPLICIT_WILDCARD_SCHEME, S_OK, FALSE,
521 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_HOST|
522 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|
523 Uri_HAS_SCHEME,
524 FALSE,
526 {"*:www.winehq.org/test",S_OK,FALSE},
527 {"www.winehq.org",S_OK,FALSE},
528 {"*:www.winehq.org/test",S_OK,FALSE},
529 {"winehq.org",S_OK,FALSE},
530 {"",S_FALSE,FALSE},
531 {"",S_FALSE,FALSE},
532 {"www.winehq.org",S_OK,FALSE},
533 {"",S_FALSE,FALSE},
534 {"/test",S_OK,FALSE},
535 {"/test",S_OK,FALSE},
536 {"",S_FALSE,FALSE},
537 {"www.winehq.org/test",S_OK,FALSE},
538 {"*",S_OK,FALSE},
539 {"",S_FALSE,FALSE},
540 {"",S_FALSE,FALSE}
543 {Uri_HOST_DNS,S_OK,FALSE},
544 {0,S_FALSE,FALSE},
545 {URL_SCHEME_WILDCARD,S_OK,FALSE},
546 {URLZONE_INVALID,E_NOTIMPL,FALSE}
549 /* Valid since the '*' is the only character in the scheme name. */
550 { "*:www.winehq.org/test", 0, S_OK, FALSE,
551 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_HOST|
552 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|
553 Uri_HAS_SCHEME,
554 FALSE,
556 {"*:www.winehq.org/test",S_OK,FALSE},
557 {"www.winehq.org",S_OK,FALSE},
558 {"*:www.winehq.org/test",S_OK,FALSE},
559 {"winehq.org",S_OK,FALSE},
560 {"",S_FALSE,FALSE},
561 {"",S_FALSE,FALSE},
562 {"www.winehq.org",S_OK,FALSE},
563 {"",S_FALSE,FALSE},
564 {"/test",S_OK,FALSE},
565 {"/test",S_OK,FALSE},
566 {"",S_FALSE,FALSE},
567 {"*:www.winehq.org/test",S_OK,FALSE},
568 {"*",S_OK,FALSE},
569 {"",S_FALSE,FALSE},
570 {"",S_FALSE,FALSE}
573 {Uri_HOST_DNS,S_OK,FALSE},
574 {0,S_FALSE,FALSE},
575 {URL_SCHEME_WILDCARD,S_OK,FALSE},
576 {URLZONE_INVALID,E_NOTIMPL,FALSE}
579 { "/../some dir/test.ext", Uri_CREATE_ALLOW_RELATIVE, S_OK, FALSE,
580 Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH|
581 Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
582 FALSE,
584 {"/../some dir/test.ext",S_OK,FALSE},
585 {"",S_FALSE,FALSE},
586 {"/../some dir/test.ext",S_OK,FALSE},
587 {"",S_FALSE,FALSE},
588 {".ext",S_OK,FALSE},
589 {"",S_FALSE,FALSE},
590 {"",S_FALSE,FALSE},
591 {"",S_FALSE,FALSE},
592 {"/../some dir/test.ext",S_OK,FALSE},
593 {"/../some dir/test.ext",S_OK,FALSE},
594 {"",S_FALSE,FALSE},
595 {"/../some dir/test.ext",S_OK,FALSE},
596 {"",S_FALSE,FALSE},
597 {"",S_FALSE,FALSE},
598 {"",S_FALSE,FALSE}
601 {Uri_HOST_UNKNOWN,S_OK,FALSE},
602 {0,S_FALSE,FALSE},
603 {URL_SCHEME_UNKNOWN,S_OK,FALSE},
604 {URLZONE_INVALID,E_NOTIMPL,FALSE}
607 { "//implicit/wildcard/uri scheme", Uri_CREATE_ALLOW_RELATIVE|Uri_CREATE_ALLOW_IMPLICIT_WILDCARD_SCHEME, S_OK, FALSE,
608 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|Uri_HAS_PATH|
609 Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
610 FALSE,
612 {"*://implicit/wildcard/uri%20scheme",S_OK,FALSE},
613 {"",S_OK,FALSE},
614 {"*://implicit/wildcard/uri%20scheme",S_OK,FALSE},
615 {"",S_FALSE,FALSE},
616 {"",S_FALSE,FALSE},
617 {"",S_FALSE,FALSE},
618 {"",S_OK,FALSE},
619 {"",S_FALSE,FALSE},
620 {"//implicit/wildcard/uri%20scheme",S_OK,FALSE},
621 {"//implicit/wildcard/uri%20scheme",S_OK,FALSE},
622 {"",S_FALSE,FALSE},
623 {"//implicit/wildcard/uri scheme",S_OK,FALSE},
624 {"*",S_OK,FALSE},
625 {"",S_FALSE,FALSE},
626 {"",S_FALSE,FALSE},
629 {Uri_HOST_UNKNOWN,S_OK,FALSE},
630 {0,S_FALSE,FALSE},
631 {URL_SCHEME_WILDCARD,S_OK,FALSE},
632 {URLZONE_INVALID,E_NOTIMPL,FALSE}
635 /* URI is considered opaque since CREATE_NO_CRACK_UNKNOWN_SCHEMES is set and its an unknown scheme. */
636 { "zip://google.com", Uri_CREATE_NO_CRACK_UNKNOWN_SCHEMES, S_OK, FALSE,
637 Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH|
638 Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME_NAME|
639 Uri_HAS_SCHEME,
640 FALSE,
642 {"zip:/.//google.com",S_OK,FALSE},
643 {"",S_FALSE,FALSE},
644 {"zip:/.//google.com",S_OK,FALSE},
645 {"",S_FALSE,FALSE},
646 {".com",S_OK,FALSE},
647 {"",S_FALSE,FALSE},
648 {"",S_FALSE,FALSE},
649 {"",S_FALSE,FALSE},
650 {"/.//google.com",S_OK,FALSE},
651 {"/.//google.com",S_OK,FALSE},
652 {"",S_FALSE,FALSE},
653 {"zip://google.com",S_OK,FALSE},
654 {"zip",S_OK,FALSE},
655 {"",S_FALSE,FALSE},
656 {"",S_FALSE,FALSE}
659 {Uri_HOST_UNKNOWN,S_OK,FALSE},
660 {0,S_FALSE,FALSE},
661 {URL_SCHEME_UNKNOWN,S_OK,FALSE},
662 {URLZONE_INVALID,E_NOTIMPL,FALSE}
665 /* Windows uses the first occurrence of ':' to delimit the userinfo. */
666 { "ftp://user:pass:word@winehq.org/", 0, S_OK, FALSE,
667 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
668 Uri_HAS_HOST|Uri_HAS_PASSWORD|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
669 Uri_HAS_SCHEME_NAME|Uri_HAS_USER_INFO|Uri_HAS_USER_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|
670 Uri_HAS_SCHEME,
671 FALSE,
673 {"ftp://user:pass:word@winehq.org/",S_OK,FALSE},
674 {"user:pass:word@winehq.org",S_OK,FALSE},
675 {"ftp://winehq.org/",S_OK,FALSE},
676 {"winehq.org",S_OK,FALSE},
677 {"",S_FALSE,FALSE},
678 {"",S_FALSE,FALSE},
679 {"winehq.org",S_OK,FALSE},
680 {"pass:word",S_OK,FALSE},
681 {"/",S_OK,FALSE},
682 {"/",S_OK,FALSE},
683 {"",S_FALSE,FALSE},
684 {"ftp://user:pass:word@winehq.org/",S_OK,FALSE},
685 {"ftp",S_OK,FALSE},
686 {"user:pass:word",S_OK,FALSE},
687 {"user",S_OK,FALSE}
690 {Uri_HOST_DNS,S_OK,FALSE},
691 {21,S_OK,FALSE},
692 {URL_SCHEME_FTP,S_OK,FALSE},
693 {URLZONE_INVALID,E_NOTIMPL,FALSE}
696 /* Make sure % encoded unreserved characters are decoded. */
697 { "ftp://w%49%4Ee:PA%53%53@ftp.google.com/", 0, S_OK, FALSE,
698 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
699 Uri_HAS_HOST|Uri_HAS_PASSWORD|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
700 Uri_HAS_SCHEME_NAME|Uri_HAS_USER_INFO|Uri_HAS_USER_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|
701 Uri_HAS_SCHEME,
702 FALSE,
704 {"ftp://wINe:PASS@ftp.google.com/",S_OK,FALSE},
705 {"wINe:PASS@ftp.google.com",S_OK,FALSE},
706 {"ftp://ftp.google.com/",S_OK,FALSE},
707 {"google.com",S_OK,FALSE},
708 {"",S_FALSE,FALSE},
709 {"",S_FALSE,FALSE},
710 {"ftp.google.com",S_OK,FALSE},
711 {"PASS",S_OK,FALSE},
712 {"/",S_OK,FALSE},
713 {"/",S_OK,FALSE},
714 {"",S_FALSE,FALSE},
715 {"ftp://w%49%4Ee:PA%53%53@ftp.google.com/",S_OK,FALSE},
716 {"ftp",S_OK,FALSE},
717 {"wINe:PASS",S_OK,FALSE},
718 {"wINe",S_OK,FALSE}
721 {Uri_HOST_DNS,S_OK,FALSE},
722 {21,S_OK,FALSE},
723 {URL_SCHEME_FTP,S_OK,FALSE},
724 {URLZONE_INVALID,E_NOTIMPL,FALSE}
727 /* Make sure % encoded characters which are NOT unreserved are NOT decoded. */
728 { "ftp://w%5D%5Be:PA%7B%7D@ftp.google.com/", 0, S_OK, FALSE,
729 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
730 Uri_HAS_HOST|Uri_HAS_PASSWORD|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
731 Uri_HAS_SCHEME_NAME|Uri_HAS_USER_INFO|Uri_HAS_USER_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|
732 Uri_HAS_SCHEME,
733 FALSE,
735 {"ftp://w%5D%5Be:PA%7B%7D@ftp.google.com/",S_OK,FALSE},
736 {"w%5D%5Be:PA%7B%7D@ftp.google.com",S_OK,FALSE},
737 {"ftp://ftp.google.com/",S_OK,FALSE},
738 {"google.com",S_OK,FALSE},
739 {"",S_FALSE,FALSE},
740 {"",S_FALSE,FALSE},
741 {"ftp.google.com",S_OK,FALSE},
742 {"PA%7B%7D",S_OK,FALSE},
743 {"/",S_OK,FALSE},
744 {"/",S_OK,FALSE},
745 {"",S_FALSE,FALSE},
746 {"ftp://w%5D%5Be:PA%7B%7D@ftp.google.com/",S_OK,FALSE},
747 {"ftp",S_OK,FALSE},
748 {"w%5D%5Be:PA%7B%7D",S_OK,FALSE},
749 {"w%5D%5Be",S_OK,FALSE}
752 {Uri_HOST_DNS,S_OK,FALSE},
753 {21,S_OK,FALSE},
754 {URL_SCHEME_FTP,S_OK,FALSE},
755 {URLZONE_INVALID,E_NOTIMPL,FALSE}
758 /* You're allowed to have an empty password portion in the userinfo section. */
759 { "ftp://empty:@ftp.google.com/", 0, S_OK, FALSE,
760 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
761 Uri_HAS_HOST|Uri_HAS_PASSWORD|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
762 Uri_HAS_SCHEME_NAME|Uri_HAS_USER_INFO|Uri_HAS_USER_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|
763 Uri_HAS_SCHEME,
764 FALSE,
766 {"ftp://empty:@ftp.google.com/",S_OK,FALSE},
767 {"empty:@ftp.google.com",S_OK,FALSE},
768 {"ftp://ftp.google.com/",S_OK,FALSE},
769 {"google.com",S_OK,FALSE},
770 {"",S_FALSE,FALSE},
771 {"",S_FALSE,FALSE},
772 {"ftp.google.com",S_OK,FALSE},
773 {"",S_OK,FALSE},
774 {"/",S_OK,FALSE},
775 {"/",S_OK,FALSE},
776 {"",S_FALSE,FALSE},
777 {"ftp://empty:@ftp.google.com/",S_OK,FALSE},
778 {"ftp",S_OK,FALSE},
779 {"empty:",S_OK,FALSE},
780 {"empty",S_OK,FALSE}
783 {Uri_HOST_DNS,S_OK,FALSE},
784 {21,S_OK,FALSE},
785 {URL_SCHEME_FTP,S_OK,FALSE},
786 {URLZONE_INVALID,E_NOTIMPL,FALSE}
789 /* Make sure forbidden characters in "userinfo" get encoded. */
790 { "ftp://\" \"weird@ftp.google.com/", 0, S_OK, FALSE,
791 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
792 Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
793 Uri_HAS_SCHEME_NAME|Uri_HAS_USER_INFO|Uri_HAS_USER_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|
794 Uri_HAS_SCHEME,
795 FALSE,
797 {"ftp://%22%20%22weird@ftp.google.com/",S_OK,FALSE},
798 {"%22%20%22weird@ftp.google.com",S_OK,FALSE},
799 {"ftp://ftp.google.com/",S_OK,FALSE},
800 {"google.com",S_OK,FALSE},
801 {"",S_FALSE,FALSE},
802 {"",S_FALSE,FALSE},
803 {"ftp.google.com",S_OK,FALSE},
804 {"",S_FALSE,FALSE},
805 {"/",S_OK,FALSE},
806 {"/",S_OK,FALSE},
807 {"",S_FALSE,FALSE},
808 {"ftp://\" \"weird@ftp.google.com/",S_OK,FALSE},
809 {"ftp",S_OK,FALSE},
810 {"%22%20%22weird",S_OK,FALSE},
811 {"%22%20%22weird",S_OK,FALSE}
814 {Uri_HOST_DNS,S_OK,FALSE},
815 {21,S_OK,FALSE},
816 {URL_SCHEME_FTP,S_OK,FALSE},
817 {URLZONE_INVALID,E_NOTIMPL,FALSE}
820 /* Make sure the forbidden characters don't get percent encoded. */
821 { "ftp://\" \"weird@ftp.google.com/", Uri_CREATE_NO_ENCODE_FORBIDDEN_CHARACTERS, S_OK, FALSE,
822 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
823 Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
824 Uri_HAS_SCHEME_NAME|Uri_HAS_USER_INFO|Uri_HAS_USER_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|
825 Uri_HAS_SCHEME,
826 FALSE,
828 {"ftp://\" \"weird@ftp.google.com/",S_OK,FALSE},
829 {"\" \"weird@ftp.google.com",S_OK,FALSE},
830 {"ftp://ftp.google.com/",S_OK,FALSE},
831 {"google.com",S_OK,FALSE},
832 {"",S_FALSE,FALSE},
833 {"",S_FALSE,FALSE},
834 {"ftp.google.com",S_OK,FALSE},
835 {"",S_FALSE,FALSE},
836 {"/",S_OK,FALSE},
837 {"/",S_OK,FALSE},
838 {"",S_FALSE,FALSE},
839 {"ftp://\" \"weird@ftp.google.com/",S_OK,FALSE},
840 {"ftp",S_OK,FALSE},
841 {"\" \"weird",S_OK,FALSE},
842 {"\" \"weird",S_OK,FALSE}
845 {Uri_HOST_DNS,S_OK,FALSE},
846 {21,S_OK,FALSE},
847 {URL_SCHEME_FTP,S_OK,FALSE},
848 {URLZONE_INVALID,E_NOTIMPL,FALSE}
851 /* Allowed to have invalid % encoded because its an unknown scheme type. */
852 { "zip://%xy:word@winehq.org/", 0, S_OK, FALSE,
853 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
854 Uri_HAS_HOST|Uri_HAS_PASSWORD|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
855 Uri_HAS_SCHEME_NAME|Uri_HAS_USER_INFO|Uri_HAS_USER_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
856 FALSE,
858 {"zip://%xy:word@winehq.org/",S_OK,FALSE},
859 {"%xy:word@winehq.org",S_OK,FALSE},
860 {"zip://%xy:word@winehq.org/",S_OK,FALSE},
861 {"winehq.org",S_OK,FALSE},
862 {"",S_FALSE,FALSE},
863 {"",S_FALSE,FALSE},
864 {"winehq.org",S_OK,FALSE},
865 {"word",S_OK,FALSE},
866 {"/",S_OK,FALSE},
867 {"/",S_OK,FALSE},
868 {"",S_FALSE,FALSE},
869 {"zip://%xy:word@winehq.org/",S_OK,FALSE},
870 {"zip",S_OK,FALSE},
871 {"%xy:word",S_OK,FALSE},
872 {"%xy",S_OK,FALSE}
875 {Uri_HOST_DNS,S_OK,FALSE},
876 {0,S_FALSE,FALSE},
877 {URL_SCHEME_UNKNOWN,S_OK,FALSE},
878 {URLZONE_INVALID,E_NOTIMPL,FALSE}
881 /* Unreserved, percent encoded characters aren't decoded in the userinfo becuase the scheme
882 * isn't known.
884 { "zip://%2E:%52%53ord@winehq.org/", 0, S_OK, FALSE,
885 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
886 Uri_HAS_HOST|Uri_HAS_PASSWORD|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
887 Uri_HAS_SCHEME_NAME|Uri_HAS_USER_INFO|Uri_HAS_USER_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
888 FALSE,
890 {"zip://%2E:%52%53ord@winehq.org/",S_OK,FALSE},
891 {"%2E:%52%53ord@winehq.org",S_OK,FALSE},
892 {"zip://%2E:%52%53ord@winehq.org/",S_OK,FALSE},
893 {"winehq.org",S_OK,FALSE},
894 {"",S_FALSE,FALSE},
895 {"",S_FALSE,FALSE},
896 {"winehq.org",S_OK,FALSE},
897 {"%52%53ord",S_OK,FALSE},
898 {"/",S_OK,FALSE},
899 {"/",S_OK,FALSE},
900 {"",S_FALSE,FALSE},
901 {"zip://%2E:%52%53ord@winehq.org/",S_OK,FALSE},
902 {"zip",S_OK,FALSE},
903 {"%2E:%52%53ord",S_OK,FALSE},
904 {"%2E",S_OK,FALSE}
907 {Uri_HOST_DNS,S_OK,FALSE},
908 {0,S_FALSE,FALSE},
909 {URL_SCHEME_UNKNOWN,S_OK,FALSE},
910 {URLZONE_INVALID,E_NOTIMPL,FALSE}
913 { "ftp://[](),'test':word@winehq.org/", 0, S_OK, FALSE,
914 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
915 Uri_HAS_HOST|Uri_HAS_PASSWORD|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
916 Uri_HAS_SCHEME_NAME|Uri_HAS_USER_INFO|Uri_HAS_USER_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|
917 Uri_HAS_SCHEME,
918 FALSE,
920 {"ftp://[](),'test':word@winehq.org/",S_OK,FALSE},
921 {"[](),'test':word@winehq.org",S_OK,FALSE},
922 {"ftp://winehq.org/",S_OK,FALSE},
923 {"winehq.org",S_OK,FALSE},
924 {"",S_FALSE,FALSE},
925 {"",S_FALSE,FALSE},
926 {"winehq.org",S_OK,FALSE},
927 {"word",S_OK,FALSE},
928 {"/",S_OK,FALSE},
929 {"/",S_OK,FALSE},
930 {"",S_FALSE,FALSE},
931 {"ftp://[](),'test':word@winehq.org/",S_OK,FALSE},
932 {"ftp",S_OK,FALSE},
933 {"[](),'test':word",S_OK,FALSE},
934 {"[](),'test'",S_OK,FALSE}
937 {Uri_HOST_DNS,S_OK,FALSE},
938 {21,S_OK,FALSE},
939 {URL_SCHEME_FTP,S_OK,FALSE},
940 {URLZONE_INVALID,E_NOTIMPL,FALSE}
943 { "ftp://test?:word@winehq.org/", 0, S_OK, FALSE,
944 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
945 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
946 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
947 FALSE,
949 {"ftp://test/?:word@winehq.org/",S_OK,FALSE},
950 {"test",S_OK,FALSE},
951 {"ftp://test/?:word@winehq.org/",S_OK,FALSE},
952 {"",S_FALSE,FALSE},
953 {"",S_FALSE,FALSE},
954 {"",S_FALSE,FALSE},
955 {"test",S_OK,FALSE},
956 {"",S_FALSE,FALSE},
957 {"/",S_OK,FALSE},
958 {"/?:word@winehq.org/",S_OK,FALSE},
959 {"?:word@winehq.org/",S_OK,FALSE},
960 {"ftp://test?:word@winehq.org/",S_OK,FALSE},
961 {"ftp",S_OK,FALSE},
962 {"",S_FALSE,FALSE},
963 {"",S_FALSE,FALSE}
966 {Uri_HOST_DNS,S_OK,FALSE},
967 {21,S_OK,FALSE},
968 {URL_SCHEME_FTP,S_OK,FALSE},
969 {URLZONE_INVALID,E_NOTIMPL,FALSE}
972 { "ftp://test#:word@winehq.org/", 0, S_OK, FALSE,
973 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_FRAGMENT|Uri_HAS_HOST|
974 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
975 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
976 FALSE,
978 {"ftp://test/#:word@winehq.org/",S_OK,FALSE},
979 {"test",S_OK,FALSE},
980 {"ftp://test/#:word@winehq.org/",S_OK,FALSE},
981 {"",S_FALSE,FALSE},
982 {"",S_FALSE,FALSE},
983 {"#:word@winehq.org/",S_OK,FALSE},
984 {"test",S_OK,FALSE},
985 {"",S_FALSE,FALSE},
986 {"/",S_OK,FALSE},
987 {"/",S_OK,FALSE},
988 {"",S_FALSE,FALSE},
989 {"ftp://test#:word@winehq.org/",S_OK,FALSE},
990 {"ftp",S_OK,FALSE},
991 {"",S_FALSE,FALSE},
992 {"",S_FALSE,FALSE}
995 {Uri_HOST_DNS,S_OK,FALSE},
996 {21,S_OK,FALSE},
997 {URL_SCHEME_FTP,S_OK,FALSE},
998 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1001 /* Allowed to have a backslash in the userinfo since it's an unknown scheme. */
1002 { "zip://test\\:word@winehq.org/", 0, S_OK, FALSE,
1003 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_HOST|
1004 Uri_HAS_PASSWORD|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
1005 Uri_HAS_USER_INFO|Uri_HAS_USER_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
1006 FALSE,
1008 {"zip://test\\:word@winehq.org/",S_OK,FALSE},
1009 {"test\\:word@winehq.org",S_OK,FALSE},
1010 {"zip://test\\:word@winehq.org/",S_OK,FALSE},
1011 {"winehq.org",S_OK,FALSE},
1012 {"",S_FALSE,FALSE},
1013 {"",S_FALSE,FALSE},
1014 {"winehq.org",S_OK,FALSE},
1015 {"word",S_OK,FALSE},
1016 {"/",S_OK,FALSE},
1017 {"/",S_OK,FALSE},
1018 {"",S_FALSE,FALSE},
1019 {"zip://test\\:word@winehq.org/",S_OK,FALSE},
1020 {"zip",S_OK,FALSE},
1021 {"test\\:word",S_OK,FALSE},
1022 {"test\\",S_OK,FALSE}
1025 {Uri_HOST_DNS,S_OK,FALSE},
1026 {0,S_FALSE,FALSE},
1027 {URL_SCHEME_UNKNOWN,S_OK,FALSE},
1028 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1031 /* It normalizes IPv4 addresses correctly. */
1032 { "http://127.000.000.100/", 0, S_OK, FALSE,
1033 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
1034 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
1035 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
1036 FALSE,
1038 {"http://127.0.0.100/",S_OK,FALSE},
1039 {"127.0.0.100",S_OK,FALSE},
1040 {"http://127.0.0.100/",S_OK,FALSE},
1041 {"",S_FALSE,FALSE},
1042 {"",S_FALSE,FALSE},
1043 {"",S_FALSE,FALSE},
1044 {"127.0.0.100",S_OK,FALSE},
1045 {"",S_FALSE,FALSE},
1046 {"/",S_OK,FALSE},
1047 {"/",S_OK,FALSE},
1048 {"",S_FALSE,FALSE},
1049 {"http://127.000.000.100/",S_OK,FALSE},
1050 {"http",S_OK,FALSE},
1051 {"",S_FALSE,FALSE},
1052 {"",S_FALSE,FALSE}
1055 {Uri_HOST_IPV4,S_OK,FALSE},
1056 {80,S_OK,FALSE},
1057 {URL_SCHEME_HTTP,S_OK,FALSE},
1058 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1061 /* Make sure it normalizes partial IPv4 addresses correctly. */
1062 { "http://127.0/", 0, S_OK, FALSE,
1063 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
1064 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
1065 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
1066 FALSE,
1068 {"http://127.0.0.0/",S_OK,FALSE},
1069 {"127.0.0.0",S_OK,FALSE},
1070 {"http://127.0.0.0/",S_OK,FALSE},
1071 {"",S_FALSE,FALSE},
1072 {"",S_FALSE,FALSE},
1073 {"",S_FALSE,FALSE},
1074 {"127.0.0.0",S_OK,FALSE},
1075 {"",S_FALSE,FALSE},
1076 {"/",S_OK,FALSE},
1077 {"/",S_OK,FALSE},
1078 {"",S_FALSE,FALSE},
1079 {"http://127.0/",S_OK,FALSE},
1080 {"http",S_OK,FALSE},
1081 {"",S_FALSE,FALSE},
1082 {"",S_FALSE,FALSE}
1085 {Uri_HOST_IPV4,S_OK,FALSE},
1086 {80,S_OK,FALSE},
1087 {URL_SCHEME_HTTP,S_OK,FALSE},
1088 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1091 /* Make sure it converts implicit IPv4's correctly. */
1092 { "http://123456/", 0, S_OK, FALSE,
1093 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
1094 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
1095 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
1096 FALSE,
1098 {"http://0.1.226.64/",S_OK,FALSE},
1099 {"0.1.226.64",S_OK,FALSE},
1100 {"http://0.1.226.64/",S_OK,FALSE},
1101 {"",S_FALSE,FALSE},
1102 {"",S_FALSE,FALSE},
1103 {"",S_FALSE,FALSE},
1104 {"0.1.226.64",S_OK,FALSE},
1105 {"",S_FALSE,FALSE},
1106 {"/",S_OK,FALSE},
1107 {"/",S_OK,FALSE},
1108 {"",S_FALSE,FALSE},
1109 {"http://123456/",S_OK,FALSE},
1110 {"http",S_OK,FALSE},
1111 {"",S_FALSE,FALSE},
1112 {"",S_FALSE,FALSE}
1115 {Uri_HOST_IPV4,S_OK,FALSE},
1116 {80,S_OK,FALSE},
1117 {URL_SCHEME_HTTP,S_OK,FALSE},
1118 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1121 /* UINT_MAX */
1122 { "http://4294967295/", 0, S_OK, FALSE,
1123 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
1124 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
1125 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
1126 FALSE,
1128 {"http://255.255.255.255/",S_OK,FALSE},
1129 {"255.255.255.255",S_OK,FALSE},
1130 {"http://255.255.255.255/",S_OK,FALSE},
1131 {"",S_FALSE,FALSE},
1132 {"",S_FALSE,FALSE},
1133 {"",S_FALSE,FALSE},
1134 {"255.255.255.255",S_OK,FALSE},
1135 {"",S_FALSE,FALSE},
1136 {"/",S_OK,FALSE},
1137 {"/",S_OK,FALSE},
1138 {"",S_FALSE,FALSE},
1139 {"http://4294967295/",S_OK,FALSE},
1140 {"http",S_OK,FALSE},
1141 {"",S_FALSE,FALSE},
1142 {"",S_FALSE,FALSE}
1145 {Uri_HOST_IPV4,S_OK,FALSE},
1146 {80,S_OK,FALSE},
1147 {URL_SCHEME_HTTP,S_OK,FALSE},
1148 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1151 /* UINT_MAX+1 */
1152 { "http://4294967296/", 0, S_OK, FALSE,
1153 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
1154 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
1155 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
1156 FALSE,
1158 {"http://4294967296/",S_OK,FALSE},
1159 {"4294967296",S_OK,FALSE},
1160 {"http://4294967296/",S_OK,FALSE},
1161 {"",S_FALSE,FALSE},
1162 {"",S_FALSE,FALSE},
1163 {"",S_FALSE,FALSE},
1164 {"4294967296",S_OK,FALSE},
1165 {"",S_FALSE,FALSE},
1166 {"/",S_OK,FALSE},
1167 {"/",S_OK,FALSE},
1168 {"",S_FALSE,FALSE},
1169 {"http://4294967296/",S_OK,FALSE},
1170 {"http",S_OK,FALSE},
1171 {"",S_FALSE,FALSE},
1172 {"",S_FALSE,FALSE}
1175 {Uri_HOST_DNS,S_OK,FALSE},
1176 {80,S_OK,FALSE},
1177 {URL_SCHEME_HTTP,S_OK,FALSE},
1178 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1181 /* Window's doesn't normalize IP address for unknown schemes. */
1182 { "1234://4294967295/", 0, S_OK, FALSE,
1183 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
1184 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
1185 Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
1186 FALSE,
1188 {"1234://4294967295/",S_OK,FALSE},
1189 {"4294967295",S_OK,FALSE},
1190 {"1234://4294967295/",S_OK,FALSE},
1191 {"",S_FALSE,FALSE},
1192 {"",S_FALSE,FALSE},
1193 {"",S_FALSE,FALSE},
1194 {"4294967295",S_OK,FALSE},
1195 {"",S_FALSE,FALSE},
1196 {"/",S_OK,FALSE},
1197 {"/",S_OK,FALSE},
1198 {"",S_FALSE,FALSE},
1199 {"1234://4294967295/",S_OK,FALSE},
1200 {"1234",S_OK,FALSE},
1201 {"",S_FALSE,FALSE},
1202 {"",S_FALSE,FALSE}
1205 {Uri_HOST_IPV4,S_OK,FALSE},
1206 {0,S_FALSE,FALSE},
1207 {URL_SCHEME_UNKNOWN,S_OK,FALSE},
1208 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1211 /* Window's doesn't normalize IP address for unknown schemes. */
1212 { "1234://127.001/", 0, S_OK, FALSE,
1213 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
1214 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
1215 Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
1216 FALSE,
1218 {"1234://127.001/",S_OK,FALSE},
1219 {"127.001",S_OK,FALSE},
1220 {"1234://127.001/",S_OK,FALSE},
1221 {"",S_FALSE,FALSE},
1222 {"",S_FALSE,FALSE},
1223 {"",S_FALSE,FALSE},
1224 {"127.001",S_OK,FALSE},
1225 {"",S_FALSE,FALSE},
1226 {"/",S_OK,FALSE},
1227 {"/",S_OK,FALSE},
1228 {"",S_FALSE,FALSE},
1229 {"1234://127.001/",S_OK,FALSE},
1230 {"1234",S_OK,FALSE},
1231 {"",S_FALSE,FALSE},
1232 {"",S_FALSE,FALSE}
1235 {Uri_HOST_IPV4,S_OK,FALSE},
1236 {0,S_FALSE,FALSE},
1237 {URL_SCHEME_UNKNOWN,S_OK,FALSE},
1238 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1241 { "http://[FEDC:BA98::3210]", 0, S_OK, FALSE,
1242 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
1243 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
1244 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
1245 FALSE,
1247 {"http://[fedc:ba98::3210]/",S_OK,FALSE},
1248 {"[fedc:ba98::3210]",S_OK,FALSE},
1249 {"http://[fedc:ba98::3210]/",S_OK,FALSE},
1250 {"",S_FALSE,FALSE},
1251 {"",S_FALSE,FALSE},
1252 {"",S_FALSE,FALSE},
1253 {"fedc:ba98::3210",S_OK,FALSE},
1254 {"",S_FALSE,FALSE},
1255 {"/",S_OK,FALSE},
1256 {"/",S_OK,FALSE},
1257 {"",S_FALSE,FALSE},
1258 {"http://[FEDC:BA98::3210]",S_OK,FALSE},
1259 {"http",S_OK,FALSE},
1260 {"",S_FALSE,FALSE},
1261 {"",S_FALSE,FALSE},
1264 {Uri_HOST_IPV6,S_OK,FALSE},
1265 {80,S_OK,FALSE},
1266 {URL_SCHEME_HTTP,S_OK,FALSE},
1267 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1270 { "http://[::]", 0, S_OK, FALSE,
1271 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
1272 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
1273 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
1274 FALSE,
1276 {"http://[::]/",S_OK,FALSE},
1277 {"[::]",S_OK,FALSE},
1278 {"http://[::]/",S_OK,FALSE},
1279 {"",S_FALSE,FALSE},
1280 {"",S_FALSE,FALSE},
1281 {"",S_FALSE,FALSE},
1282 {"::",S_OK,FALSE},
1283 {"",S_FALSE,FALSE},
1284 {"/",S_OK,FALSE},
1285 {"/",S_OK,FALSE},
1286 {"",S_FALSE,FALSE},
1287 {"http://[::]",S_OK,FALSE},
1288 {"http",S_OK,FALSE},
1289 {"",S_FALSE,FALSE},
1290 {"",S_FALSE,FALSE},
1293 {Uri_HOST_IPV6,S_OK,FALSE},
1294 {80,S_OK,FALSE},
1295 {URL_SCHEME_HTTP,S_OK,FALSE},
1296 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1299 { "http://[FEDC:BA98::]", 0, S_OK, FALSE,
1300 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
1301 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
1302 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
1303 FALSE,
1305 {"http://[fedc:ba98::]/",S_OK,FALSE},
1306 {"[fedc:ba98::]",S_OK,FALSE},
1307 {"http://[fedc:ba98::]/",S_OK,FALSE},
1308 {"",S_FALSE,FALSE},
1309 {"",S_FALSE,FALSE},
1310 {"",S_FALSE,FALSE},
1311 {"fedc:ba98::",S_OK,FALSE},
1312 {"",S_FALSE,FALSE},
1313 {"/",S_OK,FALSE},
1314 {"/",S_OK,FALSE},
1315 {"",S_FALSE,FALSE},
1316 {"http://[FEDC:BA98::]",S_OK,FALSE},
1317 {"http",S_OK,FALSE},
1318 {"",S_FALSE,FALSE},
1319 {"",S_FALSE,FALSE},
1322 {Uri_HOST_IPV6,S_OK,FALSE},
1323 {80,S_OK,FALSE},
1324 {URL_SCHEME_HTTP,S_OK,FALSE},
1325 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1328 /* Valid even with 2 byte elision because it doesn't appear the beginning or end. */
1329 { "http://[1::3:4:5:6:7:8]", 0, S_OK, FALSE,
1330 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
1331 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
1332 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
1333 FALSE,
1335 {"http://[1:0:3:4:5:6:7:8]/",S_OK,FALSE},
1336 {"[1:0:3:4:5:6:7:8]",S_OK,FALSE},
1337 {"http://[1:0:3:4:5:6:7:8]/",S_OK,FALSE},
1338 {"",S_FALSE,FALSE},
1339 {"",S_FALSE,FALSE},
1340 {"",S_FALSE,FALSE},
1341 {"1:0:3:4:5:6:7:8",S_OK,FALSE},
1342 {"",S_FALSE,FALSE},
1343 {"/",S_OK,FALSE},
1344 {"/",S_OK,FALSE},
1345 {"",S_FALSE,FALSE},
1346 {"http://[1::3:4:5:6:7:8]",S_OK,FALSE},
1347 {"http",S_OK,FALSE},
1348 {"",S_FALSE,FALSE},
1349 {"",S_FALSE,FALSE},
1352 {Uri_HOST_IPV6,S_OK,FALSE},
1353 {80,S_OK,FALSE},
1354 {URL_SCHEME_HTTP,S_OK,FALSE},
1355 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1358 { "http://[v2.34]/", 0, S_OK, FALSE,
1359 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
1360 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
1361 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
1362 FALSE,
1364 {"http://[v2.34]/",S_OK,FALSE},
1365 {"[v2.34]",S_OK,FALSE},
1366 {"http://[v2.34]/",S_OK,FALSE},
1367 {"",S_FALSE,FALSE},
1368 {"",S_FALSE,FALSE},
1369 {"",S_FALSE,FALSE},
1370 {"[v2.34]",S_OK,FALSE},
1371 {"",S_FALSE,FALSE},
1372 {"/",S_OK,FALSE},
1373 {"/",S_OK,FALSE},
1374 {"",S_FALSE,FALSE},
1375 {"http://[v2.34]/",S_OK,FALSE},
1376 {"http",S_OK,FALSE},
1377 {"",S_FALSE,FALSE},
1378 {"",S_FALSE,FALSE}
1381 {Uri_HOST_UNKNOWN,S_OK,FALSE},
1382 {80,S_OK,FALSE},
1383 {URL_SCHEME_HTTP,S_OK,FALSE},
1384 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1387 /* Windows ignores ':' if they appear after a '[' on a non-IPLiteral host. */
1388 { "http://[xyz:12345.com/test", 0, S_OK, FALSE,
1389 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
1390 Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
1391 Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
1392 FALSE,
1394 {"http://[xyz:12345.com/test",S_OK,FALSE},
1395 {"[xyz:12345.com",S_OK,FALSE},
1396 {"http://[xyz:12345.com/test",S_OK,FALSE},
1397 {"[xyz:12345.com",S_OK,FALSE},
1398 {"",S_FALSE,FALSE},
1399 {"",S_FALSE,FALSE},
1400 {"[xyz:12345.com",S_OK,FALSE},
1401 {"",S_FALSE,FALSE},
1402 {"/test",S_OK,FALSE},
1403 {"/test",S_OK,FALSE},
1404 {"",S_FALSE,FALSE},
1405 {"http://[xyz:12345.com/test",S_OK,FALSE},
1406 {"http",S_OK,FALSE},
1407 {"",S_FALSE,FALSE},
1408 {"",S_FALSE,FALSE}
1411 {Uri_HOST_DNS,S_OK,FALSE},
1412 {80,S_OK,FALSE},
1413 {URL_SCHEME_HTTP,S_OK,FALSE},
1414 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1417 /* Valid URI since the '[' and ']' don't appear at the beginning and end
1418 * of the host name (respectively).
1420 { "ftp://www.[works].com/", 0, S_OK, FALSE,
1421 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
1422 Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
1423 Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
1424 FALSE,
1426 {"ftp://www.[works].com/",S_OK,FALSE},
1427 {"www.[works].com",S_OK,FALSE},
1428 {"ftp://www.[works].com/",S_OK,FALSE},
1429 {"[works].com",S_OK,FALSE},
1430 {"",S_FALSE,FALSE},
1431 {"",S_FALSE,FALSE},
1432 {"www.[works].com",S_OK,FALSE},
1433 {"",S_FALSE,FALSE},
1434 {"/",S_OK,FALSE},
1435 {"/",S_OK,FALSE},
1436 {"",S_FALSE,FALSE},
1437 {"ftp://www.[works].com/",S_OK,FALSE},
1438 {"ftp",S_OK,FALSE},
1439 {"",S_FALSE,FALSE},
1440 {"",S_FALSE,FALSE}
1443 {Uri_HOST_DNS,S_OK,FALSE},
1444 {21,S_OK,FALSE},
1445 {URL_SCHEME_FTP,S_OK,FALSE},
1446 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1449 /* Considers ':' a delimiter since it appears after the ']'. */
1450 { "http://www.google.com]:12345/", 0, S_OK, FALSE,
1451 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
1452 Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
1453 Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
1454 FALSE,
1456 {"http://www.google.com]:12345/",S_OK,FALSE},
1457 {"www.google.com]:12345",S_OK,FALSE},
1458 {"http://www.google.com]:12345/",S_OK,FALSE},
1459 {"google.com]",S_OK,FALSE},
1460 {"",S_FALSE,FALSE},
1461 {"",S_FALSE,FALSE},
1462 {"www.google.com]",S_OK,FALSE},
1463 {"",S_FALSE,FALSE},
1464 {"/",S_OK,FALSE},
1465 {"/",S_OK,FALSE},
1466 {"",S_FALSE,FALSE},
1467 {"http://www.google.com]:12345/",S_OK,FALSE},
1468 {"http",S_OK,FALSE},
1469 {"",S_FALSE,FALSE},
1470 {"",S_FALSE,FALSE}
1473 {Uri_HOST_DNS,S_OK,FALSE},
1474 {12345,S_OK,FALSE},
1475 {URL_SCHEME_HTTP,S_OK,FALSE},
1476 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1479 /* Unknown scheme types can have invalid % encoded data in the hostname. */
1480 { "zip://w%XXw%GEw.google.com/", 0, S_OK, FALSE,
1481 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
1482 Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
1483 Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
1484 FALSE,
1486 {"zip://w%XXw%GEw.google.com/",S_OK,FALSE},
1487 {"w%XXw%GEw.google.com",S_OK,FALSE},
1488 {"zip://w%XXw%GEw.google.com/",S_OK,FALSE},
1489 {"google.com",S_OK,FALSE},
1490 {"",S_FALSE,FALSE},
1491 {"",S_FALSE,FALSE},
1492 {"w%XXw%GEw.google.com",S_OK,FALSE},
1493 {"",S_FALSE,FALSE},
1494 {"/",S_OK,FALSE},
1495 {"/",S_OK,FALSE},
1496 {"",S_FALSE,FALSE},
1497 {"zip://w%XXw%GEw.google.com/",S_OK,FALSE},
1498 {"zip",S_OK,FALSE},
1499 {"",S_FALSE,FALSE},
1500 {"",S_FALSE,FALSE}
1503 {Uri_HOST_DNS,S_OK,FALSE},
1504 {0,S_FALSE,FALSE},
1505 {URL_SCHEME_UNKNOWN,S_OK,FALSE},
1506 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1509 /* Unknown scheme types hostname doesn't get lower cased. */
1510 { "zip://GOOGLE.com/", 0, S_OK, FALSE,
1511 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
1512 Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
1513 Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
1514 FALSE,
1516 {"zip://GOOGLE.com/",S_OK,FALSE},
1517 {"GOOGLE.com",S_OK,FALSE},
1518 {"zip://GOOGLE.com/",S_OK,FALSE},
1519 {"GOOGLE.com",S_OK,FALSE},
1520 {"",S_FALSE,FALSE},
1521 {"",S_FALSE,FALSE},
1522 {"GOOGLE.com",S_OK,FALSE},
1523 {"",S_FALSE,FALSE},
1524 {"/",S_OK,FALSE},
1525 {"/",S_OK,FALSE},
1526 {"",S_FALSE,FALSE},
1527 {"zip://GOOGLE.com/",S_OK,FALSE},
1528 {"zip",S_OK,FALSE},
1529 {"",S_FALSE,FALSE},
1530 {"",S_FALSE,FALSE}
1533 {Uri_HOST_DNS,S_OK,FALSE},
1534 {0,S_FALSE,FALSE},
1535 {URL_SCHEME_UNKNOWN,S_OK,FALSE},
1536 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1539 /* Hostname get's lower cased for known scheme types. */
1540 { "http://WWW.GOOGLE.com/", 0, S_OK, FALSE,
1541 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
1542 Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
1543 Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
1544 FALSE,
1546 {"http://www.google.com/",S_OK,FALSE},
1547 {"www.google.com",S_OK,FALSE},
1548 {"http://www.google.com/",S_OK,FALSE},
1549 {"google.com",S_OK,FALSE},
1550 {"",S_FALSE,FALSE},
1551 {"",S_FALSE,FALSE},
1552 {"www.google.com",S_OK,FALSE},
1553 {"",S_FALSE,FALSE},
1554 {"/",S_OK,FALSE},
1555 {"/",S_OK,FALSE},
1556 {"",S_FALSE,FALSE},
1557 {"http://WWW.GOOGLE.com/",S_OK,FALSE},
1558 {"http",S_OK,FALSE},
1559 {"",S_FALSE,FALSE},
1560 {"",S_FALSE,FALSE}
1563 {Uri_HOST_DNS,S_OK,FALSE},
1564 {80,S_OK,FALSE},
1565 {URL_SCHEME_HTTP,S_OK,FALSE},
1566 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1569 /* Characters that get % encoded in the hostname also have their percent
1570 * encoded forms lower cased.
1572 { "http://www.%7Cgoogle|.com/", 0, S_OK, FALSE,
1573 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
1574 Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
1575 Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
1576 FALSE,
1578 {"http://www.%7cgoogle%7c.com/",S_OK,FALSE},
1579 {"www.%7cgoogle%7c.com",S_OK,FALSE},
1580 {"http://www.%7cgoogle%7c.com/",S_OK,FALSE},
1581 {"%7cgoogle%7c.com",S_OK,FALSE},
1582 {"",S_FALSE,FALSE},
1583 {"",S_FALSE,FALSE},
1584 {"www.%7cgoogle%7c.com",S_OK,FALSE},
1585 {"",S_FALSE,FALSE},
1586 {"/",S_OK,FALSE},
1587 {"/",S_OK,FALSE},
1588 {"",S_FALSE,FALSE},
1589 {"http://www.%7Cgoogle|.com/",S_OK,FALSE},
1590 {"http",S_OK,FALSE},
1591 {"",S_FALSE,FALSE},
1592 {"",S_FALSE,FALSE}
1595 {Uri_HOST_DNS,S_OK,FALSE},
1596 {80,S_OK,FALSE},
1597 {URL_SCHEME_HTTP,S_OK,FALSE},
1598 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1601 /* IPv4 addresses attached to IPv6 can be included in elisions. */
1602 { "http://[1:2:3:4:5:6:0.0.0.0]", 0, S_OK, FALSE,
1603 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
1604 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
1605 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
1606 FALSE,
1608 {"http://[1:2:3:4:5:6::]/",S_OK,FALSE},
1609 {"[1:2:3:4:5:6::]",S_OK,FALSE},
1610 {"http://[1:2:3:4:5:6::]/",S_OK,FALSE},
1611 {"",S_FALSE,FALSE},
1612 {"",S_FALSE,FALSE},
1613 {"",S_FALSE,FALSE},
1614 {"1:2:3:4:5:6::",S_OK,FALSE},
1615 {"",S_FALSE,FALSE},
1616 {"/",S_OK,FALSE},
1617 {"/",S_OK,FALSE},
1618 {"",S_FALSE,FALSE},
1619 {"http://[1:2:3:4:5:6:0.0.0.0]",S_OK,FALSE},
1620 {"http",S_OK,FALSE},
1621 {"",S_FALSE,FALSE},
1622 {"",S_FALSE,FALSE},
1625 {Uri_HOST_IPV6,S_OK,FALSE},
1626 {80,S_OK,FALSE},
1627 {URL_SCHEME_HTTP,S_OK,FALSE},
1628 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1631 /* IPv4 addresses get normalized. */
1632 { "http://[::001.002.003.000]", 0, S_OK, FALSE,
1633 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
1634 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
1635 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
1636 FALSE,
1638 {"http://[::1.2.3.0]/",S_OK,FALSE},
1639 {"[::1.2.3.0]",S_OK,FALSE},
1640 {"http://[::1.2.3.0]/",S_OK,FALSE},
1641 {"",S_FALSE,FALSE},
1642 {"",S_FALSE,FALSE},
1643 {"",S_FALSE,FALSE},
1644 {"::1.2.3.0",S_OK,FALSE},
1645 {"",S_FALSE,FALSE},
1646 {"/",S_OK,FALSE},
1647 {"/",S_OK,FALSE},
1648 {"",S_FALSE,FALSE},
1649 {"http://[::001.002.003.000]",S_OK,FALSE},
1650 {"http",S_OK,FALSE},
1651 {"",S_FALSE,FALSE},
1652 {"",S_FALSE,FALSE},
1655 {Uri_HOST_IPV6,S_OK,FALSE},
1656 {80,S_OK,FALSE},
1657 {URL_SCHEME_HTTP,S_OK,FALSE},
1658 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1661 /* Windows doesn't do anything to IPv6's in unknown schemes. */
1662 { "zip://[0001:0:000:0004:0005:0006:001.002.003.000]", 0, S_OK, FALSE,
1663 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
1664 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
1665 Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
1666 FALSE,
1668 {"zip://[0001:0:000:0004:0005:0006:001.002.003.000]/",S_OK,FALSE},
1669 {"[0001:0:000:0004:0005:0006:001.002.003.000]",S_OK,FALSE},
1670 {"zip://[0001:0:000:0004:0005:0006:001.002.003.000]/",S_OK,FALSE},
1671 {"",S_FALSE,FALSE},
1672 {"",S_FALSE,FALSE},
1673 {"",S_FALSE,FALSE},
1674 {"0001:0:000:0004:0005:0006:001.002.003.000",S_OK,FALSE},
1675 {"",S_FALSE,FALSE},
1676 {"/",S_OK,FALSE},
1677 {"/",S_OK,FALSE},
1678 {"",S_FALSE,FALSE},
1679 {"zip://[0001:0:000:0004:0005:0006:001.002.003.000]",S_OK,FALSE},
1680 {"zip",S_OK,FALSE},
1681 {"",S_FALSE,FALSE},
1682 {"",S_FALSE,FALSE},
1685 {Uri_HOST_IPV6,S_OK,FALSE},
1686 {0,S_FALSE,FALSE},
1687 {URL_SCHEME_UNKNOWN,S_OK,FALSE},
1688 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1691 /* IPv4 address is converted into 2 h16 components. */
1692 { "http://[ffff::192.222.111.32]", 0, S_OK, FALSE,
1693 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
1694 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
1695 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
1696 FALSE,
1698 {"http://[ffff::c0de:6f20]/",S_OK,FALSE},
1699 {"[ffff::c0de:6f20]",S_OK,FALSE},
1700 {"http://[ffff::c0de:6f20]/",S_OK,FALSE},
1701 {"",S_FALSE,FALSE},
1702 {"",S_FALSE,FALSE},
1703 {"",S_FALSE,FALSE},
1704 {"ffff::c0de:6f20",S_OK,FALSE},
1705 {"",S_FALSE,FALSE},
1706 {"/",S_OK,FALSE},
1707 {"/",S_OK,FALSE},
1708 {"",S_FALSE,FALSE},
1709 {"http://[ffff::192.222.111.32]",S_OK,FALSE},
1710 {"http",S_OK,FALSE},
1711 {"",S_FALSE,FALSE},
1712 {"",S_FALSE,FALSE},
1715 {Uri_HOST_IPV6,S_OK,FALSE},
1716 {80,S_OK,FALSE},
1717 {URL_SCHEME_HTTP,S_OK,FALSE},
1718 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1721 /* Max value for a port. */
1722 { "http://google.com:65535", 0, S_OK, FALSE,
1723 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
1724 Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
1725 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
1726 FALSE,
1728 {"http://google.com:65535/",S_OK,FALSE},
1729 {"google.com:65535",S_OK,FALSE},
1730 {"http://google.com:65535/",S_OK,FALSE},
1731 {"google.com",S_OK,FALSE},
1732 {"",S_FALSE,FALSE},
1733 {"",S_FALSE,FALSE},
1734 {"google.com",S_OK,FALSE},
1735 {"",S_FALSE,FALSE},
1736 {"/",S_OK,FALSE},
1737 {"/",S_OK,FALSE},
1738 {"",S_FALSE,FALSE},
1739 {"http://google.com:65535",S_OK,FALSE},
1740 {"http",S_OK,FALSE},
1741 {"",S_FALSE,FALSE},
1742 {"",S_FALSE,FALSE}
1745 {Uri_HOST_DNS,S_OK,FALSE},
1746 {65535,S_OK,FALSE},
1747 {URL_SCHEME_HTTP,S_OK,FALSE},
1748 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1751 { "zip://google.com:65536", 0, S_OK, FALSE,
1752 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
1753 Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
1754 Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
1755 FALSE,
1757 {"zip://google.com:65536/",S_OK,FALSE},
1758 {"google.com:65536",S_OK,FALSE},
1759 {"zip://google.com:65536/",S_OK,FALSE},
1760 {"google.com:65536",S_OK,FALSE},
1761 {"",S_FALSE,FALSE},
1762 {"",S_FALSE,FALSE},
1763 {"google.com:65536",S_OK,FALSE},
1764 {"",S_FALSE,FALSE},
1765 {"/",S_OK,FALSE},
1766 {"/",S_OK,FALSE},
1767 {"",S_FALSE,FALSE},
1768 {"zip://google.com:65536",S_OK,FALSE},
1769 {"zip",S_OK,FALSE},
1770 {"",S_FALSE,FALSE},
1771 {"",S_FALSE,FALSE}
1774 {Uri_HOST_DNS,S_OK,FALSE},
1775 {0,S_FALSE,FALSE},
1776 {URL_SCHEME_UNKNOWN,S_OK,FALSE},
1777 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1780 { "zip://google.com:65536:25", 0, S_OK, FALSE,
1781 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
1782 Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
1783 Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
1784 FALSE,
1786 {"zip://google.com:65536:25/",S_OK,FALSE},
1787 {"google.com:65536:25",S_OK,FALSE},
1788 {"zip://google.com:65536:25/",S_OK,FALSE},
1789 {"google.com:65536:25",S_OK,FALSE},
1790 {"",S_FALSE,FALSE},
1791 {"",S_FALSE,FALSE},
1792 {"google.com:65536:25",S_OK,FALSE},
1793 {"",S_FALSE,FALSE},
1794 {"/",S_OK,FALSE},
1795 {"/",S_OK,FALSE},
1796 {"",S_FALSE,FALSE},
1797 {"zip://google.com:65536:25",S_OK,FALSE},
1798 {"zip",S_OK,FALSE},
1799 {"",S_FALSE,FALSE},
1800 {"",S_FALSE,FALSE}
1803 {Uri_HOST_DNS,S_OK,FALSE},
1804 {0,S_FALSE,FALSE},
1805 {URL_SCHEME_UNKNOWN,S_OK,FALSE},
1806 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1809 { "zip://[::ffff]:abcd", 0, S_OK, FALSE,
1810 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|
1811 Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
1812 Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
1813 FALSE,
1815 {"zip://[::ffff]:abcd/",S_OK,FALSE},
1816 {"[::ffff]:abcd",S_OK,FALSE},
1817 {"zip://[::ffff]:abcd/",S_OK,FALSE},
1818 {"",S_FALSE,FALSE},
1819 {"",S_FALSE,FALSE},
1820 {"",S_FALSE,FALSE},
1821 {"[::ffff]:abcd",S_OK,FALSE},
1822 {"",S_FALSE,FALSE},
1823 {"/",S_OK,FALSE},
1824 {"/",S_OK,FALSE},
1825 {"",S_FALSE,FALSE},
1826 {"zip://[::ffff]:abcd",S_OK,FALSE},
1827 {"zip",S_OK,FALSE},
1828 {"",S_FALSE,FALSE},
1829 {"",S_FALSE,FALSE}
1832 {Uri_HOST_DNS,S_OK,FALSE},
1833 {0,S_FALSE,FALSE},
1834 {URL_SCHEME_UNKNOWN,S_OK,FALSE},
1835 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1838 { "zip://127.0.0.1:abcd", 0, S_OK, FALSE,
1839 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
1840 Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
1841 Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
1842 FALSE,
1844 {"zip://127.0.0.1:abcd/",S_OK,FALSE},
1845 {"127.0.0.1:abcd",S_OK,FALSE},
1846 {"zip://127.0.0.1:abcd/",S_OK,FALSE},
1847 {"0.1:abcd",S_OK,FALSE},
1848 {"",S_FALSE,FALSE},
1849 {"",S_FALSE,FALSE},
1850 {"127.0.0.1:abcd",S_OK,FALSE},
1851 {"",S_FALSE,FALSE},
1852 {"/",S_OK,FALSE},
1853 {"/",S_OK,FALSE},
1854 {"",S_FALSE,FALSE},
1855 {"zip://127.0.0.1:abcd",S_OK,FALSE},
1856 {"zip",S_OK,FALSE},
1857 {"",S_FALSE,FALSE},
1858 {"",S_FALSE,FALSE}
1861 {Uri_HOST_DNS,S_OK,FALSE},
1862 {0,S_FALSE,FALSE},
1863 {URL_SCHEME_UNKNOWN,S_OK,FALSE},
1864 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1867 /* Port is just copied over. */
1868 { "http://google.com:00035", Uri_CREATE_NO_CANONICALIZE, S_OK, FALSE,
1869 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
1870 Uri_HAS_HOST|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
1871 FALSE,
1873 {"http://google.com:00035",S_OK,FALSE},
1874 {"google.com:00035",S_OK,FALSE},
1875 {"http://google.com:00035",S_OK,FALSE,"http://google.com:35"},
1876 {"google.com",S_OK,FALSE},
1877 {"",S_FALSE,FALSE},
1878 {"",S_FALSE,FALSE},
1879 {"google.com",S_OK,FALSE},
1880 {"",S_FALSE,FALSE},
1881 {"",S_FALSE,FALSE},
1882 {"",S_FALSE,FALSE},
1883 {"",S_FALSE,FALSE},
1884 {"http://google.com:00035",S_OK,FALSE},
1885 {"http",S_OK,FALSE},
1886 {"",S_FALSE,FALSE},
1887 {"",S_FALSE,FALSE}
1890 {Uri_HOST_DNS,S_OK,FALSE},
1891 {35,S_OK,FALSE},
1892 {URL_SCHEME_HTTP,S_OK,FALSE},
1893 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1896 /* Default port is copied over. */
1897 { "http://google.com:80", Uri_CREATE_NO_CANONICALIZE, S_OK, FALSE,
1898 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
1899 Uri_HAS_HOST|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
1900 FALSE,
1902 {"http://google.com:80",S_OK,FALSE},
1903 {"google.com:80",S_OK,FALSE},
1904 {"http://google.com:80",S_OK,FALSE},
1905 {"google.com",S_OK,FALSE},
1906 {"",S_FALSE,FALSE},
1907 {"",S_FALSE,FALSE},
1908 {"google.com",S_OK,FALSE},
1909 {"",S_FALSE,FALSE},
1910 {"",S_FALSE,FALSE},
1911 {"",S_FALSE,FALSE},
1912 {"",S_FALSE,FALSE},
1913 {"http://google.com:80",S_OK,FALSE},
1914 {"http",S_OK,FALSE},
1915 {"",S_FALSE,FALSE},
1916 {"",S_FALSE,FALSE}
1919 {Uri_HOST_DNS,S_OK,FALSE},
1920 {80,S_OK,FALSE},
1921 {URL_SCHEME_HTTP,S_OK,FALSE},
1922 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1925 { "http://google.com.uk", 0, S_OK, FALSE,
1926 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
1927 Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
1928 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
1929 FALSE,
1931 {"http://google.com.uk/",S_OK,FALSE},
1932 {"google.com.uk",S_OK,FALSE},
1933 {"http://google.com.uk/",S_OK,FALSE},
1934 {"google.com.uk",S_OK,FALSE},
1935 {"",S_FALSE,FALSE},
1936 {"",S_FALSE,FALSE},
1937 {"google.com.uk",S_OK,FALSE},
1938 {"",S_FALSE,FALSE},
1939 {"/",S_OK,FALSE},
1940 {"/",S_OK,FALSE},
1941 {"",S_FALSE,FALSE},
1942 {"http://google.com.uk",S_OK,FALSE},
1943 {"http",S_OK,FALSE},
1944 {"",S_FALSE,FALSE},
1945 {"",S_FALSE,FALSE}
1948 {Uri_HOST_DNS,S_OK,FALSE},
1949 {80,S_OK,FALSE},
1950 {URL_SCHEME_HTTP,S_OK,FALSE},
1951 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1954 { "http://google.com.com", 0, S_OK, FALSE,
1955 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
1956 Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
1957 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
1958 FALSE,
1960 {"http://google.com.com/",S_OK,FALSE},
1961 {"google.com.com",S_OK,FALSE},
1962 {"http://google.com.com/",S_OK,FALSE},
1963 {"com.com",S_OK,FALSE},
1964 {"",S_FALSE,FALSE},
1965 {"",S_FALSE,FALSE},
1966 {"google.com.com",S_OK,FALSE},
1967 {"",S_FALSE,FALSE},
1968 {"/",S_OK,FALSE},
1969 {"/",S_OK,FALSE},
1970 {"",S_FALSE,FALSE},
1971 {"http://google.com.com",S_OK,FALSE},
1972 {"http",S_OK,FALSE},
1973 {"",S_FALSE,FALSE},
1974 {"",S_FALSE,FALSE}
1977 {Uri_HOST_DNS,S_OK,FALSE},
1978 {80,S_OK,FALSE},
1979 {URL_SCHEME_HTTP,S_OK,FALSE},
1980 {URLZONE_INVALID,E_NOTIMPL,FALSE}
1983 { "http://google.uk.1", 0, S_OK, FALSE,
1984 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
1985 Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
1986 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
1987 FALSE,
1989 {"http://google.uk.1/",S_OK,FALSE},
1990 {"google.uk.1",S_OK,FALSE},
1991 {"http://google.uk.1/",S_OK,FALSE},
1992 {"google.uk.1",S_OK,FALSE},
1993 {"",S_FALSE,FALSE},
1994 {"",S_FALSE,FALSE},
1995 {"google.uk.1",S_OK,FALSE},
1996 {"",S_FALSE,FALSE},
1997 {"/",S_OK,FALSE},
1998 {"/",S_OK,FALSE},
1999 {"",S_FALSE,FALSE},
2000 {"http://google.uk.1",S_OK,FALSE},
2001 {"http",S_OK,FALSE},
2002 {"",S_FALSE,FALSE},
2003 {"",S_FALSE,FALSE}
2006 {Uri_HOST_DNS,S_OK,FALSE},
2007 {80,S_OK,FALSE},
2008 {URL_SCHEME_HTTP,S_OK,FALSE},
2009 {URLZONE_INVALID,E_NOTIMPL,FALSE}
2012 /* Since foo isn't a recognized 3 character TLD its considered the domain name. */
2013 { "http://google.foo.uk", 0, S_OK, FALSE,
2014 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
2015 Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
2016 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
2017 FALSE,
2019 {"http://google.foo.uk/",S_OK,FALSE},
2020 {"google.foo.uk",S_OK,FALSE},
2021 {"http://google.foo.uk/",S_OK,FALSE},
2022 {"foo.uk",S_OK,FALSE},
2023 {"",S_FALSE,FALSE},
2024 {"",S_FALSE,FALSE},
2025 {"google.foo.uk",S_OK,FALSE},
2026 {"",S_FALSE,FALSE},
2027 {"/",S_OK,FALSE},
2028 {"/",S_OK,FALSE},
2029 {"",S_FALSE,FALSE},
2030 {"http://google.foo.uk",S_OK,FALSE},
2031 {"http",S_OK,FALSE},
2032 {"",S_FALSE,FALSE},
2033 {"",S_FALSE,FALSE}
2036 {Uri_HOST_DNS,S_OK,FALSE},
2037 {80,S_OK,FALSE},
2038 {URL_SCHEME_HTTP,S_OK,FALSE},
2039 {URLZONE_INVALID,E_NOTIMPL,FALSE}
2042 { "http://.com", 0, S_OK, FALSE,
2043 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
2044 Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
2045 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
2046 FALSE,
2048 {"http://.com/",S_OK,FALSE},
2049 {".com",S_OK,FALSE},
2050 {"http://.com/",S_OK,FALSE},
2051 {".com",S_OK,FALSE},
2052 {"",S_FALSE,FALSE},
2053 {"",S_FALSE,FALSE},
2054 {".com",S_OK,FALSE},
2055 {"",S_FALSE,FALSE},
2056 {"/",S_OK,FALSE},
2057 {"/",S_OK,FALSE},
2058 {"",S_FALSE,FALSE},
2059 {"http://.com",S_OK,FALSE},
2060 {"http",S_OK,FALSE},
2061 {"",S_FALSE,FALSE},
2062 {"",S_FALSE,FALSE}
2065 {Uri_HOST_DNS,S_OK,FALSE},
2066 {80,S_OK,FALSE},
2067 {URL_SCHEME_HTTP,S_OK,FALSE},
2068 {URLZONE_INVALID,E_NOTIMPL,FALSE}
2071 { "http://.uk", 0, S_OK, FALSE,
2072 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
2073 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
2074 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
2075 FALSE,
2077 {"http://.uk/",S_OK,FALSE},
2078 {".uk",S_OK,FALSE},
2079 {"http://.uk/",S_OK,FALSE},
2080 {"",S_FALSE,FALSE},
2081 {"",S_FALSE,FALSE},
2082 {"",S_FALSE,FALSE},
2083 {".uk",S_OK,FALSE},
2084 {"",S_FALSE,FALSE},
2085 {"/",S_OK,FALSE},
2086 {"/",S_OK,FALSE},
2087 {"",S_FALSE,FALSE},
2088 {"http://.uk",S_OK,FALSE},
2089 {"http",S_OK,FALSE},
2090 {"",S_FALSE,FALSE},
2091 {"",S_FALSE,FALSE}
2094 {Uri_HOST_DNS,S_OK,FALSE},
2095 {80,S_OK,FALSE},
2096 {URL_SCHEME_HTTP,S_OK,FALSE},
2097 {URLZONE_INVALID,E_NOTIMPL,FALSE}
2100 { "http://www.co.google.com.[]", 0, S_OK, FALSE,
2101 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
2102 Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
2103 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
2104 FALSE,
2106 {"http://www.co.google.com.[]/",S_OK,FALSE},
2107 {"www.co.google.com.[]",S_OK,FALSE},
2108 {"http://www.co.google.com.[]/",S_OK,FALSE},
2109 {"google.com.[]",S_OK,FALSE},
2110 {"",S_FALSE,FALSE},
2111 {"",S_FALSE,FALSE},
2112 {"www.co.google.com.[]",S_OK,FALSE},
2113 {"",S_FALSE,FALSE},
2114 {"/",S_OK,FALSE},
2115 {"/",S_OK,FALSE},
2116 {"",S_FALSE,FALSE},
2117 {"http://www.co.google.com.[]",S_OK,FALSE},
2118 {"http",S_OK,FALSE},
2119 {"",S_FALSE,FALSE},
2120 {"",S_FALSE,FALSE}
2123 {Uri_HOST_DNS,S_OK,FALSE},
2124 {80,S_OK,FALSE},
2125 {URL_SCHEME_HTTP,S_OK,FALSE},
2126 {URLZONE_INVALID,E_NOTIMPL,FALSE}
2129 { "http://co.uk", 0, S_OK, FALSE,
2130 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
2131 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
2132 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
2133 FALSE,
2135 {"http://co.uk/",S_OK,FALSE},
2136 {"co.uk",S_OK,FALSE},
2137 {"http://co.uk/",S_OK,FALSE},
2138 {"",S_FALSE,FALSE},
2139 {"",S_FALSE,FALSE},
2140 {"",S_FALSE,FALSE},
2141 {"co.uk",S_OK,FALSE},
2142 {"",S_FALSE,FALSE},
2143 {"/",S_OK,FALSE},
2144 {"/",S_OK,FALSE},
2145 {"",S_FALSE,FALSE},
2146 {"http://co.uk",S_OK,FALSE},
2147 {"http",S_OK,FALSE},
2148 {"",S_FALSE,FALSE},
2149 {"",S_FALSE,FALSE}
2152 {Uri_HOST_DNS,S_OK,FALSE},
2153 {80,S_OK,FALSE},
2154 {URL_SCHEME_HTTP,S_OK,FALSE},
2155 {URLZONE_INVALID,E_NOTIMPL,FALSE}
2158 { "http://www.co.google.us.test", 0, S_OK, FALSE,
2159 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
2160 Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
2161 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
2162 FALSE,
2164 {"http://www.co.google.us.test/",S_OK,FALSE},
2165 {"www.co.google.us.test",S_OK,FALSE},
2166 {"http://www.co.google.us.test/",S_OK,FALSE},
2167 {"us.test",S_OK,FALSE},
2168 {"",S_FALSE,FALSE},
2169 {"",S_FALSE,FALSE},
2170 {"www.co.google.us.test",S_OK,FALSE},
2171 {"",S_FALSE,FALSE},
2172 {"/",S_OK,FALSE},
2173 {"/",S_OK,FALSE},
2174 {"",S_FALSE,FALSE},
2175 {"http://www.co.google.us.test",S_OK,FALSE},
2176 {"http",S_OK,FALSE},
2177 {"",S_FALSE,FALSE},
2178 {"",S_FALSE,FALSE}
2181 {Uri_HOST_DNS,S_OK,FALSE},
2182 {80,S_OK,FALSE},
2183 {URL_SCHEME_HTTP,S_OK,FALSE},
2184 {URLZONE_INVALID,E_NOTIMPL,FALSE}
2187 { "http://gov.uk", 0, S_OK, FALSE,
2188 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
2189 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
2190 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
2191 FALSE,
2193 {"http://gov.uk/",S_OK,FALSE},
2194 {"gov.uk",S_OK,FALSE},
2195 {"http://gov.uk/",S_OK,FALSE},
2196 {"",S_FALSE,FALSE},
2197 {"",S_FALSE,FALSE},
2198 {"",S_FALSE,FALSE},
2199 {"gov.uk",S_OK,FALSE},
2200 {"",S_FALSE,FALSE},
2201 {"/",S_OK,FALSE},
2202 {"/",S_OK,FALSE},
2203 {"",S_FALSE,FALSE},
2204 {"http://gov.uk",S_OK,FALSE},
2205 {"http",S_OK,FALSE},
2206 {"",S_FALSE,FALSE},
2207 {"",S_FALSE,FALSE}
2210 {Uri_HOST_DNS,S_OK,FALSE},
2211 {80,S_OK,FALSE},
2212 {URL_SCHEME_HTTP,S_OK,FALSE},
2213 {URLZONE_INVALID,E_NOTIMPL,FALSE}
2216 { "zip://www.google.com\\test", Uri_CREATE_NO_CANONICALIZE, S_OK, FALSE,
2217 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
2218 Uri_HAS_HOST|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
2219 FALSE,
2221 {"zip://www.google.com\\test",S_OK,FALSE},
2222 {"www.google.com\\test",S_OK,FALSE},
2223 {"zip://www.google.com\\test",S_OK,FALSE},
2224 {"google.com\\test",S_OK,FALSE},
2225 {"",S_FALSE,FALSE},
2226 {"",S_FALSE,FALSE},
2227 {"www.google.com\\test",S_OK,FALSE},
2228 {"",S_FALSE,FALSE},
2229 {"",S_FALSE,FALSE},
2230 {"",S_FALSE,FALSE},
2231 {"",S_FALSE,FALSE},
2232 {"zip://www.google.com\\test",S_OK,FALSE},
2233 {"zip",S_OK,FALSE},
2234 {"",S_FALSE,FALSE},
2235 {"",S_FALSE,FALSE}
2238 {Uri_HOST_DNS,S_OK,FALSE},
2239 {0,S_FALSE,FALSE},
2240 {URL_SCHEME_UNKNOWN,S_OK,FALSE},
2241 {URLZONE_INVALID,E_NOTIMPL,FALSE}
2244 { "urn:excepts:bad:%XY:encoded", 0, S_OK, FALSE,
2245 Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|
2246 Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
2247 FALSE,
2249 {"urn:excepts:bad:%XY:encoded",S_OK,FALSE},
2250 {"",S_FALSE,FALSE},
2251 {"urn:excepts:bad:%XY:encoded",S_OK,FALSE},
2252 {"",S_FALSE,FALSE},
2253 {"",S_FALSE,FALSE},
2254 {"",S_FALSE,FALSE},
2255 {"",S_FALSE,FALSE},
2256 {"",S_FALSE,FALSE},
2257 {"excepts:bad:%XY:encoded",S_OK,FALSE},
2258 {"excepts:bad:%XY:encoded",S_OK,FALSE},
2259 {"",S_FALSE,FALSE},
2260 {"urn:excepts:bad:%XY:encoded",S_OK,FALSE},
2261 {"urn",S_OK,FALSE},
2262 {"",S_FALSE,FALSE},
2263 {"",S_FALSE,FALSE}
2266 {Uri_HOST_UNKNOWN,S_OK,FALSE},
2267 {0,S_FALSE,FALSE},
2268 {URL_SCHEME_UNKNOWN,S_OK,FALSE},
2269 {URLZONE_INVALID,E_NOTIMPL,FALSE}
2272 /* Since the original URI doesn't contain an extra '/' before the path no % encoded values
2273 * are decoded and all '%' are encoded.
2275 { "file://C:/te%3Es%2Et/tes%t.mp3", 0, S_OK, FALSE,
2276 Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH|
2277 Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
2278 FALSE,
2280 {"file:///C:/te%253Es%252Et/tes%25t.mp3",S_OK,FALSE},
2281 {"",S_FALSE,FALSE},
2282 {"file:///C:/te%253Es%252Et/tes%25t.mp3",S_OK,FALSE},
2283 {"",S_FALSE,FALSE},
2284 {".mp3",S_OK,FALSE},
2285 {"",S_FALSE,FALSE},
2286 {"",S_FALSE,FALSE},
2287 {"",S_FALSE,FALSE},
2288 {"/C:/te%253Es%252Et/tes%25t.mp3",S_OK,FALSE},
2289 {"/C:/te%253Es%252Et/tes%25t.mp3",S_OK,FALSE},
2290 {"",S_FALSE,FALSE},
2291 {"file://C:/te%3Es%2Et/tes%t.mp3",S_OK,FALSE},
2292 {"file",S_OK,FALSE},
2293 {"",S_FALSE,FALSE},
2294 {"",S_FALSE,FALSE}
2297 {Uri_HOST_UNKNOWN,S_OK,FALSE},
2298 {0,S_FALSE,FALSE},
2299 {URL_SCHEME_FILE,S_OK,FALSE},
2300 {URLZONE_INVALID,E_NOTIMPL,FALSE}
2303 /* Since there's a '/' in front of the drive letter, any percent encoded, non-forbidden character
2304 * is decoded and only %'s in front of invalid hex digits are encoded.
2306 { "file:///C:/te%3Es%2Et/t%23es%t.mp3", 0, S_OK, FALSE,
2307 Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH|
2308 Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
2309 FALSE,
2311 {"file:///C:/te%3Es.t/t#es%25t.mp3",S_OK,FALSE},
2312 {"",S_FALSE,FALSE},
2313 {"file:///C:/te%3Es.t/t#es%25t.mp3",S_OK,FALSE},
2314 {"",S_FALSE,FALSE},
2315 {".mp3",S_OK,FALSE},
2316 {"",S_FALSE,FALSE},
2317 {"",S_FALSE,FALSE},
2318 {"",S_FALSE,FALSE},
2319 {"/C:/te%3Es.t/t#es%25t.mp3",S_OK,FALSE},
2320 {"/C:/te%3Es.t/t#es%25t.mp3",S_OK,FALSE},
2321 {"",S_FALSE,FALSE},
2322 {"file:///C:/te%3Es%2Et/t%23es%t.mp3",S_OK,FALSE},
2323 {"file",S_OK,FALSE},
2324 {"",S_FALSE,FALSE},
2325 {"",S_FALSE,FALSE}
2328 {Uri_HOST_UNKNOWN,S_OK,FALSE},
2329 {0,S_FALSE,FALSE},
2330 {URL_SCHEME_FILE,S_OK,FALSE},
2331 {URLZONE_INVALID,E_NOTIMPL,FALSE}
2334 /* Only unreserved percent encoded characters are decoded for known schemes that aren't file. */
2335 { "http://[::001.002.003.000]/%3F%23%2E%54/test", 0, S_OK, FALSE,
2336 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
2337 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
2338 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
2339 FALSE,
2341 {"http://[::1.2.3.0]/%3F%23.T/test",S_OK,FALSE},
2342 {"[::1.2.3.0]",S_OK,FALSE},
2343 {"http://[::1.2.3.0]/%3F%23.T/test",S_OK,FALSE},
2344 {"",S_FALSE,FALSE},
2345 {"",S_FALSE,FALSE},
2346 {"",S_FALSE,FALSE},
2347 {"::1.2.3.0",S_OK,FALSE},
2348 {"",S_FALSE,FALSE},
2349 {"/%3F%23.T/test",S_OK,FALSE},
2350 {"/%3F%23.T/test",S_OK,FALSE},
2351 {"",S_FALSE,FALSE},
2352 {"http://[::001.002.003.000]/%3F%23%2E%54/test",S_OK,FALSE},
2353 {"http",S_OK,FALSE},
2354 {"",S_FALSE,FALSE},
2355 {"",S_FALSE,FALSE},
2358 {Uri_HOST_IPV6,S_OK,FALSE},
2359 {80,S_OK,FALSE},
2360 {URL_SCHEME_HTTP,S_OK,FALSE},
2361 {URLZONE_INVALID,E_NOTIMPL,FALSE}
2364 /* Forbidden characters are always encoded for file URIs. */
2365 { "file:///C:/\"test\"/test.mp3", Uri_CREATE_NO_ENCODE_FORBIDDEN_CHARACTERS, S_OK, FALSE,
2366 Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH|
2367 Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
2368 FALSE,
2370 {"file:///C:/%22test%22/test.mp3",S_OK,FALSE},
2371 {"",S_FALSE,FALSE},
2372 {"file:///C:/%22test%22/test.mp3",S_OK,FALSE},
2373 {"",S_FALSE,FALSE},
2374 {".mp3",S_OK,FALSE},
2375 {"",S_FALSE,FALSE},
2376 {"",S_FALSE,FALSE},
2377 {"",S_FALSE,FALSE},
2378 {"/C:/%22test%22/test.mp3",S_OK,FALSE},
2379 {"/C:/%22test%22/test.mp3",S_OK,FALSE},
2380 {"",S_FALSE,FALSE},
2381 {"file:///C:/\"test\"/test.mp3",S_OK,FALSE},
2382 {"file",S_OK,FALSE},
2383 {"",S_FALSE,FALSE},
2384 {"",S_FALSE,FALSE}
2387 {Uri_HOST_UNKNOWN,S_OK,FALSE},
2388 {0,S_FALSE,FALSE},
2389 {URL_SCHEME_FILE,S_OK,FALSE},
2390 {URLZONE_INVALID,E_NOTIMPL,FALSE}
2393 /* Forbidden characters are never encoded for unknown scheme types. */
2394 { "1234://4294967295/<|>\" test<|>", 0, S_OK, FALSE,
2395 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
2396 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
2397 Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
2398 FALSE,
2400 {"1234://4294967295/<|>\" test<|>",S_OK,FALSE},
2401 {"4294967295",S_OK,FALSE},
2402 {"1234://4294967295/<|>\" test<|>",S_OK,FALSE},
2403 {"",S_FALSE,FALSE},
2404 {"",S_FALSE,FALSE},
2405 {"",S_FALSE,FALSE},
2406 {"4294967295",S_OK,FALSE},
2407 {"",S_FALSE,FALSE},
2408 {"/<|>\" test<|>",S_OK,FALSE},
2409 {"/<|>\" test<|>",S_OK,FALSE},
2410 {"",S_FALSE,FALSE},
2411 {"1234://4294967295/<|>\" test<|>",S_OK,FALSE},
2412 {"1234",S_OK,FALSE},
2413 {"",S_FALSE,FALSE},
2414 {"",S_FALSE,FALSE}
2417 {Uri_HOST_IPV4,S_OK,FALSE},
2418 {0,S_FALSE,FALSE},
2419 {URL_SCHEME_UNKNOWN,S_OK,FALSE},
2420 {URLZONE_INVALID,E_NOTIMPL,FALSE}
2423 /* Make sure forbidden characters are percent encoded. */
2424 { "http://gov.uk/<|> test<|>", 0, S_OK, FALSE,
2425 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
2426 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
2427 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
2428 FALSE,
2430 {"http://gov.uk/%3C%7C%3E%20test%3C%7C%3E",S_OK,FALSE},
2431 {"gov.uk",S_OK,FALSE},
2432 {"http://gov.uk/%3C%7C%3E%20test%3C%7C%3E",S_OK,FALSE},
2433 {"",S_FALSE,FALSE},
2434 {"",S_FALSE,FALSE},
2435 {"",S_FALSE,FALSE},
2436 {"gov.uk",S_OK,FALSE},
2437 {"",S_FALSE,FALSE},
2438 {"/%3C%7C%3E%20test%3C%7C%3E",S_OK,FALSE},
2439 {"/%3C%7C%3E%20test%3C%7C%3E",S_OK,FALSE},
2440 {"",S_FALSE,FALSE},
2441 {"http://gov.uk/<|> test<|>",S_OK,FALSE},
2442 {"http",S_OK,FALSE},
2443 {"",S_FALSE,FALSE},
2444 {"",S_FALSE,FALSE}
2447 {Uri_HOST_DNS,S_OK,FALSE},
2448 {80,S_OK,FALSE},
2449 {URL_SCHEME_HTTP,S_OK,FALSE},
2450 {URLZONE_INVALID,E_NOTIMPL,FALSE}
2453 { "http://gov.uk/test/../test2/././../test3/.././././", 0, S_OK, FALSE,
2454 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
2455 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
2456 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
2457 FALSE,
2459 {"http://gov.uk/",S_OK,FALSE},
2460 {"gov.uk",S_OK,FALSE},
2461 {"http://gov.uk/",S_OK,FALSE},
2462 {"",S_FALSE,FALSE},
2463 {"",S_FALSE,FALSE},
2464 {"",S_FALSE,FALSE},
2465 {"gov.uk",S_OK,FALSE},
2466 {"",S_FALSE,FALSE},
2467 {"/",S_OK,FALSE},
2468 {"/",S_OK,FALSE},
2469 {"",S_FALSE,FALSE},
2470 {"http://gov.uk/test/../test2/././../test3/.././././",S_OK,FALSE},
2471 {"http",S_OK,FALSE},
2472 {"",S_FALSE,FALSE},
2473 {"",S_FALSE,FALSE}
2476 {Uri_HOST_DNS,S_OK,FALSE},
2477 {80,S_OK,FALSE},
2478 {URL_SCHEME_HTTP,S_OK,FALSE},
2479 {URLZONE_INVALID,E_NOTIMPL,FALSE}
2482 { "http://gov.uk/test/test2/../../..", 0, S_OK, FALSE,
2483 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
2484 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
2485 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
2486 FALSE,
2488 {"http://gov.uk/",S_OK,FALSE},
2489 {"gov.uk",S_OK,FALSE},
2490 {"http://gov.uk/",S_OK,FALSE},
2491 {"",S_FALSE,FALSE},
2492 {"",S_FALSE,FALSE},
2493 {"",S_FALSE,FALSE},
2494 {"gov.uk",S_OK,FALSE},
2495 {"",S_FALSE,FALSE},
2496 {"/",S_OK,FALSE},
2497 {"/",S_OK,FALSE},
2498 {"",S_FALSE,FALSE},
2499 {"http://gov.uk/test/test2/../../..",S_OK,FALSE},
2500 {"http",S_OK,FALSE},
2501 {"",S_FALSE,FALSE},
2502 {"",S_FALSE,FALSE}
2505 {Uri_HOST_DNS,S_OK,FALSE},
2506 {80,S_OK,FALSE},
2507 {URL_SCHEME_HTTP,S_OK,FALSE},
2508 {URLZONE_INVALID,E_NOTIMPL,FALSE}
2511 { "http://gov.uk/test/test2/../../.", 0, S_OK, FALSE,
2512 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
2513 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
2514 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
2515 FALSE,
2517 {"http://gov.uk/",S_OK,FALSE},
2518 {"gov.uk",S_OK,FALSE},
2519 {"http://gov.uk/",S_OK,FALSE},
2520 {"",S_FALSE,FALSE},
2521 {"",S_FALSE,FALSE},
2522 {"",S_FALSE,FALSE},
2523 {"gov.uk",S_OK,FALSE},
2524 {"",S_FALSE,FALSE},
2525 {"/",S_OK,FALSE},
2526 {"/",S_OK,FALSE},
2527 {"",S_FALSE,FALSE},
2528 {"http://gov.uk/test/test2/../../.",S_OK,FALSE},
2529 {"http",S_OK,FALSE},
2530 {"",S_FALSE,FALSE},
2531 {"",S_FALSE,FALSE}
2534 {Uri_HOST_DNS,S_OK,FALSE},
2535 {80,S_OK,FALSE},
2536 {URL_SCHEME_HTTP,S_OK,FALSE},
2537 {URLZONE_INVALID,E_NOTIMPL,FALSE}
2540 { "file://c:\\tests\\../tests\\./.\\..\\foo%20bar.mp3", 0, S_OK, FALSE,
2541 Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH|
2542 Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
2543 FALSE,
2545 {"file:///c:/foo%2520bar.mp3",S_OK,FALSE},
2546 {"",S_FALSE,FALSE},
2547 {"file:///c:/foo%2520bar.mp3",S_OK,FALSE},
2548 {"",S_FALSE,FALSE},
2549 {".mp3",S_OK,FALSE},
2550 {"",S_FALSE,FALSE},
2551 {"",S_FALSE,FALSE},
2552 {"",S_FALSE,FALSE},
2553 {"/c:/foo%2520bar.mp3",S_OK,FALSE},
2554 {"/c:/foo%2520bar.mp3",S_OK,FALSE},
2555 {"",S_FALSE,FALSE},
2556 {"file://c:\\tests\\../tests\\./.\\..\\foo%20bar.mp3",S_OK,FALSE},
2557 {"file",S_OK,FALSE},
2558 {"",S_FALSE,FALSE},
2559 {"",S_FALSE,FALSE}
2562 {Uri_HOST_UNKNOWN,S_OK,FALSE},
2563 {0,S_FALSE,FALSE},
2564 {URL_SCHEME_FILE,S_OK,FALSE},
2565 {URLZONE_INVALID,E_NOTIMPL,FALSE}
2568 /* Dot removal happens for unknown scheme types. */
2569 { "zip://gov.uk/test/test2/../../.", 0, S_OK, FALSE,
2570 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
2571 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
2572 Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
2573 FALSE,
2575 {"zip://gov.uk/",S_OK,FALSE},
2576 {"gov.uk",S_OK,FALSE},
2577 {"zip://gov.uk/",S_OK,FALSE},
2578 {"",S_FALSE,FALSE},
2579 {"",S_FALSE,FALSE},
2580 {"",S_FALSE,FALSE},
2581 {"gov.uk",S_OK,FALSE},
2582 {"",S_FALSE,FALSE},
2583 {"/",S_OK,FALSE},
2584 {"/",S_OK,FALSE},
2585 {"",S_FALSE,FALSE},
2586 {"zip://gov.uk/test/test2/../../.",S_OK,FALSE},
2587 {"zip",S_OK,FALSE},
2588 {"",S_FALSE,FALSE},
2589 {"",S_FALSE,FALSE}
2592 {Uri_HOST_DNS,S_OK,FALSE},
2593 {0,S_FALSE,FALSE},
2594 {URL_SCHEME_UNKNOWN,S_OK,FALSE},
2595 {URLZONE_INVALID,E_NOTIMPL,FALSE}
2598 /* Dot removal doesn't happen if NO_CANONICALIZE is set. */
2599 { "http://gov.uk/test/test2/../../.", Uri_CREATE_NO_CANONICALIZE, S_OK, FALSE,
2600 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|
2601 Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
2602 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
2603 FALSE,
2605 {"http://gov.uk/test/test2/../../.",S_OK,FALSE},
2606 {"gov.uk",S_OK,FALSE},
2607 {"http://gov.uk/test/test2/../../.",S_OK,FALSE},
2608 {"",S_FALSE,FALSE},
2609 {".",S_OK,FALSE},
2610 {"",S_FALSE,FALSE},
2611 {"gov.uk",S_OK,FALSE},
2612 {"",S_FALSE,FALSE},
2613 {"/test/test2/../../.",S_OK,FALSE},
2614 {"/test/test2/../../.",S_OK,FALSE},
2615 {"",S_FALSE,FALSE},
2616 {"http://gov.uk/test/test2/../../.",S_OK,FALSE},
2617 {"http",S_OK,FALSE},
2618 {"",S_FALSE,FALSE},
2619 {"",S_FALSE,FALSE}
2622 {Uri_HOST_DNS,S_OK,FALSE},
2623 {80,S_OK,FALSE},
2624 {URL_SCHEME_HTTP,S_OK,FALSE},
2625 {URLZONE_INVALID,E_NOTIMPL,FALSE}
2628 /* Dot removal doesn't happen for wildcard scheme types. */
2629 { "*:gov.uk/test/test2/../../.", 0, S_OK, FALSE,
2630 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|
2631 Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
2632 Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
2633 FALSE,
2635 {"*:gov.uk/test/test2/../../.",S_OK,FALSE},
2636 {"gov.uk",S_OK,FALSE},
2637 {"*:gov.uk/test/test2/../../.",S_OK,FALSE},
2638 {"",S_FALSE,FALSE},
2639 {".",S_OK,FALSE},
2640 {"",S_FALSE,FALSE},
2641 {"gov.uk",S_OK,FALSE},
2642 {"",S_FALSE,FALSE},
2643 {"/test/test2/../../.",S_OK,FALSE},
2644 {"/test/test2/../../.",S_OK,FALSE},
2645 {"",S_FALSE,FALSE},
2646 {"*:gov.uk/test/test2/../../.",S_OK,FALSE},
2647 {"*",S_OK,FALSE},
2648 {"",S_FALSE,FALSE},
2649 {"",S_FALSE,FALSE}
2652 {Uri_HOST_DNS,S_OK,FALSE},
2653 {0,S_FALSE,FALSE},
2654 {URL_SCHEME_WILDCARD,S_OK,FALSE},
2655 {URLZONE_INVALID,E_NOTIMPL,FALSE}
2658 /* Forbidden characters are encoded for opaque known scheme types. */
2659 { "mailto:\"acco<|>unt@example.com\"", 0, S_OK, FALSE,
2660 Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|
2661 Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
2662 FALSE,
2664 {"mailto:%22acco%3C%7C%3Eunt@example.com%22",S_OK,FALSE},
2665 {"",S_FALSE,FALSE},
2666 {"mailto:%22acco%3C%7C%3Eunt@example.com%22",S_OK,FALSE},
2667 {"",S_FALSE,FALSE},
2668 {".com%22",S_OK,FALSE},
2669 {"",S_FALSE,FALSE},
2670 {"",S_FALSE,FALSE},
2671 {"",S_FALSE,FALSE},
2672 {"%22acco%3C%7C%3Eunt@example.com%22",S_OK,FALSE},
2673 {"%22acco%3C%7C%3Eunt@example.com%22",S_OK,FALSE},
2674 {"",S_FALSE,FALSE},
2675 {"mailto:\"acco<|>unt@example.com\"",S_OK,FALSE},
2676 {"mailto",S_OK,FALSE},
2677 {"",S_FALSE,FALSE},
2678 {"",S_FALSE,FALSE}
2681 {Uri_HOST_UNKNOWN,S_OK,FALSE},
2682 {0,S_FALSE,FALSE},
2683 {URL_SCHEME_MAILTO,S_OK,FALSE},
2684 {URLZONE_INVALID,E_NOTIMPL,FALSE}
2687 { "news:test.tes<|>t.com", 0, S_OK, FALSE,
2688 Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|
2689 Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
2690 FALSE,
2692 {"news:test.tes%3C%7C%3Et.com",S_OK,FALSE},
2693 {"",S_FALSE,FALSE},
2694 {"news:test.tes%3C%7C%3Et.com",S_OK,FALSE},
2695 {"",S_FALSE,FALSE},
2696 {".com",S_OK,FALSE},
2697 {"",S_FALSE,FALSE},
2698 {"",S_FALSE,FALSE},
2699 {"",S_FALSE,FALSE},
2700 {"test.tes%3C%7C%3Et.com",S_OK,FALSE},
2701 {"test.tes%3C%7C%3Et.com",S_OK,FALSE},
2702 {"",S_FALSE,FALSE},
2703 {"news:test.tes<|>t.com",S_OK,FALSE},
2704 {"news",S_OK,FALSE},
2705 {"",S_FALSE,FALSE},
2706 {"",S_FALSE,FALSE}
2709 {Uri_HOST_UNKNOWN,S_OK,FALSE},
2710 {0,S_FALSE,FALSE},
2711 {URL_SCHEME_NEWS,S_OK,FALSE},
2712 {URLZONE_INVALID,E_NOTIMPL,FALSE}
2715 /* Don't encode forbidden characters. */
2716 { "news:test.tes<|>t.com", Uri_CREATE_NO_ENCODE_FORBIDDEN_CHARACTERS, S_OK, FALSE,
2717 Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|
2718 Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
2719 FALSE,
2721 {"news:test.tes<|>t.com",S_OK,FALSE},
2722 {"",S_FALSE,FALSE},
2723 {"news:test.tes<|>t.com",S_OK,FALSE},
2724 {"",S_FALSE,FALSE},
2725 {".com",S_OK,FALSE},
2726 {"",S_FALSE,FALSE},
2727 {"",S_FALSE,FALSE},
2728 {"",S_FALSE,FALSE},
2729 {"test.tes<|>t.com",S_OK,FALSE},
2730 {"test.tes<|>t.com",S_OK,FALSE},
2731 {"",S_FALSE,FALSE},
2732 {"news:test.tes<|>t.com",S_OK,FALSE},
2733 {"news",S_OK,FALSE},
2734 {"",S_FALSE,FALSE},
2735 {"",S_FALSE,FALSE}
2738 {Uri_HOST_UNKNOWN,S_OK,FALSE},
2739 {0,S_FALSE,FALSE},
2740 {URL_SCHEME_NEWS,S_OK,FALSE},
2741 {URLZONE_INVALID,E_NOTIMPL,FALSE}
2744 /* Forbidden characters aren't encoded for unknown, opaque URIs. */
2745 { "urn:test.tes<|>t.com", 0, S_OK, FALSE,
2746 Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|
2747 Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
2748 FALSE,
2750 {"urn:test.tes<|>t.com",S_OK,FALSE},
2751 {"",S_FALSE,FALSE},
2752 {"urn:test.tes<|>t.com",S_OK,FALSE},
2753 {"",S_FALSE,FALSE},
2754 {".com",S_OK,FALSE},
2755 {"",S_FALSE,FALSE},
2756 {"",S_FALSE,FALSE},
2757 {"",S_FALSE,FALSE},
2758 {"test.tes<|>t.com",S_OK,FALSE},
2759 {"test.tes<|>t.com",S_OK,FALSE},
2760 {"",S_FALSE,FALSE},
2761 {"urn:test.tes<|>t.com",S_OK,FALSE},
2762 {"urn",S_OK,FALSE},
2763 {"",S_FALSE,FALSE},
2764 {"",S_FALSE,FALSE}
2767 {Uri_HOST_UNKNOWN,S_OK,FALSE},
2768 {0,S_FALSE,FALSE},
2769 {URL_SCHEME_UNKNOWN,S_OK,FALSE},
2770 {URLZONE_INVALID,E_NOTIMPL,FALSE}
2773 /* Percent encoded unreserved characters are decoded for known opaque URIs. */
2774 { "news:test.%74%65%73%74.com", 0, S_OK, FALSE,
2775 Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|
2776 Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
2777 FALSE,
2779 {"news:test.test.com",S_OK,FALSE},
2780 {"",S_FALSE,FALSE},
2781 {"news:test.test.com",S_OK,FALSE},
2782 {"",S_FALSE,FALSE},
2783 {".com",S_OK,FALSE},
2784 {"",S_FALSE,FALSE},
2785 {"",S_FALSE,FALSE},
2786 {"",S_FALSE,FALSE},
2787 {"test.test.com",S_OK,FALSE},
2788 {"test.test.com",S_OK,FALSE},
2789 {"",S_FALSE,FALSE},
2790 {"news:test.%74%65%73%74.com",S_OK,FALSE},
2791 {"news",S_OK,FALSE},
2792 {"",S_FALSE,FALSE},
2793 {"",S_FALSE,FALSE}
2796 {Uri_HOST_UNKNOWN,S_OK,FALSE},
2797 {0,S_FALSE,FALSE},
2798 {URL_SCHEME_NEWS,S_OK,FALSE},
2799 {URLZONE_INVALID,E_NOTIMPL,FALSE}
2802 /* Percent encoded characters are still decoded for known scheme types. */
2803 { "news:test.%74%65%73%74.com", Uri_CREATE_NO_CANONICALIZE, S_OK, FALSE,
2804 Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|
2805 Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
2806 FALSE,
2808 {"news:test.test.com",S_OK,FALSE},
2809 {"",S_FALSE,FALSE},
2810 {"news:test.test.com",S_OK,FALSE},
2811 {"",S_FALSE,FALSE},
2812 {".com",S_OK,FALSE},
2813 {"",S_FALSE,FALSE},
2814 {"",S_FALSE,FALSE},
2815 {"",S_FALSE,FALSE},
2816 {"test.test.com",S_OK,FALSE},
2817 {"test.test.com",S_OK,FALSE},
2818 {"",S_FALSE,FALSE},
2819 {"news:test.%74%65%73%74.com",S_OK,FALSE},
2820 {"news",S_OK,FALSE},
2821 {"",S_FALSE,FALSE},
2822 {"",S_FALSE,FALSE}
2825 {Uri_HOST_UNKNOWN,S_OK,FALSE},
2826 {0,S_FALSE,FALSE},
2827 {URL_SCHEME_NEWS,S_OK,FALSE},
2828 {URLZONE_INVALID,E_NOTIMPL,FALSE}
2831 /* Percent encoded characters aren't decoded for unknown scheme types. */
2832 { "urn:test.%74%65%73%74.com", 0, S_OK, FALSE,
2833 Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|
2834 Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
2835 FALSE,
2837 {"urn:test.%74%65%73%74.com",S_OK,FALSE},
2838 {"",S_FALSE,FALSE},
2839 {"urn:test.%74%65%73%74.com",S_OK,FALSE},
2840 {"",S_FALSE,FALSE},
2841 {".com",S_OK,FALSE},
2842 {"",S_FALSE,FALSE},
2843 {"",S_FALSE,FALSE},
2844 {"",S_FALSE,FALSE},
2845 {"test.%74%65%73%74.com",S_OK,FALSE},
2846 {"test.%74%65%73%74.com",S_OK,FALSE},
2847 {"",S_FALSE,FALSE},
2848 {"urn:test.%74%65%73%74.com",S_OK,FALSE},
2849 {"urn",S_OK,FALSE},
2850 {"",S_FALSE,FALSE},
2851 {"",S_FALSE,FALSE}
2854 {Uri_HOST_UNKNOWN,S_OK,FALSE},
2855 {0,S_FALSE,FALSE},
2856 {URL_SCHEME_UNKNOWN,S_OK,FALSE},
2857 {URLZONE_INVALID,E_NOTIMPL,FALSE}
2860 /* Unknown scheme types can have invalid % encoded data in query string. */
2861 { "zip://www.winehq.org/tests/..?query=%xx&return=y", 0, S_OK, FALSE,
2862 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_HOST|
2863 Uri_HAS_DOMAIN|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_QUERY|Uri_HAS_RAW_URI|
2864 Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
2865 FALSE,
2867 {"zip://www.winehq.org/?query=%xx&return=y",S_OK,FALSE},
2868 {"www.winehq.org",S_OK,FALSE},
2869 {"zip://www.winehq.org/?query=%xx&return=y",S_OK,FALSE},
2870 {"winehq.org",S_OK,FALSE},
2871 {"",S_FALSE,FALSE},
2872 {"",S_FALSE,FALSE},
2873 {"www.winehq.org",S_OK,FALSE},
2874 {"",S_FALSE,FALSE},
2875 {"/",S_OK,FALSE},
2876 {"/?query=%xx&return=y",S_OK,FALSE},
2877 {"?query=%xx&return=y",S_OK,FALSE},
2878 {"zip://www.winehq.org/tests/..?query=%xx&return=y",S_OK,FALSE},
2879 {"zip",S_OK,FALSE},
2880 {"",S_FALSE,FALSE},
2881 {"",S_FALSE,FALSE}
2884 {Uri_HOST_DNS,S_OK,FALSE},
2885 {0,S_FALSE,FALSE},
2886 {URL_SCHEME_UNKNOWN,S_OK,FALSE},
2887 {URLZONE_INVALID,E_NOTIMPL,FALSE},
2890 /* Known scheme types can have invalid % encoded data with the right flags. */
2891 { "http://www.winehq.org/tests/..?query=%xx&return=y", Uri_CREATE_NO_DECODE_EXTRA_INFO, S_OK, FALSE,
2892 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_HOST|
2893 Uri_HAS_DOMAIN|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_PORT|Uri_HAS_QUERY|Uri_HAS_RAW_URI|
2894 Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
2895 FALSE,
2897 {"http://www.winehq.org/?query=%xx&return=y",S_OK,FALSE},
2898 {"www.winehq.org",S_OK,FALSE},
2899 {"http://www.winehq.org/?query=%xx&return=y",S_OK,FALSE},
2900 {"winehq.org",S_OK,FALSE},
2901 {"",S_FALSE,FALSE},
2902 {"",S_FALSE,FALSE},
2903 {"www.winehq.org",S_OK,FALSE},
2904 {"",S_FALSE,FALSE},
2905 {"/",S_OK,FALSE},
2906 {"/?query=%xx&return=y",S_OK,FALSE},
2907 {"?query=%xx&return=y",S_OK,FALSE},
2908 {"http://www.winehq.org/tests/..?query=%xx&return=y",S_OK,FALSE},
2909 {"http",S_OK,FALSE},
2910 {"",S_FALSE,FALSE},
2911 {"",S_FALSE,FALSE}
2914 {Uri_HOST_DNS,S_OK,FALSE},
2915 {80,S_OK,FALSE},
2916 {URL_SCHEME_HTTP,S_OK,FALSE},
2917 {URLZONE_INVALID,E_NOTIMPL,FALSE},
2920 /* Forbidden characters in query aren't percent encoded for known scheme types with this flag. */
2921 { "http://www.winehq.org/tests/..?query=<|>&return=y", Uri_CREATE_NO_DECODE_EXTRA_INFO, S_OK, FALSE,
2922 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_HOST|
2923 Uri_HAS_DOMAIN|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_PORT|Uri_HAS_QUERY|Uri_HAS_RAW_URI|
2924 Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
2925 FALSE,
2927 {"http://www.winehq.org/?query=<|>&return=y",S_OK,FALSE},
2928 {"www.winehq.org",S_OK,FALSE},
2929 {"http://www.winehq.org/?query=<|>&return=y",S_OK,FALSE},
2930 {"winehq.org",S_OK,FALSE},
2931 {"",S_FALSE,FALSE},
2932 {"",S_FALSE,FALSE},
2933 {"www.winehq.org",S_OK,FALSE},
2934 {"",S_FALSE,FALSE},
2935 {"/",S_OK,FALSE},
2936 {"/?query=<|>&return=y",S_OK,FALSE},
2937 {"?query=<|>&return=y",S_OK,FALSE},
2938 {"http://www.winehq.org/tests/..?query=<|>&return=y",S_OK,FALSE},
2939 {"http",S_OK,FALSE},
2940 {"",S_FALSE,FALSE},
2941 {"",S_FALSE,FALSE}
2944 {Uri_HOST_DNS,S_OK,FALSE},
2945 {80,S_OK,FALSE},
2946 {URL_SCHEME_HTTP,S_OK,FALSE},
2947 {URLZONE_INVALID,E_NOTIMPL,FALSE},
2950 /* Forbidden characters in query aren't percent encoded for known scheme types with this flag. */
2951 { "http://www.winehq.org/tests/..?query=<|>&return=y", Uri_CREATE_NO_ENCODE_FORBIDDEN_CHARACTERS, S_OK, FALSE,
2952 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_HOST|
2953 Uri_HAS_DOMAIN|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_PORT|Uri_HAS_QUERY|Uri_HAS_RAW_URI|
2954 Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
2955 FALSE,
2957 {"http://www.winehq.org/?query=<|>&return=y",S_OK,FALSE},
2958 {"www.winehq.org",S_OK,FALSE},
2959 {"http://www.winehq.org/?query=<|>&return=y",S_OK,FALSE},
2960 {"winehq.org",S_OK,FALSE},
2961 {"",S_FALSE,FALSE},
2962 {"",S_FALSE,FALSE},
2963 {"www.winehq.org",S_OK,FALSE},
2964 {"",S_FALSE,FALSE},
2965 {"/",S_OK,FALSE},
2966 {"/?query=<|>&return=y",S_OK,FALSE},
2967 {"?query=<|>&return=y",S_OK,FALSE},
2968 {"http://www.winehq.org/tests/..?query=<|>&return=y",S_OK,FALSE},
2969 {"http",S_OK,FALSE},
2970 {"",S_FALSE,FALSE},
2971 {"",S_FALSE,FALSE}
2974 {Uri_HOST_DNS,S_OK,FALSE},
2975 {80,S_OK,FALSE},
2976 {URL_SCHEME_HTTP,S_OK,FALSE},
2977 {URLZONE_INVALID,E_NOTIMPL,FALSE},
2980 /* Forbidden characters are encoded for known scheme types. */
2981 { "http://www.winehq.org/tests/..?query=<|>&return=y", 0, S_OK, FALSE,
2982 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_HOST|
2983 Uri_HAS_DOMAIN|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_PORT|Uri_HAS_QUERY|Uri_HAS_RAW_URI|
2984 Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
2985 FALSE,
2987 {"http://www.winehq.org/?query=%3C%7C%3E&return=y",S_OK,FALSE},
2988 {"www.winehq.org",S_OK,FALSE},
2989 {"http://www.winehq.org/?query=%3C%7C%3E&return=y",S_OK,FALSE},
2990 {"winehq.org",S_OK,FALSE},
2991 {"",S_FALSE,FALSE},
2992 {"",S_FALSE,FALSE},
2993 {"www.winehq.org",S_OK,FALSE},
2994 {"",S_FALSE,FALSE},
2995 {"/",S_OK,FALSE},
2996 {"/?query=%3C%7C%3E&return=y",S_OK,FALSE},
2997 {"?query=%3C%7C%3E&return=y",S_OK,FALSE},
2998 {"http://www.winehq.org/tests/..?query=<|>&return=y",S_OK,FALSE},
2999 {"http",S_OK,FALSE},
3000 {"",S_FALSE,FALSE},
3001 {"",S_FALSE,FALSE}
3004 {Uri_HOST_DNS,S_OK,FALSE},
3005 {80,S_OK,FALSE},
3006 {URL_SCHEME_HTTP,S_OK,FALSE},
3007 {URLZONE_INVALID,E_NOTIMPL,FALSE},
3010 /* Forbidden characters are not encoded for unknown scheme types. */
3011 { "zip://www.winehq.org/tests/..?query=<|>&return=y", 0, S_OK, FALSE,
3012 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_HOST|
3013 Uri_HAS_DOMAIN|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_QUERY|Uri_HAS_RAW_URI|
3014 Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
3015 FALSE,
3017 {"zip://www.winehq.org/?query=<|>&return=y",S_OK,FALSE},
3018 {"www.winehq.org",S_OK,FALSE},
3019 {"zip://www.winehq.org/?query=<|>&return=y",S_OK,FALSE},
3020 {"winehq.org",S_OK,FALSE},
3021 {"",S_FALSE,FALSE},
3022 {"",S_FALSE,FALSE},
3023 {"www.winehq.org",S_OK,FALSE},
3024 {"",S_FALSE,FALSE},
3025 {"/",S_OK,FALSE},
3026 {"/?query=<|>&return=y",S_OK,FALSE},
3027 {"?query=<|>&return=y",S_OK,FALSE},
3028 {"zip://www.winehq.org/tests/..?query=<|>&return=y",S_OK,FALSE},
3029 {"zip",S_OK,FALSE},
3030 {"",S_FALSE,FALSE},
3031 {"",S_FALSE,FALSE}
3034 {Uri_HOST_DNS,S_OK,FALSE},
3035 {0,S_FALSE,FALSE},
3036 {URL_SCHEME_UNKNOWN,S_OK,FALSE},
3037 {URLZONE_INVALID,E_NOTIMPL,FALSE},
3040 /* Percent encoded, unreserved characters are decoded for known scheme types. */
3041 { "http://www.winehq.org/tests/..?query=%30%31&return=y", 0, S_OK, FALSE,
3042 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_HOST|
3043 Uri_HAS_DOMAIN|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_PORT|Uri_HAS_QUERY|Uri_HAS_RAW_URI|
3044 Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
3045 FALSE,
3047 {"http://www.winehq.org/?query=01&return=y",S_OK,FALSE},
3048 {"www.winehq.org",S_OK,FALSE},
3049 {"http://www.winehq.org/?query=01&return=y",S_OK,FALSE},
3050 {"winehq.org",S_OK,FALSE},
3051 {"",S_FALSE,FALSE},
3052 {"",S_FALSE,FALSE},
3053 {"www.winehq.org",S_OK,FALSE},
3054 {"",S_FALSE,FALSE},
3055 {"/",S_OK,FALSE},
3056 {"/?query=01&return=y",S_OK,FALSE},
3057 {"?query=01&return=y",S_OK,FALSE},
3058 {"http://www.winehq.org/tests/..?query=%30%31&return=y",S_OK,FALSE},
3059 {"http",S_OK,FALSE},
3060 {"",S_FALSE,FALSE},
3061 {"",S_FALSE,FALSE}
3064 {Uri_HOST_DNS,S_OK,FALSE},
3065 {80,S_OK,FALSE},
3066 {URL_SCHEME_HTTP,S_OK,FALSE},
3067 {URLZONE_INVALID,E_NOTIMPL,FALSE},
3070 /* Percent encoded, unreserved characters aren't decoded for unknown scheme types. */
3071 { "zip://www.winehq.org/tests/..?query=%30%31&return=y", 0, S_OK, FALSE,
3072 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_HOST|
3073 Uri_HAS_DOMAIN|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_QUERY|Uri_HAS_RAW_URI|
3074 Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
3075 FALSE,
3077 {"zip://www.winehq.org/?query=%30%31&return=y",S_OK,FALSE},
3078 {"www.winehq.org",S_OK,FALSE},
3079 {"zip://www.winehq.org/?query=%30%31&return=y",S_OK,FALSE},
3080 {"winehq.org",S_OK,FALSE},
3081 {"",S_FALSE,FALSE},
3082 {"",S_FALSE,FALSE},
3083 {"www.winehq.org",S_OK,FALSE},
3084 {"",S_FALSE,FALSE},
3085 {"/",S_OK,FALSE},
3086 {"/?query=%30%31&return=y",S_OK,FALSE},
3087 {"?query=%30%31&return=y",S_OK,FALSE},
3088 {"zip://www.winehq.org/tests/..?query=%30%31&return=y",S_OK,FALSE},
3089 {"zip",S_OK,FALSE},
3090 {"",S_FALSE,FALSE},
3091 {"",S_FALSE,FALSE}
3094 {Uri_HOST_DNS,S_OK,FALSE},
3095 {0,S_FALSE,FALSE},
3096 {URL_SCHEME_UNKNOWN,S_OK,FALSE},
3097 {URLZONE_INVALID,E_NOTIMPL,FALSE},
3100 /* Percent encoded characters aren't decoded when NO_DECODE_EXTRA_INFO is set. */
3101 { "http://www.winehq.org/tests/..?query=%30%31&return=y", Uri_CREATE_NO_DECODE_EXTRA_INFO, S_OK, FALSE,
3102 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_HOST|
3103 Uri_HAS_DOMAIN|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_PORT|Uri_HAS_QUERY|Uri_HAS_RAW_URI|
3104 Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
3105 FALSE,
3107 {"http://www.winehq.org/?query=%30%31&return=y",S_OK,FALSE},
3108 {"www.winehq.org",S_OK,FALSE},
3109 {"http://www.winehq.org/?query=%30%31&return=y",S_OK,FALSE},
3110 {"winehq.org",S_OK,FALSE},
3111 {"",S_FALSE,FALSE},
3112 {"",S_FALSE,FALSE},
3113 {"www.winehq.org",S_OK,FALSE},
3114 {"",S_FALSE,FALSE},
3115 {"/",S_OK,FALSE},
3116 {"/?query=%30%31&return=y",S_OK,FALSE},
3117 {"?query=%30%31&return=y",S_OK,FALSE},
3118 {"http://www.winehq.org/tests/..?query=%30%31&return=y",S_OK,FALSE},
3119 {"http",S_OK,FALSE},
3120 {"",S_FALSE,FALSE},
3121 {"",S_FALSE,FALSE}
3124 {Uri_HOST_DNS,S_OK,FALSE},
3125 {80,S_OK,FALSE},
3126 {URL_SCHEME_HTTP,S_OK,FALSE},
3127 {URLZONE_INVALID,E_NOTIMPL,FALSE},
3130 { "http://www.winehq.org?query=12&return=y", Uri_CREATE_NO_CANONICALIZE, S_OK, FALSE,
3131 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_HOST|
3132 Uri_HAS_DOMAIN|Uri_HAS_PATH_AND_QUERY|Uri_HAS_PORT|Uri_HAS_QUERY|Uri_HAS_RAW_URI|
3133 Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
3134 FALSE,
3136 {"http://www.winehq.org?query=12&return=y",S_OK,FALSE},
3137 {"www.winehq.org",S_OK,FALSE},
3138 {"http://www.winehq.org?query=12&return=y",S_OK,FALSE},
3139 {"winehq.org",S_OK,FALSE},
3140 {"",S_FALSE,FALSE},
3141 {"",S_FALSE,FALSE},
3142 {"www.winehq.org",S_OK,FALSE},
3143 {"",S_FALSE,FALSE},
3144 {"",S_FALSE,FALSE},
3145 {"?query=12&return=y",S_OK,FALSE},
3146 {"?query=12&return=y",S_OK,FALSE},
3147 {"http://www.winehq.org?query=12&return=y",S_OK,FALSE},
3148 {"http",S_OK,FALSE},
3149 {"",S_FALSE,FALSE},
3150 {"",S_FALSE,FALSE}
3153 {Uri_HOST_DNS,S_OK,FALSE},
3154 {80,S_OK,FALSE},
3155 {URL_SCHEME_HTTP,S_OK,FALSE},
3156 {URLZONE_INVALID,E_NOTIMPL,FALSE},
3159 /* Unknown scheme types can have invalid % encoded data in fragments. */
3160 { "zip://www.winehq.org/tests/#Te%xx", 0, S_OK, FALSE,
3161 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_FRAGMENT|
3162 Uri_HAS_HOST|Uri_HAS_DOMAIN|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
3163 Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
3164 FALSE,
3166 {"zip://www.winehq.org/tests/#Te%xx",S_OK,FALSE},
3167 {"www.winehq.org",S_OK,FALSE},
3168 {"zip://www.winehq.org/tests/#Te%xx",S_OK,FALSE},
3169 {"winehq.org",S_OK,FALSE},
3170 {"",S_FALSE,FALSE},
3171 {"#Te%xx",S_OK,FALSE},
3172 {"www.winehq.org",S_OK,FALSE},
3173 {"",S_FALSE,FALSE},
3174 {"/tests/",S_OK,FALSE},
3175 {"/tests/",S_OK,FALSE},
3176 {"",S_FALSE,FALSE},
3177 {"zip://www.winehq.org/tests/#Te%xx",S_OK,FALSE},
3178 {"zip",S_OK,FALSE},
3179 {"",S_FALSE,FALSE},
3180 {"",S_FALSE,FALSE}
3183 {Uri_HOST_DNS,S_OK,FALSE},
3184 {0,S_FALSE,FALSE},
3185 {URL_SCHEME_UNKNOWN,S_OK,FALSE},
3186 {URLZONE_INVALID,E_NOTIMPL,FALSE},
3189 /* Forbidden characters in fragment aren't encoded for unknown schemes. */
3190 { "zip://www.winehq.org/tests/#Te<|>", 0, S_OK, FALSE,
3191 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_FRAGMENT|
3192 Uri_HAS_HOST|Uri_HAS_DOMAIN|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
3193 Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
3194 FALSE,
3196 {"zip://www.winehq.org/tests/#Te<|>",S_OK,FALSE},
3197 {"www.winehq.org",S_OK,FALSE},
3198 {"zip://www.winehq.org/tests/#Te<|>",S_OK,FALSE},
3199 {"winehq.org",S_OK,FALSE},
3200 {"",S_FALSE,FALSE},
3201 {"#Te<|>",S_OK,FALSE},
3202 {"www.winehq.org",S_OK,FALSE},
3203 {"",S_FALSE,FALSE},
3204 {"/tests/",S_OK,FALSE},
3205 {"/tests/",S_OK,FALSE},
3206 {"",S_FALSE,FALSE},
3207 {"zip://www.winehq.org/tests/#Te<|>",S_OK,FALSE},
3208 {"zip",S_OK,FALSE},
3209 {"",S_FALSE,FALSE},
3210 {"",S_FALSE,FALSE}
3213 {Uri_HOST_DNS,S_OK,FALSE},
3214 {0,S_FALSE,FALSE},
3215 {URL_SCHEME_UNKNOWN,S_OK,FALSE},
3216 {URLZONE_INVALID,E_NOTIMPL,FALSE},
3219 /* Forbidden characters in the fragment are percent encoded for known schemes. */
3220 { "http://www.winehq.org/tests/#Te<|>", 0, S_OK, FALSE,
3221 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_FRAGMENT|
3222 Uri_HAS_HOST|Uri_HAS_DOMAIN|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
3223 Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
3224 FALSE,
3226 {"http://www.winehq.org/tests/#Te%3C%7C%3E",S_OK,FALSE},
3227 {"www.winehq.org",S_OK,FALSE},
3228 {"http://www.winehq.org/tests/#Te%3C%7C%3E",S_OK,FALSE},
3229 {"winehq.org",S_OK,FALSE},
3230 {"",S_FALSE,FALSE},
3231 {"#Te%3C%7C%3E",S_OK,FALSE},
3232 {"www.winehq.org",S_OK,FALSE},
3233 {"",S_FALSE,FALSE},
3234 {"/tests/",S_OK,FALSE},
3235 {"/tests/",S_OK,FALSE},
3236 {"",S_FALSE,FALSE},
3237 {"http://www.winehq.org/tests/#Te<|>",S_OK,FALSE},
3238 {"http",S_OK,FALSE},
3239 {"",S_FALSE,FALSE},
3240 {"",S_FALSE,FALSE}
3243 {Uri_HOST_DNS,S_OK,FALSE},
3244 {80,S_OK,FALSE},
3245 {URL_SCHEME_HTTP,S_OK,FALSE},
3246 {URLZONE_INVALID,E_NOTIMPL,FALSE},
3249 /* Forbidden characters aren't encoded in the fragment with this flag. */
3250 { "http://www.winehq.org/tests/#Te<|>", Uri_CREATE_NO_DECODE_EXTRA_INFO, S_OK, FALSE,
3251 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_FRAGMENT|
3252 Uri_HAS_HOST|Uri_HAS_DOMAIN|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
3253 Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
3254 FALSE,
3256 {"http://www.winehq.org/tests/#Te<|>",S_OK,FALSE},
3257 {"www.winehq.org",S_OK,FALSE},
3258 {"http://www.winehq.org/tests/#Te<|>",S_OK,FALSE},
3259 {"winehq.org",S_OK,FALSE},
3260 {"",S_FALSE,FALSE},
3261 {"#Te<|>",S_OK,FALSE},
3262 {"www.winehq.org",S_OK,FALSE},
3263 {"",S_FALSE,FALSE},
3264 {"/tests/",S_OK,FALSE},
3265 {"/tests/",S_OK,FALSE},
3266 {"",S_FALSE,FALSE},
3267 {"http://www.winehq.org/tests/#Te<|>",S_OK,FALSE},
3268 {"http",S_OK,FALSE},
3269 {"",S_FALSE,FALSE},
3270 {"",S_FALSE,FALSE}
3273 {Uri_HOST_DNS,S_OK,FALSE},
3274 {80,S_OK,FALSE},
3275 {URL_SCHEME_HTTP,S_OK,FALSE},
3276 {URLZONE_INVALID,E_NOTIMPL,FALSE},
3279 /* Forbidden characters aren't encoded in the fragment with this flag. */
3280 { "http://www.winehq.org/tests/#Te<|>", Uri_CREATE_NO_ENCODE_FORBIDDEN_CHARACTERS, S_OK, FALSE,
3281 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_FRAGMENT|
3282 Uri_HAS_HOST|Uri_HAS_DOMAIN|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
3283 Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
3284 FALSE,
3286 {"http://www.winehq.org/tests/#Te<|>",S_OK,FALSE},
3287 {"www.winehq.org",S_OK,FALSE},
3288 {"http://www.winehq.org/tests/#Te<|>",S_OK,FALSE},
3289 {"winehq.org",S_OK,FALSE},
3290 {"",S_FALSE,FALSE},
3291 {"#Te<|>",S_OK,FALSE},
3292 {"www.winehq.org",S_OK,FALSE},
3293 {"",S_FALSE,FALSE},
3294 {"/tests/",S_OK,FALSE},
3295 {"/tests/",S_OK,FALSE},
3296 {"",S_FALSE,FALSE},
3297 {"http://www.winehq.org/tests/#Te<|>",S_OK,FALSE},
3298 {"http",S_OK,FALSE},
3299 {"",S_FALSE,FALSE},
3300 {"",S_FALSE,FALSE}
3303 {Uri_HOST_DNS,S_OK,FALSE},
3304 {80,S_OK,FALSE},
3305 {URL_SCHEME_HTTP,S_OK,FALSE},
3306 {URLZONE_INVALID,E_NOTIMPL,FALSE},
3309 /* Percent encoded, unreserved characters aren't decoded for known scheme types. */
3310 { "zip://www.winehq.org/tests/#Te%30%31%32", 0, S_OK, FALSE,
3311 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_FRAGMENT|
3312 Uri_HAS_HOST|Uri_HAS_DOMAIN|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
3313 Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
3314 FALSE,
3316 {"zip://www.winehq.org/tests/#Te%30%31%32",S_OK,FALSE},
3317 {"www.winehq.org",S_OK,FALSE},
3318 {"zip://www.winehq.org/tests/#Te%30%31%32",S_OK,FALSE},
3319 {"winehq.org",S_OK,FALSE},
3320 {"",S_FALSE,FALSE},
3321 {"#Te%30%31%32",S_OK,FALSE},
3322 {"www.winehq.org",S_OK,FALSE},
3323 {"",S_FALSE,FALSE},
3324 {"/tests/",S_OK,FALSE},
3325 {"/tests/",S_OK,FALSE},
3326 {"",S_FALSE,FALSE},
3327 {"zip://www.winehq.org/tests/#Te%30%31%32",S_OK,FALSE},
3328 {"zip",S_OK,FALSE},
3329 {"",S_FALSE,FALSE},
3330 {"",S_FALSE,FALSE}
3333 {Uri_HOST_DNS,S_OK,FALSE},
3334 {0,S_FALSE,FALSE},
3335 {URL_SCHEME_UNKNOWN,S_OK,FALSE},
3336 {URLZONE_INVALID,E_NOTIMPL,FALSE},
3339 /* Percent encoded, unreserved characters are decoded for known schemes. */
3340 { "http://www.winehq.org/tests/#Te%30%31%32", 0, S_OK, FALSE,
3341 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_FRAGMENT|
3342 Uri_HAS_HOST|Uri_HAS_DOMAIN|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
3343 Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
3344 FALSE,
3346 {"http://www.winehq.org/tests/#Te012",S_OK,FALSE},
3347 {"www.winehq.org",S_OK,FALSE},
3348 {"http://www.winehq.org/tests/#Te012",S_OK,FALSE},
3349 {"winehq.org",S_OK,FALSE},
3350 {"",S_FALSE,FALSE},
3351 {"#Te012",S_OK,FALSE},
3352 {"www.winehq.org",S_OK,FALSE},
3353 {"",S_FALSE,FALSE},
3354 {"/tests/",S_OK,FALSE},
3355 {"/tests/",S_OK,FALSE},
3356 {"",S_FALSE,FALSE},
3357 {"http://www.winehq.org/tests/#Te%30%31%32",S_OK,FALSE},
3358 {"http",S_OK,FALSE},
3359 {"",S_FALSE,FALSE},
3360 {"",S_FALSE,FALSE}
3363 {Uri_HOST_DNS,S_OK,FALSE},
3364 {80,S_OK,FALSE},
3365 {URL_SCHEME_HTTP,S_OK,FALSE},
3366 {URLZONE_INVALID,E_NOTIMPL,FALSE},
3369 /* Percent encoded, unreserved characters are decoded even if NO_CANONICALIZE is set. */
3370 { "http://www.winehq.org/tests/#Te%30%31%32", Uri_CREATE_NO_CANONICALIZE, S_OK, FALSE,
3371 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_FRAGMENT|
3372 Uri_HAS_HOST|Uri_HAS_DOMAIN|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
3373 Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
3374 FALSE,
3376 {"http://www.winehq.org/tests/#Te012",S_OK,FALSE},
3377 {"www.winehq.org",S_OK,FALSE},
3378 {"http://www.winehq.org/tests/#Te012",S_OK,FALSE},
3379 {"winehq.org",S_OK,FALSE},
3380 {"",S_FALSE,FALSE},
3381 {"#Te012",S_OK,FALSE},
3382 {"www.winehq.org",S_OK,FALSE},
3383 {"",S_FALSE,FALSE},
3384 {"/tests/",S_OK,FALSE},
3385 {"/tests/",S_OK,FALSE},
3386 {"",S_FALSE,FALSE},
3387 {"http://www.winehq.org/tests/#Te%30%31%32",S_OK,FALSE},
3388 {"http",S_OK,FALSE},
3389 {"",S_FALSE,FALSE},
3390 {"",S_FALSE,FALSE}
3393 {Uri_HOST_DNS,S_OK,FALSE},
3394 {80,S_OK,FALSE},
3395 {URL_SCHEME_HTTP,S_OK,FALSE},
3396 {URLZONE_INVALID,E_NOTIMPL,FALSE},
3399 /* Percent encoded, unreserved characters aren't decoded when NO_DECODE_EXTRA is set. */
3400 { "http://www.winehq.org/tests/#Te%30%31%32", Uri_CREATE_NO_DECODE_EXTRA_INFO, S_OK, FALSE,
3401 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_FRAGMENT|
3402 Uri_HAS_HOST|Uri_HAS_DOMAIN|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
3403 Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
3404 FALSE,
3406 {"http://www.winehq.org/tests/#Te%30%31%32",S_OK,FALSE},
3407 {"www.winehq.org",S_OK,FALSE},
3408 {"http://www.winehq.org/tests/#Te%30%31%32",S_OK,FALSE},
3409 {"winehq.org",S_OK,FALSE},
3410 {"",S_FALSE,FALSE},
3411 {"#Te%30%31%32",S_OK,FALSE},
3412 {"www.winehq.org",S_OK,FALSE},
3413 {"",S_FALSE,FALSE},
3414 {"/tests/",S_OK,FALSE},
3415 {"/tests/",S_OK,FALSE},
3416 {"",S_FALSE,FALSE},
3417 {"http://www.winehq.org/tests/#Te%30%31%32",S_OK,FALSE},
3418 {"http",S_OK,FALSE},
3419 {"",S_FALSE,FALSE},
3420 {"",S_FALSE,FALSE}
3423 {Uri_HOST_DNS,S_OK,FALSE},
3424 {80,S_OK,FALSE},
3425 {URL_SCHEME_HTTP,S_OK,FALSE},
3426 {URLZONE_INVALID,E_NOTIMPL,FALSE},
3429 /* Leading/Trailing whitespace is removed. */
3430 { " http://google.com/ ", 0, S_OK, FALSE,
3431 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
3432 Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
3433 Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
3434 FALSE,
3436 {"http://google.com/",S_OK,FALSE},
3437 {"google.com",S_OK,FALSE},
3438 {"http://google.com/",S_OK,FALSE},
3439 {"google.com",S_OK,FALSE},
3440 {"",S_FALSE,FALSE},
3441 {"",S_FALSE,FALSE},
3442 {"google.com",S_OK,FALSE},
3443 {"",S_FALSE,FALSE},
3444 {"/",S_OK,FALSE},
3445 {"/",S_OK,FALSE},
3446 {"",S_FALSE,FALSE},
3447 {"http://google.com/",S_OK,FALSE},
3448 {"http",S_OK,FALSE},
3449 {"",S_FALSE,FALSE},
3450 {"",S_FALSE,FALSE}
3453 {Uri_HOST_DNS,S_OK,FALSE},
3454 {80,S_OK,FALSE},
3455 {URL_SCHEME_HTTP,S_OK,FALSE},
3456 {URLZONE_INVALID,E_NOTIMPL,FALSE}
3459 { "\t\t\r\nhttp\n://g\noogle.co\rm/\n\n\n", 0, S_OK, FALSE,
3460 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
3461 Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
3462 Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
3463 FALSE,
3465 {"http://google.com/",S_OK,FALSE},
3466 {"google.com",S_OK,FALSE},
3467 {"http://google.com/",S_OK,FALSE},
3468 {"google.com",S_OK,FALSE},
3469 {"",S_FALSE,FALSE},
3470 {"",S_FALSE,FALSE},
3471 {"google.com",S_OK,FALSE},
3472 {"",S_FALSE,FALSE},
3473 {"/",S_OK,FALSE},
3474 {"/",S_OK,FALSE},
3475 {"",S_FALSE,FALSE},
3476 {"http://google.com/",S_OK,FALSE},
3477 {"http",S_OK,FALSE},
3478 {"",S_FALSE,FALSE},
3479 {"",S_FALSE,FALSE}
3482 {Uri_HOST_DNS,S_OK,FALSE},
3483 {80,S_OK,FALSE},
3484 {URL_SCHEME_HTTP,S_OK,FALSE},
3485 {URLZONE_INVALID,E_NOTIMPL,FALSE}
3488 { "http://g\noogle.co\rm/\n\n\n", Uri_CREATE_NO_PRE_PROCESS_HTML_URI, S_OK, FALSE,
3489 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
3490 Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
3491 Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
3492 FALSE,
3494 {"http://g%0aoogle.co%0dm/%0A%0A%0A",S_OK,FALSE},
3495 {"g%0aoogle.co%0dm",S_OK,FALSE},
3496 {"http://g%0aoogle.co%0dm/%0A%0A%0A",S_OK,FALSE},
3497 {"g%0aoogle.co%0dm",S_OK,FALSE},
3498 {"",S_FALSE,FALSE},
3499 {"",S_FALSE,FALSE},
3500 {"g%0aoogle.co%0dm",S_OK,FALSE},
3501 {"",S_FALSE,FALSE},
3502 {"/%0A%0A%0A",S_OK,FALSE},
3503 {"/%0A%0A%0A",S_OK,FALSE},
3504 {"",S_FALSE,FALSE},
3505 {"http://g\noogle.co\rm/\n\n\n",S_OK,FALSE},
3506 {"http",S_OK,FALSE},
3507 {"",S_FALSE,FALSE},
3508 {"",S_FALSE,FALSE}
3511 {Uri_HOST_DNS,S_OK,FALSE},
3512 {80,S_OK,FALSE},
3513 {URL_SCHEME_HTTP,S_OK,FALSE},
3514 {URLZONE_INVALID,E_NOTIMPL,FALSE}
3517 { "zip://g\noogle.co\rm/\n\n\n", Uri_CREATE_NO_PRE_PROCESS_HTML_URI, S_OK, FALSE,
3518 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
3519 Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
3520 Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
3521 FALSE,
3523 {"zip://g\noogle.co\rm/\n\n\n",S_OK,FALSE},
3524 {"g\noogle.co\rm",S_OK,FALSE},
3525 {"zip://g\noogle.co\rm/\n\n\n",S_OK,FALSE},
3526 {"g\noogle.co\rm",S_OK,FALSE},
3527 {"",S_FALSE,FALSE},
3528 {"",S_FALSE,FALSE},
3529 {"g\noogle.co\rm",S_OK,FALSE},
3530 {"",S_FALSE,FALSE},
3531 {"/\n\n\n",S_OK,FALSE},
3532 {"/\n\n\n",S_OK,FALSE},
3533 {"",S_FALSE,FALSE},
3534 {"zip://g\noogle.co\rm/\n\n\n",S_OK,FALSE},
3535 {"zip",S_OK,FALSE},
3536 {"",S_FALSE,FALSE},
3537 {"",S_FALSE,FALSE}
3540 {Uri_HOST_DNS,S_OK,FALSE},
3541 {0,S_FALSE,FALSE},
3542 {URL_SCHEME_UNKNOWN,S_OK,FALSE},
3543 {URLZONE_INVALID,E_NOTIMPL,FALSE}
3546 /* Since file URLs are usually hierarchical, it returns an empty string
3547 * for the absolute URI property since it was declared as an opaque URI.
3549 { "file:index.html", 0, S_OK, FALSE,
3550 Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY
3551 |Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, FALSE,
3553 {"",S_FALSE,FALSE},
3554 {"",S_FALSE,FALSE},
3555 {"file:index.html",S_OK,FALSE},
3556 {"",S_FALSE,FALSE},
3557 {".html",S_OK,FALSE},
3558 {"",S_FALSE,FALSE},
3559 {"",S_FALSE,FALSE},
3560 {"",S_FALSE,FALSE},
3561 {"index.html",S_OK,FALSE},
3562 {"index.html",S_OK,FALSE},
3563 {"",S_FALSE,FALSE},
3564 {"file:index.html",S_OK,FALSE},
3565 {"file",S_OK,FALSE},
3566 {"",S_FALSE,FALSE},
3567 {"",S_FALSE,FALSE}
3570 {0,S_OK,FALSE},
3571 {0,S_FALSE,FALSE},
3572 {URL_SCHEME_FILE,S_OK,FALSE},
3573 {URLZONE_INVALID,E_NOTIMPL,FALSE}
3576 /* Doesn't have an absolute since it's opaque, but gets it port set. */
3577 { "http:test.com/index.html", 0, S_OK, FALSE,
3578 Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY
3579 |Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, FALSE,
3581 {"",S_FALSE,FALSE},
3582 {"",S_FALSE,FALSE},
3583 {"http:test.com/index.html",S_OK,FALSE},
3584 {"",S_FALSE,FALSE},
3585 {".html",S_OK,FALSE},
3586 {"",S_FALSE,FALSE},
3587 {"",S_FALSE,FALSE},
3588 {"",S_FALSE,FALSE},
3589 {"test.com/index.html",S_OK,FALSE},
3590 {"test.com/index.html",S_OK,FALSE},
3591 {"",S_FALSE,FALSE},
3592 {"http:test.com/index.html",S_OK,FALSE},
3593 {"http",S_OK,FALSE},
3594 {"",S_FALSE,FALSE},
3595 {"",S_FALSE,FALSE}
3598 {Uri_HOST_UNKNOWN,S_OK,FALSE},
3599 {80,S_OK,FALSE},
3600 {URL_SCHEME_HTTP,S_OK,FALSE},
3601 {URLZONE_INVALID,E_NOTIMPL,FALSE}
3604 { "ftp:test.com/index.html", 0, S_OK, FALSE,
3605 Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY
3606 |Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, FALSE,
3608 {"",S_FALSE,FALSE},
3609 {"",S_FALSE,FALSE},
3610 {"ftp:test.com/index.html",S_OK,FALSE},
3611 {"",S_FALSE,FALSE},
3612 {".html",S_OK,FALSE},
3613 {"",S_FALSE,FALSE},
3614 {"",S_FALSE,FALSE},
3615 {"",S_FALSE,FALSE},
3616 {"test.com/index.html",S_OK,FALSE},
3617 {"test.com/index.html",S_OK,FALSE},
3618 {"",S_FALSE,FALSE},
3619 {"ftp:test.com/index.html",S_OK,FALSE},
3620 {"ftp",S_OK,FALSE},
3621 {"",S_FALSE,FALSE},
3622 {"",S_FALSE,FALSE}
3625 {Uri_HOST_UNKNOWN,S_OK,FALSE},
3626 {21,S_OK,FALSE},
3627 {URL_SCHEME_FTP,S_OK,FALSE},
3628 {URLZONE_INVALID,E_NOTIMPL,FALSE}
3631 { "file://C|/test.mp3", 0, S_OK, FALSE,
3632 Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH|
3633 Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
3634 FALSE,
3636 {"file:///C:/test.mp3",S_OK,FALSE},
3637 {"",S_FALSE,FALSE},
3638 {"file:///C:/test.mp3",S_OK,FALSE},
3639 {"",S_FALSE,FALSE},
3640 {".mp3",S_OK,FALSE},
3641 {"",S_FALSE,FALSE},
3642 {"",S_FALSE,FALSE},
3643 {"",S_FALSE,FALSE},
3644 {"/C:/test.mp3",S_OK,FALSE},
3645 {"/C:/test.mp3",S_OK,FALSE},
3646 {"",S_FALSE,FALSE},
3647 {"file://C|/test.mp3",S_OK,FALSE},
3648 {"file",S_OK,FALSE},
3649 {"",S_FALSE,FALSE},
3650 {"",S_FALSE,FALSE}
3653 {Uri_HOST_UNKNOWN,S_OK,FALSE},
3654 {0,S_FALSE,FALSE},
3655 {URL_SCHEME_FILE,S_OK,FALSE},
3656 {URLZONE_INVALID,E_NOTIMPL,FALSE}
3659 { "file:///C|/test.mp3", 0, S_OK, FALSE,
3660 Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH|
3661 Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
3662 FALSE,
3664 {"file:///C:/test.mp3",S_OK,FALSE},
3665 {"",S_FALSE,FALSE},
3666 {"file:///C:/test.mp3",S_OK,FALSE},
3667 {"",S_FALSE,FALSE},
3668 {".mp3",S_OK,FALSE},
3669 {"",S_FALSE,FALSE},
3670 {"",S_FALSE,FALSE},
3671 {"",S_FALSE,FALSE},
3672 {"/C:/test.mp3",S_OK,FALSE},
3673 {"/C:/test.mp3",S_OK,FALSE},
3674 {"",S_FALSE,FALSE},
3675 {"file:///C|/test.mp3",S_OK,FALSE},
3676 {"file",S_OK,FALSE},
3677 {"",S_FALSE,FALSE},
3678 {"",S_FALSE,FALSE}
3681 {Uri_HOST_UNKNOWN,S_OK,FALSE},
3682 {0,S_FALSE,FALSE},
3683 {URL_SCHEME_FILE,S_OK,FALSE},
3684 {URLZONE_INVALID,E_NOTIMPL,FALSE}
3687 /* Extra '/' isn't added before "c:" since USE_DOS_PATH is set and '/' are converted
3688 * to '\\'.
3690 { "file://c:/dir/index.html", Uri_CREATE_FILE_USE_DOS_PATH, S_OK, FALSE,
3691 Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH
3692 |Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE
3693 |Uri_HAS_SCHEME, FALSE,
3695 {"file://c:\\dir\\index.html",S_OK,FALSE},
3696 {"",S_FALSE,FALSE},
3697 {"file://c:\\dir\\index.html",S_OK,FALSE},
3698 {"",S_FALSE,FALSE},
3699 {".html",S_OK,FALSE},
3700 {"",S_FALSE,FALSE},
3701 {"",S_FALSE,FALSE},
3702 {"",S_FALSE,FALSE},
3703 {"c:\\dir\\index.html",S_OK,FALSE},
3704 {"c:\\dir\\index.html",S_OK,FALSE},
3705 {"",S_FALSE,FALSE},
3706 {"file://c:/dir/index.html",S_OK,FALSE},
3707 {"file",S_OK,FALSE},
3708 {"",S_FALSE,FALSE},
3709 {"",S_FALSE,FALSE}
3712 {0,S_OK,FALSE},
3713 {0,S_FALSE,FALSE},
3714 {URL_SCHEME_FILE,S_OK,FALSE},
3715 {URLZONE_INVALID,E_NOTIMPL,FALSE}
3718 /* Extra '/' after "file://" is removed. */
3719 { "file:///c:/dir/index.html", Uri_CREATE_FILE_USE_DOS_PATH, S_OK, FALSE,
3720 Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH
3721 |Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE
3722 |Uri_HAS_SCHEME, FALSE,
3724 {"file://c:\\dir\\index.html",S_OK,FALSE},
3725 {"",S_FALSE,FALSE},
3726 {"file://c:\\dir\\index.html",S_OK,FALSE},
3727 {"",S_FALSE,FALSE},
3728 {".html",S_OK,FALSE},
3729 {"",S_FALSE,FALSE},
3730 {"",S_FALSE,FALSE},
3731 {"",S_FALSE,FALSE},
3732 {"c:\\dir\\index.html",S_OK,FALSE},
3733 {"c:\\dir\\index.html",S_OK,FALSE},
3734 {"",S_FALSE,FALSE},
3735 {"file:///c:/dir/index.html",S_OK,FALSE},
3736 {"file",S_OK,FALSE},
3737 {"",S_FALSE,FALSE},
3738 {"",S_FALSE,FALSE}
3741 {0,S_OK,FALSE},
3742 {0,S_FALSE,FALSE},
3743 {URL_SCHEME_FILE,S_OK,FALSE},
3744 {URLZONE_INVALID,E_NOTIMPL,FALSE}
3747 { "file://c|/dir\\index.html", Uri_CREATE_FILE_USE_DOS_PATH, S_OK, FALSE,
3748 Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH
3749 |Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE
3750 |Uri_HAS_SCHEME, FALSE,
3752 {"file://c:\\dir\\index.html",S_OK,FALSE},
3753 {"",S_FALSE,FALSE},
3754 {"file://c:\\dir\\index.html",S_OK,FALSE},
3755 {"",S_FALSE,FALSE},
3756 {".html",S_OK,FALSE},
3757 {"",S_FALSE,FALSE},
3758 {"",S_FALSE,FALSE},
3759 {"",S_FALSE,FALSE},
3760 {"c:\\dir\\index.html",S_OK,FALSE},
3761 {"c:\\dir\\index.html",S_OK,FALSE},
3762 {"",S_FALSE,FALSE},
3763 {"file://c|/dir\\index.html",S_OK,FALSE},
3764 {"file",S_OK,FALSE},
3765 {"",S_FALSE,FALSE},
3766 {"",S_FALSE,FALSE}
3769 {0,S_OK,FALSE},
3770 {0,S_FALSE,FALSE},
3771 {URL_SCHEME_FILE,S_OK,FALSE},
3772 {URLZONE_INVALID,E_NOTIMPL,FALSE}
3775 /* The backslashes after the scheme name are converted to forward slashes. */
3776 { "file:\\\\c:\\dir\\index.html", Uri_CREATE_FILE_USE_DOS_PATH, S_OK, FALSE,
3777 Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH
3778 |Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE
3779 |Uri_HAS_SCHEME, FALSE,
3781 {"file://c:\\dir\\index.html",S_OK,FALSE},
3782 {"",S_FALSE,FALSE},
3783 {"file://c:\\dir\\index.html",S_OK,FALSE},
3784 {"",S_FALSE,FALSE},
3785 {".html",S_OK,FALSE},
3786 {"",S_FALSE,FALSE},
3787 {"",S_FALSE,FALSE},
3788 {"",S_FALSE,FALSE},
3789 {"c:\\dir\\index.html",S_OK,FALSE},
3790 {"c:\\dir\\index.html",S_OK,FALSE},
3791 {"",S_FALSE,FALSE},
3792 {"file:\\\\c:\\dir\\index.html",S_OK,FALSE},
3793 {"file",S_OK,FALSE},
3794 {"",S_FALSE,FALSE},
3795 {"",S_FALSE,FALSE}
3798 {0,S_OK,FALSE},
3799 {0,S_FALSE,FALSE},
3800 {URL_SCHEME_FILE,S_OK,FALSE},
3801 {URLZONE_INVALID,E_NOTIMPL,FALSE}
3804 { "file:\\\\c:/dir/index.html", 0, S_OK, FALSE,
3805 Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH
3806 |Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE
3807 |Uri_HAS_SCHEME, FALSE,
3809 {"file:///c:/dir/index.html",S_OK,FALSE},
3810 {"",S_FALSE,FALSE},
3811 {"file:///c:/dir/index.html",S_OK,FALSE},
3812 {"",S_FALSE,FALSE},
3813 {".html",S_OK,FALSE},
3814 {"",S_FALSE,FALSE},
3815 {"",S_FALSE,FALSE},
3816 {"",S_FALSE,FALSE},
3817 {"/c:/dir/index.html",S_OK,FALSE},
3818 {"/c:/dir/index.html",S_OK,FALSE},
3819 {"",S_FALSE,FALSE},
3820 {"file:\\\\c:/dir/index.html",S_OK,FALSE},
3821 {"file",S_OK,FALSE},
3822 {"",S_FALSE,FALSE},
3823 {"",S_FALSE,FALSE}
3826 {0,S_OK,FALSE},
3827 {0,S_FALSE,FALSE},
3828 {URL_SCHEME_FILE,S_OK,FALSE},
3829 {URLZONE_INVALID,E_NOTIMPL,FALSE}
3832 { "http:\\\\google.com", 0, S_OK, FALSE,
3833 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
3834 Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
3835 Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
3836 FALSE,
3838 {"http://google.com/",S_OK,FALSE},
3839 {"google.com",S_OK,FALSE},
3840 {"http://google.com/",S_OK,FALSE},
3841 {"google.com",S_OK,FALSE},
3842 {"",S_FALSE,FALSE},
3843 {"",S_FALSE,FALSE},
3844 {"google.com",S_OK,FALSE},
3845 {"",S_FALSE,FALSE},
3846 {"/",S_OK,FALSE},
3847 {"/",S_OK,FALSE},
3848 {"",S_FALSE,FALSE},
3849 {"http:\\\\google.com",S_OK,FALSE},
3850 {"http",S_OK,FALSE},
3851 {"",S_FALSE,FALSE},
3852 {"",S_FALSE,FALSE}
3855 {Uri_HOST_DNS,S_OK,FALSE},
3856 {80,S_OK,FALSE},
3857 {URL_SCHEME_HTTP,S_OK,FALSE},
3858 {URLZONE_INVALID,E_NOTIMPL,FALSE}
3861 /* the "\\\\" aren't converted to "//" for unknown scheme types and it's considered opaque. */
3862 { "zip:\\\\google.com", 0, S_OK, FALSE,
3863 Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH|
3864 Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_SCHEME|
3865 Uri_HAS_HOST_TYPE,
3866 FALSE,
3868 {"zip:\\\\google.com",S_OK,FALSE},
3869 {"",S_FALSE,FALSE},
3870 {"zip:\\\\google.com",S_OK,FALSE},
3871 {"",S_FALSE,FALSE},
3872 {".com",S_OK,FALSE},
3873 {"",S_FALSE,FALSE},
3874 {"",S_FALSE,FALSE},
3875 {"",S_FALSE,FALSE},
3876 {"\\\\google.com",S_OK,FALSE},
3877 {"\\\\google.com",S_OK,FALSE},
3878 {"",S_FALSE,FALSE},
3879 {"zip:\\\\google.com",S_OK,FALSE},
3880 {"zip",S_OK,FALSE},
3881 {"",S_FALSE,FALSE},
3882 {"",S_FALSE,FALSE}
3885 {Uri_HOST_UNKNOWN,S_OK,FALSE},
3886 {0,S_FALSE,FALSE},
3887 {URL_SCHEME_UNKNOWN,S_OK,FALSE},
3888 {URLZONE_INVALID,E_NOTIMPL,FALSE}
3891 /* Dot segements aren't removed. */
3892 { "file://c:\\dir\\../..\\./index.html", Uri_CREATE_FILE_USE_DOS_PATH, S_OK, FALSE,
3893 Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH
3894 |Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE
3895 |Uri_HAS_SCHEME, FALSE,
3897 {"file://c:\\dir\\..\\..\\.\\index.html",S_OK,FALSE},
3898 {"",S_FALSE,FALSE},
3899 {"file://c:\\dir\\..\\..\\.\\index.html",S_OK,FALSE},
3900 {"",S_FALSE,FALSE},
3901 {".html",S_OK,FALSE},
3902 {"",S_FALSE,FALSE},
3903 {"",S_FALSE,FALSE},
3904 {"",S_FALSE,FALSE},
3905 {"c:\\dir\\..\\..\\.\\index.html",S_OK,FALSE},
3906 {"c:\\dir\\..\\..\\.\\index.html",S_OK,FALSE},
3907 {"",S_FALSE,FALSE},
3908 {"file://c:\\dir\\../..\\./index.html",S_OK,FALSE},
3909 {"file",S_OK,FALSE},
3910 {"",S_FALSE,FALSE},
3911 {"",S_FALSE,FALSE}
3914 {0,S_OK,FALSE},
3915 {0,S_FALSE,FALSE},
3916 {URL_SCHEME_FILE,S_OK,FALSE},
3917 {URLZONE_INVALID,E_NOTIMPL,FALSE}
3920 /* Forbidden characters aren't percent encoded. */
3921 { "file://c:\\dir\\i^|ndex.html", Uri_CREATE_FILE_USE_DOS_PATH, S_OK, FALSE,
3922 Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH
3923 |Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE
3924 |Uri_HAS_SCHEME, FALSE,
3926 {"file://c:\\dir\\i^|ndex.html",S_OK,FALSE},
3927 {"",S_FALSE,FALSE},
3928 {"file://c:\\dir\\i^|ndex.html",S_OK,FALSE},
3929 {"",S_FALSE,FALSE},
3930 {".html",S_OK,FALSE},
3931 {"",S_FALSE,FALSE},
3932 {"",S_FALSE,FALSE},
3933 {"",S_FALSE,FALSE},
3934 {"c:\\dir\\i^|ndex.html",S_OK,FALSE},
3935 {"c:\\dir\\i^|ndex.html",S_OK,FALSE},
3936 {"",S_FALSE,FALSE},
3937 {"file://c:\\dir\\i^|ndex.html",S_OK,FALSE},
3938 {"file",S_OK,FALSE},
3939 {"",S_FALSE,FALSE},
3940 {"",S_FALSE,FALSE}
3943 {0,S_OK,FALSE},
3944 {0,S_FALSE,FALSE},
3945 {URL_SCHEME_FILE,S_OK,FALSE},
3946 {URLZONE_INVALID,E_NOTIMPL,FALSE}
3949 /* The '\' are still converted to '/' even though it's an opaque file URI. */
3950 { "file:c:\\dir\\../..\\index.html", 0, S_OK, FALSE,
3951 Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY
3952 |Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, FALSE,
3954 {"",S_FALSE,FALSE},
3955 {"",S_FALSE,FALSE},
3956 {"file:c:/dir/../../index.html",S_OK,FALSE},
3957 {"",S_FALSE,FALSE},
3958 {".html",S_OK,FALSE},
3959 {"",S_FALSE,FALSE},
3960 {"",S_FALSE,FALSE},
3961 {"",S_FALSE,FALSE},
3962 {"c:/dir/../../index.html",S_OK,FALSE},
3963 {"c:/dir/../../index.html",S_OK,FALSE},
3964 {"",S_FALSE,FALSE},
3965 {"file:c:\\dir\\../..\\index.html",S_OK,FALSE},
3966 {"file",S_OK,FALSE},
3967 {"",S_FALSE,FALSE},
3968 {"",S_FALSE,FALSE}
3971 {0,S_OK,FALSE},
3972 {0,S_FALSE,FALSE},
3973 {URL_SCHEME_FILE,S_OK,FALSE},
3974 {URLZONE_INVALID,E_NOTIMPL,FALSE}
3977 /* '/' are still converted to '\' even though it's an opaque URI. */
3978 { "file:c:/dir\\../..\\index.html", Uri_CREATE_FILE_USE_DOS_PATH, S_OK, FALSE,
3979 Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY
3980 |Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, FALSE,
3982 {"",S_FALSE,FALSE},
3983 {"",S_FALSE,FALSE},
3984 {"file:c:\\dir\\..\\..\\index.html",S_OK,FALSE},
3985 {"",S_FALSE,FALSE},
3986 {".html",S_OK,FALSE},
3987 {"",S_FALSE,FALSE},
3988 {"",S_FALSE,FALSE},
3989 {"",S_FALSE,FALSE},
3990 {"c:\\dir\\..\\..\\index.html",S_OK,FALSE},
3991 {"c:\\dir\\..\\..\\index.html",S_OK,FALSE},
3992 {"",S_FALSE,FALSE},
3993 {"file:c:/dir\\../..\\index.html",S_OK,FALSE},
3994 {"file",S_OK,FALSE},
3995 {"",S_FALSE,FALSE},
3996 {"",S_FALSE,FALSE}
3999 {0,S_OK,FALSE},
4000 {0,S_FALSE,FALSE},
4001 {URL_SCHEME_FILE,S_OK,FALSE},
4002 {URLZONE_INVALID,E_NOTIMPL,FALSE}
4005 /* Forbidden characters aren't percent encoded. */
4006 { "file:c:\\in^|dex.html", Uri_CREATE_FILE_USE_DOS_PATH, S_OK, FALSE,
4007 Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY
4008 |Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, FALSE,
4010 {"",S_FALSE,FALSE},
4011 {"",S_FALSE,FALSE},
4012 {"file:c:\\in^|dex.html",S_OK,FALSE},
4013 {"",S_FALSE,FALSE},
4014 {".html",S_OK,FALSE},
4015 {"",S_FALSE,FALSE},
4016 {"",S_FALSE,FALSE},
4017 {"",S_FALSE,FALSE},
4018 {"c:\\in^|dex.html",S_OK,FALSE},
4019 {"c:\\in^|dex.html",S_OK,FALSE},
4020 {"",S_FALSE,FALSE},
4021 {"file:c:\\in^|dex.html",S_OK,FALSE},
4022 {"file",S_OK,FALSE},
4023 {"",S_FALSE,FALSE},
4024 {"",S_FALSE,FALSE}
4027 {0,S_OK,FALSE},
4028 {0,S_FALSE,FALSE},
4029 {URL_SCHEME_FILE,S_OK,FALSE},
4030 {URLZONE_INVALID,E_NOTIMPL,FALSE}
4033 /* Doesn't have a UserName since the ':' appears at the beginning of the
4034 * userinfo section.
4036 { "http://:password@gov.uk", 0, S_OK, FALSE,
4037 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
4038 Uri_HAS_PASSWORD|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
4039 Uri_HAS_USER_INFO|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
4040 FALSE,
4042 {"http://:password@gov.uk/",S_OK,FALSE},
4043 {":password@gov.uk",S_OK,FALSE},
4044 {"http://gov.uk/",S_OK,FALSE},
4045 {"",S_FALSE,FALSE},
4046 {"",S_FALSE,FALSE},
4047 {"",S_FALSE,FALSE},
4048 {"gov.uk",S_OK,FALSE},
4049 {"password",S_OK,FALSE},
4050 {"/",S_OK,FALSE},
4051 {"/",S_OK,FALSE},
4052 {"",S_FALSE,FALSE},
4053 {"http://:password@gov.uk",S_OK,FALSE},
4054 {"http",S_OK,FALSE},
4055 {":password",S_OK,FALSE},
4056 {"",S_FALSE,FALSE}
4059 {Uri_HOST_DNS,S_OK,FALSE},
4060 {80,S_OK,FALSE},
4061 {URL_SCHEME_HTTP,S_OK,FALSE},
4062 {URLZONE_INVALID,E_NOTIMPL,FALSE}
4065 /* Has a UserName since the userinfo section doesn't contain a password. */
4066 { "http://@gov.uk", 0, S_OK, FALSE,
4067 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
4068 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
4069 Uri_HAS_USER_INFO|Uri_HAS_USER_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
4070 FALSE,
4072 {"http://gov.uk/",S_OK,FALSE,"http://@gov.uk/"},
4073 {"@gov.uk",S_OK,FALSE},
4074 {"http://gov.uk/",S_OK,FALSE},
4075 {"",S_FALSE,FALSE},
4076 {"",S_FALSE,FALSE},
4077 {"",S_FALSE,FALSE},
4078 {"gov.uk",S_OK,FALSE},
4079 {"",S_FALSE,FALSE},
4080 {"/",S_OK,FALSE},
4081 {"/",S_OK,FALSE},
4082 {"",S_FALSE,FALSE},
4083 {"http://@gov.uk",S_OK,FALSE},
4084 {"http",S_OK,FALSE},
4085 {"",S_OK,FALSE},
4086 {"",S_OK,FALSE}
4089 {Uri_HOST_DNS,S_OK,FALSE},
4090 {80,S_OK,FALSE},
4091 {URL_SCHEME_HTTP,S_OK,FALSE},
4092 {URLZONE_INVALID,E_NOTIMPL,FALSE}
4095 /* ":@" not included in the absolute URI. */
4096 { "http://:@gov.uk", 0, S_OK, FALSE,
4097 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
4098 Uri_HAS_PASSWORD|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
4099 Uri_HAS_USER_INFO|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
4100 FALSE,
4102 {"http://gov.uk/",S_OK,FALSE,"http://:@gov.uk/"},
4103 {":@gov.uk",S_OK,FALSE},
4104 {"http://gov.uk/",S_OK,FALSE},
4105 {"",S_FALSE,FALSE},
4106 {"",S_FALSE,FALSE},
4107 {"",S_FALSE,FALSE},
4108 {"gov.uk",S_OK,FALSE},
4109 {"",S_OK,FALSE},
4110 {"/",S_OK,FALSE},
4111 {"/",S_OK,FALSE},
4112 {"",S_FALSE,FALSE},
4113 {"http://:@gov.uk",S_OK,FALSE},
4114 {"http",S_OK,FALSE},
4115 {":",S_OK,FALSE},
4116 {"",S_FALSE,FALSE}
4119 {Uri_HOST_DNS,S_OK,FALSE},
4120 {80,S_OK,FALSE},
4121 {URL_SCHEME_HTTP,S_OK,FALSE},
4122 {URLZONE_INVALID,E_NOTIMPL,FALSE}
4125 /* '@' is included because it's an unknown scheme type. */
4126 { "zip://@gov.uk", 0, S_OK, FALSE,
4127 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
4128 Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
4129 Uri_HAS_USER_INFO|Uri_HAS_USER_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
4130 FALSE,
4132 {"zip://@gov.uk/",S_OK,FALSE},
4133 {"@gov.uk",S_OK,FALSE},
4134 {"zip://@gov.uk/",S_OK,FALSE},
4135 {"",S_FALSE,FALSE},
4136 {"",S_FALSE,FALSE},
4137 {"",S_FALSE,FALSE},
4138 {"gov.uk",S_OK,FALSE},
4139 {"",S_FALSE,FALSE},
4140 {"/",S_OK,FALSE},
4141 {"/",S_OK,FALSE},
4142 {"",S_FALSE,FALSE},
4143 {"zip://@gov.uk",S_OK,FALSE},
4144 {"zip",S_OK,FALSE},
4145 {"",S_OK,FALSE},
4146 {"",S_OK,FALSE}
4149 {Uri_HOST_DNS,S_OK,FALSE},
4150 {0,S_FALSE,FALSE},
4151 {URL_SCHEME_UNKNOWN,S_OK,FALSE},
4152 {URLZONE_INVALID,E_NOTIMPL,FALSE}
4155 /* ":@" are included because it's an unknown scheme type. */
4156 { "zip://:@gov.uk", 0, S_OK, FALSE,
4157 Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|
4158 Uri_HAS_PASSWORD|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
4159 Uri_HAS_SCHEME_NAME|Uri_HAS_USER_INFO|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
4160 FALSE,
4162 {"zip://:@gov.uk/",S_OK,FALSE},
4163 {":@gov.uk",S_OK,FALSE},
4164 {"zip://:@gov.uk/",S_OK,FALSE},
4165 {"",S_FALSE,FALSE},
4166 {"",S_FALSE,FALSE},
4167 {"",S_FALSE,FALSE},
4168 {"gov.uk",S_OK,FALSE},
4169 {"",S_OK,FALSE},
4170 {"/",S_OK,FALSE},
4171 {"/",S_OK,FALSE},
4172 {"",S_FALSE,FALSE},
4173 {"zip://:@gov.uk",S_OK,FALSE},
4174 {"zip",S_OK,FALSE},
4175 {":",S_OK,FALSE},
4176 {"",S_FALSE,FALSE}
4179 {Uri_HOST_DNS,S_OK,FALSE},
4180 {0,S_FALSE,FALSE},
4181 {URL_SCHEME_UNKNOWN,S_OK,FALSE},
4182 {URLZONE_INVALID,E_NOTIMPL,FALSE}
4185 { "about:blank", 0, S_OK, FALSE,
4186 Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
4187 Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
4188 FALSE,
4190 {"about:blank",S_OK,FALSE},
4191 {"",S_FALSE,FALSE},
4192 {"about:blank",S_OK,FALSE},
4193 {"",S_FALSE,FALSE},
4194 {"",S_FALSE,FALSE},
4195 {"",S_FALSE,FALSE},
4196 {"",S_FALSE,FALSE},
4197 {"",S_FALSE,FALSE},
4198 {"blank",S_OK,FALSE},
4199 {"blank",S_OK,FALSE},
4200 {"",S_FALSE,FALSE},
4201 {"about:blank",S_OK,FALSE},
4202 {"about",S_OK,FALSE},
4203 {"",S_FALSE,FALSE},
4204 {"",S_FALSE,FALSE}
4207 {0,S_OK,FALSE},
4208 {0,S_FALSE,FALSE},
4209 {URL_SCHEME_ABOUT,S_OK,FALSE},
4210 {URLZONE_INVALID,E_NOTIMPL,FALSE}
4213 { "mk:@MSITStore:C:\\Program Files/AutoCAD 2008\\Help/acad_acg.chm::/WSfacf1429558a55de1a7524c1004e616f8b-322b.htm",0,S_OK,FALSE,
4214 Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|
4215 Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
4216 FALSE,
4218 {"mk:@MSITStore:C:\\Program%20Files/AutoCAD%202008\\Help/acad_acg.chm::/WSfacf1429558a55de1a7524c1004e616f8b-322b.htm",S_OK,FALSE},
4219 {"",S_FALSE,FALSE},
4220 {"mk:@MSITStore:C:\\Program%20Files/AutoCAD%202008\\Help/acad_acg.chm::/WSfacf1429558a55de1a7524c1004e616f8b-322b.htm",S_OK,FALSE},
4221 {"",S_FALSE,FALSE},
4222 {".htm",S_OK,FALSE},
4223 {"",S_FALSE,FALSE},
4224 {"",S_FALSE,FALSE},
4225 {"",S_FALSE,FALSE},
4226 {"@MSITStore:C:\\Program%20Files/AutoCAD%202008\\Help/acad_acg.chm::/WSfacf1429558a55de1a7524c1004e616f8b-322b.htm",S_OK,FALSE},
4227 {"@MSITStore:C:\\Program%20Files/AutoCAD%202008\\Help/acad_acg.chm::/WSfacf1429558a55de1a7524c1004e616f8b-322b.htm",S_OK,FALSE},
4228 {"",S_FALSE,FALSE},
4229 {"mk:@MSITStore:C:\\Program Files/AutoCAD 2008\\Help/acad_acg.chm::/WSfacf1429558a55de1a7524c1004e616f8b-322b.htm",S_OK,FALSE},
4230 {"mk",S_OK,FALSE},
4231 {"",S_FALSE,FALSE},
4232 {"",S_FALSE,FALSE}
4235 {Uri_HOST_UNKNOWN,S_OK,FALSE},
4236 {0,S_FALSE,FALSE},
4237 {URL_SCHEME_MK,S_OK,FALSE},
4238 {URLZONE_INVALID,E_NOTIMPL,FALSE}
4241 { "mk:@MSITStore:Z:\\home\\test\\chm\\silqhelp.chm::/thesilqquickstartguide.htm",0,S_OK,FALSE,
4242 Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|
4243 Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
4244 FALSE,
4246 {"mk:@MSITStore:Z:\\home\\test\\chm\\silqhelp.chm::/thesilqquickstartguide.htm",S_OK,FALSE},
4247 {"",S_FALSE,FALSE},
4248 {"mk:@MSITStore:Z:\\home\\test\\chm\\silqhelp.chm::/thesilqquickstartguide.htm",S_OK,FALSE},
4249 {"",S_FALSE,FALSE},
4250 {".htm",S_OK,FALSE},
4251 {"",S_FALSE,FALSE},
4252 {"",S_FALSE,FALSE},
4253 {"",S_FALSE,FALSE},
4254 {"@MSITStore:Z:\\home\\test\\chm\\silqhelp.chm::/thesilqquickstartguide.htm",S_OK,FALSE},
4255 {"@MSITStore:Z:\\home\\test\\chm\\silqhelp.chm::/thesilqquickstartguide.htm",S_OK,FALSE},
4256 {"",S_FALSE,FALSE},
4257 {"mk:@MSITStore:Z:\\home\\test\\chm\\silqhelp.chm::/thesilqquickstartguide.htm",S_OK,FALSE},
4258 {"mk",S_OK,FALSE},
4259 {"",S_FALSE,FALSE},
4260 {"",S_FALSE,FALSE}
4263 {Uri_HOST_UNKNOWN,S_OK,FALSE},
4264 {0,S_FALSE,FALSE},
4265 {URL_SCHEME_MK,S_OK,FALSE},
4266 {URLZONE_INVALID,E_NOTIMPL,FALSE}
4271 typedef struct _invalid_uri {
4272 const char* uri;
4273 DWORD flags;
4274 BOOL todo;
4275 } invalid_uri;
4277 static const invalid_uri invalid_uri_tests[] = {
4278 /* Has to have a scheme name. */
4279 {"://www.winehq.org",0,FALSE},
4280 /* Window's doesn't like URI's which are implicitly file paths without the
4281 * ALLOW_IMPLICIT_FILE_SCHEME flag set.
4283 {"C:/test/test.mp3",0,FALSE},
4284 {"\\\\Server/test/test.mp3",0,FALSE},
4285 {"C:/test/test.mp3",Uri_CREATE_ALLOW_IMPLICIT_WILDCARD_SCHEME,FALSE},
4286 {"\\\\Server/test/test.mp3",Uri_CREATE_ALLOW_RELATIVE,FALSE},
4287 /* Invalid schemes. */
4288 {"*abcd://not.valid.com",0,FALSE},
4289 {"*a*b*c*d://not.valid.com",0,FALSE},
4290 /* Not allowed to have invalid % encoded data. */
4291 {"ftp://google.co%XX/",0,FALSE},
4292 /* To many h16 components. */
4293 {"http://[1:2:3:4:5:6:7:8:9]",0,FALSE},
4294 /* Not enough room for IPv4 address. */
4295 {"http://[1:2:3:4:5:6:7:192.0.1.0]",0,FALSE},
4296 /* Not enough h16 components. */
4297 {"http://[1:2:3:4]",0,FALSE},
4298 /* Not enough components including IPv4. */
4299 {"http://[1:192.0.1.0]",0,FALSE},
4300 /* Not allowed to have partial IPv4 in IPv6. */
4301 {"http://[::192.0]",0,FALSE},
4302 /* Can't have elision of 1 h16 at beginning of address. */
4303 {"http://[::2:3:4:5:6:7:8]",0,FALSE},
4304 /* Can't have elision of 1 h16 at end of address. */
4305 {"http://[1:2:3:4:5:6:7::]",0,FALSE},
4306 /* Expects a valid IP Literal. */
4307 {"ftp://[not.valid.uri]/",0,FALSE},
4308 /* Expects valid port for a known scheme type. */
4309 {"ftp://www.winehq.org:123fgh",0,FALSE},
4310 /* Port exceeds USHORT_MAX for known scheme type. */
4311 {"ftp://www.winehq.org:65536",0,FALSE},
4312 /* Invalid port with IPv4 address. */
4313 {"http://www.winehq.org:1abcd",0,FALSE},
4314 /* Invalid port with IPv6 address. */
4315 {"http://[::ffff]:32xy",0,FALSE},
4316 /* Not allowed to have backslashes with NO_CANONICALIZE. */
4317 {"gopher://www.google.com\\test",Uri_CREATE_NO_CANONICALIZE,FALSE},
4318 /* Not allowed to have invalid % encoded data in opaque URI path. */
4319 {"news:test%XX",0,FALSE},
4320 {"mailto:wine@winehq%G8.com",0,FALSE},
4321 /* Known scheme types can't have invalid % encoded data in query string. */
4322 {"http://google.com/?query=te%xx",0,FALSE},
4323 /* Invalid % encoded data in fragment of know scheme type. */
4324 {"ftp://google.com/#Test%xx",0,FALSE},
4325 {" http://google.com/",Uri_CREATE_NO_PRE_PROCESS_HTML_URI,FALSE},
4326 {"\n\nhttp://google.com/",Uri_CREATE_NO_PRE_PROCESS_HTML_URI,FALSE},
4327 {"file://c:\\test<test",Uri_CREATE_FILE_USE_DOS_PATH,FALSE},
4328 {"file://c:\\test>test",Uri_CREATE_FILE_USE_DOS_PATH,FALSE},
4329 {"file://c:\\test\"test",Uri_CREATE_FILE_USE_DOS_PATH,FALSE},
4330 {"file:c:\\test<test",Uri_CREATE_FILE_USE_DOS_PATH,FALSE},
4331 {"file:c:\\test>test",Uri_CREATE_FILE_USE_DOS_PATH,FALSE},
4332 {"file:c:\\test\"test",Uri_CREATE_FILE_USE_DOS_PATH,FALSE}
4335 typedef struct _uri_equality {
4336 const char* a;
4337 DWORD create_flags_a;
4338 BOOL create_todo_a;
4339 const char* b;
4340 DWORD create_flags_b;
4341 BOOL create_todo_b;
4342 BOOL equal;
4343 BOOL todo;
4344 } uri_equality;
4346 static const uri_equality equality_tests[] = {
4348 "HTTP://www.winehq.org/test dir/./",0,FALSE,
4349 "http://www.winehq.org/test dir/../test dir/",0,FALSE,
4350 TRUE, FALSE
4353 /* http://www.winehq.org/test%20dir */
4354 "http://%77%77%77%2E%77%69%6E%65%68%71%2E%6F%72%67/%74%65%73%74%20%64%69%72",0,FALSE,
4355 "http://www.winehq.org/test dir",0,FALSE,
4356 TRUE, FALSE
4359 "c:\\test.mp3",Uri_CREATE_ALLOW_IMPLICIT_FILE_SCHEME,FALSE,
4360 "file:///c:/test.mp3",0,FALSE,
4361 TRUE, FALSE
4364 "ftp://ftp.winehq.org/",0,FALSE,
4365 "ftp://ftp.winehq.org",0,FALSE,
4366 TRUE, FALSE
4369 "ftp://ftp.winehq.org/test/test2/../../testB/",0,FALSE,
4370 "ftp://ftp.winehq.org/t%45stB/",0,FALSE,
4371 FALSE, FALSE
4374 "http://google.com/TEST",0,FALSE,
4375 "http://google.com/test",0,FALSE,
4376 FALSE, FALSE
4379 "http://GOOGLE.com/",0,FALSE,
4380 "http://google.com/",0,FALSE,
4381 TRUE, FALSE
4383 /* Performs case insensitive compare of host names (for known scheme types). */
4385 "ftp://GOOGLE.com/",Uri_CREATE_NO_CANONICALIZE,FALSE,
4386 "ftp://google.com/",0,FALSE,
4387 TRUE, FALSE
4390 "zip://GOOGLE.com/",0,FALSE,
4391 "zip://google.com/",0,FALSE,
4392 FALSE, FALSE
4395 "file:///c:/TEST/TeST/",0,FALSE,
4396 "file:///c:/test/test/",0,FALSE,
4397 TRUE, FALSE
4400 "file:///server/TEST",0,FALSE,
4401 "file:///SERVER/TEST",0,FALSE,
4402 TRUE, FALSE
4405 "http://google.com",Uri_CREATE_NO_CANONICALIZE,FALSE,
4406 "http://google.com/",0,FALSE,
4407 TRUE, FALSE
4410 "ftp://google.com:21/",0,FALSE,
4411 "ftp://google.com/",0,FALSE,
4412 TRUE, FALSE
4415 "http://google.com:80/",Uri_CREATE_NO_CANONICALIZE,FALSE,
4416 "http://google.com/",0,FALSE,
4417 TRUE, FALSE
4420 "http://google.com:70/",0,FALSE,
4421 "http://google.com:71/",0,FALSE,
4422 FALSE, FALSE
4426 typedef struct _uri_with_fragment {
4427 const char* uri;
4428 const char* fragment;
4429 DWORD create_flags;
4430 HRESULT create_expected;
4431 BOOL create_todo;
4433 const char* expected_uri;
4434 BOOL expected_todo;
4435 } uri_with_fragment;
4437 static const uri_with_fragment uri_fragment_tests[] = {
4439 "http://google.com/","#fragment",0,S_OK,FALSE,
4440 "http://google.com/#fragment",FALSE
4443 "http://google.com/","fragment",0,S_OK,FALSE,
4444 "http://google.com/#fragment",FALSE
4447 "zip://test.com/","?test",0,S_OK,FALSE,
4448 "zip://test.com/#?test",FALSE
4450 /* The fragment can be empty. */
4452 "ftp://ftp.google.com/","",0,S_OK,FALSE,
4453 "ftp://ftp.google.com/#",FALSE
4457 typedef struct _uri_builder_property {
4458 BOOL change;
4459 const char *value;
4460 const char *expected_value;
4461 Uri_PROPERTY property;
4462 HRESULT expected;
4463 BOOL todo;
4464 } uri_builder_property;
4466 typedef struct _uri_builder_port {
4467 BOOL change;
4468 BOOL set;
4469 DWORD value;
4470 HRESULT expected;
4471 BOOL todo;
4472 } uri_builder_port;
4474 typedef struct _uri_builder_str_property {
4475 const char* expected;
4476 HRESULT result;
4477 BOOL todo;
4478 } uri_builder_str_property;
4480 typedef struct _uri_builder_dword_property {
4481 DWORD expected;
4482 HRESULT result;
4483 BOOL todo;
4484 } uri_builder_dword_property;
4486 typedef struct _uri_builder_test {
4487 const char *uri;
4488 DWORD create_flags;
4489 HRESULT create_builder_expected;
4490 BOOL create_builder_todo;
4492 uri_builder_property properties[URI_BUILDER_STR_PROPERTY_COUNT];
4494 uri_builder_port port_prop;
4496 DWORD uri_flags;
4497 HRESULT uri_hres;
4498 BOOL uri_todo;
4500 DWORD uri_simple_encode_flags;
4501 HRESULT uri_simple_hres;
4502 BOOL uri_simple_todo;
4504 DWORD uri_with_flags;
4505 DWORD uri_with_builder_flags;
4506 DWORD uri_with_encode_flags;
4507 HRESULT uri_with_hres;
4508 BOOL uri_with_todo;
4510 uri_builder_str_property expected_str_props[URI_STR_PROPERTY_COUNT];
4511 uri_builder_dword_property expected_dword_props[URI_DWORD_PROPERTY_COUNT];
4512 } uri_builder_test;
4514 static const uri_builder_test uri_builder_tests[] = {
4515 { "http://google.com/",0,S_OK,FALSE,
4517 {TRUE,"#fragment",NULL,Uri_PROPERTY_FRAGMENT,S_OK,FALSE},
4518 {TRUE,"password",NULL,Uri_PROPERTY_PASSWORD,S_OK,FALSE},
4519 {TRUE,"?query=x",NULL,Uri_PROPERTY_QUERY,S_OK,FALSE},
4520 {TRUE,"username",NULL,Uri_PROPERTY_USER_NAME,S_OK,FALSE}
4522 {FALSE},
4523 0,S_OK,TRUE,
4524 0,S_OK,TRUE,
4525 0,0,0,S_OK,TRUE,
4527 {"http://username:password@google.com/?query=x#fragment",S_OK},
4528 {"username:password@google.com",S_OK},
4529 {"http://google.com/?query=x#fragment",S_OK},
4530 {"google.com",S_OK},
4531 {"",S_FALSE},
4532 {"#fragment",S_OK},
4533 {"google.com",S_OK},
4534 {"password",S_OK},
4535 {"/",S_OK},
4536 {"/?query=x",S_OK},
4537 {"?query=x",S_OK},
4538 {"http://username:password@google.com/?query=x#fragment",S_OK},
4539 {"http",S_OK},
4540 {"username:password",S_OK},
4541 {"username",S_OK}
4544 {Uri_HOST_DNS,S_OK},
4545 {80,S_OK},
4546 {URL_SCHEME_HTTP,S_OK},
4547 {URLZONE_INVALID,E_NOTIMPL}
4550 { "http://google.com/",0,S_OK,FALSE,
4552 {TRUE,"test",NULL,Uri_PROPERTY_SCHEME_NAME,S_OK,FALSE}
4554 {TRUE,TRUE,120,S_OK,FALSE},
4555 0,S_OK,TRUE,
4556 0,S_OK,TRUE,
4557 0,0,0,S_OK,TRUE,
4559 {"test://google.com:120/",S_OK},
4560 {"google.com:120",S_OK},
4561 {"test://google.com:120/",S_OK},
4562 {"google.com",S_OK},
4563 {"",S_FALSE},
4564 {"",S_FALSE},
4565 {"google.com",S_OK},
4566 {"",S_FALSE},
4567 {"/",S_OK},
4568 {"/",S_OK},
4569 {"",S_FALSE},
4570 {"test://google.com:120/",S_OK},
4571 {"test",S_OK},
4572 {"",S_FALSE},
4573 {"",S_FALSE}
4576 {Uri_HOST_DNS,S_OK},
4577 {120,S_OK},
4578 {URL_SCHEME_UNKNOWN,S_OK},
4579 {URLZONE_INVALID,E_NOTIMPL}
4582 { "/Test/test dir",Uri_CREATE_ALLOW_RELATIVE,S_OK,FALSE,
4584 {TRUE,"http",NULL,Uri_PROPERTY_SCHEME_NAME,S_OK,FALSE},
4585 {TRUE,"::192.2.3.4",NULL,Uri_PROPERTY_HOST,S_OK,FALSE},
4586 {TRUE,NULL,NULL,Uri_PROPERTY_PATH,S_OK,FALSE}
4588 {FALSE},
4589 0,S_OK,TRUE,
4590 0,S_OK,TRUE,
4591 0,0,0,S_OK,TRUE,
4593 {"http://[::192.2.3.4]/",S_OK},
4594 {"[::192.2.3.4]",S_OK},
4595 {"http://[::192.2.3.4]/",S_OK},
4596 {"",S_FALSE},
4597 {"",S_FALSE},
4598 {"",S_FALSE},
4599 {"::192.2.3.4",S_OK},
4600 {"",S_FALSE},
4601 {"/",S_OK},
4602 {"/",S_OK},
4603 {"",S_FALSE},
4604 {"http://[::192.2.3.4]/",S_OK},
4605 {"http",S_OK},
4606 {"",S_FALSE},
4607 {"",S_FALSE}
4610 {Uri_HOST_IPV6,S_OK},
4611 {80,S_OK},
4612 {URL_SCHEME_HTTP,S_OK},
4613 {URLZONE_INVALID,E_NOTIMPL}
4616 { "http://google.com/",0,S_OK,FALSE,
4618 {TRUE,"Frag","#Frag",Uri_PROPERTY_FRAGMENT,S_OK,FALSE}
4620 {FALSE},
4621 0,S_OK,TRUE,
4622 0,S_OK,TRUE,
4623 0,0,0,S_OK,TRUE,
4625 {"http://google.com/#Frag",S_OK},
4626 {"google.com",S_OK},
4627 {"http://google.com/#Frag",S_OK},
4628 {"google.com",S_OK},
4629 {"",S_FALSE},
4630 {"#Frag",S_OK},
4631 {"google.com",S_OK},
4632 {"",S_FALSE},
4633 {"/",S_OK},
4634 {"/",S_OK},
4635 {"",S_FALSE},
4636 {"http://google.com/#Frag",S_OK},
4637 {"http",S_OK},
4638 {"",S_FALSE},
4639 {"",S_FALSE}
4642 {Uri_HOST_DNS,S_OK},
4643 {80,S_OK},
4644 {URL_SCHEME_HTTP,S_OK},
4645 {URLZONE_INVALID,E_NOTIMPL}
4648 { "http://google.com/",0,S_OK,FALSE,
4650 {TRUE,"","#",Uri_PROPERTY_FRAGMENT,S_OK,FALSE},
4652 {FALSE},
4653 0,S_OK,TRUE,
4654 0,S_OK,TRUE,
4655 0,0,0,S_OK,TRUE,
4657 {"http://google.com/#",S_OK},
4658 {"google.com",S_OK},
4659 {"http://google.com/#",S_OK},
4660 {"google.com",S_OK},
4661 {"",S_FALSE},
4662 {"#",S_OK},
4663 {"google.com",S_OK},
4664 {"",S_FALSE},
4665 {"/",S_OK},
4666 {"/",S_OK},
4667 {"",S_FALSE},
4668 {"http://google.com/#",S_OK},
4669 {"http",S_OK},
4670 {"",S_FALSE},
4671 {"",S_FALSE}
4674 {Uri_HOST_DNS,S_OK},
4675 {80,S_OK},
4676 {URL_SCHEME_HTTP,S_OK},
4677 {URLZONE_INVALID,E_NOTIMPL}
4680 { "http://google.com/",0,S_OK,FALSE,
4682 {TRUE,":password",NULL,Uri_PROPERTY_PASSWORD,S_OK,FALSE}
4684 {FALSE},
4685 0,S_OK,TRUE,
4686 0,S_OK,TRUE,
4687 0,0,0,S_OK,TRUE,
4689 {"http://::password@google.com/",S_OK},
4690 {"::password@google.com",S_OK},
4691 {"http://google.com/",S_OK},
4692 {"google.com",S_OK},
4693 {"",S_FALSE},
4694 {"",S_FALSE},
4695 {"google.com",S_OK},
4696 {":password",S_OK},
4697 {"/",S_OK},
4698 {"/",S_OK},
4699 {"",S_FALSE},
4700 {"http://::password@google.com/",S_OK},
4701 {"http",S_OK},
4702 {"::password",S_OK},
4703 {"",S_FALSE}
4706 {Uri_HOST_DNS,S_OK},
4707 {80,S_OK},
4708 {URL_SCHEME_HTTP,S_OK},
4709 {URLZONE_INVALID,E_NOTIMPL}
4712 { "test/test",Uri_CREATE_ALLOW_RELATIVE,S_OK,FALSE,
4714 {TRUE,"password",NULL,Uri_PROPERTY_PASSWORD,S_OK,FALSE}
4716 {FALSE},
4717 Uri_CREATE_ALLOW_RELATIVE,S_OK,TRUE,
4718 0,S_OK,TRUE,
4719 Uri_CREATE_ALLOW_RELATIVE,0,0,S_OK,TRUE,
4721 {":password@test/test",S_OK},
4722 {":password@",S_OK},
4723 {":password@test/test",S_OK},
4724 {"",S_FALSE},
4725 {"",S_FALSE},
4726 {"",S_FALSE},
4727 {"",S_FALSE},
4728 {"password",S_OK},
4729 {"test/test",S_OK},
4730 {"test/test",S_OK},
4731 {"",S_FALSE},
4732 {":password@test/test",S_OK},
4733 {"",S_FALSE},
4734 {":password",S_OK},
4735 {"",S_FALSE}
4738 {Uri_HOST_UNKNOWN,S_OK},
4739 {0,S_FALSE},
4740 {URL_SCHEME_UNKNOWN,S_OK},
4741 {URLZONE_INVALID,E_NOTIMPL}
4744 { "http://google.com/",0,S_OK,FALSE,
4746 {TRUE,"test/test",NULL,Uri_PROPERTY_PATH,S_OK,FALSE},
4748 {FALSE},
4749 0,S_OK,TRUE,
4750 0,S_OK,TRUE,
4751 0,0,0,S_OK,TRUE,
4753 {"http://google.com/test/test",S_OK},
4754 {"google.com",S_OK},
4755 {"http://google.com/test/test",S_OK},
4756 {"google.com",S_OK},
4757 {"",S_FALSE},
4758 {"",S_FALSE},
4759 {"google.com",S_OK},
4760 {"",S_FALSE},
4761 {"/test/test",S_OK},
4762 {"/test/test",S_OK},
4763 {"",S_FALSE},
4764 {"http://google.com/test/test",S_OK},
4765 {"http",S_OK},
4766 {"",S_FALSE},
4767 {"",S_FALSE}
4770 {Uri_HOST_DNS,S_OK},
4771 {80,S_OK},
4772 {URL_SCHEME_HTTP,S_OK},
4773 {URLZONE_INVALID,E_NOTIMPL}
4776 { "zip:testing/test",0,S_OK,FALSE,
4778 {TRUE,"test",NULL,Uri_PROPERTY_PATH,S_OK,FALSE},
4780 {FALSE},
4781 0,S_OK,TRUE,
4782 0,S_OK,TRUE,
4783 0,0,0,S_OK,TRUE,
4785 {"zip:test",S_OK},
4786 {"",S_FALSE},
4787 {"zip:test",S_OK},
4788 {"",S_FALSE},
4789 {"",S_FALSE},
4790 {"",S_FALSE},
4791 {"",S_FALSE},
4792 {"",S_FALSE},
4793 {"test",S_OK},
4794 {"test",S_OK},
4795 {"",S_FALSE},
4796 {"zip:test",S_OK},
4797 {"zip",S_OK},
4798 {"",S_FALSE},
4799 {"",S_FALSE}
4802 {Uri_HOST_UNKNOWN,S_OK},
4803 {0,S_FALSE},
4804 {URL_SCHEME_UNKNOWN,S_OK},
4805 {URLZONE_INVALID,E_NOTIMPL}
4808 { "http://google.com/",0,S_OK,FALSE,
4810 {FALSE},
4812 /* 555 will be returned from GetPort even though FALSE was passed as the hasPort parameter. */
4813 {TRUE,FALSE,555,S_OK,FALSE},
4814 0,S_OK,TRUE,
4815 0,S_OK,TRUE,
4816 0,0,0,S_OK,TRUE,
4818 {"http://google.com/",S_OK},
4819 {"google.com",S_OK},
4820 {"http://google.com/",S_OK},
4821 {"google.com",S_OK},
4822 {"",S_FALSE},
4823 {"",S_FALSE},
4824 {"google.com",S_OK},
4825 {"",S_FALSE},
4826 {"/",S_OK},
4827 {"/",S_OK},
4828 {"",S_FALSE},
4829 {"http://google.com/",S_OK},
4830 {"http",S_OK},
4831 {"",S_FALSE},
4832 {"",S_FALSE}
4835 {Uri_HOST_DNS,S_OK},
4836 /* Still returns 80, even though earlier the port was disabled. */
4837 {80,S_OK},
4838 {URL_SCHEME_HTTP,S_OK},
4839 {URLZONE_INVALID,E_NOTIMPL}
4842 { "http://google.com/",0,S_OK,FALSE,
4844 {FALSE},
4846 /* Instead of getting "TRUE" back as the "hasPort" parameter in GetPort,
4847 * you'll get 122345 instead.
4849 {TRUE,122345,222,S_OK,FALSE},
4850 0,S_OK,TRUE,
4851 0,S_OK,TRUE,
4852 0,0,0,S_OK,TRUE,
4854 {"http://google.com:222/",S_OK},
4855 {"google.com:222",S_OK},
4856 {"http://google.com:222/",S_OK},
4857 {"google.com",S_OK},
4858 {"",S_FALSE},
4859 {"",S_FALSE},
4860 {"google.com",S_OK},
4861 {"",S_FALSE},
4862 {"/",S_OK},
4863 {"/",S_OK},
4864 {"",S_FALSE},
4865 {"http://google.com:222/",S_OK},
4866 {"http",S_OK},
4867 {"",S_FALSE},
4868 {"",S_FALSE}
4871 {Uri_HOST_DNS,S_OK},
4872 {222,S_OK},
4873 {URL_SCHEME_HTTP,S_OK},
4874 {URLZONE_INVALID,E_NOTIMPL}
4877 /* IUri's created with the IUriBuilder can have ports that exceed USHORT_MAX. */
4878 { "http://google.com/",0,S_OK,FALSE,
4880 {FALSE},
4882 {TRUE,TRUE,999999,S_OK,FALSE},
4883 0,S_OK,TRUE,
4884 0,S_OK,TRUE,
4885 0,0,0,S_OK,TRUE,
4887 {"http://google.com:999999/",S_OK},
4888 {"google.com:999999",S_OK},
4889 {"http://google.com:999999/",S_OK},
4890 {"google.com",S_OK},
4891 {"",S_FALSE},
4892 {"",S_FALSE},
4893 {"google.com",S_OK},
4894 {"",S_FALSE},
4895 {"/",S_OK},
4896 {"/",S_OK},
4897 {"",S_FALSE},
4898 {"http://google.com:999999/",S_OK},
4899 {"http",S_OK},
4900 {"",S_FALSE},
4901 {"",S_FALSE}
4904 {Uri_HOST_DNS,S_OK},
4905 {999999,S_OK},
4906 {URL_SCHEME_HTTP,S_OK},
4907 {URLZONE_INVALID,E_NOTIMPL}
4910 { "http://google.com/",0,S_OK,FALSE,
4912 {TRUE,"test","?test",Uri_PROPERTY_QUERY,S_OK,FALSE},
4915 {FALSE},
4916 0,S_OK,TRUE,
4917 0,S_OK,TRUE,
4918 0,0,0,S_OK,TRUE,
4920 {"http://google.com/?test",S_OK},
4921 {"google.com",S_OK},
4922 {"http://google.com/?test",S_OK},
4923 {"google.com",S_OK},
4924 {"",S_FALSE},
4925 {"",S_FALSE},
4926 {"google.com",S_OK},
4927 {"",S_FALSE},
4928 {"/",S_OK},
4929 {"/?test",S_OK},
4930 {"?test",S_OK},
4931 {"http://google.com/?test",S_OK},
4932 {"http",S_OK},
4933 {"",S_FALSE},
4934 {"",S_FALSE}
4937 {Uri_HOST_DNS,S_OK},
4938 {80,S_OK},
4939 {URL_SCHEME_HTTP,S_OK},
4940 {URLZONE_INVALID,E_NOTIMPL}
4943 { "http://:password@google.com/",0,S_OK,FALSE,
4945 {FALSE},
4947 {FALSE},
4948 0,S_OK,FALSE,
4949 0,S_OK,FALSE,
4950 0,0,0,S_OK,FALSE,
4952 {"http://:password@google.com/",S_OK},
4953 {":password@google.com",S_OK},
4954 {"http://google.com/",S_OK},
4955 {"google.com",S_OK},
4956 {"",S_FALSE},
4957 {"",S_FALSE},
4958 {"google.com",S_OK},
4959 {"password",S_OK},
4960 {"/",S_OK},
4961 {"/",S_OK},
4962 {"",S_FALSE},
4963 {"http://:password@google.com/",S_OK},
4964 {"http",S_OK},
4965 {":password",S_OK},
4966 {"",S_FALSE}
4969 {Uri_HOST_DNS,S_OK},
4970 {80,S_OK},
4971 {URL_SCHEME_HTTP,S_OK},
4972 {URLZONE_INVALID,E_NOTIMPL}
4975 /* IUriBuilder doesn't need a base IUri to build a IUri. */
4976 { NULL,0,S_OK,FALSE,
4978 {TRUE,"http",NULL,Uri_PROPERTY_SCHEME_NAME,S_OK,FALSE},
4979 {TRUE,"google.com",NULL,Uri_PROPERTY_HOST,S_OK,FALSE}
4981 {FALSE},
4982 0,S_OK,TRUE,
4983 0,S_OK,TRUE,
4984 0,0,0,S_OK,TRUE,
4986 {"http://google.com/",S_OK},
4987 {"google.com",S_OK},
4988 {"http://google.com/",S_OK},
4989 {"google.com",S_OK},
4990 {"",S_FALSE},
4991 {"",S_FALSE},
4992 {"google.com",S_OK},
4993 {"",S_FALSE},
4994 {"/",S_OK},
4995 {"/",S_OK},
4996 {"",S_FALSE},
4997 {"http://google.com/",S_OK},
4998 {"http",S_OK},
4999 {"",S_FALSE},
5000 {"",S_FALSE}
5003 {Uri_HOST_DNS,S_OK},
5004 {80,S_OK},
5005 {URL_SCHEME_HTTP,S_OK},
5006 {URLZONE_INVALID,E_NOTIMPL}
5009 /* Can't set the scheme name to NULL. */
5010 { "zip://google.com/",0,S_OK,FALSE,
5012 {TRUE,NULL,"zip",Uri_PROPERTY_SCHEME_NAME,E_INVALIDARG,FALSE}
5014 {FALSE},
5015 0,S_OK,FALSE,
5016 0,S_OK,FALSE,
5017 0,0,0,S_OK,FALSE,
5019 {"zip://google.com/",S_OK},
5020 {"google.com",S_OK},
5021 {"zip://google.com/",S_OK},
5022 {"google.com",S_OK},
5023 {"",S_FALSE},
5024 {"",S_FALSE},
5025 {"google.com",S_OK},
5026 {"",S_FALSE},
5027 {"/",S_OK},
5028 {"/",S_OK},
5029 {"",S_FALSE},
5030 {"zip://google.com/",S_OK},
5031 {"zip",S_OK},
5032 {"",S_FALSE},
5033 {"",S_FALSE}
5036 {Uri_HOST_DNS,S_OK},
5037 {0,S_FALSE},
5038 {URL_SCHEME_UNKNOWN,S_OK},
5039 {URLZONE_INVALID,E_NOTIMPL}
5042 /* Can't set the scheme name to an empty string. */
5043 { "zip://google.com/",0,S_OK,FALSE,
5045 {TRUE,"","zip",Uri_PROPERTY_SCHEME_NAME,E_INVALIDARG,FALSE}
5047 {FALSE},
5048 0,S_OK,FALSE,
5049 0,S_OK,FALSE,
5050 0,0,0,S_OK,FALSE,
5052 {"zip://google.com/",S_OK},
5053 {"google.com",S_OK},
5054 {"zip://google.com/",S_OK},
5055 {"google.com",S_OK},
5056 {"",S_FALSE},
5057 {"",S_FALSE},
5058 {"google.com",S_OK},
5059 {"",S_FALSE},
5060 {"/",S_OK},
5061 {"/",S_OK},
5062 {"",S_FALSE},
5063 {"zip://google.com/",S_OK},
5064 {"zip",S_OK},
5065 {"",S_FALSE},
5066 {"",S_FALSE}
5069 {Uri_HOST_DNS,S_OK},
5070 {0,S_FALSE},
5071 {URL_SCHEME_UNKNOWN,S_OK},
5072 {URLZONE_INVALID,E_NOTIMPL}
5075 /* -1 to CreateUri makes it use the same flags as the base IUri was created with.
5076 * CreateUriSimple always uses the flags the base IUri was created with (if any).
5078 { "http://google.com/../../",Uri_CREATE_NO_CANONICALIZE,S_OK,FALSE,
5079 {{FALSE}},
5080 {FALSE},
5081 -1,S_OK,FALSE,
5082 0,S_OK,FALSE,
5083 0,UriBuilder_USE_ORIGINAL_FLAGS,0,S_OK,FALSE,
5085 {"http://google.com/../../",S_OK},
5086 {"google.com",S_OK},
5087 {"http://google.com/../../",S_OK},
5088 {"google.com",S_OK},
5089 {"",S_FALSE},
5090 {"",S_FALSE},
5091 {"google.com",S_OK},
5092 {"",S_FALSE},
5093 {"/../../",S_OK},
5094 {"/../../",S_OK},
5095 {"",S_FALSE},
5096 {"http://google.com/../../",S_OK},
5097 {"http",S_OK},
5098 {"",S_FALSE},
5099 {"",S_FALSE}
5102 {Uri_HOST_DNS,S_OK},
5103 {80,S_OK},
5104 {URL_SCHEME_HTTP,S_OK},
5105 {URLZONE_INVALID,E_NOTIMPL}
5108 { "http://google.com/",0,S_OK,FALSE,
5110 {TRUE,"#Fr<|>g",NULL,Uri_PROPERTY_FRAGMENT,S_OK,FALSE}
5112 {FALSE},
5113 -1,S_OK,TRUE,
5114 0,S_OK,TRUE,
5115 Uri_CREATE_NO_DECODE_EXTRA_INFO,UriBuilder_USE_ORIGINAL_FLAGS,0,S_OK,TRUE,
5117 {"http://google.com/#Fr%3C%7C%3Eg",S_OK},
5118 {"google.com",S_OK},
5119 {"http://google.com/#Fr%3C%7C%3Eg",S_OK},
5120 {"google.com",S_OK},
5121 {"",S_FALSE},
5122 {"#Fr%3C%7C%3Eg",S_OK},
5123 {"google.com",S_OK},
5124 {"",S_FALSE},
5125 {"/",S_OK},
5126 {"/",S_OK},
5127 {"",S_FALSE},
5128 {"http://google.com/#Fr<|>g",S_OK},
5129 {"http",S_OK},
5130 {"",S_FALSE},
5131 {"",S_FALSE}
5134 {Uri_HOST_DNS,S_OK},
5135 {80,S_OK},
5136 {URL_SCHEME_HTTP,S_OK},
5137 {URLZONE_INVALID,E_NOTIMPL}
5140 { "http://google.com/",0,S_OK,FALSE,
5142 {TRUE,"#Fr<|>g",NULL,Uri_PROPERTY_FRAGMENT,S_OK,FALSE}
5144 {FALSE},
5145 Uri_CREATE_CANONICALIZE|Uri_CREATE_NO_CANONICALIZE,E_INVALIDARG,FALSE,
5146 0,S_OK,TRUE,
5147 Uri_CREATE_CANONICALIZE|Uri_CREATE_NO_CANONICALIZE,UriBuilder_USE_ORIGINAL_FLAGS,0,S_OK,TRUE,
5149 {"http://google.com/#Fr%3C%7C%3Eg",S_OK},
5150 {"google.com",S_OK},
5151 {"http://google.com/#Fr%3C%7C%3Eg",S_OK},
5152 {"google.com",S_OK},
5153 {"",S_FALSE},
5154 {"#Fr%3C%7C%3Eg",S_OK},
5155 {"google.com",S_OK},
5156 {"",S_FALSE},
5157 {"/",S_OK},
5158 {"/",S_OK},
5159 {"",S_FALSE},
5160 {"http://google.com/#Fr<|>g",S_OK},
5161 {"http",S_OK},
5162 {"",S_FALSE},
5163 {"",S_FALSE}
5166 {Uri_HOST_DNS,S_OK},
5167 {80,S_OK},
5168 {URL_SCHEME_HTTP,S_OK},
5169 {URLZONE_INVALID,E_NOTIMPL}
5172 { NULL,0,S_OK,FALSE,
5174 {TRUE,"/test/test/",NULL,Uri_PROPERTY_PATH,S_OK,FALSE},
5175 {TRUE,"#Fr<|>g",NULL,Uri_PROPERTY_FRAGMENT,S_OK,FALSE}
5177 {FALSE},
5178 0,INET_E_INVALID_URL,FALSE,
5179 0,INET_E_INVALID_URL,FALSE,
5180 0,0,0,INET_E_INVALID_URL,FALSE
5182 { "http://google.com/",0,S_OK,FALSE,
5184 {TRUE,"ht%xxtp",NULL,Uri_PROPERTY_SCHEME_NAME,S_OK,FALSE}
5186 {FALSE},
5187 0,INET_E_INVALID_URL,FALSE,
5188 0,INET_E_INVALID_URL,FALSE,
5189 0,0,0,INET_E_INVALID_URL,FALSE
5191 /* File scheme's can't have a username set. */
5192 { "file://google.com/",0,S_OK,FALSE,
5194 {TRUE,"username",NULL,Uri_PROPERTY_USER_NAME,S_OK,FALSE}
5196 {FALSE},
5197 0,INET_E_INVALID_URL,FALSE,
5198 0,INET_E_INVALID_URL,FALSE,
5199 0,0,0,INET_E_INVALID_URL,FALSE
5201 /* File schemes can't have a password set. */
5202 { "file://google.com/",0,S_OK,FALSE,
5204 {TRUE,"password",NULL,Uri_PROPERTY_PASSWORD,S_OK,FALSE}
5206 {FALSE},
5207 0,INET_E_INVALID_URL,FALSE,
5208 0,INET_E_INVALID_URL,FALSE,
5209 0,0,0,INET_E_INVALID_URL,FALSE
5211 /* UserName can't contain any character that is a delimeter for another
5212 * component that appears after it in a normal URI.
5214 { "http://google.com/",0,S_OK,FALSE,
5216 {TRUE,"user:pass",NULL,Uri_PROPERTY_USER_NAME,S_OK,FALSE}
5218 {FALSE},
5219 0,INET_E_INVALID_URL,FALSE,
5220 0,INET_E_INVALID_URL,FALSE,
5221 0,0,0,INET_E_INVALID_URL,FALSE
5223 { "http://google.com/",0,S_OK,FALSE,
5225 {TRUE,"user@google.com",NULL,Uri_PROPERTY_USER_NAME,S_OK,FALSE}
5227 {FALSE},
5228 0,INET_E_INVALID_URL,FALSE,
5229 0,INET_E_INVALID_URL,FALSE,
5230 0,0,0,INET_E_INVALID_URL,FALSE
5232 { "http://google.com/",0,S_OK,FALSE,
5234 {TRUE,"user/path",NULL,Uri_PROPERTY_USER_NAME,S_OK,FALSE}
5236 {FALSE},
5237 0,INET_E_INVALID_URL,FALSE,
5238 0,INET_E_INVALID_URL,FALSE,
5239 0,0,0,INET_E_INVALID_URL,FALSE
5241 { "http://google.com/",0,S_OK,FALSE,
5243 {TRUE,"user?Query",NULL,Uri_PROPERTY_USER_NAME,S_OK,FALSE}
5245 {FALSE},
5246 0,INET_E_INVALID_URL,FALSE,
5247 0,INET_E_INVALID_URL,FALSE,
5248 0,0,0,INET_E_INVALID_URL,FALSE
5250 { "http://google.com/",0,S_OK,FALSE,
5252 {TRUE,"user#Frag",NULL,Uri_PROPERTY_USER_NAME,S_OK,FALSE}
5254 {FALSE},
5255 0,INET_E_INVALID_URL,FALSE,
5256 0,INET_E_INVALID_URL,FALSE,
5257 0,0,0,INET_E_INVALID_URL,FALSE
5259 { "http://google.com/",0,S_OK,FALSE,
5261 {TRUE,"pass@google.com",NULL,Uri_PROPERTY_PASSWORD,S_OK,FALSE}
5263 {FALSE},
5264 0,INET_E_INVALID_URL,FALSE,
5265 0,INET_E_INVALID_URL,FALSE,
5266 0,0,0,INET_E_INVALID_URL,FALSE
5268 { "http://google.com/",0,S_OK,FALSE,
5270 {TRUE,"pass/path",NULL,Uri_PROPERTY_PASSWORD,S_OK,FALSE}
5272 {FALSE},
5273 0,INET_E_INVALID_URL,FALSE,
5274 0,INET_E_INVALID_URL,FALSE,
5275 0,0,0,INET_E_INVALID_URL,FALSE
5277 { "http://google.com/",0,S_OK,FALSE,
5279 {TRUE,"pass?query",NULL,Uri_PROPERTY_PASSWORD,S_OK,FALSE}
5281 {FALSE},
5282 0,INET_E_INVALID_URL,FALSE,
5283 0,INET_E_INVALID_URL,FALSE,
5284 0,0,0,INET_E_INVALID_URL,FALSE
5286 { "http://google.com/",0,S_OK,FALSE,
5288 {TRUE,"pass#frag",NULL,Uri_PROPERTY_PASSWORD,S_OK,FALSE}
5290 {FALSE},
5291 0,INET_E_INVALID_URL,FALSE,
5292 0,INET_E_INVALID_URL,FALSE,
5293 0,0,0,INET_E_INVALID_URL,FALSE
5295 { "http://google.com/",0,S_OK,FALSE,
5297 {TRUE,"winehq.org/test",NULL,Uri_PROPERTY_HOST,S_OK,FALSE}
5299 {FALSE},
5300 0,INET_E_INVALID_URL,FALSE,
5301 0,INET_E_INVALID_URL,FALSE,
5302 0,0,0,INET_E_INVALID_URL,FALSE
5304 { "http://google.com/",0,S_OK,FALSE,
5306 {TRUE,"winehq.org?test",NULL,Uri_PROPERTY_HOST,S_OK,FALSE}
5308 {FALSE},
5309 0,INET_E_INVALID_URL,FALSE,
5310 0,INET_E_INVALID_URL,FALSE,
5311 0,0,0,INET_E_INVALID_URL,FALSE
5313 { "http://google.com/",0,S_OK,FALSE,
5315 {TRUE,"winehq.org#test",NULL,Uri_PROPERTY_HOST,S_OK,FALSE}
5317 {FALSE},
5318 0,INET_E_INVALID_URL,FALSE,
5319 0,INET_E_INVALID_URL,FALSE,
5320 0,0,0,INET_E_INVALID_URL,FALSE
5322 /* Hostname is allowed to contain a ':' (even for known scheme types). */
5323 { "http://google.com/",0,S_OK,FALSE,
5325 {TRUE,"winehq.org:test",NULL,Uri_PROPERTY_HOST,S_OK,FALSE},
5327 {FALSE},
5328 0,S_OK,TRUE,
5329 0,S_OK,TRUE,
5330 0,0,0,S_OK,TRUE,
5332 {"http://winehq.org:test/",S_OK},
5333 {"winehq.org:test",S_OK},
5334 {"http://winehq.org:test/",S_OK},
5335 {"winehq.org:test",S_OK},
5336 {"",S_FALSE},
5337 {"",S_FALSE},
5338 {"winehq.org:test",S_OK},
5339 {"",S_FALSE},
5340 {"/",S_OK},
5341 {"/",S_OK},
5342 {"",S_FALSE},
5343 {"http://winehq.org:test/",S_OK},
5344 {"http",S_OK},
5345 {"",S_FALSE},
5346 {"",S_FALSE}
5349 {Uri_HOST_DNS,S_OK},
5350 {80,S_OK},
5351 {URL_SCHEME_HTTP,S_OK},
5352 {URLZONE_INVALID,E_NOTIMPL}
5355 /* Can't set the host name to NULL. */
5356 { "http://google.com/",0,S_OK,FALSE,
5358 {TRUE,NULL,"google.com",Uri_PROPERTY_HOST,E_INVALIDARG,FALSE}
5360 {FALSE},
5361 0,S_OK,FALSE,
5362 0,S_OK,FALSE,
5363 0,0,0,S_OK,FALSE,
5365 {"http://google.com/",S_OK},
5366 {"google.com",S_OK},
5367 {"http://google.com/",S_OK},
5368 {"google.com",S_OK},
5369 {"",S_FALSE},
5370 {"",S_FALSE},
5371 {"google.com",S_OK},
5372 {"",S_FALSE},
5373 {"/",S_OK},
5374 {"/",S_OK},
5375 {"",S_FALSE},
5376 {"http://google.com/",S_OK},
5377 {"http",S_OK},
5378 {"",S_FALSE},
5379 {"",S_FALSE}
5382 {Uri_HOST_DNS,S_OK},
5383 {80,S_OK},
5384 {URL_SCHEME_HTTP,S_OK},
5385 {URLZONE_INVALID,E_NOTIMPL}
5388 /* Can set the host name to an empty string. */
5389 { "http://google.com/",0,S_OK,FALSE,
5391 {TRUE,"",NULL,Uri_PROPERTY_HOST,S_OK,FALSE}
5393 {FALSE},
5394 0,S_OK,TRUE,
5395 0,S_OK,TRUE,
5396 0,0,0,S_OK,TRUE,
5398 {"http:///",S_OK},
5399 {"",S_OK},
5400 {"http:///",S_OK},
5401 {"",S_FALSE},
5402 {"",S_FALSE},
5403 {"",S_FALSE},
5404 {"",S_OK},
5405 {"",S_FALSE},
5406 {"/",S_OK},
5407 {"/",S_OK},
5408 {"",S_FALSE},
5409 {"http:///",S_OK},
5410 {"http",S_OK},
5411 {"",S_FALSE},
5412 {"",S_FALSE}
5415 {Uri_HOST_UNKNOWN,S_OK},
5416 {80,S_OK},
5417 {URL_SCHEME_HTTP,S_OK},
5418 {URLZONE_INVALID,E_NOTIMPL}
5421 { "http://google.com/",0,S_OK,FALSE,
5423 {TRUE,"/path?query",NULL,Uri_PROPERTY_PATH,S_OK,FALSE}
5425 {FALSE},
5426 0,INET_E_INVALID_URL,FALSE,
5427 0,INET_E_INVALID_URL,FALSE,
5428 0,0,0,INET_E_INVALID_URL,FALSE
5430 { "http://google.com/",0,S_OK,FALSE,
5432 {TRUE,"/path#test",NULL,Uri_PROPERTY_PATH,S_OK,FALSE}
5434 {FALSE},
5435 0,INET_E_INVALID_URL,FALSE,
5436 0,INET_E_INVALID_URL,FALSE,
5437 0,0,0,INET_E_INVALID_URL,FALSE
5439 { "http://google.com/",0,S_OK,FALSE,
5441 {TRUE,"?path#test",NULL,Uri_PROPERTY_QUERY,S_OK,FALSE}
5443 {FALSE},
5444 0,INET_E_INVALID_URL,FALSE,
5445 0,INET_E_INVALID_URL,FALSE,
5446 0,0,0,INET_E_INVALID_URL,FALSE
5450 typedef struct _uri_builder_remove_test {
5451 const char *uri;
5452 DWORD create_flags;
5453 HRESULT create_builder_expected;
5454 BOOL create_builder_todo;
5456 DWORD remove_properties;
5457 HRESULT remove_expected;
5458 BOOL remove_todo;
5460 const char *expected_uri;
5461 DWORD expected_flags;
5462 HRESULT expected_hres;
5463 BOOL expected_todo;
5464 } uri_builder_remove_test;
5466 static const uri_builder_remove_test uri_builder_remove_tests[] = {
5467 { "http://google.com/test?test=y#Frag",0,S_OK,FALSE,
5468 Uri_HAS_FRAGMENT|Uri_HAS_PATH|Uri_HAS_QUERY,S_OK,FALSE,
5469 "http://google.com/",0,S_OK,TRUE
5471 { "http://user:pass@winehq.org/",0,S_OK,FALSE,
5472 Uri_HAS_USER_NAME|Uri_HAS_PASSWORD,S_OK,FALSE,
5473 "http://winehq.org/",0,S_OK,TRUE
5475 { "zip://google.com?Test=x",0,S_OK,FALSE,
5476 Uri_HAS_HOST,S_OK,FALSE,
5477 "zip:/?Test=x",0,S_OK,TRUE
5479 /* Doesn't remove the whole userinfo component. */
5480 { "http://username:pass@google.com/",0,S_OK,FALSE,
5481 Uri_HAS_USER_INFO,S_OK,FALSE,
5482 "http://username:pass@google.com/",0,S_OK,FALSE
5484 /* Doesn't remove the domain. */
5485 { "http://google.com/",0,S_OK,FALSE,
5486 Uri_HAS_DOMAIN,S_OK,FALSE,
5487 "http://google.com/",0,S_OK,FALSE
5489 { "http://google.com:120/",0,S_OK,FALSE,
5490 Uri_HAS_AUTHORITY,S_OK,FALSE,
5491 "http://google.com:120/",0,S_OK,FALSE
5493 { "http://google.com/test.com/",0,S_OK,FALSE,
5494 Uri_HAS_EXTENSION,S_OK,FALSE,
5495 "http://google.com/test.com/",0,S_OK,FALSE
5497 { "http://google.com/?test=x",0,S_OK,FALSE,
5498 Uri_HAS_PATH_AND_QUERY,S_OK,FALSE,
5499 "http://google.com/?test=x",0,S_OK,FALSE
5501 /* Can't remove the scheme name. */
5502 { "http://google.com/?test=x",0,S_OK,FALSE,
5503 Uri_HAS_SCHEME_NAME|Uri_HAS_QUERY,E_INVALIDARG,FALSE,
5504 "http://google.com/?test=x",0,S_OK,FALSE
5508 static inline LPWSTR a2w(LPCSTR str) {
5509 LPWSTR ret = NULL;
5511 if(str) {
5512 DWORD len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
5513 ret = HeapAlloc(GetProcessHeap(), 0, len*sizeof(WCHAR));
5514 MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len);
5517 return ret;
5520 static inline BOOL heap_free(void* mem) {
5521 return HeapFree(GetProcessHeap(), 0, mem);
5524 static inline DWORD strcmp_aw(LPCSTR strA, LPCWSTR strB) {
5525 LPWSTR strAW = a2w(strA);
5526 DWORD ret = lstrcmpW(strAW, strB);
5527 heap_free(strAW);
5528 return ret;
5531 static inline ULONG get_refcnt(IUri *uri) {
5532 IUri_AddRef(uri);
5533 return IUri_Release(uri);
5536 static void change_property(IUriBuilder *builder, const uri_builder_property *prop,
5537 DWORD test_index) {
5538 HRESULT hr;
5539 LPWSTR valueW;
5541 valueW = a2w(prop->value);
5542 switch(prop->property) {
5543 case Uri_PROPERTY_FRAGMENT:
5544 hr = IUriBuilder_SetFragment(builder, valueW);
5545 if(prop->todo) {
5546 todo_wine {
5547 ok(hr == prop->expected,
5548 "Error: IUriBuilder_SetFragment returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
5549 hr, prop->expected, test_index);
5551 } else {
5552 ok(hr == prop->expected,
5553 "Error: IUriBuilder_SetFragment returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
5554 hr, prop->expected, test_index);
5556 break;
5557 case Uri_PROPERTY_HOST:
5558 hr = IUriBuilder_SetHost(builder, valueW);
5559 if(prop->todo) {
5560 todo_wine {
5561 ok(hr == prop->expected,
5562 "Error: IUriBuilder_SetHost returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
5563 hr, prop->expected, test_index);
5565 } else {
5566 ok(hr == prop->expected,
5567 "Error: IUriBuilder_SetHost returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
5568 hr, prop->expected, test_index);
5570 break;
5571 case Uri_PROPERTY_PASSWORD:
5572 hr = IUriBuilder_SetPassword(builder, valueW);
5573 if(prop->todo) {
5574 todo_wine {
5575 ok(hr == prop->expected,
5576 "Error: IUriBuilder_SetPassword returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
5577 hr, prop->expected, test_index);
5579 } else {
5580 ok(hr == prop->expected,
5581 "Error: IUriBuilder_SetPassword returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
5582 hr, prop->expected, test_index);
5584 break;
5585 case Uri_PROPERTY_PATH:
5586 hr = IUriBuilder_SetPath(builder, valueW);
5587 if(prop->todo) {
5588 todo_wine {
5589 ok(hr == prop->expected,
5590 "Error: IUriBuilder_SetPath returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
5591 hr, prop->expected, test_index);
5593 } else {
5594 ok(hr == prop->expected,
5595 "Error: IUriBuilder_SetPath returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
5596 hr, prop->expected, test_index);
5598 break;
5599 case Uri_PROPERTY_QUERY:
5600 hr = IUriBuilder_SetQuery(builder, valueW);
5601 if(prop->todo) {
5602 todo_wine {
5603 ok(hr == prop->expected,
5604 "Error: IUriBuilder_SetQuery returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
5605 hr, prop->expected, test_index);
5607 } else {
5608 ok(hr == prop->expected,
5609 "Error: IUriBuilder_SetQuery returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
5610 hr, prop->expected, test_index);
5612 break;
5613 case Uri_PROPERTY_SCHEME_NAME:
5614 hr = IUriBuilder_SetSchemeName(builder, valueW);
5615 if(prop->todo) {
5616 todo_wine {
5617 ok(hr == prop->expected,
5618 "Error: IUriBuilder_SetSchemeName returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
5619 hr, prop->expected, test_index);
5621 } else {
5622 ok(hr == prop->expected,
5623 "Error: IUriBuilder_SetSchemeName returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
5624 hr, prop->expected, test_index);
5626 break;
5627 case Uri_PROPERTY_USER_NAME:
5628 hr = IUriBuilder_SetUserName(builder, valueW);
5629 if(prop->todo) {
5630 todo_wine {
5631 ok(hr == prop->expected,
5632 "Error: IUriBuilder_SetUserName returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
5633 hr, prop->expected, test_index);
5635 } else {
5636 ok(hr == prop->expected,
5637 "Error: IUriBuilder_SetUserName returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
5638 hr, prop->expected, test_index);
5640 break;
5641 default:
5642 trace("Unsupported operation for %d on uri_builder_tests[%d].\n", prop->property, test_index);
5645 heap_free(valueW);
5649 * Simple tests to make sure the CreateUri function handles invalid flag combinations
5650 * correctly.
5652 static void test_CreateUri_InvalidFlags(void) {
5653 DWORD i;
5655 for(i = 0; i < sizeof(invalid_flag_tests)/sizeof(invalid_flag_tests[0]); ++i) {
5656 HRESULT hr;
5657 IUri *uri = (void*) 0xdeadbeef;
5659 hr = pCreateUri(http_urlW, invalid_flag_tests[i].flags, 0, &uri);
5660 ok(hr == invalid_flag_tests[i].expected, "Error: CreateUri returned 0x%08x, expected 0x%08x, flags=0x%08x\n",
5661 hr, invalid_flag_tests[i].expected, invalid_flag_tests[i].flags);
5662 ok(uri == NULL, "Error: expected the IUri to be NULL, but it was %p instead\n", uri);
5666 static void test_CreateUri_InvalidArgs(void) {
5667 HRESULT hr;
5668 IUri *uri = (void*) 0xdeadbeef;
5670 const WCHAR invalidW[] = {'i','n','v','a','l','i','d',0};
5671 static const WCHAR emptyW[] = {0};
5673 hr = pCreateUri(http_urlW, 0, 0, NULL);
5674 ok(hr == E_INVALIDARG, "Error: CreateUri returned 0x%08x, expected 0x%08x\n", hr, E_INVALIDARG);
5676 hr = pCreateUri(NULL, 0, 0, &uri);
5677 ok(hr == E_INVALIDARG, "Error: CreateUri returned 0x%08x, expected 0x%08x\n", hr, E_INVALIDARG);
5678 ok(uri == NULL, "Error: Expected the IUri to be NULL, but it was %p instead\n", uri);
5680 uri = (void*) 0xdeadbeef;
5681 hr = pCreateUri(invalidW, 0, 0, &uri);
5682 ok(hr == E_INVALIDARG, "Error: CreateUri returned 0x%08x, expected 0x%08x.\n", hr, E_INVALIDARG);
5683 ok(uri == NULL, "Error: Expected the IUri to be NULL, but it was %p instead\n", uri);
5685 uri = (void*) 0xdeadbeef;
5686 hr = pCreateUri(emptyW, 0, 0, &uri);
5687 ok(hr == E_INVALIDARG, "Error: CreateUri returned 0x%08x, expected 0x%08x.\n", hr, E_INVALIDARG);
5688 ok(uri == NULL, "Error: Expected the IUri to be NULL, but it was %p instead\n", uri);
5691 static void test_CreateUri_InvalidUri(void) {
5692 DWORD i;
5694 for(i = 0; i < sizeof(invalid_uri_tests)/sizeof(invalid_uri_tests[0]); ++i) {
5695 invalid_uri test = invalid_uri_tests[i];
5696 IUri *uri = NULL;
5697 LPWSTR uriW;
5698 HRESULT hr;
5700 uriW = a2w(test.uri);
5701 hr = pCreateUri(uriW, test.flags, 0, &uri);
5702 if(test.todo) {
5703 todo_wine {
5704 ok(hr == E_INVALIDARG, "Error: CreateUri returned 0x%08x, expected 0x%08x on invalid_uri_tests[%d].\n",
5705 hr, E_INVALIDARG, i);
5707 } else {
5708 ok(hr == E_INVALIDARG, "Error: CreateUri returned 0x%08x, expected 0x%08x on invalid_uri_tests[%d].\n",
5709 hr, E_INVALIDARG, i);
5711 if(uri) IUri_Release(uri);
5713 heap_free(uriW);
5717 static void test_IUri_GetPropertyBSTR(void) {
5718 IUri *uri = NULL;
5719 HRESULT hr;
5720 DWORD i;
5722 /* Make sure GetPropertyBSTR handles invalid args correctly. */
5723 hr = pCreateUri(http_urlW, 0, 0, &uri);
5724 ok(hr == S_OK, "Error: CreateUri returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
5725 if(SUCCEEDED(hr)) {
5726 BSTR received = NULL;
5728 hr = IUri_GetPropertyBSTR(uri, Uri_PROPERTY_RAW_URI, NULL, 0);
5729 ok(hr == E_POINTER, "Error: GetPropertyBSTR returned 0x%08x, expected 0x%08x.\n", hr, E_POINTER);
5731 /* Make sure it handles a invalid Uri_PROPERTY's correctly. */
5732 hr = IUri_GetPropertyBSTR(uri, Uri_PROPERTY_PORT, &received, 0);
5733 ok(hr == S_OK, "Error: GetPropertyBSTR returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
5734 ok(received != NULL, "Error: Expected the string not to be NULL.\n");
5735 ok(!SysStringLen(received), "Error: Expected the string to be of len=0 but it was %d instead.\n", SysStringLen(received));
5736 SysFreeString(received);
5738 /* Make sure it handles the ZONE property correctly. */
5739 received = NULL;
5740 hr = IUri_GetPropertyBSTR(uri, Uri_PROPERTY_ZONE, &received, 0);
5741 ok(hr == S_FALSE, "Error: GetPropertyBSTR returned 0x%08x, expected 0x%08x.\n", hr, S_FALSE);
5742 ok(received != NULL, "Error: Expected the string not to be NULL.\n");
5743 ok(!SysStringLen(received), "Error: Expected the string to be of len=0 but it was %d instead.\n", SysStringLen(received));
5744 SysFreeString(received);
5746 if(uri) IUri_Release(uri);
5748 for(i = 0; i < sizeof(uri_tests)/sizeof(uri_tests[0]); ++i) {
5749 uri_properties test = uri_tests[i];
5750 LPWSTR uriW;
5751 uri = NULL;
5753 uriW = a2w(test.uri);
5754 hr = pCreateUri(uriW, test.create_flags, 0, &uri);
5755 if(test.create_todo) {
5756 todo_wine {
5757 ok(hr == test.create_expected, "Error: CreateUri returned 0x%08x, expected 0x%08x. Failed on uri_tests[%d].\n",
5758 hr, test.create_expected, i);
5760 } else {
5761 ok(hr == test.create_expected, "Error: CreateUri returned 0x%08x, expected 0x%08x. Failed on uri_tests[%d].\n",
5762 hr, test.create_expected, i);
5765 if(SUCCEEDED(hr)) {
5766 DWORD j;
5768 /* Checks all the string properties of the uri. */
5769 for(j = Uri_PROPERTY_STRING_START; j <= Uri_PROPERTY_STRING_LAST; ++j) {
5770 BSTR received = NULL;
5771 uri_str_property prop = test.str_props[j];
5773 hr = IUri_GetPropertyBSTR(uri, j, &received, 0);
5774 if(prop.todo) {
5775 todo_wine {
5776 ok(hr == prop.expected, "GetPropertyBSTR returned 0x%08x, expected 0x%08x. On uri_tests[%d].str_props[%d].\n",
5777 hr, prop.expected, i, j);
5779 todo_wine {
5780 ok(!strcmp_aw(prop.value, received) || broken(prop.broken_value && !strcmp_aw(prop.broken_value, received)),
5781 "Expected %s but got %s on uri_tests[%d].str_props[%d].\n",
5782 prop.value, wine_dbgstr_w(received), i, j);
5784 } else {
5785 ok(hr == prop.expected, "GetPropertyBSTR returned 0x%08x, expected 0x%08x. On uri_tests[%d].str_props[%d].\n",
5786 hr, prop.expected, i, j);
5787 ok(!strcmp_aw(prop.value, received) || broken(prop.broken_value && !strcmp_aw(prop.broken_value, received)),
5788 "Expected %s but got %s on uri_tests[%d].str_props[%d].\n",
5789 prop.value, wine_dbgstr_w(received), i, j);
5792 SysFreeString(received);
5796 if(uri) IUri_Release(uri);
5798 heap_free(uriW);
5802 static void test_IUri_GetPropertyDWORD(void) {
5803 IUri *uri = NULL;
5804 HRESULT hr;
5805 DWORD i;
5807 hr = pCreateUri(http_urlW, 0, 0, &uri);
5808 ok(hr == S_OK, "Error: CreateUri returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
5809 if(SUCCEEDED(hr)) {
5810 DWORD received = 0xdeadbeef;
5812 hr = IUri_GetPropertyDWORD(uri, Uri_PROPERTY_DWORD_START, NULL, 0);
5813 ok(hr == E_INVALIDARG, "Error: GetPropertyDWORD returned 0x%08x, expected 0x%08x.\n", hr, E_INVALIDARG);
5815 hr = IUri_GetPropertyDWORD(uri, Uri_PROPERTY_ABSOLUTE_URI, &received, 0);
5816 ok(hr == E_INVALIDARG, "Error: GetPropertyDWORD returned 0x%08x, expected 0x%08x.\n", hr, E_INVALIDARG);
5817 ok(received == 0, "Error: Expected received=%d but instead received=%d.\n", 0, received);
5819 if(uri) IUri_Release(uri);
5821 for(i = 0; i < sizeof(uri_tests)/sizeof(uri_tests[0]); ++i) {
5822 uri_properties test = uri_tests[i];
5823 LPWSTR uriW;
5824 uri = NULL;
5826 uriW = a2w(test.uri);
5827 hr = pCreateUri(uriW, test.create_flags, 0, &uri);
5828 if(test.create_todo) {
5829 todo_wine {
5830 ok(hr == test.create_expected, "Error: CreateUri returned 0x%08x, expected 0x%08x. Failed on uri_tests[%d].\n",
5831 hr, test.create_expected, i);
5833 } else {
5834 ok(hr == test.create_expected, "Error: CreateUri returned 0x%08x, expected 0x%08x. Failed on uri_tests[%d].\n",
5835 hr, test.create_expected, i);
5838 if(SUCCEEDED(hr)) {
5839 DWORD j;
5841 /* Checks all the DWORD properties of the uri. */
5842 for(j = 0; j < sizeof(test.dword_props)/sizeof(test.dword_props[0]); ++j) {
5843 DWORD received;
5844 uri_dword_property prop = test.dword_props[j];
5846 hr = IUri_GetPropertyDWORD(uri, j+Uri_PROPERTY_DWORD_START, &received, 0);
5847 if(prop.todo) {
5848 todo_wine {
5849 ok(hr == prop.expected, "GetPropertyDWORD returned 0x%08x, expected 0x%08x. On uri_tests[%d].dword_props[%d].\n",
5850 hr, prop.expected, i, j);
5852 todo_wine {
5853 ok(prop.value == received, "Expected %d but got %d on uri_tests[%d].dword_props[%d].\n",
5854 prop.value, received, i, j);
5856 } else {
5857 ok(hr == prop.expected, "GetPropertyDWORD returned 0x%08x, expected 0x%08x. On uri_tests[%d].dword_props[%d].\n",
5858 hr, prop.expected, i, j);
5859 ok(prop.value == received, "Expected %d but got %d on uri_tests[%d].dword_props[%d].\n",
5860 prop.value, received, i, j);
5865 if(uri) IUri_Release(uri);
5867 heap_free(uriW);
5871 /* Tests all the 'Get*' property functions which deal with strings. */
5872 static void test_IUri_GetStrProperties(void) {
5873 IUri *uri = NULL;
5874 HRESULT hr;
5875 DWORD i;
5877 /* Make sure all the 'Get*' string property functions handle invalid args correctly. */
5878 hr = pCreateUri(http_urlW, 0, 0, &uri);
5879 ok(hr == S_OK, "Error: CreateUri returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
5880 if(SUCCEEDED(hr)) {
5881 hr = IUri_GetAbsoluteUri(uri, NULL);
5882 ok(hr == E_POINTER, "Error: GetAbsoluteUri returned 0x%08x, expected 0x%08x.\n", hr, E_POINTER);
5884 hr = IUri_GetAuthority(uri, NULL);
5885 ok(hr == E_POINTER, "Error: GetAuthority returned 0x%08x, expected 0x%08x.\n", hr, E_POINTER);
5887 hr = IUri_GetDisplayUri(uri, NULL);
5888 ok(hr == E_POINTER, "Error: GetDisplayUri returned 0x%08x, expected 0x%08x.\n", hr, E_POINTER);
5890 hr = IUri_GetDomain(uri, NULL);
5891 ok(hr == E_POINTER, "Error: GetDomain returned 0x%08x, expected 0x%08x.\n", hr, E_POINTER);
5893 hr = IUri_GetExtension(uri, NULL);
5894 ok(hr == E_POINTER, "Error: GetExtension returned 0x%08x, expected 0x%08x.\n", hr, E_POINTER);
5896 hr = IUri_GetFragment(uri, NULL);
5897 ok(hr == E_POINTER, "Error: GetFragment returned 0x%08x, expected 0x%08x.\n", hr, E_POINTER);
5899 hr = IUri_GetHost(uri, NULL);
5900 ok(hr == E_POINTER, "Error: GetHost returned 0x%08x, expected 0x%08x.\n", hr, E_POINTER);
5902 hr = IUri_GetPassword(uri, NULL);
5903 ok(hr == E_POINTER, "Error: GetPassword returned 0x%08x, expected 0x%08x.\n", hr, E_POINTER);
5905 hr = IUri_GetPath(uri, NULL);
5906 ok(hr == E_POINTER, "Error: GetPath returned 0x%08x, expected 0x%08x.\n", hr, E_POINTER);
5908 hr = IUri_GetPathAndQuery(uri, NULL);
5909 ok(hr == E_POINTER, "Error: GetPathAndQuery returned 0x%08x, expected 0x%08x.\n", hr, E_POINTER);
5911 hr = IUri_GetQuery(uri, NULL);
5912 ok(hr == E_POINTER, "Error: GetQuery returned 0x%08x, expected 0x%08x.\n", hr, E_POINTER);
5914 hr = IUri_GetRawUri(uri, NULL);
5915 ok(hr == E_POINTER, "Error: GetRawUri returned 0x%08x, expected 0x%08x.\n", hr, E_POINTER);
5917 hr = IUri_GetSchemeName(uri, NULL);
5918 ok(hr == E_POINTER, "Error: GetSchemeName returned 0x%08x, expected 0x%08x.\n", hr, E_POINTER);
5920 hr = IUri_GetUserInfo(uri, NULL);
5921 ok(hr == E_POINTER, "Error: GetUserInfo returned 0x%08x, expected 0x%08x.\n", hr, E_POINTER);
5923 hr = IUri_GetUserName(uri, NULL);
5924 ok(hr == E_POINTER, "Error: GetUserName returned 0x%08x, expected 0x%08x.\n", hr, E_POINTER);
5926 if(uri) IUri_Release(uri);
5928 for(i = 0; i < sizeof(uri_tests)/sizeof(uri_tests[0]); ++i) {
5929 uri_properties test = uri_tests[i];
5930 LPWSTR uriW;
5931 uri = NULL;
5933 uriW = a2w(test.uri);
5934 hr = pCreateUri(uriW, test.create_flags, 0, &uri);
5935 if(test.create_todo) {
5936 todo_wine {
5937 ok(hr == test.create_expected, "Error: CreateUri returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
5938 hr, test.create_expected, i);
5940 } else {
5941 ok(hr == test.create_expected, "Error: CreateUri returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
5942 hr, test.create_expected, i);
5945 if(SUCCEEDED(hr)) {
5946 uri_str_property prop;
5947 BSTR received = NULL;
5949 /* GetAbsoluteUri() tests. */
5950 prop = test.str_props[Uri_PROPERTY_ABSOLUTE_URI];
5951 hr = IUri_GetAbsoluteUri(uri, &received);
5952 if(prop.todo) {
5953 todo_wine {
5954 ok(hr == prop.expected, "Error: GetAbsoluteUri returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
5955 hr, prop.expected, i);
5957 todo_wine {
5958 ok(!strcmp_aw(prop.value, received) || broken(prop.broken_value && !strcmp_aw(prop.broken_value, received)),
5959 "Error: Expected %s but got %s on uri_tests[%d].\n",
5960 prop.value, wine_dbgstr_w(received), i);
5962 } else {
5963 ok(hr == prop.expected, "Error: GetAbsoluteUri returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
5964 hr, prop.expected, i);
5965 ok(!strcmp_aw(prop.value, received) || broken(prop.broken_value && !strcmp_aw(prop.broken_value, received)),
5966 "Error: Expected %s but got %s on uri_tests[%d].\n",
5967 prop.value, wine_dbgstr_w(received), i);
5969 SysFreeString(received);
5970 received = NULL;
5972 /* GetAuthority() tests. */
5973 prop = test.str_props[Uri_PROPERTY_AUTHORITY];
5974 hr = IUri_GetAuthority(uri, &received);
5975 if(prop.todo) {
5976 todo_wine {
5977 ok(hr == prop.expected, "Error: GetAuthority returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
5978 hr, prop.expected, i);
5980 todo_wine {
5981 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
5982 prop.value, wine_dbgstr_w(received), i);
5984 } else {
5985 ok(hr == prop.expected, "Error: GetAuthority returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
5986 hr, prop.expected, i);
5987 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
5988 prop.value, wine_dbgstr_w(received), i);
5990 SysFreeString(received);
5991 received = NULL;
5993 /* GetDisplayUri() tests. */
5994 prop = test.str_props[Uri_PROPERTY_DISPLAY_URI];
5995 hr = IUri_GetDisplayUri(uri, &received);
5996 if(prop.todo) {
5997 todo_wine {
5998 ok(hr == prop.expected, "Error: GetDisplayUri returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
5999 hr, prop.expected, i);
6001 todo_wine {
6002 ok(!strcmp_aw(prop.value, received) || broken(prop.broken_value && !strcmp_aw(prop.broken_value, received)),
6003 "Error: Expected %s but got %s on uri_test[%d].\n",
6004 prop.value, wine_dbgstr_w(received), i);
6006 } else {
6007 ok(hr == prop.expected, "Error: GetDisplayUri returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
6008 hr, prop.expected, i);
6009 ok(!strcmp_aw(prop.value, received) || broken(prop.broken_value && !strcmp_aw(prop.broken_value, received)),
6010 "Error: Expected %s but got %s on uri_tests[%d].\n",
6011 prop.value, wine_dbgstr_w(received), i);
6013 SysFreeString(received);
6014 received = NULL;
6016 /* GetDomain() tests. */
6017 prop = test.str_props[Uri_PROPERTY_DOMAIN];
6018 hr = IUri_GetDomain(uri, &received);
6019 if(prop.todo) {
6020 todo_wine {
6021 ok(hr == prop.expected, "Error: GetDomain returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
6022 hr, prop.expected, i);
6024 todo_wine {
6025 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
6026 prop.value, wine_dbgstr_w(received), i);
6028 } else {
6029 ok(hr == prop.expected, "Error: GetDomain returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
6030 hr, prop.expected, i);
6031 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
6032 prop.value, wine_dbgstr_w(received), i);
6034 SysFreeString(received);
6035 received = NULL;
6037 /* GetExtension() tests. */
6038 prop = test.str_props[Uri_PROPERTY_EXTENSION];
6039 hr = IUri_GetExtension(uri, &received);
6040 if(prop.todo) {
6041 todo_wine {
6042 ok(hr == prop.expected, "Error: GetExtension returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
6043 hr, prop.expected, i);
6045 todo_wine {
6046 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
6047 prop.value, wine_dbgstr_w(received), i);
6049 } else {
6050 ok(hr == prop.expected, "Error: GetExtension returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
6051 hr, prop.expected, i);
6052 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
6053 prop.value, wine_dbgstr_w(received), i);
6055 SysFreeString(received);
6056 received = NULL;
6058 /* GetFragment() tests. */
6059 prop = test.str_props[Uri_PROPERTY_FRAGMENT];
6060 hr = IUri_GetFragment(uri, &received);
6061 if(prop.todo) {
6062 todo_wine {
6063 ok(hr == prop.expected, "Error: GetFragment returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
6064 hr, prop.expected, i);
6066 todo_wine {
6067 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
6068 prop.value, wine_dbgstr_w(received), i);
6070 } else {
6071 ok(hr == prop.expected, "Error: GetFragment returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
6072 hr, prop.expected, i);
6073 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
6074 prop.value, wine_dbgstr_w(received), i);
6076 SysFreeString(received);
6077 received = NULL;
6079 /* GetHost() tests. */
6080 prop = test.str_props[Uri_PROPERTY_HOST];
6081 hr = IUri_GetHost(uri, &received);
6082 if(prop.todo) {
6083 todo_wine {
6084 ok(hr == prop.expected, "Error: GetHost returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
6085 hr, prop.expected, i);
6087 todo_wine {
6088 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
6089 prop.value, wine_dbgstr_w(received), i);
6091 } else {
6092 ok(hr == prop.expected, "Error: GetHost returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
6093 hr, prop.expected, i);
6094 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
6095 prop.value, wine_dbgstr_w(received), i);
6097 SysFreeString(received);
6098 received = NULL;
6100 /* GetPassword() tests. */
6101 prop = test.str_props[Uri_PROPERTY_PASSWORD];
6102 hr = IUri_GetPassword(uri, &received);
6103 if(prop.todo) {
6104 todo_wine {
6105 ok(hr == prop.expected, "Error: GetPassword returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
6106 hr, prop.expected, i);
6108 todo_wine {
6109 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
6110 prop.value, wine_dbgstr_w(received), i);
6112 } else {
6113 ok(hr == prop.expected, "Error: GetPassword returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
6114 hr, prop.expected, i);
6115 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
6116 prop.value, wine_dbgstr_w(received), i);
6118 SysFreeString(received);
6119 received = NULL;
6121 /* GetPath() tests. */
6122 prop = test.str_props[Uri_PROPERTY_PATH];
6123 hr = IUri_GetPath(uri, &received);
6124 if(prop.todo) {
6125 todo_wine {
6126 ok(hr == prop.expected, "Error: GetPath returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
6127 hr, prop.expected, i);
6129 todo_wine {
6130 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
6131 prop.value, wine_dbgstr_w(received), i);
6133 } else {
6134 ok(hr == prop.expected, "Error: GetPath returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
6135 hr, prop.expected, i);
6136 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
6137 prop.value, wine_dbgstr_w(received), i);
6139 SysFreeString(received);
6140 received = NULL;
6142 /* GetPathAndQuery() tests. */
6143 prop = test.str_props[Uri_PROPERTY_PATH_AND_QUERY];
6144 hr = IUri_GetPathAndQuery(uri, &received);
6145 if(prop.todo) {
6146 todo_wine {
6147 ok(hr == prop.expected, "Error: GetPathAndQuery returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
6148 hr, prop.expected, i);
6150 todo_wine {
6151 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
6152 prop.value, wine_dbgstr_w(received), i);
6154 } else {
6155 ok(hr == prop.expected, "Error: GetPathAndQuery returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
6156 hr, prop.expected, i);
6157 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
6158 prop.value, wine_dbgstr_w(received), i);
6160 SysFreeString(received);
6161 received = NULL;
6163 /* GetQuery() tests. */
6164 prop = test.str_props[Uri_PROPERTY_QUERY];
6165 hr = IUri_GetQuery(uri, &received);
6166 if(prop.todo) {
6167 todo_wine {
6168 ok(hr == prop.expected, "Error: GetQuery returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
6169 hr, prop.expected, i);
6171 todo_wine {
6172 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
6173 prop.value, wine_dbgstr_w(received), i);
6175 } else {
6176 ok(hr == prop.expected, "Error: GetQuery returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
6177 hr, prop.expected, i);
6178 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
6179 prop.value, wine_dbgstr_w(received), i);
6181 SysFreeString(received);
6182 received = NULL;
6184 /* GetRawUri() tests. */
6185 prop = test.str_props[Uri_PROPERTY_RAW_URI];
6186 hr = IUri_GetRawUri(uri, &received);
6187 if(prop.todo) {
6188 todo_wine {
6189 ok(hr == prop.expected, "Error: GetRawUri returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
6190 hr, prop.expected, i);
6192 todo_wine {
6193 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
6194 prop.value, wine_dbgstr_w(received), i);
6196 } else {
6197 ok(hr == prop.expected, "Error: GetRawUri returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
6198 hr, prop.expected, i);
6199 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
6200 prop.value, wine_dbgstr_w(received), i);
6202 SysFreeString(received);
6203 received = NULL;
6205 /* GetSchemeName() tests. */
6206 prop = test.str_props[Uri_PROPERTY_SCHEME_NAME];
6207 hr = IUri_GetSchemeName(uri, &received);
6208 if(prop.todo) {
6209 todo_wine {
6210 ok(hr == prop.expected, "Error: GetSchemeName returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
6211 hr, prop.expected, i);
6213 todo_wine {
6214 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
6215 prop.value, wine_dbgstr_w(received), i);
6217 } else {
6218 ok(hr == prop.expected, "Error: GetSchemeName returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
6219 hr, prop.expected, i);
6220 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
6221 prop.value, wine_dbgstr_w(received), i);
6223 SysFreeString(received);
6224 received = NULL;
6226 /* GetUserInfo() tests. */
6227 prop = test.str_props[Uri_PROPERTY_USER_INFO];
6228 hr = IUri_GetUserInfo(uri, &received);
6229 if(prop.todo) {
6230 todo_wine {
6231 ok(hr == prop.expected, "Error: GetUserInfo returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
6232 hr, prop.expected, i);
6234 todo_wine {
6235 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
6236 prop.value, wine_dbgstr_w(received), i);
6238 } else {
6239 ok(hr == prop.expected, "Error: GetUserInfo returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
6240 hr, prop.expected, i);
6241 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
6242 prop.value, wine_dbgstr_w(received), i);
6244 SysFreeString(received);
6245 received = NULL;
6247 /* GetUserName() tests. */
6248 prop = test.str_props[Uri_PROPERTY_USER_NAME];
6249 hr = IUri_GetUserName(uri, &received);
6250 if(prop.todo) {
6251 todo_wine {
6252 ok(hr == prop.expected, "Error: GetUserName returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
6253 hr, prop.expected, i);
6255 todo_wine {
6256 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
6257 prop.value, wine_dbgstr_w(received), i);
6259 } else {
6260 ok(hr == prop.expected, "Error: GetUserName returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
6261 hr, prop.expected, i);
6262 ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n",
6263 prop.value, wine_dbgstr_w(received), i);
6265 SysFreeString(received);
6268 if(uri) IUri_Release(uri);
6270 heap_free(uriW);
6274 static void test_IUri_GetDwordProperties(void) {
6275 IUri *uri = NULL;
6276 HRESULT hr;
6277 DWORD i;
6279 /* Make sure all the 'Get*' dword property functions handle invalid args correctly. */
6280 hr = pCreateUri(http_urlW, 0, 0, &uri);
6281 ok(hr == S_OK, "Error: CreateUri returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
6282 if(SUCCEEDED(hr)) {
6283 hr = IUri_GetHostType(uri, NULL);
6284 ok(hr == E_INVALIDARG, "Error: GetHostType returned 0x%08x, expected 0x%08x.\n", hr, E_INVALIDARG);
6286 hr = IUri_GetPort(uri, NULL);
6287 ok(hr == E_INVALIDARG, "Error: GetPort returned 0x%08x, expected 0x%08x.\n", hr, E_INVALIDARG);
6289 hr = IUri_GetScheme(uri, NULL);
6290 ok(hr == E_INVALIDARG, "Error: GetScheme returned 0x%08x, expected 0x%08x.\n", hr, E_INVALIDARG);
6292 hr = IUri_GetZone(uri, NULL);
6293 ok(hr == E_INVALIDARG, "Error: GetZone returned 0x%08x, expected 0x%08x.\n", hr, E_INVALIDARG);
6295 if(uri) IUri_Release(uri);
6297 for(i = 0; i < sizeof(uri_tests)/sizeof(uri_tests[0]); ++i) {
6298 uri_properties test = uri_tests[i];
6299 LPWSTR uriW;
6300 uri = NULL;
6302 uriW = a2w(test.uri);
6303 hr = pCreateUri(uriW, test.create_flags, 0, &uri);
6304 if(test.create_todo) {
6305 todo_wine {
6306 ok(hr == test.create_expected, "Error: CreateUri returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
6307 hr, test.create_expected, i);
6309 } else {
6310 ok(hr == test.create_expected, "Error: CreateUri returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
6311 hr, test.create_expected, i);
6314 if(SUCCEEDED(hr)) {
6315 uri_dword_property prop;
6316 DWORD received;
6318 /* Assign an insane value so tests don't accidentally pass when
6319 * they shouldn't!
6321 received = -9999999;
6323 /* GetHostType() tests. */
6324 prop = test.dword_props[Uri_PROPERTY_HOST_TYPE-Uri_PROPERTY_DWORD_START];
6325 hr = IUri_GetHostType(uri, &received);
6326 if(prop.todo) {
6327 todo_wine {
6328 ok(hr == prop.expected, "Error: GetHostType returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
6329 hr, prop.expected, i);
6331 todo_wine {
6332 ok(received == prop.value, "Error: Expected %d but got %d on uri_tests[%d].\n", prop.value, received, i);
6334 } else {
6335 ok(hr == prop.expected, "Error: GetHostType returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
6336 hr, prop.expected, i);
6337 ok(received == prop.value, "Error: Expected %d but got %d on uri_tests[%d].\n", prop.value, received, i);
6339 received = -9999999;
6341 /* GetPort() tests. */
6342 prop = test.dword_props[Uri_PROPERTY_PORT-Uri_PROPERTY_DWORD_START];
6343 hr = IUri_GetPort(uri, &received);
6344 if(prop.todo) {
6345 todo_wine {
6346 ok(hr == prop.expected, "Error: GetPort returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
6347 hr, prop.expected, i);
6349 todo_wine {
6350 ok(received == prop.value, "Error: Expected %d but got %d on uri_tests[%d].\n", prop.value, received, i);
6352 } else {
6353 ok(hr == prop.expected, "Error: GetPort returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
6354 hr, prop.expected, i);
6355 ok(received == prop.value, "Error: Expected %d but got %d on uri_tests[%d].\n", prop.value, received, i);
6357 received = -9999999;
6359 /* GetScheme() tests. */
6360 prop = test.dword_props[Uri_PROPERTY_SCHEME-Uri_PROPERTY_DWORD_START];
6361 hr = IUri_GetScheme(uri, &received);
6362 if(prop.todo) {
6363 todo_wine {
6364 ok(hr == prop.expected, "Error: GetScheme returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
6365 hr, prop.expected, i);
6367 todo_wine {
6368 ok(received == prop.value, "Error: Expected %d but got %d on uri_tests[%d].\n", prop.value, received, i);
6370 } else {
6371 ok(hr == prop.expected, "Error: GetScheme returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
6372 hr, prop.expected, i);
6373 ok(received == prop.value, "Error: Expected %d but got %d on uri_tests[%d].\n", prop.value, received, i);
6375 received = -9999999;
6377 /* GetZone() tests. */
6378 prop = test.dword_props[Uri_PROPERTY_ZONE-Uri_PROPERTY_DWORD_START];
6379 hr = IUri_GetZone(uri, &received);
6380 if(prop.todo) {
6381 todo_wine {
6382 ok(hr == prop.expected, "Error: GetZone returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
6383 hr, prop.expected, i);
6385 todo_wine {
6386 ok(received == prop.value, "Error: Expected %d but got %d on uri_tests[%d].\n", prop.value, received, i);
6388 } else {
6389 ok(hr == prop.expected, "Error: GetZone returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
6390 hr, prop.expected, i);
6391 ok(received == prop.value, "Error: Expected %d but got %d on uri_tests[%d].\n", prop.value, received, i);
6395 if(uri) IUri_Release(uri);
6397 heap_free(uriW);
6401 static void test_IUri_GetPropertyLength(void) {
6402 IUri *uri = NULL;
6403 HRESULT hr;
6404 DWORD i;
6406 /* Make sure it handles invalid args correctly. */
6407 hr = pCreateUri(http_urlW, 0, 0, &uri);
6408 ok(hr == S_OK, "Error: CreateUri returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
6409 if(SUCCEEDED(hr)) {
6410 DWORD received = 0xdeadbeef;
6412 hr = IUri_GetPropertyLength(uri, Uri_PROPERTY_STRING_START, NULL, 0);
6413 ok(hr == E_INVALIDARG, "Error: GetPropertyLength returned 0x%08x, expected 0x%08x.\n", hr, E_INVALIDARG);
6415 hr = IUri_GetPropertyLength(uri, Uri_PROPERTY_DWORD_START, &received, 0);
6416 ok(hr == E_INVALIDARG, "Error: GetPropertyLength return 0x%08x, expected 0x%08x.\n", hr, E_INVALIDARG);
6417 ok(received == 0xdeadbeef, "Error: Expected 0xdeadbeef but got 0x%08x.\n", received);
6419 if(uri) IUri_Release(uri);
6421 for(i = 0; i < sizeof(uri_tests)/sizeof(uri_tests[0]); ++i) {
6422 uri_properties test = uri_tests[i];
6423 LPWSTR uriW;
6424 uri = NULL;
6426 uriW = a2w(test.uri);
6427 hr = pCreateUri(uriW, test.create_flags, 0, &uri);
6428 if(test.create_todo) {
6429 todo_wine {
6430 ok(hr == test.create_expected, "Error: CreateUri returned 0x%08x, expected 0x%08x on uri_tests[%d].\n",
6431 hr, test.create_expected, i);
6433 } else {
6434 ok(hr == test.create_expected, "Error: CreateUri returned 0x%08x, expected 0x%08x on uri_test[%d].\n",
6435 hr, test.create_expected, i);
6438 if(SUCCEEDED(hr)) {
6439 DWORD j;
6441 for(j = Uri_PROPERTY_STRING_START; j <= Uri_PROPERTY_STRING_LAST; ++j) {
6442 DWORD expectedLen, brokenLen, receivedLen;
6443 uri_str_property prop = test.str_props[j];
6445 expectedLen = lstrlen(prop.value);
6446 brokenLen = lstrlen(prop.broken_value);
6448 /* This won't be necessary once GetPropertyLength is implemented. */
6449 receivedLen = -1;
6451 hr = IUri_GetPropertyLength(uri, j, &receivedLen, 0);
6452 if(prop.todo) {
6453 todo_wine {
6454 ok(hr == prop.expected, "Error: GetPropertyLength returned 0x%08x, expected 0x%08x on uri_tests[%d].str_props[%d].\n",
6455 hr, prop.expected, i, j);
6457 todo_wine {
6458 ok(receivedLen == expectedLen || broken(receivedLen == brokenLen),
6459 "Error: Expected a length of %d but got %d on uri_tests[%d].str_props[%d].\n",
6460 expectedLen, receivedLen, i, j);
6462 } else {
6463 ok(hr == prop.expected, "Error: GetPropertyLength returned 0x%08x, expected 0x%08x on uri_tests[%d].str_props[%d].\n",
6464 hr, prop.expected, i, j);
6465 ok(receivedLen == expectedLen || broken(receivedLen == brokenLen),
6466 "Error: Expected a length of %d but got %d on uri_tests[%d].str_props[%d].\n",
6467 expectedLen, receivedLen, i, j);
6472 if(uri) IUri_Release(uri);
6474 heap_free(uriW);
6478 static void test_IUri_GetProperties(void) {
6479 IUri *uri = NULL;
6480 HRESULT hr;
6481 DWORD i;
6483 hr = pCreateUri(http_urlW, 0, 0, &uri);
6484 ok(hr == S_OK, "Error: CreateUri returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
6485 if(SUCCEEDED(hr)) {
6486 hr = IUri_GetProperties(uri, NULL);
6487 ok(hr == E_INVALIDARG, "Error: GetProperties returned 0x%08x, expected 0x%08x.\n", hr, E_INVALIDARG);
6489 if(uri) IUri_Release(uri);
6491 for(i = 0; i < sizeof(uri_tests)/sizeof(uri_tests[0]); ++i) {
6492 uri_properties test = uri_tests[i];
6493 LPWSTR uriW;
6494 uri = NULL;
6496 uriW = a2w(test.uri);
6497 hr = pCreateUri(uriW, test.create_flags, 0, &uri);
6498 if(test.create_todo) {
6499 todo_wine {
6500 ok(hr == test.create_expected, "Error: CreateUri returned 0x%08x, expected 0x%08x.\n", hr, test.create_expected);
6502 } else {
6503 ok(hr == test.create_expected, "Error: CreateUri returned 0x%08x, expected 0x%08x.\n", hr, test.create_expected);
6506 if(SUCCEEDED(hr)) {
6507 DWORD received = 0;
6508 DWORD j;
6510 hr = IUri_GetProperties(uri, &received);
6511 if(test.props_todo) {
6512 todo_wine {
6513 ok(hr == S_OK, "Error: GetProperties returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
6515 } else {
6516 ok(hr == S_OK, "Error: GetProperties returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
6519 for(j = 0; j <= Uri_PROPERTY_DWORD_LAST; ++j) {
6520 /* (1 << j) converts a Uri_PROPERTY to its corresponding Uri_HAS_* flag mask. */
6521 if(test.props & (1 << j)) {
6522 if(test.props_todo) {
6523 todo_wine {
6524 ok(received & (1 << j), "Error: Expected flag for property %d on uri_tests[%d].\n", j, i);
6526 } else {
6527 ok(received & (1 << j), "Error: Expected flag for property %d on uri_tests[%d].\n", j, i);
6529 } else {
6530 /* NOTE: Since received is initialized to 0, this test will always pass while
6531 * GetProperties is unimplemented.
6533 ok(!(received & (1 << j)), "Error: Received flag for property %d when not expected on uri_tests[%d].\n", j, i);
6538 if(uri) IUri_Release(uri);
6540 heap_free(uriW);
6544 static void test_IUri_HasProperty(void) {
6545 IUri *uri = NULL;
6546 HRESULT hr;
6547 DWORD i;
6549 hr = pCreateUri(http_urlW, 0, 0, &uri);
6550 ok(hr == S_OK, "Error: CreateUri returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
6551 if(SUCCEEDED(hr)) {
6552 hr = IUri_HasProperty(uri, Uri_PROPERTY_RAW_URI, NULL);
6553 ok(hr == E_INVALIDARG, "Error: HasProperty returned 0x%08x, expected 0x%08x.\n", hr, E_INVALIDARG);
6555 if(uri) IUri_Release(uri);
6557 for(i = 0; i < sizeof(uri_tests)/sizeof(uri_tests[0]); ++i) {
6558 uri_properties test = uri_tests[i];
6559 LPWSTR uriW;
6560 uri = NULL;
6562 uriW = a2w(test.uri);
6564 hr = pCreateUri(uriW, test.create_flags, 0, &uri);
6565 if(test.create_todo) {
6566 todo_wine {
6567 ok(hr == test.create_expected, "Error: CreateUri returned 0x%08x, expected 0x%08x.\n", hr, test.create_expected);
6569 } else {
6570 ok(hr == test.create_expected, "Error: CreateUri returned 0x%08x, expected 0x%08x.\n", hr, test.create_expected);
6573 if(SUCCEEDED(hr)) {
6574 DWORD j;
6576 for(j = 0; j <= Uri_PROPERTY_DWORD_LAST; ++j) {
6577 /* Assign -1, then explicitly test for TRUE or FALSE later. */
6578 BOOL received = -1;
6580 hr = IUri_HasProperty(uri, j, &received);
6581 if(test.props_todo) {
6582 todo_wine {
6583 ok(hr == S_OK, "Error: HasProperty returned 0x%08x, expected 0x%08x for property %d on uri_tests[%d].\n",
6584 hr, S_OK, j, i);
6587 /* Check if the property should be true. */
6588 if(test.props & (1 << j)) {
6589 todo_wine {
6590 ok(received == TRUE, "Error: Expected to have property %d on uri_tests[%d].\n", j, i);
6592 } else {
6593 todo_wine {
6594 ok(received == FALSE, "Error: Wasn't expecting to have property %d on uri_tests[%d].\n", j, i);
6597 } else {
6598 ok(hr == S_OK, "Error: HasProperty returned 0x%08x, expected 0x%08x for property %d on uri_tests[%d].\n",
6599 hr, S_OK, j, i);
6601 if(test.props & (1 << j)) {
6602 ok(received == TRUE, "Error: Expected to have property %d on uri_tests[%d].\n", j, i);
6603 } else {
6604 ok(received == FALSE, "Error: Wasn't expecting to have property %d on uri_tests[%d].\n", j, i);
6610 if(uri) IUri_Release(uri);
6612 heap_free(uriW);
6616 static void test_IUri_IsEqual(void) {
6617 IUri *uriA, *uriB;
6618 HRESULT hrA, hrB;
6619 DWORD i;
6621 uriA = uriB = NULL;
6623 /* Make sure IsEqual handles invalid args correctly. */
6624 hrA = pCreateUri(http_urlW, 0, 0, &uriA);
6625 hrB = pCreateUri(http_urlW, 0, 0, &uriB);
6626 ok(hrA == S_OK, "Error: CreateUri returned 0x%08x, expected 0x%08x.\n", hrA, S_OK);
6627 ok(hrB == S_OK, "Error: CreateUri returned 0x%08x, expected 0x%08x.\n", hrB, S_OK);
6628 if(SUCCEEDED(hrA) && SUCCEEDED(hrB)) {
6629 BOOL equal = -1;
6630 hrA = IUri_IsEqual(uriA, NULL, &equal);
6631 ok(hrA == S_OK, "Error: IsEqual returned 0x%08x, expected 0x%08x.\n", hrA, S_OK);
6632 ok(equal == FALSE, "Error: Expected equal to be FALSE, but was %d instead.\n", equal);
6634 hrA = IUri_IsEqual(uriA, uriB, NULL);
6635 ok(hrA == E_POINTER, "Error: IsEqual returned 0x%08x, expected 0x%08x.\n", hrA, E_POINTER);
6637 if(uriA) IUri_Release(uriA);
6638 if(uriB) IUri_Release(uriB);
6640 for(i = 0; i < sizeof(equality_tests)/sizeof(equality_tests[0]); ++i) {
6641 uri_equality test = equality_tests[i];
6642 LPWSTR uriA_W, uriB_W;
6644 uriA = uriB = NULL;
6646 uriA_W = a2w(test.a);
6647 uriB_W = a2w(test.b);
6649 hrA = pCreateUri(uriA_W, test.create_flags_a, 0, &uriA);
6650 if(test.create_todo_a) {
6651 todo_wine {
6652 ok(hrA == S_OK, "Error: CreateUri returned 0x%08x, expected 0x%08x on equality_tests[%d].a\n",
6653 hrA, S_OK, i);
6655 } else {
6656 ok(hrA == S_OK, "Error: CreateUri returned 0x%08x, expected 0x%08x on equality_tests[%d].a\n",
6657 hrA, S_OK, i);
6660 hrB = pCreateUri(uriB_W, test.create_flags_b, 0, &uriB);
6661 if(test.create_todo_b) {
6662 todo_wine {
6663 ok(hrB == S_OK, "Error: CreateUri returned 0x%08x, expected 0x%08x on equality_tests[%d].b\n",
6664 hrB, S_OK, i);
6666 } else {
6667 ok(hrB == S_OK, "Error: CreateUri returned 0x%08x, expected 0x%08x on equality_tests[%d].b\n",
6668 hrB, S_OK, i);
6671 if(SUCCEEDED(hrA) && SUCCEEDED(hrB)) {
6672 BOOL equal = -1;
6674 hrA = IUri_IsEqual(uriA, uriB, &equal);
6675 if(test.todo) {
6676 todo_wine {
6677 ok(hrA == S_OK, "Error: IsEqual returned 0x%08x, expected 0x%08x on equality_tests[%d].\n",
6678 hrA, S_OK, i);
6680 todo_wine {
6681 ok(equal == test.equal, "Error: Expected the comparison to be %d on equality_tests[%d].\n", test.equal, i);
6683 } else {
6684 ok(hrA == S_OK, "Error: IsEqual returned 0x%08x, expected 0x%08x on equality_tests[%d].\n", hrA, S_OK, i);
6685 ok(equal == test.equal, "Error: Expected the comparison to be %d on equality_tests[%d].\n", test.equal, i);
6688 if(uriA) IUri_Release(uriA);
6689 if(uriB) IUri_Release(uriB);
6691 heap_free(uriA_W);
6692 heap_free(uriB_W);
6696 static void test_CreateUriWithFragment_InvalidArgs(void) {
6697 HRESULT hr;
6698 IUri *uri = (void*) 0xdeadbeef;
6699 const WCHAR fragmentW[] = {'#','f','r','a','g','m','e','n','t',0};
6701 hr = pCreateUriWithFragment(NULL, fragmentW, 0, 0, &uri);
6702 ok(hr == E_INVALIDARG, "Error: CreateUriWithFragment returned 0x%08x, expected 0x%08x.\n", hr, E_INVALIDARG);
6703 ok(uri == NULL, "Error: Expected uri to be NULL, but was %p instead.\n", uri);
6705 hr = pCreateUriWithFragment(http_urlW, fragmentW, 0, 0, NULL);
6706 ok(hr == E_INVALIDARG, "Error: CreateUriWithFragment returned 0x%08x, expected 0x%08x.\n", hr, E_INVALIDARG);
6708 /* Original URI can't already contain a fragment component. */
6709 uri = (void*) 0xdeadbeef;
6710 hr = pCreateUriWithFragment(http_url_fragW, fragmentW, 0, 0, &uri);
6711 ok(hr == E_INVALIDARG, "Error: CreateUriWithFragment returned 0x%08x, expected 0x%08x.\n", hr, E_INVALIDARG);
6712 ok(uri == NULL, "Error: Expected uri to be NULL, but was %p instead.\n", uri);
6715 /* CreateUriWithFragment has the same invalid flag combinations as CreateUri. */
6716 static void test_CreateUriWithFragment_InvalidFlags(void) {
6717 DWORD i;
6719 for(i = 0; i < sizeof(invalid_flag_tests)/sizeof(invalid_flag_tests[0]); ++i) {
6720 HRESULT hr;
6721 IUri *uri = (void*) 0xdeadbeef;
6723 hr = pCreateUriWithFragment(http_urlW, NULL, invalid_flag_tests[i].flags, 0, &uri);
6724 ok(hr == invalid_flag_tests[i].expected, "Error: CreateUriWithFragment returned 0x%08x, expected 0x%08x. flags=0x%08x.\n",
6725 hr, invalid_flag_tests[i].expected, invalid_flag_tests[i].flags);
6726 ok(uri == NULL, "Error: Expected uri to be NULL, but was %p instead.\n", uri);
6730 static void test_CreateUriWithFragment(void) {
6731 DWORD i;
6733 for(i = 0; i < sizeof(uri_fragment_tests)/sizeof(uri_fragment_tests[0]); ++i) {
6734 HRESULT hr;
6735 IUri *uri = NULL;
6736 LPWSTR uriW, fragW;
6737 uri_with_fragment test = uri_fragment_tests[i];
6739 uriW = a2w(test.uri);
6740 fragW = a2w(test.fragment);
6742 hr = pCreateUriWithFragment(uriW, fragW, test.create_flags, 0, &uri);
6743 if(test.expected_todo) {
6744 todo_wine {
6745 ok(hr == test.create_expected,
6746 "Error: CreateUriWithFragment returned 0x%08x, expected 0x%08x on uri_fragment_tests[%d].\n",
6747 hr, test.create_expected, i);
6749 } else
6750 ok(hr == test.create_expected,
6751 "Error: CreateUriWithFragment returned 0x%08x, expected 0x%08x on uri_fragment_tests[%d].\n",
6752 hr, test.create_expected, i);
6754 if(SUCCEEDED(hr)) {
6755 BSTR received = NULL;
6757 hr = IUri_GetAbsoluteUri(uri, &received);
6758 if(test.expected_todo) {
6759 todo_wine {
6760 ok(hr == S_OK,
6761 "Error: GetAbsoluteUri returned 0x%08x, expected 0x%08x on uri_fragment_tests[%d].\n",
6762 hr, S_OK, i);
6764 todo_wine {
6765 ok(!strcmp_aw(test.expected_uri, received),
6766 "Error: Expected %s but got %s on uri_fragment_tests[%d].\n",
6767 test.expected_uri, wine_dbgstr_w(received), i);
6769 } else {
6770 ok(hr == S_OK, "Error: GetAbsoluteUri returned 0x%08x, expected 0x%08x on uri_fragment_tests[%d].\n",
6771 hr, S_OK, i);
6772 ok(!strcmp_aw(test.expected_uri, received), "Error: Expected %s but got %s on uri_fragment_tests[%d].\n",
6773 test.expected_uri, wine_dbgstr_w(received), i);
6776 SysFreeString(received);
6779 if(uri) IUri_Release(uri);
6780 heap_free(uriW);
6784 static void test_CreateIUriBuilder(void) {
6785 HRESULT hr;
6786 IUriBuilder *builder = NULL;
6787 IUri *uri;
6789 hr = pCreateIUriBuilder(NULL, 0, 0, NULL);
6790 ok(hr == E_POINTER, "Error: CreateIUriBuilder returned 0x%08x, expected 0x%08x\n",
6791 hr, E_POINTER);
6793 /* CreateIUriBuilder increases the ref count of the IUri it receives. */
6794 hr = pCreateUri(http_urlW, 0, 0, &uri);
6795 ok(hr == S_OK, "Error: CreateUri returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
6796 if(SUCCEEDED(hr)) {
6797 ULONG cur_count, orig_count;
6799 orig_count = get_refcnt(uri);
6800 hr = pCreateIUriBuilder(uri, 0, 0, &builder);
6801 ok(hr == S_OK, "Error: CreateIUriBuilder returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
6802 ok(builder != NULL, "Error: Expecting builder not to be NULL\n");
6804 cur_count = get_refcnt(uri);
6805 ok(cur_count == orig_count+1, "Error: Expected the ref count to be %u, but was %u instead.\n", orig_count+1, cur_count);
6807 if(builder) IUriBuilder_Release(builder);
6808 cur_count = get_refcnt(uri);
6809 ok(cur_count == orig_count, "Error: Expected the ref count to be %u, but was %u instead.\n", orig_count, cur_count);
6811 if(uri) IUri_Release(uri);
6814 static void test_IUriBuilder_CreateUri(IUriBuilder *builder, const uri_builder_test *test,
6815 DWORD test_index) {
6816 HRESULT hr;
6817 IUri *uri = NULL;
6819 hr = IUriBuilder_CreateUri(builder, test->uri_flags, 0, 0, &uri);
6820 if(test->uri_todo) {
6821 todo_wine {
6822 ok(hr == test->uri_hres,
6823 "Error: IUriBuilder_CreateUri returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
6824 hr, test->uri_hres, test_index);
6826 } else {
6827 ok(hr == test->uri_hres,
6828 "Error: IUriBuilder_CreateUri returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
6829 hr, test->uri_hres, test_index);
6832 if(SUCCEEDED(hr)) {
6833 DWORD i;
6835 for(i = 0; i < sizeof(test->expected_str_props)/sizeof(test->expected_str_props[0]); ++i) {
6836 uri_builder_str_property prop = test->expected_str_props[i];
6837 BSTR received = NULL;
6839 hr = IUri_GetPropertyBSTR(uri, i, &received, 0);
6840 if(prop.todo) {
6841 todo_wine {
6842 ok(hr == prop.result,
6843 "Error: IUri_GetPropertyBSTR returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].expected_str_props[%d].\n",
6844 hr, prop.result, test_index, i);
6846 } else {
6847 ok(hr == prop.result,
6848 "Error: IUri_GetPropertyBSTR returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].expected_str_props[%d].\n",
6849 hr, prop.result, test_index, i);
6851 if(SUCCEEDED(hr)) {
6852 if(prop.todo) {
6853 todo_wine {
6854 ok(!strcmp_aw(prop.expected, received),
6855 "Error: Expected %s but got %s instead on uri_builder_tests[%d].expected_str_props[%d].\n",
6856 prop.expected, wine_dbgstr_w(received), test_index, i);
6858 } else {
6859 ok(!strcmp_aw(prop.expected, received),
6860 "Error: Expected %s but got %s instead on uri_builder_tests[%d].expected_str_props[%d].\n",
6861 prop.expected, wine_dbgstr_w(received), test_index, i);
6864 SysFreeString(received);
6867 for(i = 0; i < sizeof(test->expected_dword_props)/sizeof(test->expected_dword_props[0]); ++i) {
6868 uri_builder_dword_property prop = test->expected_dword_props[i];
6869 DWORD received = -2;
6871 hr = IUri_GetPropertyDWORD(uri, i+Uri_PROPERTY_DWORD_START, &received, 0);
6872 if(prop.todo) {
6873 todo_wine {
6874 ok(hr == prop.result,
6875 "Error: IUri_GetPropertyDWORD returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].expected_dword_props[%d].\n",
6876 hr, prop.result, test_index, i);
6878 } else {
6879 ok(hr == prop.result,
6880 "Error: IUri_GetPropertyDWORD returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].expected_dword_props[%d].\n",
6881 hr, prop.result, test_index, i);
6883 if(SUCCEEDED(hr)) {
6884 if(prop.todo) {
6885 todo_wine {
6886 ok(received == prop.expected,
6887 "Error: Expected %d but got %d instead on uri_builder_tests[%d].expected_dword_props[%d].\n",
6888 prop.expected, received, test_index, i);
6890 } else {
6891 ok(received == prop.expected,
6892 "Error: Expected %d but got %d instead on uri_builder_tests[%d].expected_dword_props[%d].\n",
6893 prop.expected, received, test_index, i);
6898 if(uri) IUri_Release(uri);
6901 static void test_IUriBuilder_CreateUriSimple(IUriBuilder *builder, const uri_builder_test *test,
6902 DWORD test_index) {
6903 HRESULT hr;
6904 IUri *uri = NULL;
6906 hr = IUriBuilder_CreateUriSimple(builder, test->uri_simple_encode_flags, 0, &uri);
6907 if(test->uri_simple_todo) {
6908 todo_wine {
6909 ok(hr == test->uri_simple_hres,
6910 "Error: IUriBuilder_CreateUriSimple returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
6911 hr, test->uri_simple_hres, test_index);
6913 } else {
6914 ok(hr == test->uri_simple_hres,
6915 "Error: IUriBuilder_CreateUriSimple returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
6916 hr, test->uri_simple_hres, test_index);
6919 if(SUCCEEDED(hr)) {
6920 DWORD i;
6922 for(i = 0; i < sizeof(test->expected_str_props)/sizeof(test->expected_str_props[0]); ++i) {
6923 uri_builder_str_property prop = test->expected_str_props[i];
6924 BSTR received = NULL;
6926 hr = IUri_GetPropertyBSTR(uri, i, &received, 0);
6927 if(prop.todo) {
6928 todo_wine {
6929 ok(hr == prop.result,
6930 "Error: IUri_GetPropertyBSTR returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].expected_str_props[%d].\n",
6931 hr, prop.result, test_index, i);
6933 } else {
6934 ok(hr == prop.result,
6935 "Error: IUri_GetPropertyBSTR returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].expected_str_props[%d].\n",
6936 hr, prop.result, test_index, i);
6938 if(SUCCEEDED(hr)) {
6939 if(prop.todo) {
6940 todo_wine {
6941 ok(!strcmp_aw(prop.expected, received),
6942 "Error: Expected %s but got %s instead on uri_builder_tests[%d].expected_str_props[%d].\n",
6943 prop.expected, wine_dbgstr_w(received), test_index, i);
6945 } else {
6946 ok(!strcmp_aw(prop.expected, received),
6947 "Error: Expected %s but got %s instead on uri_builder_tests[%d].expected_str_props[%d].\n",
6948 prop.expected, wine_dbgstr_w(received), test_index, i);
6951 SysFreeString(received);
6954 for(i = 0; i < sizeof(test->expected_dword_props)/sizeof(test->expected_dword_props[0]); ++i) {
6955 uri_builder_dword_property prop = test->expected_dword_props[i];
6956 DWORD received = -2;
6958 hr = IUri_GetPropertyDWORD(uri, i+Uri_PROPERTY_DWORD_START, &received, 0);
6959 if(prop.todo) {
6960 todo_wine {
6961 ok(hr == prop.result,
6962 "Error: IUri_GetPropertyDWORD returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].expected_dword_props[%d].\n",
6963 hr, prop.result, test_index, i);
6965 } else {
6966 ok(hr == prop.result,
6967 "Error: IUri_GetPropertyDWORD returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].expected_dword_props[%d].\n",
6968 hr, prop.result, test_index, i);
6970 if(SUCCEEDED(hr)) {
6971 if(prop.todo) {
6972 todo_wine {
6973 ok(received == prop.expected,
6974 "Error: Expected %d but got %d instead on uri_builder_tests[%d].expected_dword_props[%d].\n",
6975 prop.expected, received, test_index, i);
6977 } else {
6978 ok(received == prop.expected,
6979 "Error: Expected %d but got %d instead on uri_builder_tests[%d].expected_dword_props[%d].\n",
6980 prop.expected, received, test_index, i);
6985 if(uri) IUri_Release(uri);
6988 static void test_IUriBuilder_CreateUriWithFlags(IUriBuilder *builder, const uri_builder_test *test,
6989 DWORD test_index) {
6990 HRESULT hr;
6991 IUri *uri = NULL;
6993 hr = IUriBuilder_CreateUriWithFlags(builder, test->uri_with_flags, test->uri_with_builder_flags,
6994 test->uri_with_encode_flags, 0, &uri);
6995 if(test->uri_with_todo) {
6996 todo_wine {
6997 ok(hr == test->uri_with_hres,
6998 "Error: IUriBuilder_CreateUriWithFlags returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
6999 hr, test->uri_with_hres, test_index);
7001 } else {
7002 ok(hr == test->uri_with_hres,
7003 "Error: IUriBuilder_CreateUriWithFlags returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
7004 hr, test->uri_with_hres, test_index);
7007 if(SUCCEEDED(hr)) {
7008 DWORD i;
7010 for(i = 0; i < sizeof(test->expected_str_props)/sizeof(test->expected_str_props[0]); ++i) {
7011 uri_builder_str_property prop = test->expected_str_props[i];
7012 BSTR received = NULL;
7014 hr = IUri_GetPropertyBSTR(uri, i, &received, 0);
7015 if(prop.todo) {
7016 todo_wine {
7017 ok(hr == prop.result,
7018 "Error: IUri_GetPropertyBSTR returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].expected_str_props[%d].\n",
7019 hr, prop.result, test_index, i);
7021 } else {
7022 ok(hr == prop.result,
7023 "Error: IUri_GetPropertyBSTR returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].expected_str_props[%d].\n",
7024 hr, prop.result, test_index, i);
7026 if(SUCCEEDED(hr)) {
7027 if(prop.todo) {
7028 todo_wine {
7029 ok(!strcmp_aw(prop.expected, received),
7030 "Error: Expected %s but got %s instead on uri_builder_tests[%d].expected_str_props[%d].\n",
7031 prop.expected, wine_dbgstr_w(received), test_index, i);
7033 } else {
7034 ok(!strcmp_aw(prop.expected, received),
7035 "Error: Expected %s but got %s instead on uri_builder_tests[%d].expected_str_props[%d].\n",
7036 prop.expected, wine_dbgstr_w(received), test_index, i);
7039 SysFreeString(received);
7042 for(i = 0; i < sizeof(test->expected_dword_props)/sizeof(test->expected_dword_props[0]); ++i) {
7043 uri_builder_dword_property prop = test->expected_dword_props[i];
7044 DWORD received = -2;
7046 hr = IUri_GetPropertyDWORD(uri, i+Uri_PROPERTY_DWORD_START, &received, 0);
7047 if(prop.todo) {
7048 todo_wine {
7049 ok(hr == prop.result,
7050 "Error: IUri_GetPropertyDWORD returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].expected_dword_props[%d].\n",
7051 hr, prop.result, test_index, i);
7053 } else {
7054 ok(hr == prop.result,
7055 "Error: IUri_GetPropertyDWORD returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].expected_dword_props[%d].\n",
7056 hr, prop.result, test_index, i);
7058 if(SUCCEEDED(hr)) {
7059 if(prop.todo) {
7060 todo_wine {
7061 ok(received == prop.expected,
7062 "Error: Expected %d but got %d instead on uri_builder_tests[%d].expected_dword_props[%d].\n",
7063 prop.expected, received, test_index, i);
7065 } else {
7066 ok(received == prop.expected,
7067 "Error: Expected %d but got %d instead on uri_builder_tests[%d].expected_dword_props[%d].\n",
7068 prop.expected, received, test_index, i);
7073 if(uri) IUri_Release(uri);
7076 static void test_IUriBuilder_CreateInvalidArgs(void) {
7077 IUriBuilder *builder;
7078 HRESULT hr;
7080 hr = pCreateIUriBuilder(NULL, 0, 0, &builder);
7081 ok(hr == S_OK, "Error: CreateIUriBuilder returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
7082 if(SUCCEEDED(hr)) {
7083 IUri *test = NULL, *uri = (void*) 0xdeadbeef;
7085 /* Test what happens if the IUriBuilder doesn't have a IUri set. */
7086 hr = IUriBuilder_CreateUri(builder, 0, 0, 0, NULL);
7087 ok(hr == E_POINTER, "Error: IUriBuilder_CreateUri returned 0x%08x, expected 0x%08x.\n", hr, E_POINTER);
7089 uri = (void*) 0xdeadbeef;
7090 hr = IUriBuilder_CreateUri(builder, 0, Uri_HAS_USER_NAME, 0, &uri);
7091 ok(hr == E_NOTIMPL, "Error: IUriBuilder_CreateUri returned 0x%08x, expected 0x%08x.\n", hr, E_NOTIMPL);
7092 ok(uri == NULL, "Error: expected uri to be NULL, but was %p instead.\n", uri);
7094 hr = IUriBuilder_CreateUriSimple(builder, 0, 0, NULL);
7095 ok(hr == E_POINTER, "Error: IUriBuilder_CreateUriSimple returned 0x%08x, expected 0x%08x.\n",
7096 hr, E_POINTER);
7098 uri = (void*) 0xdeadbeef;
7099 hr = IUriBuilder_CreateUriSimple(builder, Uri_HAS_USER_NAME, 0, &uri);
7100 ok(hr == E_NOTIMPL, "Error: IUriBuilder_CreateUriSimple returned 0x%08x, expected 0x%08x.\n",
7101 hr, E_NOTIMPL);
7102 ok(!uri, "Error: Expected uri to NULL, but was %p instead.\n", uri);
7104 hr = IUriBuilder_CreateUriWithFlags(builder, 0, 0, 0, 0, NULL);
7105 ok(hr == E_POINTER, "Error: IUriBuilder_CreateUriWithFlags returned 0x%08x, expected 0x%08x.\n",
7106 hr, E_POINTER);
7108 uri = (void*) 0xdeadbeef;
7109 hr = IUriBuilder_CreateUriWithFlags(builder, 0, 0, Uri_HAS_USER_NAME, 0, &uri);
7110 ok(hr == E_NOTIMPL, "Error: IUriBuilder_CreateUriWithFlags returned 0x%08x, expected 0x%08x.\n",
7111 hr, E_NOTIMPL);
7112 ok(!uri, "Error: Expected uri to be NULL, but was %p instead.\n", uri);
7114 hr = pCreateUri(http_urlW, 0, 0, &test);
7115 ok(hr == S_OK, "Error: CreateUri returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
7116 if(SUCCEEDED(hr)) {
7117 hr = IUriBuilder_SetIUri(builder, test);
7118 ok(hr == S_OK, "Error: IUriBuilder_SetIUri returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
7120 /* No longer returns E_NOTIMPL, since a IUri has been set and hasn't been modified. */
7121 uri = NULL;
7122 hr = IUriBuilder_CreateUri(builder, 0, Uri_HAS_USER_NAME, 0, &uri);
7123 ok(hr == S_OK, "Error: IUriBuilder_CreateUri returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
7124 ok(uri != NULL, "Error: The uri was NULL.\n");
7125 if(uri) IUri_Release(uri);
7127 uri = NULL;
7128 hr = IUriBuilder_CreateUriSimple(builder, Uri_HAS_USER_NAME, 0, &uri);
7129 ok(hr == S_OK, "Error: IUriBuilder_CreateUriSimple returned 0x%08x, expected 0x%08x.\n",
7130 hr, S_OK);
7131 ok(uri != NULL, "Error: uri was NULL.\n");
7132 if(uri) IUri_Release(uri);
7134 uri = NULL;
7135 hr = IUriBuilder_CreateUriWithFlags(builder, 0, 0, 0, 0, &uri);
7136 ok(hr == S_OK, "Error: IUriBuilder_CreateUriWithFlags returned 0x%08x, expected 0x%08x.\n",
7137 hr, S_OK);
7138 ok(uri != NULL, "Error: uri was NULL.\n");
7139 if(uri) IUri_Release(uri);
7141 hr = IUriBuilder_SetFragment(builder, NULL);
7142 ok(hr == S_OK, "Error: IUriBuilder_SetFragment returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
7144 /* The IUriBuilder is changed, so it returns E_NOTIMPL again. */
7145 uri = (void*) 0xdeadbeef;
7146 hr = IUriBuilder_CreateUri(builder, 0, Uri_HAS_USER_NAME, 0, &uri);
7147 ok(hr == E_NOTIMPL, "Error: IUriBuilder_CreateUri returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
7148 ok(!uri, "Error: Expected uri to be NULL but was %p instead.\n", uri);
7150 uri = (void*) 0xdeadbeef;
7151 hr = IUriBuilder_CreateUriSimple(builder, Uri_HAS_USER_NAME, 0, &uri);
7152 ok(hr == E_NOTIMPL, "Error: IUriBuilder_CreateUriSimple returned 0x%08x, expected 0x%08x.\n",
7153 hr, S_OK);
7154 ok(!uri, "Error: Expected uri to be NULL, but was %p instead.\n", uri);
7156 uri = (void*) 0xdeadbeef;
7157 hr = IUriBuilder_CreateUriWithFlags(builder, 0, 0, Uri_HAS_USER_NAME, 0, &uri);
7158 ok(hr == E_NOTIMPL, "Error: IUriBuilder_CreateUriWithFlags returned 0x%08x, expected 0x%08x.\n",
7159 hr, E_NOTIMPL);
7160 ok(!uri, "Error: Expected uri to be NULL, but was %p instead.\n", uri);
7162 if(test) IUri_Release(test);
7164 if(builder) IUriBuilder_Release(builder);
7167 /* Tests invalid args to the "Get*" functions. */
7168 static void test_IUriBuilder_GetInvalidArgs(void) {
7169 IUriBuilder *builder = NULL;
7170 HRESULT hr;
7172 hr = pCreateIUriBuilder(NULL, 0, 0, &builder);
7173 ok(hr == S_OK, "Error: CreateIUriBuilder returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
7174 if(SUCCEEDED(hr)) {
7175 LPCWSTR received = (void*) 0xdeadbeef;
7176 DWORD len = -1, port = -1;
7177 BOOL set = -1;
7179 hr = IUriBuilder_GetFragment(builder, NULL, NULL);
7180 ok(hr == E_POINTER, "Error: IUriBuilder_GetFragment returned 0x%08x, expected 0x%08x.\n",
7181 hr, E_POINTER);
7182 hr = IUriBuilder_GetFragment(builder, NULL, &received);
7183 ok(hr == E_POINTER, "Error: IUriBuilder_GetFragment returned 0x%08x, expected 0x%08x.\n",
7184 hr, E_POINTER);
7185 ok(!received, "Error: Expected received to be NULL, but was %p instead.\n", received);
7186 hr = IUriBuilder_GetFragment(builder, &len, NULL);
7187 ok(hr == E_POINTER, "Error: IUriBuilder_GetFragment returned 0x%08x, expected 0x%08x.\n",
7188 hr, E_POINTER);
7189 ok(!len, "Error: Expected len to be 0, but was %d instead.\n", len);
7191 hr = IUriBuilder_GetHost(builder, NULL, NULL);
7192 ok(hr == E_POINTER, "Error: IUriBuilder_GetHost returned 0x%08x, expected 0x%08x.\n",
7193 hr, E_POINTER);
7194 received = (void*) 0xdeadbeef;
7195 hr = IUriBuilder_GetHost(builder, NULL, &received);
7196 ok(hr == E_POINTER, "Error: IUriBuilder_GetHost returned 0x%08x, expected 0x%08x.\n",
7197 hr, E_POINTER);
7198 ok(!received, "Error: Expected received to be NULL, but was %p instead.\n", received);
7199 len = -1;
7200 hr = IUriBuilder_GetHost(builder, &len, NULL);
7201 ok(hr == E_POINTER, "Error: IUriBuilder_GetHost returned 0x%08x, expected 0x%08x.\n",
7202 hr, E_POINTER);
7203 ok(!len, "Error: Expected len to be 0, but was %d instead.\n", len);
7205 hr = IUriBuilder_GetPassword(builder, NULL, NULL);
7206 ok(hr == E_POINTER, "Error: IUriBuilder_GetPassword returned 0x%08x, expected 0x%08x.\n",
7207 hr, E_POINTER);
7208 received = (void*) 0xdeadbeef;
7209 hr = IUriBuilder_GetPassword(builder, NULL, &received);
7210 ok(hr == E_POINTER, "Error: IUriBuilder_GetPassword returned 0x%08x, expected 0x%08x.\n",
7211 hr, E_POINTER);
7212 ok(!received, "Error: Expected received to be NULL, but was %p instead.\n", received);
7213 len = -1;
7214 hr = IUriBuilder_GetPassword(builder, &len, NULL);
7215 ok(hr == E_POINTER, "Error: IUriBuilder_GetPassword returned 0x%08x, expected 0x%08x.\n",
7216 hr, E_POINTER);
7217 ok(!len, "Error: Expected len to be 0, but was %d instead.\n", len);
7219 hr = IUriBuilder_GetPath(builder, NULL, NULL);
7220 ok(hr == E_POINTER, "Error: IUriBuilder_GetPath returned 0x%08x, expected 0x%08x.\n",
7221 hr, E_POINTER);
7222 received = (void*) 0xdeadbeef;
7223 hr = IUriBuilder_GetPath(builder, NULL, &received);
7224 ok(hr == E_POINTER, "Error: IUriBuilder_GetPath returned 0x%08x, expected 0x%08x.\n",
7225 hr, E_POINTER);
7226 ok(!received, "Error: Expected received to be NULL, but was %p instead.\n", received);
7227 len = -1;
7228 hr = IUriBuilder_GetPath(builder, &len, NULL);
7229 ok(hr == E_POINTER, "Error: IUriBuilder_GetPath returned 0x%08x, expected 0x%08x.\n",
7230 hr, E_POINTER);
7231 ok(!len, "Error: Expected len to be 0, but was %d instead.\n", len);
7233 hr = IUriBuilder_GetPort(builder, NULL, NULL);
7234 ok(hr == E_POINTER, "Error: IUriBuilder_GetPort returned 0x%08x, expected 0x%08x.\n",
7235 hr, E_POINTER);
7236 hr = IUriBuilder_GetPort(builder, NULL, &port);
7237 ok(hr == E_POINTER, "Error: IUriBuilder_GetPort returned 0x%08x, expected 0x%08x.\n",
7238 hr, E_POINTER);
7239 ok(!port, "Error: Expected port to be 0, but was %d instead.\n", port);
7240 hr = IUriBuilder_GetPort(builder, &set, NULL);
7241 ok(hr == E_POINTER, "Error: IUriBuilder_GetPort returned 0x%08x, expected 0x%08x.\n",
7242 hr, E_POINTER);
7243 ok(!set, "Error: Expected set to be FALSE, but was %d instead.\n", set);
7245 hr = IUriBuilder_GetQuery(builder, NULL, NULL);
7246 ok(hr == E_POINTER, "Error: IUriBuilder_GetQuery returned 0x%08x, expected 0x%08x.\n",
7247 hr, E_POINTER);
7248 received = (void*) 0xdeadbeef;
7249 hr = IUriBuilder_GetQuery(builder, NULL, &received);
7250 ok(hr == E_POINTER, "Error: IUriBuilder_GetQuery returned 0x%08x, expected 0x%08x.\n",
7251 hr, E_POINTER);
7252 ok(!received, "Error: Expected received to be NULL, but was %p instead.\n", received);
7253 len = -1;
7254 hr = IUriBuilder_GetQuery(builder, &len, NULL);
7255 ok(hr == E_POINTER, "Error: IUriBuilder_GetQuery returned 0x%08x, expected 0x%08x.\n",
7256 hr, E_POINTER);
7257 ok(!len, "Error: Expected len to be 0, but was %d instead.\n", len);
7259 hr = IUriBuilder_GetSchemeName(builder, NULL, NULL);
7260 ok(hr == E_POINTER, "Error: IUriBuilder_GetSchemeName returned 0x%08x, expected 0x%08x.\n",
7261 hr, E_POINTER);
7262 received = (void*) 0xdeadbeef;
7263 hr = IUriBuilder_GetSchemeName(builder, NULL, &received);
7264 ok(hr == E_POINTER, "Error: IUriBuilder_GetSchemeName returned 0x%08x, expected 0x%08x.\n",
7265 hr, E_POINTER);
7266 ok(!received, "Error: Expected received to be NULL, but was %p instead.\n", received);
7267 len = -1;
7268 hr = IUriBuilder_GetSchemeName(builder, &len, NULL);
7269 ok(hr == E_POINTER, "Error: IUriBuilder_GetSchemeName returned 0x%08x, expected 0x%08x.\n",
7270 hr, E_POINTER);
7271 ok(!len, "Error: Expected len to be 0, but was %d instead.\n", len);
7273 hr = IUriBuilder_GetUserName(builder, NULL, NULL);
7274 ok(hr == E_POINTER, "Error: IUriBuilder_GetUserName returned 0x%08x, expected 0x%08x.\n",
7275 hr, E_POINTER);
7276 received = (void*) 0xdeadbeef;
7277 hr = IUriBuilder_GetUserName(builder, NULL, &received);
7278 ok(hr == E_POINTER, "Error: IUriBuilder_GetUserName returned 0x%08x, expected 0x%08x.\n",
7279 hr, E_POINTER);
7280 ok(!received, "Error: Expected received to be NULL, but was %p instead.\n", received);
7281 len = -1;
7282 hr = IUriBuilder_GetUserName(builder, &len, NULL);
7283 ok(hr == E_POINTER, "Error: IUriBuilder_GetUserName returned 0x%08x, expected 0x%08x.\n",
7284 hr, E_POINTER);
7285 ok(!len, "Error: Expected len to be 0, but was %d instead.\n", len);
7287 if(builder) IUriBuilder_Release(builder);
7290 static void test_IUriBuilder_GetFragment(IUriBuilder *builder, const uri_builder_test *test,
7291 DWORD test_index) {
7292 HRESULT hr;
7293 DWORD i;
7294 LPCWSTR received = NULL;
7295 DWORD len = -1;
7296 const uri_builder_property *prop = NULL;
7298 /* Check if the property was set earlier. */
7299 for(i = 0; i < sizeof(test->properties)/sizeof(test->properties[0]); ++i) {
7300 if(test->properties[i].change && test->properties[i].property == Uri_PROPERTY_FRAGMENT)
7301 prop = &(test->properties[i]);
7304 if(prop) {
7305 /* Use expected_value unless it's NULL, then use value. */
7306 LPCSTR expected = prop->expected_value ? prop->expected_value : prop->value;
7307 hr = IUriBuilder_GetFragment(builder, &len, &received);
7308 if(prop->todo) {
7309 todo_wine {
7310 ok(hr == (expected ? S_OK : S_FALSE),
7311 "Error: IUriBuilder_GetFragment returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
7312 hr, (expected ? S_OK : S_FALSE), test_index);
7314 if(SUCCEEDED(hr)) {
7315 todo_wine {
7316 ok(!strcmp_aw(expected, received), "Error: Expected %s but got %s on uri_builder_tests[%d].\n",
7317 expected, wine_dbgstr_w(received), test_index);
7319 todo_wine {
7320 ok(lstrlen(expected) == len,
7321 "Error: Expected the length to be %d, but was %d instead on uri_builder_tests[%d].\n",
7322 lstrlen(expected), len, test_index);
7325 } else {
7326 ok(hr == (expected ? S_OK : S_FALSE),
7327 "Error: IUriBuilder_GetFragment returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
7328 hr, (expected ? S_OK : S_FALSE), test_index);
7329 ok(!strcmp_aw(expected, received), "Error: Expected %s but got %s on uri_builder_tests[%d].\n",
7330 expected, wine_dbgstr_w(received), test_index);
7331 ok(lstrlen(expected) == len,
7332 "Error: Expected the length to be %d, but was %d instead on uri_builder_tests[%d].\n",
7333 lstrlen(expected), len, test_index);
7335 } else {
7336 /* The property wasn't set earlier, so it should return whatever
7337 * the base IUri contains (if anything).
7339 IUri *uri = NULL;
7340 hr = IUriBuilder_GetIUri(builder, &uri);
7341 ok(hr == S_OK,
7342 "Error: IUriBuilder_GetIUri returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
7343 hr, S_OK, test_index);
7344 if(SUCCEEDED(hr)) {
7345 if(!uri) {
7346 received = (void*) 0xdeadbeef;
7347 len = -1;
7349 hr = IUriBuilder_GetFragment(builder, &len, &received);
7350 ok(hr == S_FALSE,
7351 "Error: IUriBuilder_GetFragment returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
7352 hr, S_FALSE, test_index);
7353 if(SUCCEEDED(hr)) {
7354 ok(!len, "Error: Expected len to be 0, but was %d instead on uri_builder_tests[%d].\n",
7355 len, test_index);
7356 ok(!received, "Error: Expected received to be NULL, but was %p instead on uri_builder_tests[%d].\n",
7357 received, test_index);
7359 } else {
7360 BOOL has_prop = FALSE;
7361 BSTR expected = NULL;
7363 hr = IUri_GetFragment(uri, &expected);
7364 ok(SUCCEEDED(hr),
7365 "Error: Expected IUri_GetFragment to succeed, but got 0x%08x instead on uri_builder_tests[%d].\n",
7366 hr, test_index);
7367 has_prop = hr == S_OK;
7369 hr = IUriBuilder_GetFragment(builder, &len, &received);
7370 if(has_prop) {
7371 ok(hr == S_OK,
7372 "Error: IUriBuilder_GetFragment returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
7373 hr, S_OK, test_index);
7374 if(SUCCEEDED(hr)) {
7375 ok(!lstrcmpW(expected, received),
7376 "Error: Expected %s but got %s instead on uri_builder_tests[%d].\n",
7377 wine_dbgstr_w(expected), wine_dbgstr_w(received), test_index);
7378 ok(lstrlenW(expected) == len,
7379 "Error: Expected the length to be %d, but was %d instead on uri_builder_tests[%d].\n",
7380 lstrlenW(expected), len, test_index);
7382 } else {
7383 ok(hr == S_FALSE,
7384 "Error: IUriBuilder_GetFragment returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
7385 hr, S_FALSE, test_index);
7386 if(SUCCEEDED(hr)) {
7387 ok(!received, "Error: Expected received to be NULL on uri_builder_tests[%d].\n", test_index);
7388 ok(!len, "Error: Expected the length to be 0, but was %d instead on uri_builder_tests[%d].\n",
7389 len, test_index);
7392 SysFreeString(expected);
7395 if(uri) IUri_Release(uri);
7399 static void test_IUriBuilder_GetHost(IUriBuilder *builder, const uri_builder_test *test,
7400 DWORD test_index) {
7401 HRESULT hr;
7402 DWORD i;
7403 LPCWSTR received = NULL;
7404 DWORD len = -1;
7405 const uri_builder_property *prop = NULL;
7407 /* Check if the property was set earlier. */
7408 for(i = 0; i < sizeof(test->properties)/sizeof(test->properties[0]); ++i) {
7409 if(test->properties[i].change && test->properties[i].property == Uri_PROPERTY_HOST)
7410 prop = &(test->properties[i]);
7413 if(prop) {
7414 /* Use expected_value unless it's NULL, then use value. */
7415 LPCSTR expected = prop->expected_value ? prop->expected_value : prop->value;
7416 hr = IUriBuilder_GetHost(builder, &len, &received);
7417 if(prop->todo) {
7418 todo_wine {
7419 ok(hr == (expected ? S_OK : S_FALSE),
7420 "Error: IUriBuilder_GetHost returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
7421 hr, (expected ? S_OK : S_FALSE), test_index);
7423 if(SUCCEEDED(hr)) {
7424 todo_wine {
7425 ok(!strcmp_aw(expected, received), "Error: Expected %s but got %s on uri_builder_tests[%d].\n",
7426 expected, wine_dbgstr_w(received), test_index);
7428 todo_wine {
7429 ok(lstrlen(expected) == len,
7430 "Error: Expected the length to be %d, but was %d instead on uri_builder_tests[%d].\n",
7431 lstrlen(expected), len, test_index);
7434 } else {
7435 ok(hr == (expected ? S_OK : S_FALSE),
7436 "Error: IUriBuilder_GetHost returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
7437 hr, (expected ? S_OK : S_FALSE), test_index);
7438 ok(!strcmp_aw(expected, received), "Error: Expected %s but got %s on uri_builder_tests[%d].\n",
7439 expected, wine_dbgstr_w(received), test_index);
7440 ok(lstrlen(expected) == len,
7441 "Error: Expected the length to be %d, but was %d instead on uri_builder_tests[%d].\n",
7442 lstrlen(expected), len, test_index);
7444 } else {
7445 /* The property wasn't set earlier, so it should return whatever
7446 * the base IUri contains (if anything).
7448 IUri *uri = NULL;
7449 hr = IUriBuilder_GetIUri(builder, &uri);
7450 ok(hr == S_OK,
7451 "Error: IUriBuilder_GetIUri returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
7452 hr, S_OK, test_index);
7453 if(SUCCEEDED(hr)) {
7454 if(!uri) {
7455 received = (void*) 0xdeadbeef;
7456 len = -1;
7458 hr = IUriBuilder_GetHost(builder, &len, &received);
7459 ok(hr == S_FALSE,
7460 "Error: IUriBuilder_GetHost returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
7461 hr, S_FALSE, test_index);
7462 if(SUCCEEDED(hr)) {
7463 ok(!len, "Error: Expected len to be 0, but was %d instead on uri_builder_tests[%d].\n",
7464 len, test_index);
7465 ok(!received, "Error: Expected received to be NULL, but was %p instead on uri_builder_tests[%d].\n",
7466 received, test_index);
7468 } else {
7469 BOOL has_prop = FALSE;
7470 BSTR expected = NULL;
7472 hr = IUri_GetHost(uri, &expected);
7473 ok(SUCCEEDED(hr),
7474 "Error: Expected IUri_GetHost to succeed, but got 0x%08x instead on uri_builder_tests[%d].\n",
7475 hr, test_index);
7476 has_prop = hr == S_OK;
7478 hr = IUriBuilder_GetHost(builder, &len, &received);
7479 if(has_prop) {
7480 ok(hr == S_OK,
7481 "Error: IUriBuilder_GetHost returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
7482 hr, S_OK, test_index);
7483 if(SUCCEEDED(hr)) {
7484 ok(!lstrcmpW(expected, received),
7485 "Error: Expected %s but got %s instead on uri_builder_tests[%d].\n",
7486 wine_dbgstr_w(expected), wine_dbgstr_w(received), test_index);
7487 ok(lstrlenW(expected) == len,
7488 "Error: Expected the length to be %d, but was %d instead on uri_builder_tests[%d].\n",
7489 lstrlenW(expected), len, test_index);
7491 } else {
7492 ok(hr == S_FALSE,
7493 "Error: IUriBuilder_GetHost returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
7494 hr, S_FALSE, test_index);
7495 if(SUCCEEDED(hr)) {
7496 ok(!received, "Error: Expected received to be NULL on uri_builder_tests[%d].\n", test_index);
7497 ok(!len, "Error: Expected the length to be 0, but was %d instead on uri_builder_tests[%d].\n",
7498 len, test_index);
7501 SysFreeString(expected);
7504 if(uri) IUri_Release(uri);
7508 static void test_IUriBuilder_GetPassword(IUriBuilder *builder, const uri_builder_test *test,
7509 DWORD test_index) {
7510 HRESULT hr;
7511 DWORD i;
7512 LPCWSTR received = NULL;
7513 DWORD len = -1;
7514 const uri_builder_property *prop = NULL;
7516 /* Check if the property was set earlier. */
7517 for(i = 0; i < sizeof(test->properties)/sizeof(test->properties[0]); ++i) {
7518 if(test->properties[i].change && test->properties[i].property == Uri_PROPERTY_PASSWORD)
7519 prop = &(test->properties[i]);
7522 if(prop) {
7523 /* Use expected_value unless it's NULL, then use value. */
7524 LPCSTR expected = prop->expected_value ? prop->expected_value : prop->value;
7525 hr = IUriBuilder_GetPassword(builder, &len, &received);
7526 if(prop->todo) {
7527 todo_wine {
7528 ok(hr == (expected ? S_OK : S_FALSE),
7529 "Error: IUriBuilder_GetPassword returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
7530 hr, (expected ? S_OK : S_FALSE), test_index);
7532 if(SUCCEEDED(hr)) {
7533 todo_wine {
7534 ok(!strcmp_aw(expected, received), "Error: Expected %s but got %s on uri_builder_tests[%d].\n",
7535 expected, wine_dbgstr_w(received), test_index);
7537 todo_wine {
7538 ok(lstrlen(expected) == len,
7539 "Error: Expected the length to be %d, but was %d instead on uri_builder_tests[%d].\n",
7540 lstrlen(expected), len, test_index);
7543 } else {
7544 ok(hr == (expected ? S_OK : S_FALSE),
7545 "Error: IUriBuilder_GetPassword returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
7546 hr, (expected ? S_OK : S_FALSE), test_index);
7547 ok(!strcmp_aw(expected, received), "Error: Expected %s but got %s on uri_builder_tests[%d].\n",
7548 expected, wine_dbgstr_w(received), test_index);
7549 ok(lstrlen(expected) == len,
7550 "Error: Expected the length to be %d, but was %d instead on uri_builder_tests[%d].\n",
7551 lstrlen(expected), len, test_index);
7553 } else {
7554 /* The property wasn't set earlier, so it should return whatever
7555 * the base IUri contains (if anything).
7557 IUri *uri = NULL;
7558 hr = IUriBuilder_GetIUri(builder, &uri);
7559 ok(hr == S_OK,
7560 "Error: IUriBuilder_GetIUri returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
7561 hr, S_OK, test_index);
7562 if(SUCCEEDED(hr)) {
7563 if(!uri) {
7564 received = (void*) 0xdeadbeef;
7565 len = -1;
7567 hr = IUriBuilder_GetPassword(builder, &len, &received);
7568 ok(hr == S_FALSE,
7569 "Error: IUriBuilder_GetPassword returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
7570 hr, S_FALSE, test_index);
7571 if(SUCCEEDED(hr)) {
7572 ok(!len, "Error: Expected len to be 0, but was %d instead on uri_builder_tests[%d].\n",
7573 len, test_index);
7574 ok(!received, "Error: Expected received to be NULL, but was %p instead on uri_builder_tests[%d].\n",
7575 received, test_index);
7577 } else {
7578 BOOL has_prop = FALSE;
7579 BSTR expected = NULL;
7581 hr = IUri_GetPassword(uri, &expected);
7582 ok(SUCCEEDED(hr),
7583 "Error: Expected IUri_GetPassword to succeed, but got 0x%08x instead on uri_builder_tests[%d].\n",
7584 hr, test_index);
7585 has_prop = hr == S_OK;
7587 hr = IUriBuilder_GetPassword(builder, &len, &received);
7588 if(has_prop) {
7589 ok(hr == S_OK,
7590 "Error: IUriBuilder_GetPassword returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
7591 hr, S_OK, test_index);
7592 if(SUCCEEDED(hr)) {
7593 ok(!lstrcmpW(expected, received),
7594 "Error: Expected %s but got %s instead on uri_builder_tests[%d].\n",
7595 wine_dbgstr_w(expected), wine_dbgstr_w(received), test_index);
7596 ok(lstrlenW(expected) == len,
7597 "Error: Expected the length to be %d, but was %d instead on uri_builder_tests[%d].\n",
7598 lstrlenW(expected), len, test_index);
7600 } else {
7601 ok(hr == S_FALSE,
7602 "Error: IUriBuilder_GetPassword returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
7603 hr, S_FALSE, test_index);
7604 if(SUCCEEDED(hr)) {
7605 ok(!received, "Error: Expected received to be NULL on uri_builder_tests[%d].\n", test_index);
7606 ok(!len, "Error: Expected the length to be 0, but was %d instead on uri_builder_tests[%d].\n",
7607 len, test_index);
7610 SysFreeString(expected);
7613 if(uri) IUri_Release(uri);
7617 static void test_IUriBuilder_GetPath(IUriBuilder *builder, const uri_builder_test *test,
7618 DWORD test_index) {
7619 HRESULT hr;
7620 DWORD i;
7621 LPCWSTR received = NULL;
7622 DWORD len = -1;
7623 const uri_builder_property *prop = NULL;
7625 /* Check if the property was set earlier. */
7626 for(i = 0; i < sizeof(test->properties)/sizeof(test->properties[0]); ++i) {
7627 if(test->properties[i].change && test->properties[i].property == Uri_PROPERTY_PATH)
7628 prop = &(test->properties[i]);
7631 if(prop) {
7632 /* Use expected_value unless it's NULL, then use value. */
7633 LPCSTR expected = prop->expected_value ? prop->expected_value : prop->value;
7634 hr = IUriBuilder_GetPath(builder, &len, &received);
7635 if(prop->todo) {
7636 todo_wine {
7637 ok(hr == (expected ? S_OK : S_FALSE),
7638 "Error: IUriBuilder_GetPath returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
7639 hr, (expected ? S_OK : S_FALSE), test_index);
7641 if(SUCCEEDED(hr)) {
7642 todo_wine {
7643 ok(!strcmp_aw(expected, received), "Error: Expected %s but got %s on uri_builder_tests[%d].\n",
7644 expected, wine_dbgstr_w(received), test_index);
7646 todo_wine {
7647 ok(lstrlen(expected) == len,
7648 "Error: Expected the length to be %d, but was %d instead on uri_builder_tests[%d].\n",
7649 lstrlen(expected), len, test_index);
7652 } else {
7653 ok(hr == (expected ? S_OK : S_FALSE),
7654 "Error: IUriBuilder_GetPath returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
7655 hr, (expected ? S_OK : S_FALSE), test_index);
7656 ok(!strcmp_aw(expected, received), "Error: Expected %s but got %s on uri_builder_tests[%d].\n",
7657 expected, wine_dbgstr_w(received), test_index);
7658 ok(lstrlen(expected) == len,
7659 "Error: Expected the length to be %d, but was %d instead on uri_builder_tests[%d].\n",
7660 lstrlen(expected), len, test_index);
7662 } else {
7663 /* The property wasn't set earlier, so it should return whatever
7664 * the base IUri contains (if anything).
7666 IUri *uri = NULL;
7667 hr = IUriBuilder_GetIUri(builder, &uri);
7668 ok(hr == S_OK,
7669 "Error: IUriBuilder_GetIUri returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
7670 hr, S_OK, test_index);
7671 if(SUCCEEDED(hr)) {
7672 if(!uri) {
7673 received = (void*) 0xdeadbeef;
7674 len = -1;
7676 hr = IUriBuilder_GetPath(builder, &len, &received);
7677 ok(hr == S_FALSE,
7678 "Error: IUriBuilder_GetPath returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
7679 hr, S_FALSE, test_index);
7680 if(SUCCEEDED(hr)) {
7681 ok(!len, "Error: Expected len to be 0, but was %d instead on uri_builder_tests[%d].\n",
7682 len, test_index);
7683 ok(!received, "Error: Expected received to be NULL, but was %p instead on uri_builder_tests[%d].\n",
7684 received, test_index);
7686 } else {
7687 BOOL has_prop = FALSE;
7688 BSTR expected = NULL;
7690 hr = IUri_GetPath(uri, &expected);
7691 ok(SUCCEEDED(hr),
7692 "Error: Expected IUri_GetPath to succeed, but got 0x%08x instead on uri_builder_tests[%d].\n",
7693 hr, test_index);
7694 has_prop = hr == S_OK;
7696 hr = IUriBuilder_GetPath(builder, &len, &received);
7697 if(has_prop) {
7698 ok(hr == S_OK,
7699 "Error: IUriBuilder_GetPath returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
7700 hr, S_OK, test_index);
7701 if(SUCCEEDED(hr)) {
7702 ok(!lstrcmpW(expected, received),
7703 "Error: Expected %s but got %s instead on uri_builder_tests[%d].\n",
7704 wine_dbgstr_w(expected), wine_dbgstr_w(received), test_index);
7705 ok(lstrlenW(expected) == len,
7706 "Error: Expected the length to be %d, but was %d instead on uri_builder_tests[%d].\n",
7707 lstrlenW(expected), len, test_index);
7709 } else {
7710 ok(hr == S_FALSE,
7711 "Error: IUriBuilder_GetPath returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
7712 hr, S_FALSE, test_index);
7713 if(SUCCEEDED(hr)) {
7714 ok(!received, "Error: Expected received to be NULL on uri_builder_tests[%d].\n", test_index);
7715 ok(!len, "Error: Expected the length to be 0, but was %d instead on uri_builder_tests[%d].\n",
7716 len, test_index);
7719 SysFreeString(expected);
7722 if(uri) IUri_Release(uri);
7726 static void test_IUriBuilder_GetPort(IUriBuilder *builder, const uri_builder_test *test,
7727 DWORD test_index) {
7728 HRESULT hr;
7729 BOOL has_port = FALSE;
7730 DWORD received = -1;
7732 if(test->port_prop.change) {
7733 DWORD expected = test->port_prop.value;
7735 hr = IUriBuilder_GetPort(builder, &has_port, &received);
7736 if(test->port_prop.todo) {
7737 todo_wine {
7738 ok(hr == S_OK,
7739 "Error: IUriBuilder_GetPort returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
7740 hr, S_OK, test_index);
7742 if(SUCCEEDED(hr)) {
7743 todo_wine {
7744 ok(has_port == test->port_prop.set,
7745 "Error: Expected has_port to be %d but was %d instead on uri_builder_tests[%d].\n",
7746 test->port_prop.set, has_port, test_index);
7748 todo_wine {
7749 ok(received == expected,
7750 "Error: Expected received to be %d, but was %d instead on uri_builder_tests[%d].\n",
7751 expected, received, test_index);
7754 } else {
7755 ok(hr == S_OK,
7756 "Error: IUriBuilder_GetPort returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
7757 hr, S_OK, test_index);
7758 ok(has_port == test->port_prop.set,
7759 "Error: Expected has_port to be %d, but was %d instead on uri_builder_tests[%d].\n",
7760 test->port_prop.set, has_port, test_index);
7761 ok(received == test->port_prop.value,
7762 "Error: Expected port to be %d, but was %d instead on uri_builder_tests[%d].\n",
7763 test->port_prop.value, received, test_index);
7765 } else {
7766 IUri *uri = NULL;
7768 hr = IUriBuilder_GetIUri(builder, &uri);
7769 ok(hr == S_OK,
7770 "Error: IUriBuilder_GetIUri returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
7771 hr, S_OK, test_index);
7772 if(SUCCEEDED(hr)) {
7773 if(!uri) {
7774 hr = IUriBuilder_GetPort(builder, &has_port, &received);
7775 ok(hr == S_OK,
7776 "Error: IUriBuilder_GetPort returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
7777 hr, S_OK, test_index);
7778 if(SUCCEEDED(hr)) {
7779 ok(has_port == FALSE,
7780 "Error: Expected has_port to be FALSE, but was %d instead on uri_builder_tests[%d].\n",
7781 has_port, test_index);
7782 ok(!received, "Error: Expected received to be 0, but was %d instead on uri_builder_tests[%d].\n",
7783 received, test_index);
7785 } else {
7786 DWORD expected;
7788 hr = IUri_GetPort(uri, &expected);
7789 ok(SUCCEEDED(hr),
7790 "Error: Expected IUri_Port to succeed, but got 0x%08x instead on uri_builder_tests[%d].\n",
7791 hr, test_index);
7793 hr = IUriBuilder_GetPort(builder, &has_port, &received);
7794 ok(hr == S_OK,
7795 "Error: IUriBuilder_GetPort returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
7796 hr, S_OK, test_index);
7797 if(SUCCEEDED(hr)) {
7798 ok(!has_port,
7799 "Error: Expected has_port to be FALSE but was TRUE instead on uri_builder_tests[%d].\n",
7800 test_index);
7801 ok(received == expected,
7802 "Error: Expected received to be %d, but was %d instead on uri_builder_tests[%d].\n",
7803 expected, received, test_index);
7807 if(uri) IUri_Release(uri);
7811 static void test_IUriBuilder_GetQuery(IUriBuilder *builder, const uri_builder_test *test,
7812 DWORD test_index) {
7813 HRESULT hr;
7814 DWORD i;
7815 LPCWSTR received = NULL;
7816 DWORD len = -1;
7817 const uri_builder_property *prop = NULL;
7819 /* Check if the property was set earlier. */
7820 for(i = 0; i < sizeof(test->properties)/sizeof(test->properties[0]); ++i) {
7821 if(test->properties[i].change && test->properties[i].property == Uri_PROPERTY_QUERY)
7822 prop = &(test->properties[i]);
7825 if(prop) {
7826 /* Use expected_value unless it's NULL, then use value. */
7827 LPCSTR expected = prop->expected_value ? prop->expected_value : prop->value;
7828 hr = IUriBuilder_GetQuery(builder, &len, &received);
7829 if(prop->todo) {
7830 todo_wine {
7831 ok(hr == (expected ? S_OK : S_FALSE),
7832 "Error: IUriBuilder_GetQuery returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
7833 hr, (expected ? S_OK : S_FALSE), test_index);
7835 if(SUCCEEDED(hr)) {
7836 todo_wine {
7837 ok(!strcmp_aw(expected, received), "Error: Expected %s but got %s on uri_builder_tests[%d].\n",
7838 expected, wine_dbgstr_w(received), test_index);
7840 todo_wine {
7841 ok(lstrlen(expected) == len,
7842 "Error: Expected the length to be %d, but was %d instead on uri_builder_tests[%d].\n",
7843 lstrlen(expected), len, test_index);
7846 } else {
7847 ok(hr == (expected ? S_OK : S_FALSE),
7848 "Error: IUriBuilder_GetQuery returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
7849 hr, (expected ? S_OK : S_FALSE), test_index);
7850 ok(!strcmp_aw(expected, received), "Error: Expected %s but got %s on uri_builder_tests[%d].\n",
7851 expected, wine_dbgstr_w(received), test_index);
7852 ok(lstrlen(expected) == len,
7853 "Error: Expected the length to be %d, but was %d instead on uri_builder_tests[%d].\n",
7854 lstrlen(expected), len, test_index);
7856 } else {
7857 /* The property wasn't set earlier, so it should return whatever
7858 * the base IUri contains (if anything).
7860 IUri *uri = NULL;
7861 hr = IUriBuilder_GetIUri(builder, &uri);
7862 ok(hr == S_OK,
7863 "Error: IUriBuilder_GetIUri returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
7864 hr, S_OK, test_index);
7865 if(SUCCEEDED(hr)) {
7866 if(!uri) {
7867 received = (void*) 0xdeadbeef;
7868 len = -1;
7870 hr = IUriBuilder_GetQuery(builder, &len, &received);
7871 ok(hr == S_FALSE,
7872 "Error: IUriBuilder_GetQuery returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
7873 hr, S_FALSE, test_index);
7874 if(SUCCEEDED(hr)) {
7875 ok(!len, "Error: Expected len to be 0, but was %d instead on uri_builder_tests[%d].\n",
7876 len, test_index);
7877 ok(!received, "Error: Expected received to be NULL, but was %p instead on uri_builder_tests[%d].\n",
7878 received, test_index);
7880 } else {
7881 BOOL has_prop = FALSE;
7882 BSTR expected = NULL;
7884 hr = IUri_GetQuery(uri, &expected);
7885 ok(SUCCEEDED(hr),
7886 "Error: Expected IUri_GetQuery to succeed, but got 0x%08x instead on uri_builder_tests[%d].\n",
7887 hr, test_index);
7888 has_prop = hr == S_OK;
7890 hr = IUriBuilder_GetQuery(builder, &len, &received);
7891 if(has_prop) {
7892 ok(hr == S_OK,
7893 "Error: IUriBuilder_GetQuery returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
7894 hr, S_OK, test_index);
7895 if(SUCCEEDED(hr)) {
7896 ok(!lstrcmpW(expected, received),
7897 "Error: Expected %s but got %s instead on uri_builder_tests[%d].\n",
7898 wine_dbgstr_w(expected), wine_dbgstr_w(received), test_index);
7899 ok(lstrlenW(expected) == len,
7900 "Error: Expected the length to be %d, but was %d instead on uri_builder_tests[%d].\n",
7901 lstrlenW(expected), len, test_index);
7903 } else {
7904 ok(hr == S_FALSE,
7905 "Error: IUriBuilder_GetQuery returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
7906 hr, S_FALSE, test_index);
7907 if(SUCCEEDED(hr)) {
7908 ok(!received, "Error: Expected received to be NULL on uri_builder_tests[%d].\n", test_index);
7909 ok(!len, "Error: Expected the length to be 0, but was %d instead on uri_builder_tests[%d].\n",
7910 len, test_index);
7913 SysFreeString(expected);
7916 if(uri) IUri_Release(uri);
7920 static void test_IUriBuilder_GetSchemeName(IUriBuilder *builder, const uri_builder_test *test,
7921 DWORD test_index) {
7922 HRESULT hr;
7923 DWORD i;
7924 LPCWSTR received = NULL;
7925 DWORD len = -1;
7926 const uri_builder_property *prop = NULL;
7928 /* Check if the property was set earlier. */
7929 for(i = 0; i < sizeof(test->properties)/sizeof(test->properties[0]); ++i) {
7930 if(test->properties[i].change && test->properties[i].property == Uri_PROPERTY_SCHEME_NAME)
7931 prop = &(test->properties[i]);
7934 if(prop) {
7935 /* Use expected_value unless it's NULL, then use value. */
7936 LPCSTR expected = prop->expected_value ? prop->expected_value : prop->value;
7937 hr = IUriBuilder_GetSchemeName(builder, &len, &received);
7938 if(prop->todo) {
7939 todo_wine {
7940 ok(hr == (expected ? S_OK : S_FALSE),
7941 "Error: IUriBuilder_GetSchemeName returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
7942 hr, (expected ? S_OK : S_FALSE), test_index);
7944 if(SUCCEEDED(hr)) {
7945 todo_wine {
7946 ok(!strcmp_aw(expected, received), "Error: Expected %s but got %s on uri_builder_tests[%d].\n",
7947 expected, wine_dbgstr_w(received), test_index);
7949 todo_wine {
7950 ok(lstrlen(expected) == len,
7951 "Error: Expected the length to be %d, but was %d instead on uri_builder_tests[%d].\n",
7952 lstrlen(expected), len, test_index);
7955 } else {
7956 ok(hr == (expected ? S_OK : S_FALSE),
7957 "Error: IUriBuilder_GetSchemeName returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
7958 hr, (expected ? S_OK : S_FALSE), test_index);
7959 ok(!strcmp_aw(expected, received), "Error: Expected %s but got %s on uri_builder_tests[%d].\n",
7960 expected, wine_dbgstr_w(received), test_index);
7961 ok(lstrlen(expected) == len,
7962 "Error: Expected the length to be %d, but was %d instead on uri_builder_tests[%d].\n",
7963 lstrlen(expected), len, test_index);
7965 } else {
7966 /* The property wasn't set earlier, so it should return whatever
7967 * the base IUri contains (if anything).
7969 IUri *uri = NULL;
7970 hr = IUriBuilder_GetIUri(builder, &uri);
7971 ok(hr == S_OK,
7972 "Error: IUriBuilder_GetIUri returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
7973 hr, S_OK, test_index);
7974 if(SUCCEEDED(hr)) {
7975 if(!uri) {
7976 received = (void*) 0xdeadbeef;
7977 len = -1;
7979 hr = IUriBuilder_GetSchemeName(builder, &len, &received);
7980 ok(hr == S_FALSE,
7981 "Error: IUriBuilder_GetSchemeName returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
7982 hr, S_FALSE, test_index);
7983 if(SUCCEEDED(hr)) {
7984 ok(!len, "Error: Expected len to be 0, but was %d instead on uri_builder_tests[%d].\n",
7985 len, test_index);
7986 ok(!received, "Error: Expected received to be NULL, but was %p instead on uri_builder_tests[%d].\n",
7987 received, test_index);
7989 } else {
7990 BOOL has_prop = FALSE;
7991 BSTR expected = NULL;
7993 hr = IUri_GetSchemeName(uri, &expected);
7994 ok(SUCCEEDED(hr),
7995 "Error: Expected IUri_GetSchemeName to succeed, but got 0x%08x instead on uri_builder_tests[%d].\n",
7996 hr, test_index);
7997 has_prop = hr == S_OK;
7999 hr = IUriBuilder_GetSchemeName(builder, &len, &received);
8000 if(has_prop) {
8001 ok(hr == S_OK,
8002 "Error: IUriBuilder_GetSchemeName returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
8003 hr, S_OK, test_index);
8004 if(SUCCEEDED(hr)) {
8005 ok(!lstrcmpW(expected, received),
8006 "Error: Expected %s but got %s instead on uri_builder_tests[%d].\n",
8007 wine_dbgstr_w(expected), wine_dbgstr_w(received), test_index);
8008 ok(lstrlenW(expected) == len,
8009 "Error: Expected the length to be %d, but was %d instead on uri_builder_tests[%d].\n",
8010 lstrlenW(expected), len, test_index);
8012 } else {
8013 ok(hr == S_FALSE,
8014 "Error: IUriBuilder_GetSchemeName returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
8015 hr, S_FALSE, test_index);
8016 if(SUCCEEDED(hr)) {
8017 ok(!received, "Error: Expected received to be NULL on uri_builder_tests[%d].\n", test_index);
8018 ok(!len, "Error: Expected the length to be 0, but was %d instead on uri_builder_tests[%d].\n",
8019 len, test_index);
8022 SysFreeString(expected);
8025 if(uri) IUri_Release(uri);
8029 static void test_IUriBuilder_GetUserName(IUriBuilder *builder, const uri_builder_test *test,
8030 DWORD test_index) {
8031 HRESULT hr;
8032 DWORD i;
8033 LPCWSTR received = NULL;
8034 DWORD len = -1;
8035 const uri_builder_property *prop = NULL;
8037 /* Check if the property was set earlier. */
8038 for(i = 0; i < sizeof(test->properties)/sizeof(test->properties[0]); ++i) {
8039 if(test->properties[i].change && test->properties[i].property == Uri_PROPERTY_USER_NAME)
8040 prop = &(test->properties[i]);
8043 if(prop && prop->value && *prop->value) {
8044 /* Use expected_value unless it's NULL, then use value. */
8045 LPCSTR expected = prop->expected_value ? prop->expected_value : prop->value;
8046 hr = IUriBuilder_GetUserName(builder, &len, &received);
8047 if(prop->todo) {
8048 todo_wine {
8049 ok(hr == (expected ? S_OK : S_FALSE),
8050 "Error: IUriBuilder_GetUserName returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
8051 hr, (expected ? S_OK : S_FALSE), test_index);
8053 if(SUCCEEDED(hr)) {
8054 todo_wine {
8055 ok(!strcmp_aw(expected, received), "Error: Expected %s but got %s on uri_builder_tests[%d].\n",
8056 expected, wine_dbgstr_w(received), test_index);
8058 todo_wine {
8059 ok(lstrlen(expected) == len,
8060 "Error: Expected the length to be %d, but was %d instead on uri_builder_tests[%d].\n",
8061 lstrlen(expected), len, test_index);
8064 } else {
8065 ok(hr == (expected ? S_OK : S_FALSE),
8066 "Error: IUriBuilder_GetUserName returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
8067 hr, (expected ? S_OK : S_FALSE), test_index);
8068 ok(!strcmp_aw(expected, received), "Error: Expected %s but got %s on uri_builder_tests[%d].\n",
8069 expected, wine_dbgstr_w(received), test_index);
8070 ok(lstrlen(expected) == len,
8071 "Error: Expected the length to be %d, but was %d instead on uri_builder_tests[%d].\n",
8072 lstrlen(expected), len, test_index);
8074 } else {
8075 /* The property wasn't set earlier, so it should return whatever
8076 * the base IUri contains (if anything).
8078 IUri *uri = NULL;
8079 hr = IUriBuilder_GetIUri(builder, &uri);
8080 ok(hr == S_OK,
8081 "Error: IUriBuilder_GetIUri returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
8082 hr, S_OK, test_index);
8083 if(SUCCEEDED(hr)) {
8084 if(!uri) {
8085 received = (void*) 0xdeadbeef;
8086 len = -1;
8088 hr = IUriBuilder_GetUserName(builder, &len, &received);
8089 ok(hr == S_FALSE,
8090 "Error: IUriBuilder_GetUserName returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
8091 hr, S_FALSE, test_index);
8092 if(SUCCEEDED(hr)) {
8093 ok(!len, "Error: Expected len to be 0, but was %d instead on uri_builder_tests[%d].\n",
8094 len, test_index);
8095 ok(!received, "Error: Expected received to be NULL, but was %p instead on uri_builder_tests[%d].\n",
8096 received, test_index);
8098 } else {
8099 BSTR expected = NULL;
8100 BOOL has_prop = FALSE;
8102 hr = IUri_GetUserName(uri, &expected);
8103 ok(SUCCEEDED(hr),
8104 "Error: Expected IUri_GetUserName to succeed, but got 0x%08x instead on uri_builder_tests[%d].\n",
8105 hr, test_index);
8106 has_prop = hr == S_OK;
8108 hr = IUriBuilder_GetUserName(builder, &len, &received);
8109 if(has_prop) {
8110 ok(hr == S_OK,
8111 "Error: IUriBuilder_GetUserName returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
8112 hr, S_OK, test_index);
8113 if(SUCCEEDED(hr)) {
8114 ok(!lstrcmpW(expected, received),
8115 "Error: Expected %s but got %s instead on uri_builder_tests[%d].\n",
8116 wine_dbgstr_w(expected), wine_dbgstr_w(received), test_index);
8117 ok(lstrlenW(expected) == len,
8118 "Error: Expected the length to be %d, but was %d instead on uri_builder_tests[%d].\n",
8119 lstrlenW(expected), len, test_index);
8121 } else {
8122 ok(hr == S_FALSE,
8123 "Error: IUriBuilder_GetUserName returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
8124 hr, S_FALSE, test_index);
8125 if(SUCCEEDED(hr)) {
8126 ok(!received, "Error: Expected received to be NULL on uri_builder_tests[%d].\n", test_index);
8127 ok(!len, "Error: Expected the length to be 0, but was %d instead on uri_builder_tests[%d].\n",
8128 len, test_index);
8131 SysFreeString(expected);
8134 if(uri) IUri_Release(uri);
8138 /* Tests IUriBuilder functions. */
8139 static void test_IUriBuilder(void) {
8140 HRESULT hr;
8141 IUriBuilder *builder;
8142 DWORD i;
8144 for(i = 0; i < sizeof(uri_builder_tests)/sizeof(uri_builder_tests[0]); ++i) {
8145 IUri *uri = NULL;
8146 uri_builder_test test = uri_builder_tests[i];
8147 LPWSTR uriW = NULL;
8149 if(test.uri) {
8150 uriW = a2w(test.uri);
8151 hr = pCreateUri(uriW, test.create_flags, 0, &uri);
8152 ok(hr == S_OK, "Error: CreateUri returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
8153 hr, S_OK, i);
8154 if(FAILED(hr)) continue;
8156 hr = pCreateIUriBuilder(uri, 0, 0, &builder);
8157 if(test.create_builder_todo) {
8158 todo_wine {
8159 ok(hr == test.create_builder_expected,
8160 "Error: CreateIUriBuilder returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
8161 hr, test.create_builder_expected, i);
8163 } else {
8164 ok(hr == test.create_builder_expected,
8165 "Error: CreateIUriBuilder returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
8166 hr, test.create_builder_expected, i);
8168 if(SUCCEEDED(hr)) {
8169 DWORD j;
8170 BOOL modified = FALSE, received = FALSE;
8172 /* Perform all the string property changes. */
8173 for(j = 0; j < URI_BUILDER_STR_PROPERTY_COUNT; ++j) {
8174 uri_builder_property prop = test.properties[j];
8175 if(prop.change) {
8176 change_property(builder, &prop, i);
8177 if(prop.property != Uri_PROPERTY_SCHEME_NAME &&
8178 prop.property != Uri_PROPERTY_HOST)
8179 modified = TRUE;
8180 else if(prop.value && *prop.value)
8181 modified = TRUE;
8182 else if(prop.value && !*prop.value && prop.property == Uri_PROPERTY_HOST)
8183 /* Host name property can't be NULL, but it can be empty. */
8184 modified = TRUE;
8188 if(test.port_prop.change) {
8189 hr = IUriBuilder_SetPort(builder, test.port_prop.set, test.port_prop.value);
8190 modified = TRUE;
8191 if(test.port_prop.todo) {
8192 todo_wine {
8193 ok(hr == test.port_prop.expected,
8194 "Error: IUriBuilder_SetPort returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
8195 hr, test.port_prop.expected, i);
8197 } else {
8198 ok(hr == test.port_prop.expected,
8199 "Error: IUriBuilder_SetPort returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
8200 hr, test.port_prop.expected, i);
8204 hr = IUriBuilder_HasBeenModified(builder, &received);
8205 ok(hr == S_OK,
8206 "Error IUriBuilder_HasBeenModified returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n",
8207 hr, S_OK, i);
8208 if(SUCCEEDED(hr))
8209 ok(received == modified,
8210 "Error: Expected received to be %d but was %d instead on uri_builder_tests[%d].\n",
8211 modified, received, i);
8213 /* Test the "Get*" functions. */
8214 test_IUriBuilder_GetFragment(builder, &test, i);
8215 test_IUriBuilder_GetHost(builder, &test, i);
8216 test_IUriBuilder_GetPassword(builder, &test, i);
8217 test_IUriBuilder_GetPath(builder, &test, i);
8218 test_IUriBuilder_GetPort(builder, &test, i);
8219 test_IUriBuilder_GetQuery(builder, &test, i);
8220 test_IUriBuilder_GetSchemeName(builder, &test, i);
8221 test_IUriBuilder_GetUserName(builder, &test, i);
8223 test_IUriBuilder_CreateUri(builder, &test, i);
8224 test_IUriBuilder_CreateUriSimple(builder, &test, i);
8225 test_IUriBuilder_CreateUriWithFlags(builder, &test, i);
8227 if(builder) IUriBuilder_Release(builder);
8228 if(uri) IUri_Release(uri);
8229 heap_free(uriW);
8233 static void test_IUriBuilder_HasBeenModified(void) {
8234 HRESULT hr;
8235 IUriBuilder *builder = NULL;
8237 hr = pCreateIUriBuilder(NULL, 0, 0, &builder);
8238 ok(hr == S_OK, "Error: CreateIUriBuilder returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
8239 if(SUCCEEDED(hr)) {
8240 static const WCHAR hostW[] = {'g','o','o','g','l','e','.','c','o','m',0};
8241 IUri *uri = NULL;
8242 BOOL received;
8244 hr = IUriBuilder_HasBeenModified(builder, NULL);
8245 ok(hr == E_POINTER, "Error: IUriBuilder_HasBeenModified returned 0x%08x, expected 0x%08x.\n",
8246 hr, E_POINTER);
8248 hr = IUriBuilder_SetHost(builder, hostW);
8249 ok(hr == S_OK, "Error: IUriBuilder_SetHost returned 0x%08x, expected 0x%08x.\n",
8250 hr, S_OK);
8252 hr = IUriBuilder_HasBeenModified(builder, &received);
8253 ok(hr == S_OK, "Error: IUriBuilder_HasBeenModified returned 0x%08x, expected 0x%08x.\n",
8254 hr, S_OK);
8255 if(SUCCEEDED(hr))
8256 ok(received == TRUE, "Error: Expected received to be TRUE.\n");
8258 hr = pCreateUri(http_urlW, 0, 0, &uri);
8259 ok(hr == S_OK, "Error: CreateUri returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
8260 if(SUCCEEDED(hr)) {
8261 LPCWSTR prop;
8262 DWORD len = -1;
8264 hr = IUriBuilder_SetIUri(builder, uri);
8265 ok(hr == S_OK, "Error: IUriBuilder_SetIUri returned 0x%08x, expected 0x%08x.\n",
8266 hr, S_OK);
8268 hr = IUriBuilder_HasBeenModified(builder, &received);
8269 ok(hr == S_OK, "Error: IUriBuilder_HasBeenModified returned 0x%08x, expected 0x%08x.\n",
8270 hr, S_OK);
8271 if(SUCCEEDED(hr))
8272 ok(received == FALSE, "Error: Expected received to be FALSE.\n");
8274 /* Test what happens with you call SetIUri with the same IUri again. */
8275 hr = IUriBuilder_SetHost(builder, hostW);
8276 ok(hr == S_OK, "Error: IUriBuilder_SetHost returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
8278 hr = IUriBuilder_HasBeenModified(builder, &received);
8279 ok(hr == S_OK, "Error: IUriBuilder_HasBeenModified returned 0x%08x, expected 0x%08x.\n",
8280 hr, S_OK);
8281 if(SUCCEEDED(hr))
8282 ok(received == TRUE, "Error: Expected received to be TRUE.\n");
8284 hr = IUriBuilder_SetIUri(builder, uri);
8285 ok(hr == S_OK, "Error: IUriBuilder_SetIUri returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
8287 /* IUriBuilder already had 'uri' as it's IUri property and so Windows doesn't
8288 * reset any of the changes that were made to the IUriBuilder.
8290 hr = IUriBuilder_HasBeenModified(builder, &received);
8291 ok(hr == S_OK, "Error: IUriBuilder_HasBeenModified returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
8292 if(SUCCEEDED(hr))
8293 ok(received == TRUE, "Error: Expected received to be TRUE.\n");
8295 hr = IUriBuilder_GetHost(builder, &len, &prop);
8296 ok(hr == S_OK, "Error: IUriBuilder_GetHost returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
8297 if(SUCCEEDED(hr)) {
8298 ok(!lstrcmpW(prop, hostW), "Error: Expected %s but got %s instead.\n",
8299 wine_dbgstr_w(hostW), wine_dbgstr_w(prop));
8300 ok(len == lstrlenW(hostW), "Error: Expected len to be %d, but was %d instead.\n",
8301 lstrlenW(hostW), len);
8304 hr = IUriBuilder_SetIUri(builder, NULL);
8305 ok(hr == S_OK, "Error: IUriBuilder_SetIUri returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
8307 hr = IUriBuilder_SetHost(builder, hostW);
8308 ok(hr == S_OK, "Error: IUriBuilder_SetHost returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
8309 hr = IUriBuilder_HasBeenModified(builder, &received);
8310 ok(hr == S_OK, "Error: IUriBuilder_HasBeenModified returned 0x%08x, expected 0x%08x.\n",
8311 hr, S_OK);
8312 if(SUCCEEDED(hr))
8313 ok(received == TRUE, "Error: Expected received to be TRUE.\n");
8315 hr = IUriBuilder_SetIUri(builder, NULL);
8316 ok(hr == S_OK, "Error: IUriBuilder_SetIUri returned 0x%08x, expected 0x%09x.\n", hr, S_OK);
8318 hr = IUriBuilder_HasBeenModified(builder, &received);
8319 ok(hr == S_OK, "Error: IUriBuilder_HasBeenModified returned 0x%08x, expected 0x%08x.\n",
8320 hr, S_OK);
8321 if(SUCCEEDED(hr))
8322 ok(received == TRUE, "Error: Expected received to be TRUE.\n");
8324 hr = IUriBuilder_GetHost(builder, &len, &prop);
8325 ok(hr == S_OK, "Error: IUriBuilder_GetHost returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
8326 if(SUCCEEDED(hr)) {
8327 ok(!lstrcmpW(prop, hostW), "Error: Expected %s but got %s instead.\n",
8328 wine_dbgstr_w(hostW), wine_dbgstr_w(prop));
8329 ok(len == lstrlenW(hostW), "Error: Expected len to %d, but was %d instead.\n",
8330 lstrlenW(hostW), len);
8333 if(uri) IUri_Release(uri);
8335 if(builder) IUriBuilder_Release(builder);
8338 /* Test IUriBuilder {Get,Set}IUri functions. */
8339 static void test_IUriBuilder_IUriProperty(void) {
8340 IUriBuilder *builder = NULL;
8341 HRESULT hr;
8343 hr = pCreateIUriBuilder(NULL, 0, 0, &builder);
8344 ok(hr == S_OK, "Error: CreateIUriBuilder returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
8345 if(SUCCEEDED(hr)) {
8346 IUri *uri = NULL;
8348 hr = IUriBuilder_GetIUri(builder, NULL);
8349 ok(hr == E_POINTER, "Error: IUriBuilder_GetIUri returned 0x%08x, expected 0x%08x.\n",
8350 hr, E_POINTER);
8352 hr = pCreateUri(http_urlW, 0, 0, &uri);
8353 if(SUCCEEDED(hr)) {
8354 IUri *test = NULL;
8355 ULONG cur_count, orig_count;
8357 /* IUriBuilder doesn't clone the IUri, it use the same IUri. */
8358 orig_count = get_refcnt(uri);
8359 hr = IUriBuilder_SetIUri(builder, uri);
8360 cur_count = get_refcnt(uri);
8361 if(SUCCEEDED(hr))
8362 ok(cur_count == orig_count+1, "Error: Expected uri ref count to be %d, but was %d instead.\n",
8363 orig_count+1, cur_count);
8365 hr = IUriBuilder_SetIUri(builder, NULL);
8366 cur_count = get_refcnt(uri);
8367 if(SUCCEEDED(hr))
8368 ok(cur_count == orig_count, "Error: Expected uri ref count to be %d, but was %d instead.\n",
8369 orig_count, cur_count);
8371 /* CreateUri* functions will return back the same IUri if nothing has changed. */
8372 hr = IUriBuilder_SetIUri(builder, uri);
8373 ok(hr == S_OK, "Error: IUriBuilder_SetIUri returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
8374 orig_count = get_refcnt(uri);
8376 hr = IUriBuilder_CreateUri(builder, 0, 0, 0, &test);
8377 ok(hr == S_OK, "Error: IUriBuilder_CreateUri returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
8378 if(SUCCEEDED(hr)) {
8379 cur_count = get_refcnt(uri);
8380 ok(cur_count == orig_count+1, "Error: Expected uri ref count to be %d, but was %d instead.\n",
8381 orig_count+1, cur_count);
8382 ok(test == uri, "Error: Expected test to be %p, but was %p instead.\n",
8383 uri, test);
8385 if(test) IUri_Release(test);
8387 test = NULL;
8388 hr = IUriBuilder_CreateUri(builder, -1, 0, 0, &test);
8389 ok(hr == S_OK, "Error: IUriBuilder_CreateUri returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
8390 if(SUCCEEDED(hr)) {
8391 cur_count = get_refcnt(uri);
8392 ok(cur_count == orig_count+1, "Error: Expected uri ref count to be %d, but was %d instead.\n",
8393 orig_count+1, cur_count);
8394 ok(test == uri, "Error: Expected test to be %p, but was %p instead.\n", uri, test);
8396 if(test) IUri_Release(test);
8398 /* Doesn't return the same IUri, if the flag combination is different then the one that created
8399 * the base IUri.
8401 test = NULL;
8402 hr = IUriBuilder_CreateUri(builder, Uri_CREATE_ALLOW_RELATIVE, 0, 0, &test);
8403 todo_wine {
8404 ok(hr == S_OK, "Error: IUriBuilder_CreateUri returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
8406 if(SUCCEEDED(hr)) {
8407 todo_wine {
8408 ok(test != uri, "Error: Wasn't expecting 'test' to be 'uri'\n");
8411 if(test) IUri_Release(test);
8413 /* Still returns the same IUri, even though the base one wasn't created with CREATE_CANONICALIZE
8414 * explicitly set (because it's a default flags).
8416 test = NULL;
8417 hr = IUriBuilder_CreateUri(builder, Uri_CREATE_CANONICALIZE, 0, 0, &test);
8418 ok(hr == S_OK, "Error: IUriBuilder_CreateUri returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
8419 if(SUCCEEDED(hr)) {
8420 cur_count = get_refcnt(uri);
8421 ok(cur_count == orig_count+1, "Error: Expected uri ref count to be %d, but was %d instead.\n",
8422 orig_count+1, cur_count);
8423 ok(test == uri, "Error: Expected 'test' to be %p, but was %p instead.\n", uri, test);
8425 if(test) IUri_Release(test);
8427 test = NULL;
8428 hr = IUriBuilder_CreateUriSimple(builder, 0, 0, &test);
8429 ok(hr == S_OK, "Error: IUriBuilder_CreateUriSimple returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
8430 if(SUCCEEDED(hr)) {
8431 cur_count = get_refcnt(uri);
8432 ok(cur_count == orig_count+1, "Error: Expected uri ref count to be %d, but was %d instead.\n",
8433 orig_count+1, cur_count);
8434 ok(test == uri, "Error: Expected test to be %p, but was %p instead.\n", uri, test);
8436 if(test) IUri_Release(test);
8438 test = NULL;
8439 hr = IUriBuilder_CreateUriWithFlags(builder, 0, 0, 0, 0, &test);
8440 ok(hr == S_OK, "Error: IUriBuilder_CreateUriWithFlags returned 0x%08x, expected 0x%08x.\n",
8441 hr, S_OK);
8442 if(SUCCEEDED(hr)) {
8443 cur_count = get_refcnt(uri);
8444 ok(cur_count == orig_count+1, "Error: Expected uri ref count to be %d, but was %d instead.\n",
8445 orig_count+1, cur_count);
8446 ok(test == uri, "Error: Expected test to be %p, but was %p instead.\n", uri, test);
8448 if(test) IUri_Release(test);
8450 /* Doesn't return the same IUri, if the flag combination is different then the one that created
8451 * the base IUri.
8453 test = NULL;
8454 hr = IUriBuilder_CreateUriWithFlags(builder, Uri_CREATE_ALLOW_RELATIVE, 0, 0, 0, &test);
8455 todo_wine {
8456 ok(hr == S_OK, "Error: IUriBuilder_CreateUriWithFlags returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
8458 if(SUCCEEDED(hr)) {
8459 todo_wine {
8460 ok(test != uri, "Error: Wasn't expecting 'test' to be 'uri'\n");
8463 if(test) IUri_Release(test);
8465 /* Still returns the same IUri, even though the base one wasn't created with CREATE_CANONICALIZE
8466 * explicitly set (because it's a default flags).
8468 test = NULL;
8469 hr = IUriBuilder_CreateUriWithFlags(builder, Uri_CREATE_CANONICALIZE, 0, 0, 0, &test);
8470 ok(hr == S_OK, "Error: IUriBuilder_CreateUriWithFlags returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
8471 if(SUCCEEDED(hr)) {
8472 cur_count = get_refcnt(uri);
8473 ok(cur_count == orig_count+1, "Error: Expected uri ref count to be %d, but was %d instead.\n",
8474 orig_count+1, cur_count);
8475 ok(test == uri, "Error: Expected 'test' to be %p, but was %p instead.\n", uri, test);
8477 if(test) IUri_Release(test);
8479 if(uri) IUri_Release(uri);
8481 if(builder) IUriBuilder_Release(builder);
8484 static void test_IUriBuilder_RemoveProperties(void) {
8485 IUriBuilder *builder = NULL;
8486 HRESULT hr;
8487 DWORD i;
8489 hr = pCreateIUriBuilder(NULL, 0, 0, &builder);
8490 ok(hr == S_OK, "Error: CreateIUriBuilder returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
8491 if(SUCCEEDED(hr)) {
8492 /* Properties that can't be removed. */
8493 const DWORD invalid = Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_RAW_URI|Uri_HAS_HOST_TYPE|
8494 Uri_HAS_SCHEME|Uri_HAS_ZONE;
8496 for(i = Uri_PROPERTY_STRING_START; i <= Uri_PROPERTY_DWORD_LAST; ++i) {
8497 hr = IUriBuilder_RemoveProperties(builder, i << 1);
8498 if((i << 1) & invalid) {
8499 ok(hr == E_INVALIDARG,
8500 "Error: IUriBuilder_RemoveProperties returned 0x%08x, expected 0x%08x with prop=%d.\n",
8501 hr, E_INVALIDARG, i);
8502 } else {
8503 ok(hr == S_OK,
8504 "Error: IUriBuilder_RemoveProperties returned 0x%08x, expected 0x%08x with prop=%d.\n",
8505 hr, S_OK, i);
8509 /* Also doesn't accept anything that's outside the range of the
8510 * Uri_HAS flags.
8512 hr = IUriBuilder_RemoveProperties(builder, (Uri_PROPERTY_DWORD_LAST+1) << 1);
8513 ok(hr == E_INVALIDARG, "Error: IUriBuilder_RemoveProperties returned 0x%08x, expected 0x%08x.\n",
8514 hr, E_INVALIDARG);
8516 if(builder) IUriBuilder_Release(builder);
8518 for(i = 0; i < sizeof(uri_builder_remove_tests)/sizeof(uri_builder_remove_tests[0]); ++i) {
8519 uri_builder_remove_test test = uri_builder_remove_tests[i];
8520 IUri *uri = NULL;
8521 LPWSTR uriW;
8523 uriW = a2w(test.uri);
8524 hr = pCreateUri(uriW, test.create_flags, 0, &uri);
8525 if(SUCCEEDED(hr)) {
8526 builder = NULL;
8528 hr = pCreateIUriBuilder(uri, 0, 0, &builder);
8529 if(test.create_builder_todo) {
8530 todo_wine {
8531 ok(hr == test.create_builder_expected,
8532 "Error: CreateIUriBuilder returned 0x%08x, expected 0x%08x on test %d.\n",
8533 hr, test.create_builder_expected, i);
8535 } else {
8536 ok(hr == test.create_builder_expected,
8537 "Error: CreateIUriBuilder returned 0x%08x, expected 0x%08x on test %d.\n",
8538 hr, test.create_builder_expected, i);
8540 if(SUCCEEDED(hr)) {
8541 hr = IUriBuilder_RemoveProperties(builder, test.remove_properties);
8542 if(test.remove_todo) {
8543 todo_wine {
8544 ok(hr == test.remove_expected,
8545 "Error: IUriBuilder_RemoveProperties returned 0x%08x, expected 0x%08x on test %d.\n",
8546 hr, test.remove_expected, i);
8548 } else {
8549 ok(hr == test.remove_expected,
8550 "Error: IUriBuilder returned 0x%08x, expected 0x%08x on test %d.\n",
8551 hr, test.remove_expected, i);
8553 if(SUCCEEDED(hr)) {
8554 IUri *result = NULL;
8556 hr = IUriBuilder_CreateUri(builder, test.expected_flags, 0, 0, &result);
8557 if(test.expected_todo) {
8558 todo_wine {
8559 ok(hr == test.expected_hres,
8560 "Error: IUriBuilder_CreateUri returned 0x%08x, expected 0x%08x on test %d.\n",
8561 hr, test.expected_hres, i);
8563 } else {
8564 ok(hr == test.expected_hres,
8565 "Error: IUriBuilder_CreateUri returned 0x%08x, expected 0x%08x on test %d.\n",
8566 hr, test.expected_hres, i);
8568 if(SUCCEEDED(hr)) {
8569 BSTR received = NULL;
8571 hr = IUri_GetAbsoluteUri(result, &received);
8572 ok(!strcmp_aw(test.expected_uri, received),
8573 "Error: Expected %s but got %s instead on test %d.\n",
8574 test.expected_uri, wine_dbgstr_w(received), i);
8575 SysFreeString(received);
8577 if(result) IUri_Release(result);
8580 if(builder) IUriBuilder_Release(builder);
8582 if(uri) IUri_Release(uri);
8583 heap_free(uriW);
8587 static void test_IUriBuilder_Misc(void) {
8588 HRESULT hr;
8589 IUri *uri;
8591 hr = pCreateUri(http_urlW, 0, 0, &uri);
8592 if(SUCCEEDED(hr)) {
8593 IUriBuilder *builder;
8595 hr = pCreateIUriBuilder(uri, 0, 0, &builder);
8596 ok(hr == S_OK, "Error: CreateIUriBuilder returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
8597 if(SUCCEEDED(hr)) {
8598 BOOL has = -1;
8599 DWORD port = -1;
8601 hr = IUriBuilder_GetPort(builder, &has, &port);
8602 ok(hr == S_OK, "Error: IUriBuilder_GetPort returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
8603 if(SUCCEEDED(hr)) {
8604 /* 'has' will be set to FALSE, even though uri had a port. */
8605 ok(has == FALSE, "Error: Expected 'has' to be FALSE, was %d instead.\n", has);
8606 /* Still sets 'port' to 80. */
8607 ok(port == 80, "Error: Expected the port to be 80, but, was %d instead.\n", port);
8610 if(builder) IUriBuilder_Release(builder);
8612 if(uri) IUri_Release(uri);
8615 START_TEST(uri) {
8616 HMODULE hurlmon;
8618 hurlmon = GetModuleHandle("urlmon.dll");
8619 pCreateUri = (void*) GetProcAddress(hurlmon, "CreateUri");
8620 pCreateUriWithFragment = (void*) GetProcAddress(hurlmon, "CreateUriWithFragment");
8621 pCreateIUriBuilder = (void*) GetProcAddress(hurlmon, "CreateIUriBuilder");
8623 if(!pCreateUri) {
8624 win_skip("CreateUri is not present, skipping tests.\n");
8625 return;
8628 trace("test CreateUri invalid flags...\n");
8629 test_CreateUri_InvalidFlags();
8631 trace("test CreateUri invalid args...\n");
8632 test_CreateUri_InvalidArgs();
8634 trace("test CreateUri invalid URIs...\n");
8635 test_CreateUri_InvalidUri();
8637 trace("test IUri_GetPropertyBSTR...\n");
8638 test_IUri_GetPropertyBSTR();
8640 trace("test IUri_GetPropertyDWORD...\n");
8641 test_IUri_GetPropertyDWORD();
8643 trace("test IUri_GetStrProperties...\n");
8644 test_IUri_GetStrProperties();
8646 trace("test IUri_GetDwordProperties...\n");
8647 test_IUri_GetDwordProperties();
8649 trace("test IUri_GetPropertyLength...\n");
8650 test_IUri_GetPropertyLength();
8652 trace("test IUri_GetProperties...\n");
8653 test_IUri_GetProperties();
8655 trace("test IUri_HasProperty...\n");
8656 test_IUri_HasProperty();
8658 trace("test IUri_IsEqual...\n");
8659 test_IUri_IsEqual();
8661 trace("test CreateUriWithFragment invalid args...\n");
8662 test_CreateUriWithFragment_InvalidArgs();
8664 trace("test CreateUriWithFragment invalid flags...\n");
8665 test_CreateUriWithFragment_InvalidFlags();
8667 trace("test CreateUriWithFragment...\n");
8668 test_CreateUriWithFragment();
8670 trace("test CreateIUriBuilder...\n");
8671 test_CreateIUriBuilder();
8673 trace("test IUriBuilder_CreateInvalidArgs...\n");
8674 test_IUriBuilder_CreateInvalidArgs();
8676 trace("test IUriBuilder...\n");
8677 test_IUriBuilder();
8679 trace("test IUriBuilder_GetInvalidArgs...\n");
8680 test_IUriBuilder_GetInvalidArgs();
8682 trace("test IUriBuilder_HasBeenModified...\n");
8683 test_IUriBuilder_HasBeenModified();
8685 trace("test IUriBuilder_IUriProperty...\n");
8686 test_IUriBuilder_IUriProperty();
8688 trace("test IUriBuilder_RemoveProperties...\n");
8689 test_IUriBuilder_RemoveProperties();
8691 trace("test IUriBuilder miscellaneous...\n");
8692 test_IUriBuilder_Misc();