Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(914)

Side by Side Diff: tests/corelib/uri_test.dart

Issue 2771453003: Format all tests. (Closed)
Patch Set: Format files Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library uriTest; 5 library uriTest;
6 6
7 import "package:expect/expect.dart"; 7 import "package:expect/expect.dart";
8 import 'dart:convert'; 8 import 'dart:convert';
9 9
10 testUri(String uriText, bool isAbsolute) { 10 testUri(String uriText, bool isAbsolute) {
11 var uri = Uri.parse(uriText); 11 var uri = Uri.parse(uriText);
12 12
13 // Test that parsing a substring works the same as parsing the string. 13 // Test that parsing a substring works the same as parsing the string.
14 String wrapper = "://@[]:/%?#"; 14 String wrapper = "://@[]:/%?#";
15 var embeddedUri = Uri.parse( 15 var embeddedUri = Uri.parse(
16 "$wrapper$uri$wrapper", wrapper.length, uriText.length + wrapper.length); 16 "$wrapper$uri$wrapper", wrapper.length, uriText.length + wrapper.length);
17 17
18 Expect.equals(uri, embeddedUri); 18 Expect.equals(uri, embeddedUri);
19 Expect.equals(isAbsolute, uri.isAbsolute); 19 Expect.equals(isAbsolute, uri.isAbsolute);
20 Expect.stringEquals(uriText, uri.toString()); 20 Expect.stringEquals(uriText, uri.toString());
21 21
22 // Test equals and hashCode members. 22 // Test equals and hashCode members.
23 var uri2 = Uri.parse(uriText); 23 var uri2 = Uri.parse(uriText);
24 Expect.equals(uri, uri2); 24 Expect.equals(uri, uri2);
25 Expect.equals(uri.hashCode, uri2.hashCode); 25 Expect.equals(uri.hashCode, uri2.hashCode);
26 26
27 // Test that removeFragment doesn't change anything else. 27 // Test that removeFragment doesn't change anything else.
28 if (uri.hasFragment) { 28 if (uri.hasFragment) {
29 Expect.equals(Uri.parse(uriText.substring(0, uriText.indexOf('#'))), 29 Expect.equals(Uri.parse(uriText.substring(0, uriText.indexOf('#'))),
30 uri.removeFragment()); 30 uri.removeFragment());
31 } else { 31 } else {
32 Expect.equals(uri, 32 Expect.equals(uri, Uri.parse(uriText + "#fragment").removeFragment());
33 Uri.parse(uriText + "#fragment").removeFragment());
34 } 33 }
35 34
36 Expect.isTrue(uri.isScheme(uri.scheme)); 35 Expect.isTrue(uri.isScheme(uri.scheme));
37 Expect.isTrue(uri.isScheme(uri.scheme.toLowerCase())); 36 Expect.isTrue(uri.isScheme(uri.scheme.toLowerCase()));
38 Expect.isTrue(uri.isScheme(uri.scheme.toUpperCase())); 37 Expect.isTrue(uri.isScheme(uri.scheme.toUpperCase()));
39 if (uri.hasScheme) { 38 if (uri.hasScheme) {
40 // Capitalize 39 // Capitalize
41 Expect.isTrue(uri.isScheme( 40 Expect.isTrue(
42 uri.scheme[0].toUpperCase()+uri.scheme.substring(1))); 41 uri.isScheme(uri.scheme[0].toUpperCase() + uri.scheme.substring(1)));
43 Expect.isFalse(uri.isScheme( 42 Expect
44 uri.scheme.substring(0, uri.scheme.length - 1))); 43 .isFalse(uri.isScheme(uri.scheme.substring(0, uri.scheme.length - 1)));
45 Expect.isFalse(uri.isScheme(uri.scheme + ":")); 44 Expect.isFalse(uri.isScheme(uri.scheme + ":"));
46 Expect.isFalse(uri.isScheme(uri.scheme + "\x00")); 45 Expect.isFalse(uri.isScheme(uri.scheme + "\x00"));
47 } else { 46 } else {
48 Expect.isTrue(uri.isScheme(null)); 47 Expect.isTrue(uri.isScheme(null));
49 Expect.isFalse(uri.isScheme(":")); 48 Expect.isFalse(uri.isScheme(":"));
50 } 49 }
51 } 50 }
52 51
53 testEncodeDecode(String orig, String encoded) { 52 testEncodeDecode(String orig, String encoded) {
54 var e = Uri.encodeFull(orig); 53 var e = Uri.encodeFull(orig);
55 Expect.stringEquals(encoded, e); 54 Expect.stringEquals(encoded, e);
56 var d = Uri.decodeFull(encoded); 55 var d = Uri.decodeFull(encoded);
57 Expect.stringEquals(orig, d); 56 Expect.stringEquals(orig, d);
58 } 57 }
59 58
60 testEncodeDecodeComponent(String orig, String encoded) { 59 testEncodeDecodeComponent(String orig, String encoded) {
61 var e = Uri.encodeComponent(orig); 60 var e = Uri.encodeComponent(orig);
62 Expect.stringEquals(encoded, e); 61 Expect.stringEquals(encoded, e);
63 var d = Uri.decodeComponent(encoded); 62 var d = Uri.decodeComponent(encoded);
64 Expect.stringEquals(orig, d); 63 Expect.stringEquals(orig, d);
65 } 64 }
66 65
67 testEncodeDecodeQueryComponent(String orig, 66 testEncodeDecodeQueryComponent(String orig, String encodedUTF8,
68 String encodedUTF8, 67 String encodedLatin1, String encodedAscii) {
69 String encodedLatin1,
70 String encodedAscii) {
71 var e, d; 68 var e, d;
72 e = Uri.encodeQueryComponent(orig); 69 e = Uri.encodeQueryComponent(orig);
73 Expect.stringEquals(encodedUTF8, e); 70 Expect.stringEquals(encodedUTF8, e);
74 d = Uri.decodeQueryComponent(encodedUTF8); 71 d = Uri.decodeQueryComponent(encodedUTF8);
75 Expect.stringEquals(orig, d); 72 Expect.stringEquals(orig, d);
76 73
77 e = Uri.encodeQueryComponent(orig, encoding: UTF8); 74 e = Uri.encodeQueryComponent(orig, encoding: UTF8);
78 Expect.stringEquals(encodedUTF8, e); 75 Expect.stringEquals(encodedUTF8, e);
79 d = Uri.decodeQueryComponent(encodedUTF8, encoding: UTF8); 76 d = Uri.decodeQueryComponent(encodedUTF8, encoding: UTF8);
80 Expect.stringEquals(orig, d); 77 Expect.stringEquals(orig, d);
81 78
82 e = Uri.encodeQueryComponent(orig, encoding: LATIN1); 79 e = Uri.encodeQueryComponent(orig, encoding: LATIN1);
83 Expect.stringEquals(encodedLatin1, e); 80 Expect.stringEquals(encodedLatin1, e);
84 d = Uri.decodeQueryComponent(encodedLatin1, encoding: LATIN1); 81 d = Uri.decodeQueryComponent(encodedLatin1, encoding: LATIN1);
85 Expect.stringEquals(orig, d); 82 Expect.stringEquals(orig, d);
86 83
87 if (encodedAscii != null) { 84 if (encodedAscii != null) {
88 e = Uri.encodeQueryComponent(orig, encoding: ASCII); 85 e = Uri.encodeQueryComponent(orig, encoding: ASCII);
89 Expect.stringEquals(encodedAscii, e); 86 Expect.stringEquals(encodedAscii, e);
90 d = Uri.decodeQueryComponent(encodedAscii, encoding: ASCII); 87 d = Uri.decodeQueryComponent(encodedAscii, encoding: ASCII);
91 Expect.stringEquals(orig, d); 88 Expect.stringEquals(orig, d);
92 } else { 89 } else {
93 Expect.throws(() => Uri.encodeQueryComponent(orig, encoding: ASCII), 90 Expect.throws(() => Uri.encodeQueryComponent(orig, encoding: ASCII),
94 (e) => e is ArgumentError); 91 (e) => e is ArgumentError);
95 } 92 }
96 } 93 }
97 94
98 testUriPerRFCs() { 95 testUriPerRFCs() {
99 // Convert a Uri to a guaranteed "non simple" URI with the same content. 96 // Convert a Uri to a guaranteed "non simple" URI with the same content.
100 toComplex(Uri uri) { 97 toComplex(Uri uri) {
101 Uri complex = new Uri( 98 Uri complex = new Uri(
102 scheme: uri.scheme, 99 scheme: uri.scheme,
103 userInfo: uri.hasAuthority ? uri.userInfo : null, 100 userInfo: uri.hasAuthority ? uri.userInfo : null,
104 host: uri.hasAuthority ? uri.host : null, 101 host: uri.hasAuthority ? uri.host : null,
(...skipping 13 matching lines...) Expand all
118 setBase(String uri) { 115 setBase(String uri) {
119 base = Uri.parse(uri); 116 base = Uri.parse(uri);
120 complexBase = toComplex(base); 117 complexBase = toComplex(base);
121 } 118 }
122 119
123 testResolve(expect, relative) { 120 testResolve(expect, relative) {
124 String name = "$base << $relative"; 121 String name = "$base << $relative";
125 Expect.stringEquals(expect, base.resolve(relative).toString(), name); 122 Expect.stringEquals(expect, base.resolve(relative).toString(), name);
126 123
127 Expect.stringEquals(expect, complexBase.resolve(relative).toString(), 124 Expect.stringEquals(expect, complexBase.resolve(relative).toString(),
128 name + " (complex base)"); 125 name + " (complex base)");
129 } 126 }
130 127
131 // From RFC 3986. 128 // From RFC 3986.
132 final urisSample = "http://a/b/c/d;p?q"; 129 final urisSample = "http://a/b/c/d;p?q";
133 setBase(urisSample); 130 setBase(urisSample);
134 131
135 testResolve("g:h", "g:h"); 132 testResolve("g:h", "g:h");
136 testResolve("http://a/b/c/g", "g"); 133 testResolve("http://a/b/c/g", "g");
137 testResolve("http://a/b/c/g", "./g"); 134 testResolve("http://a/b/c/g", "./g");
138 testResolve("http://a/b/c/g/", "g/"); 135 testResolve("http://a/b/c/g/", "g/");
139 testResolve("http://a/g", "/g"); 136 testResolve("http://a/g", "/g");
140 testResolve("http://g", "//g"); 137 testResolve("http://g", "//g");
141 testResolve("http://a/b/c/d;p?y", "?y"); 138 testResolve("http://a/b/c/d;p?y", "?y");
142 testResolve("http://a/b/c/g?y", "g?y"); 139 testResolve("http://a/b/c/g?y", "g?y");
143 testResolve("http://a/b/c/d;p?q#s", "#s"); 140 testResolve("http://a/b/c/d;p?q#s", "#s");
144 testResolve("http://a/b/c/g#s", "g#s"); 141 testResolve("http://a/b/c/g#s", "g#s");
145 testResolve("http://a/b/c/g?y#s", "g?y#s"); 142 testResolve("http://a/b/c/g?y#s", "g?y#s");
146 testResolve("http://a/b/c/;x", ";x"); 143 testResolve("http://a/b/c/;x", ";x");
147 testResolve("http://a/b/c/g;x", "g;x"); 144 testResolve("http://a/b/c/g;x", "g;x");
148 testResolve("http://a/b/c/g;x?y#s", "g;x?y#s"); 145 testResolve("http://a/b/c/g;x?y#s", "g;x?y#s");
149 testResolve("http://a/b/c/d;p?q", ""); 146 testResolve("http://a/b/c/d;p?q", "");
150 testResolve("http://a/b/c/", "."); 147 testResolve("http://a/b/c/", ".");
151 testResolve("http://a/b/c/", "./"); 148 testResolve("http://a/b/c/", "./");
152 testResolve("http://a/b/", ".."); 149 testResolve("http://a/b/", "..");
153 testResolve("http://a/b/", "../"); 150 testResolve("http://a/b/", "../");
154 testResolve("http://a/b/g", "../g"); 151 testResolve("http://a/b/g", "../g");
155 testResolve("http://a/", "../.."); 152 testResolve("http://a/", "../..");
156 testResolve("http://a/", "../../"); 153 testResolve("http://a/", "../../");
157 testResolve("http://a/g", "../../g"); 154 testResolve("http://a/g", "../../g");
158 testResolve("http://a/g", "../../../g"); 155 testResolve("http://a/g", "../../../g");
159 testResolve("http://a/g", "../../../../g"); 156 testResolve("http://a/g", "../../../../g");
160 testResolve("http://a/g", "/./g"); 157 testResolve("http://a/g", "/./g");
161 testResolve("http://a/g", "/../g"); 158 testResolve("http://a/g", "/../g");
162 testResolve("http://a/b/c/g.", "g."); 159 testResolve("http://a/b/c/g.", "g.");
163 testResolve("http://a/b/c/.g", ".g"); 160 testResolve("http://a/b/c/.g", ".g");
164 testResolve("http://a/b/c/g..", "g.."); 161 testResolve("http://a/b/c/g..", "g..");
165 testResolve("http://a/b/c/..g", "..g"); 162 testResolve("http://a/b/c/..g", "..g");
166 testResolve("http://a/b/g", "./../g"); 163 testResolve("http://a/b/g", "./../g");
167 testResolve("http://a/b/c/g/", "./g/."); 164 testResolve("http://a/b/c/g/", "./g/.");
168 testResolve("http://a/b/c/g/h", "g/./h"); 165 testResolve("http://a/b/c/g/h", "g/./h");
169 testResolve("http://a/b/c/h", "g/../h"); 166 testResolve("http://a/b/c/h", "g/../h");
170 testResolve("http://a/b/c/g;x=1/y", "g;x=1/./y"); 167 testResolve("http://a/b/c/g;x=1/y", "g;x=1/./y");
171 testResolve("http://a/b/c/y", "g;x=1/../y"); 168 testResolve("http://a/b/c/y", "g;x=1/../y");
172 testResolve("http://a/b/c/g?y/./x", "g?y/./x"); 169 testResolve("http://a/b/c/g?y/./x", "g?y/./x");
173 testResolve("http://a/b/c/g?y/../x", "g?y/../x"); 170 testResolve("http://a/b/c/g?y/../x", "g?y/../x");
174 testResolve("http://a/b/c/g#s/./x", "g#s/./x"); 171 testResolve("http://a/b/c/g#s/./x", "g#s/./x");
175 testResolve("http://a/b/c/g#s/../x", "g#s/../x"); 172 testResolve("http://a/b/c/g#s/../x", "g#s/../x");
176 testResolve("http:g", "http:g"); 173 testResolve("http:g", "http:g");
177 174
178 // Additional tests (not from RFC 3986). 175 // Additional tests (not from RFC 3986).
179 testResolve("http://a/b/g;p/h;s", "../g;p/h;s"); 176 testResolve("http://a/b/g;p/h;s", "../g;p/h;s");
180 177
181 setBase("s:a/b"); 178 setBase("s:a/b");
182 testResolve("s:a/c", "c"); 179 testResolve("s:a/c", "c");
183 testResolve("s:/c", "../c"); 180 testResolve("s:/c", "../c");
184 181
185 setBase("S:a/b"); 182 setBase("S:a/b");
186 testResolve("s:a/c", "c"); 183 testResolve("s:a/c", "c");
187 testResolve("s:/c", "../c"); 184 testResolve("s:/c", "../c");
188 185
189 setBase("s:foo"); 186 setBase("s:foo");
(...skipping 16 matching lines...) Expand all
206 setBase("S:/foo"); 203 setBase("S:/foo");
207 testResolve("s:/bar", "bar"); 204 testResolve("s:/bar", "bar");
208 testResolve("s:/bar", "../bar"); 205 testResolve("s:/bar", "../bar");
209 206
210 // Test non-URI base (no scheme, no authority, relative path). 207 // Test non-URI base (no scheme, no authority, relative path).
211 setBase("a/b/c?_#_"); 208 setBase("a/b/c?_#_");
212 testResolve("a/b/g?q#f", "g?q#f"); 209 testResolve("a/b/g?q#f", "g?q#f");
213 testResolve("./", "../.."); 210 testResolve("./", "../..");
214 testResolve("../", "../../.."); 211 testResolve("../", "../../..");
215 testResolve("a/b/", "."); 212 testResolve("a/b/", ".");
216 testResolve("c", "../../c"); // Deliberate non-RFC behavior. 213 testResolve("c", "../../c"); // Deliberate non-RFC behavior.
217 setBase("../../a/b/c?_#_"); // Initial ".." in base url. 214 setBase("../../a/b/c?_#_"); // Initial ".." in base url.
218 testResolve("../../a/d", "../d"); 215 testResolve("../../a/d", "../d");
219 testResolve("../../d", "../../d"); 216 testResolve("../../d", "../../d");
220 testResolve("../../../d", "../../../d"); 217 testResolve("../../../d", "../../../d");
221 setBase("../../a/b"); 218 setBase("../../a/b");
222 testResolve("../../a/d", "d"); 219 testResolve("../../a/d", "d");
223 testResolve("../../d", "../d"); 220 testResolve("../../d", "../d");
224 testResolve("../../../d", "../../d"); 221 testResolve("../../../d", "../../d");
225 setBase("../../a"); 222 setBase("../../a");
226 testResolve("../../d", "d"); 223 testResolve("../../d", "d");
227 testResolve("../../../d", "../d"); 224 testResolve("../../../d", "../d");
228 testResolve("../../../../d", "../../d"); 225 testResolve("../../../../d", "../../d");
229 226
230 // Absoluyte path, not scheme or authority. 227 // Absoluyte path, not scheme or authority.
231 setBase("/a"); 228 setBase("/a");
232 testResolve("/b", "b"); 229 testResolve("/b", "b");
233 testResolve("/b", "../b"); 230 testResolve("/b", "../b");
234 testResolve("/b", "../../b"); 231 testResolve("/b", "../../b");
235 setBase("/a/b"); 232 setBase("/a/b");
236 testResolve("/a/c", "c"); 233 testResolve("/a/c", "c");
237 testResolve("/c", "../c"); 234 testResolve("/c", "../c");
238 testResolve("/c", "../../c"); 235 testResolve("/c", "../../c");
239 236
240 setBase("s://h/p?q#f"); // A simple base. 237 setBase("s://h/p?q#f"); // A simple base.
241 // Simple references: 238 // Simple references:
242 testResolve("s2://h2/P?Q#F", "s2://h2/P?Q#F"); 239 testResolve("s2://h2/P?Q#F", "s2://h2/P?Q#F");
243 testResolve("s://h2/P?Q#F", "//h2/P?Q#F"); 240 testResolve("s://h2/P?Q#F", "//h2/P?Q#F");
244 testResolve("s://h/P?Q#F", "/P?Q#F"); 241 testResolve("s://h/P?Q#F", "/P?Q#F");
245 testResolve("s://h/p?Q#F", "?Q#F"); 242 testResolve("s://h/p?Q#F", "?Q#F");
246 testResolve("s://h/p?q#F", "#F"); 243 testResolve("s://h/p?q#F", "#F");
247 testResolve("s://h/p?q", ""); 244 testResolve("s://h/p?q", "");
248 // Non-simple references: 245 // Non-simple references:
249 testResolve("s2://I@h2/P?Q#F%20", "s2://I@h2/P?Q#F%20"); 246 testResolve("s2://I@h2/P?Q#F%20", "s2://I@h2/P?Q#F%20");
250 testResolve("s://I@h2/P?Q#F%20", "//I@h2/P?Q#F%20"); 247 testResolve("s://I@h2/P?Q#F%20", "//I@h2/P?Q#F%20");
251 testResolve("s://h2/P?Q#F%20", "//h2/P?Q#F%20"); 248 testResolve("s://h2/P?Q#F%20", "//h2/P?Q#F%20");
252 testResolve("s://h/P?Q#F%20", "/P?Q#F%20"); 249 testResolve("s://h/P?Q#F%20", "/P?Q#F%20");
253 testResolve("s://h/p?Q#F%20", "?Q#F%20"); 250 testResolve("s://h/p?Q#F%20", "?Q#F%20");
254 testResolve("s://h/p?q#F%20", "#F%20"); 251 testResolve("s://h/p?q#F%20", "#F%20");
255 252
256 setBase("s://h/p1/p2/p3"); // A simple base with a path. 253 setBase("s://h/p1/p2/p3"); // A simple base with a path.
257 testResolve("s://h/p1/p2/", "."); 254 testResolve("s://h/p1/p2/", ".");
258 testResolve("s://h/p1/p2/", "./"); 255 testResolve("s://h/p1/p2/", "./");
259 testResolve("s://h/p1/", ".."); 256 testResolve("s://h/p1/", "..");
260 testResolve("s://h/p1/", "../"); 257 testResolve("s://h/p1/", "../");
261 testResolve("s://h/", "../.."); 258 testResolve("s://h/", "../..");
262 testResolve("s://h/", "../../"); 259 testResolve("s://h/", "../../");
263 testResolve("s://h/p1/%20", "../%20"); 260 testResolve("s://h/p1/%20", "../%20");
264 testResolve("s://h/", "../../../.."); 261 testResolve("s://h/", "../../../..");
265 testResolve("s://h/", "../../../../"); 262 testResolve("s://h/", "../../../../");
266 263
267 setBase("s://h/p?q#f%20"); // A non-simpe base. 264 setBase("s://h/p?q#f%20"); // A non-simpe base.
268 // Simple references: 265 // Simple references:
269 testResolve("s2://h2/P?Q#F", "s2://h2/P?Q#F"); 266 testResolve("s2://h2/P?Q#F", "s2://h2/P?Q#F");
270 testResolve("s://h2/P?Q#F", "//h2/P?Q#F"); 267 testResolve("s://h2/P?Q#F", "//h2/P?Q#F");
271 testResolve("s://h/P?Q#F", "/P?Q#F"); 268 testResolve("s://h/P?Q#F", "/P?Q#F");
272 testResolve("s://h/p?Q#F", "?Q#F"); 269 testResolve("s://h/p?Q#F", "?Q#F");
273 testResolve("s://h/p?q#F", "#F"); 270 testResolve("s://h/p?q#F", "#F");
274 testResolve("s://h/p?q", ""); 271 testResolve("s://h/p?q", "");
275 // Non-simple references: 272 // Non-simple references:
276 testResolve("s2://I@h2/P?Q#F%20", "s2://I@h2/P?Q#F%20"); 273 testResolve("s2://I@h2/P?Q#F%20", "s2://I@h2/P?Q#F%20");
277 testResolve("s://I@h2/P?Q#F%20", "//I@h2/P?Q#F%20"); 274 testResolve("s://I@h2/P?Q#F%20", "//I@h2/P?Q#F%20");
278 testResolve("s://h2/P?Q#F%20", "//h2/P?Q#F%20"); 275 testResolve("s://h2/P?Q#F%20", "//h2/P?Q#F%20");
279 testResolve("s://h/P?Q#F%20", "/P?Q#F%20"); 276 testResolve("s://h/P?Q#F%20", "/P?Q#F%20");
280 testResolve("s://h/p?Q#F%20", "?Q#F%20"); 277 testResolve("s://h/p?Q#F%20", "?Q#F%20");
281 testResolve("s://h/p?q#F%20", "#F%20"); 278 testResolve("s://h/p?q#F%20", "#F%20");
282 279
283 setBase("S://h/p1/p2/p3"); // A non-simple base with a path. 280 setBase("S://h/p1/p2/p3"); // A non-simple base with a path.
284 testResolve("s://h/p1/p2/", "."); 281 testResolve("s://h/p1/p2/", ".");
285 testResolve("s://h/p1/p2/", "./"); 282 testResolve("s://h/p1/p2/", "./");
286 testResolve("s://h/p1/", ".."); 283 testResolve("s://h/p1/", "..");
287 testResolve("s://h/p1/", "../"); 284 testResolve("s://h/p1/", "../");
288 testResolve("s://h/", "../.."); 285 testResolve("s://h/", "../..");
289 testResolve("s://h/", "../../"); 286 testResolve("s://h/", "../../");
290 testResolve("s://h/p1/%20", "../%20"); 287 testResolve("s://h/p1/%20", "../%20");
291 testResolve("s://h/", "../../../.."); 288 testResolve("s://h/", "../../../..");
292 testResolve("s://h/", "../../../../"); 289 testResolve("s://h/", "../../../../");
293 290
294 setBase("../../../"); // A simple relative path. 291 setBase("../../../"); // A simple relative path.
295 testResolve("../../../a", "a"); 292 testResolve("../../../a", "a");
296 testResolve("../../../../a", "../a"); 293 testResolve("../../../../a", "../a");
297 testResolve("../../../a%20", "a%20"); 294 testResolve("../../../a%20", "a%20");
298 testResolve("../../../../a%20", "../a%20"); 295 testResolve("../../../../a%20", "../a%20");
299 296
300 // Tests covering the branches of the merge algorithm in RFC 3986 297 // Tests covering the branches of the merge algorithm in RFC 3986
301 // with both simple and complex base URIs. 298 // with both simple and complex base URIs.
302 for (var b in ["s://a/pa/pb?q#f", "s://a/pa/pb?q#f%20"]) { 299 for (var b in ["s://a/pa/pb?q#f", "s://a/pa/pb?q#f%20"]) {
303 setBase(b); 300 setBase(b);
304 301
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
417 setBase(noAuthEmptyPathBase); 414 setBase(noAuthEmptyPathBase);
418 testResolve("s:", ".."); 415 testResolve("s:", "..");
419 testResolve("s:", "."); 416 testResolve("s:", ".");
420 setBase(noAuthRelSinglePathBase); 417 setBase(noAuthRelSinglePathBase);
421 testResolve("s:", ".."); 418 testResolve("s:", "..");
422 testResolve("s:", "."); 419 testResolve("s:", ".");
423 } 420 }
424 } 421 }
425 422
426 void testResolvePath(String expected, String path) { 423 void testResolvePath(String expected, String path) {
427 Expect.equals(expected,
428 new Uri(path: '/').resolveUri(new Uri(path: path)).path);
429 Expect.equals( 424 Expect.equals(
430 "http://localhost$expected", 425 expected, new Uri(path: '/').resolveUri(new Uri(path: path)).path);
426 Expect.equals("http://localhost$expected",
431 Uri.parse("http://localhost").resolveUri(new Uri(path: path)).toString()); 427 Uri.parse("http://localhost").resolveUri(new Uri(path: path)).toString());
432 } 428 }
433 429
434 const ALPHA = r"abcdefghijklmnopqrstuvwxuzABCDEFGHIJKLMNOPQRSTUVWXUZ"; 430 const ALPHA = r"abcdefghijklmnopqrstuvwxuzABCDEFGHIJKLMNOPQRSTUVWXUZ";
435 const DIGIT = r"0123456789"; 431 const DIGIT = r"0123456789";
436 const PERCENT_ENCODED = "%00%ff"; 432 const PERCENT_ENCODED = "%00%ff";
437 const SUBDELIM = r"!$&'()*+,;="; 433 const SUBDELIM = r"!$&'()*+,;=";
438 434
439 const SCHEMECHAR = "$ALPHA$DIGIT+-."; 435 const SCHEMECHAR = "$ALPHA$DIGIT+-.";
440 const UNRESERVED = "$ALPHA$DIGIT-._~"; 436 const UNRESERVED = "$ALPHA$DIGIT-._~";
441 const REGNAMECHAR = "$UNRESERVED$SUBDELIM$PERCENT_ENCODED"; 437 const REGNAMECHAR = "$UNRESERVED$SUBDELIM$PERCENT_ENCODED";
442 const USERINFOCHAR = "$REGNAMECHAR:"; 438 const USERINFOCHAR = "$REGNAMECHAR:";
443 439
444 const PCHAR_NC = "$UNRESERVED$SUBDELIM$PERCENT_ENCODED@"; 440 const PCHAR_NC = "$UNRESERVED$SUBDELIM$PERCENT_ENCODED@";
445 const PCHAR = "$PCHAR_NC:"; 441 const PCHAR = "$PCHAR_NC:";
446 const QUERYCHAR = "$PCHAR/?"; 442 const QUERYCHAR = "$PCHAR/?";
447 443
448 void testValidCharacters() { 444 void testValidCharacters() {
449 // test that all valid characters are accepted. 445 // test that all valid characters are accepted.
450 446
451 for (var scheme in ["", "$SCHEMECHAR$SCHEMECHAR:"]) { 447 for (var scheme in ["", "$SCHEMECHAR$SCHEMECHAR:"]) {
452 for (var userinfo in ["", "@", "$USERINFOCHAR$USERINFOCHAR@", 448 for (var userinfo in [
453 "$USERINFOCHAR:$DIGIT@"]) { 449 "",
454 for (var host in ["", "$REGNAMECHAR$REGNAMECHAR", 450 "@",
455 "255.255.255.256", // valid reg-name. 451 "$USERINFOCHAR$USERINFOCHAR@",
456 "[ffff::ffff:ffff]", "[ffff::255.255.255.255]"]) { 452 "$USERINFOCHAR:$DIGIT@"
453 ]) {
454 for (var host in [
455 "", "$REGNAMECHAR$REGNAMECHAR",
456 "255.255.255.256", // valid reg-name.
457 "[ffff::ffff:ffff]", "[ffff::255.255.255.255]"
458 ]) {
457 for (var port in ["", ":", ":$DIGIT$DIGIT"]) { 459 for (var port in ["", ":", ":$DIGIT$DIGIT"]) {
458 var auth = "$userinfo$host$port"; 460 var auth = "$userinfo$host$port";
459 if (auth.isNotEmpty) auth = "//$auth"; 461 if (auth.isNotEmpty) auth = "//$auth";
460 var paths = ["", "/", "/$PCHAR", "/$PCHAR/"]; // Absolute or empty. 462 var paths = ["", "/", "/$PCHAR", "/$PCHAR/"]; // Absolute or empty.
461 if (auth.isNotEmpty) { 463 if (auth.isNotEmpty) {
462 // Initial segment may be empty. 464 // Initial segment may be empty.
463 paths..add("//$PCHAR"); 465 paths..add("//$PCHAR");
464 } else { 466 } else {
465 // Path may begin with non-slash. 467 // Path may begin with non-slash.
466 if (scheme.isEmpty) { 468 if (scheme.isEmpty) {
467 // Initial segment must not contain colon. 469 // Initial segment must not contain colon.
468 paths..add(PCHAR_NC) 470 paths
469 ..add("$PCHAR_NC/$PCHAR") 471 ..add(PCHAR_NC)
470 ..add("$PCHAR_NC/$PCHAR/"); 472 ..add("$PCHAR_NC/$PCHAR")
473 ..add("$PCHAR_NC/$PCHAR/");
471 } else { 474 } else {
472 paths..add(PCHAR) 475 paths..add(PCHAR)..add("$PCHAR/$PCHAR")..add("$PCHAR/$PCHAR/");
473 ..add("$PCHAR/$PCHAR")
474 ..add("$PCHAR/$PCHAR/");
475 } 476 }
476 } 477 }
477 for (var path in paths) { 478 for (var path in paths) {
478 for (var query in ["", "?", "?$QUERYCHAR"]) { 479 for (var query in ["", "?", "?$QUERYCHAR"]) {
479 for (var fragment in ["", "#", "#$QUERYCHAR"]) { 480 for (var fragment in ["", "#", "#$QUERYCHAR"]) {
480 var uri = "$scheme$auth$path$query$fragment"; 481 var uri = "$scheme$auth$path$query$fragment";
481 // Should not throw. 482 // Should not throw.
482 var result = Uri.parse(uri); 483 var result = Uri.parse(uri);
483 } 484 }
484 } 485 }
485 } 486 }
486 } 487 }
487 } 488 }
488 } 489 }
489 } 490 }
490 } 491 }
491 492
492 void testInvalidUrls() { 493 void testInvalidUrls() {
493 void checkInvalid(uri) { 494 void checkInvalid(uri) {
494 try { 495 try {
495 var result = Uri.parse(uri); 496 var result = Uri.parse(uri);
496 Expect.fail("Invalid URI `$uri` parsed to $result\n" + dump(result)); 497 Expect.fail("Invalid URI `$uri` parsed to $result\n" + dump(result));
497 } on FormatException { 498 } on FormatException {
498 // Success. 499 // Success.
499 } 500 }
500 } 501 }
502
501 checkInvalid("s%41://x.x/"); // No escapes in scheme, 503 checkInvalid("s%41://x.x/"); // No escapes in scheme,
502 // and no colon before slash in path. 504 // and no colon before slash in path.
503 checkInvalid("1a://x.x/"); // Scheme must start with letter, 505 checkInvalid("1a://x.x/"); // Scheme must start with letter,
504 // and no colon before slash in path. 506 // and no colon before slash in path.
505 checkInvalid(".a://x.x/"); // Scheme must start with letter, 507 checkInvalid(".a://x.x/"); // Scheme must start with letter,
506 // and no colon before slash in path. 508 // and no colon before slash in path.
507 checkInvalid("_:"); // Character not valid in scheme, 509 checkInvalid("_:"); // Character not valid in scheme,
508 // and no colon before slash in path. 510 // and no colon before slash in path.
509 checkInvalid(":"); // Scheme must start with letter, 511 checkInvalid(":"); // Scheme must start with letter,
510 // and no colon before slash in path. 512 // and no colon before slash in path.
511 513
512 void checkInvalidReplaced(uri, invalid, replacement) { 514 void checkInvalidReplaced(uri, invalid, replacement) {
513 var source = uri.replaceAll('{}', invalid); 515 var source = uri.replaceAll('{}', invalid);
514 var expected = uri.replaceAll('{}', replacement); 516 var expected = uri.replaceAll('{}', replacement);
515 var result = Uri.parse(source); 517 var result = Uri.parse(source);
516 Expect.equals(expected, "$result", "Source: $source\n${dump(result)}"); 518 Expect.equals(expected, "$result", "Source: $source\n${dump(result)}");
517 } 519 }
518 520
519 // Regression test for http://dartbug.com/16081 521 // Regression test for http://dartbug.com/16081
520 checkInvalidReplaced("http://www.example.org/red%09ros{}#red)", 522 checkInvalidReplaced(
521 "\u00e9", "%C3%A9"); 523 "http://www.example.org/red%09ros{}#red)", "\u00e9", "%C3%A9");
522 checkInvalidReplaced("http://r{}sum\{}.example.org", "\u00E9", "%C3%A9"); 524 checkInvalidReplaced("http://r{}sum\{}.example.org", "\u00E9", "%C3%A9");
523 525
524 // Invalid characters. The characters must be rejected, even if normalizing 526 // Invalid characters. The characters must be rejected, even if normalizing
525 // the input would cause them to be valid (normalization happens after 527 // the input would cause them to be valid (normalization happens after
526 // validation). 528 // validation).
527 var invalidCharsAndReplacements = [ 529 var invalidCharsAndReplacements = [
528 "\xe7", "%C3%A7", // Arbitrary non-ASCII letter 530 "\xe7", "%C3%A7", // Arbitrary non-ASCII letter
529 " ", "%20", // Space, not allowed anywhere. 531 " ", "%20", // Space, not allowed anywhere.
530 '"', "%22", // Quote, not allowed anywhere 532 '"', "%22", // Quote, not allowed anywhere
531 "<>", "%3C%3E", // Less/greater-than, not allowed anywhere. 533 "<>", "%3C%3E", // Less/greater-than, not allowed anywhere.
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
594 uri = Uri.parse("Z:"); 596 uri = Uri.parse("Z:");
595 Expect.equals("z", uri.scheme); 597 Expect.equals("z", uri.scheme);
596 uri = Uri.parse("$SCHEMECHAR:"); 598 uri = Uri.parse("$SCHEMECHAR:");
597 Expect.equals(SCHEMECHAR.toLowerCase(), uri.scheme); 599 Expect.equals(SCHEMECHAR.toLowerCase(), uri.scheme);
598 600
599 // Percent escape normalization. 601 // Percent escape normalization.
600 // Escapes of unreserved characters are converted to the character, 602 // Escapes of unreserved characters are converted to the character,
601 // subject to case normalization in reg-name. 603 // subject to case normalization in reg-name.
602 for (var i = 0; i < UNRESERVED.length; i++) { 604 for (var i = 0; i < UNRESERVED.length; i++) {
603 var char = UNRESERVED[i]; 605 var char = UNRESERVED[i];
604 var escape = "%" + char.codeUnitAt(0).toRadixString(16); // all > 0xf. 606 var escape = "%" + char.codeUnitAt(0).toRadixString(16); // all > 0xf.
605 607
606 uri = Uri.parse("s://xX${escape}xX@yY${escape}yY/zZ${escape}zZ" 608 uri = Uri.parse("s://xX${escape}xX@yY${escape}yY/zZ${escape}zZ"
607 "?vV${escape}vV#wW${escape}wW"); 609 "?vV${escape}vV#wW${escape}wW");
608 Expect.equals("xX${char}xX", uri.userInfo); 610 Expect.equals("xX${char}xX", uri.userInfo);
609 Expect.equals("yY${char}yY".toLowerCase(), uri.host); 611 Expect.equals("yY${char}yY".toLowerCase(), uri.host);
610 Expect.equals("/zZ${char}zZ", uri.path); 612 Expect.equals("/zZ${char}zZ", uri.path);
611 Expect.equals("vV${char}vV", uri.query); 613 Expect.equals("vV${char}vV", uri.query);
612 Expect.equals("wW${char}wW", uri.fragment); 614 Expect.equals("wW${char}wW", uri.fragment);
613 615
614 uri = Uri.parse("s://yY${escape}yY/zZ${escape}zZ" 616 uri = Uri.parse("s://yY${escape}yY/zZ${escape}zZ"
615 "?vV${escape}vV#wW${escape}wW"); 617 "?vV${escape}vV#wW${escape}wW");
616 Expect.equals("yY${char}yY".toLowerCase(), uri.host); 618 Expect.equals("yY${char}yY".toLowerCase(), uri.host);
617 Expect.equals("/zZ${char}zZ", uri.path); 619 Expect.equals("/zZ${char}zZ", uri.path);
618 Expect.equals("vV${char}vV", uri.query); 620 Expect.equals("vV${char}vV", uri.query);
619 Expect.equals("wW${char}wW", uri.fragment); 621 Expect.equals("wW${char}wW", uri.fragment);
620 } 622 }
621 623
622 // Escapes of reserved characters are kept, but upper-cased. 624 // Escapes of reserved characters are kept, but upper-cased.
623 for (var escape in ["%00", "%1f", "%7F", "%fF"]) { 625 for (var escape in ["%00", "%1f", "%7F", "%fF"]) {
624 uri = Uri.parse("s://xX${escape}xX@yY${escape}yY/zZ${escape}zZ" 626 uri = Uri.parse("s://xX${escape}xX@yY${escape}yY/zZ${escape}zZ"
625 "?vV${escape}vV#wW${escape}wW"); 627 "?vV${escape}vV#wW${escape}wW");
626 var normalizedEscape = escape.toUpperCase(); 628 var normalizedEscape = escape.toUpperCase();
627 Expect.equals("xX${normalizedEscape}xX", uri.userInfo); 629 Expect.equals("xX${normalizedEscape}xX", uri.userInfo);
628 Expect.equals("yy${normalizedEscape}yy", uri.host); 630 Expect.equals("yy${normalizedEscape}yy", uri.host);
629 Expect.equals("/zZ${normalizedEscape}zZ", uri.path); 631 Expect.equals("/zZ${normalizedEscape}zZ", uri.path);
630 Expect.equals("vV${normalizedEscape}vV", uri.query); 632 Expect.equals("vV${normalizedEscape}vV", uri.query);
631 Expect.equals("wW${normalizedEscape}wW", uri.fragment); 633 Expect.equals("wW${normalizedEscape}wW", uri.fragment);
632 } 634 }
633 635
634 // Some host normalization edge cases. 636 // Some host normalization edge cases.
635 uri = Uri.parse("x://x%61X%41x%41X%61x/"); 637 uri = Uri.parse("x://x%61X%41x%41X%61x/");
(...skipping 27 matching lines...) Expand all
663 665
664 // File scheme noralizes to always showing authority, even if empty. 666 // File scheme noralizes to always showing authority, even if empty.
665 uri = new Uri(scheme: "file", path: "/y"); 667 uri = new Uri(scheme: "file", path: "/y");
666 Expect.equals("file:///y", uri.toString()); 668 Expect.equals("file:///y", uri.toString());
667 uri = new Uri(scheme: "file", path: "y"); 669 uri = new Uri(scheme: "file", path: "y");
668 Expect.equals("file:///y", uri.toString()); 670 Expect.equals("file:///y", uri.toString());
669 671
670 // Empty host/query/fragment ensures the delimiter is there. 672 // Empty host/query/fragment ensures the delimiter is there.
671 // Different from not being there. 673 // Different from not being there.
672 Expect.equals("scheme:/", Uri.parse("scheme:/").toString()); 674 Expect.equals("scheme:/", Uri.parse("scheme:/").toString());
673 Expect.equals("scheme:/", 675 Expect.equals("scheme:/", new Uri(scheme: "scheme", path: "/").toString());
674 new Uri(scheme: "scheme", path: "/").toString());
675 676
676 Expect.equals("scheme:///?#", Uri.parse("scheme:///?#").toString()); 677 Expect.equals("scheme:///?#", Uri.parse("scheme:///?#").toString());
677 Expect.equals("scheme:///#", 678 Expect.equals(
678 new Uri(scheme: "scheme", host: "", path: "/", 679 "scheme:///#",
679 query: "", fragment: "").toString()); 680 new Uri(scheme: "scheme", host: "", path: "/", query: "", fragment: "")
681 .toString());
680 } 682 }
681 683
682 void testReplace() { 684 void testReplace() {
683 var uris = [ 685 var uris = [
684 Uri.parse(""), 686 Uri.parse(""),
685 Uri.parse("a://@:/?#"), 687 Uri.parse("a://@:/?#"),
686 Uri.parse("a://:/?#"), // Parsed as simple URI. 688 Uri.parse("a://:/?#"), // Parsed as simple URI.
687 Uri.parse("a://b@c:4/e/f?g#h"), 689 Uri.parse("a://b@c:4/e/f?g#h"),
688 Uri.parse("a://c:4/e/f?g#h"), // Parsed as simple URI. 690 Uri.parse("a://c:4/e/f?g#h"), // Parsed as simple URI.
689 Uri.parse("$SCHEMECHAR://$REGNAMECHAR:$DIGIT/$PCHAR/$PCHAR" 691 Uri.parse("$SCHEMECHAR://$REGNAMECHAR:$DIGIT/$PCHAR/$PCHAR"
690 "?$QUERYCHAR#$QUERYCHAR"), // Parsed as simple URI. 692 "?$QUERYCHAR#$QUERYCHAR"), // Parsed as simple URI.
691 Uri.parse("$SCHEMECHAR://$USERINFOCHAR@$REGNAMECHAR:$DIGIT/$PCHAR/$PCHAR" 693 Uri.parse("$SCHEMECHAR://$USERINFOCHAR@$REGNAMECHAR:$DIGIT/$PCHAR/$PCHAR"
692 "?$QUERYCHAR#$QUERYCHAR"), 694 "?$QUERYCHAR#$QUERYCHAR"),
693 ]; 695 ];
694 for (var uri1 in uris) { 696 for (var uri1 in uris) {
695 for (var uri2 in uris) { 697 for (var uri2 in uris) {
696 if (identical(uri1, uri2)) continue; 698 if (identical(uri1, uri2)) continue;
697 var scheme = uri1.scheme; 699 var scheme = uri1.scheme;
698 var userInfo = uri1.hasAuthority ? uri1.userInfo : ""; 700 var userInfo = uri1.hasAuthority ? uri1.userInfo : "";
699 var host = uri1.hasAuthority ? uri1.host : null; 701 var host = uri1.hasAuthority ? uri1.host : null;
700 var port = uri1.hasAuthority ? uri1.port : 0; 702 var port = uri1.hasAuthority ? uri1.port : 0;
701 var path = uri1.path; 703 var path = uri1.path;
702 var query = uri1.hasQuery ? uri1.query : null; 704 var query = uri1.hasQuery ? uri1.query : null;
703 var fragment = uri1.hasFragment ? uri1.fragment : null; 705 var fragment = uri1.hasFragment ? uri1.fragment : null;
704 706
705 var tmp1 = uri1; 707 var tmp1 = uri1;
706 708
707 void test() { 709 void test() {
708 var tmp2 = new Uri(scheme: scheme, userInfo: userInfo, host: host, 710 var tmp2 = new Uri(
709 port: port, path: path, 711 scheme: scheme,
710 query: query == "" ? null : query, 712 userInfo: userInfo,
711 queryParameters: query == "" ? {} : null, 713 host: host,
712 fragment: fragment); 714 port: port,
715 path: path,
716 query: query == "" ? null : query,
717 queryParameters: query == "" ? {} : null,
718 fragment: fragment);
713 Expect.equals(tmp1, tmp2); 719 Expect.equals(tmp1, tmp2);
714 } 720 }
715 721
716 test(); 722 test();
717 723
718 scheme = uri2.scheme; 724 scheme = uri2.scheme;
719 tmp1 = tmp1.replace(scheme: scheme); 725 tmp1 = tmp1.replace(scheme: scheme);
720 test(); 726 test();
721 727
722 if (uri2.hasAuthority) { 728 if (uri2.hasAuthority) {
(...skipping 21 matching lines...) Expand all
744 } 750 }
745 } 751 }
746 } 752 }
747 753
748 // Regression test, http://dartbug.com/20814 754 // Regression test, http://dartbug.com/20814
749 var uri = Uri.parse("/no-authorty/"); 755 var uri = Uri.parse("/no-authorty/");
750 uri = uri.replace(fragment: "fragment"); 756 uri = uri.replace(fragment: "fragment");
751 Expect.isFalse(uri.hasAuthority); 757 Expect.isFalse(uri.hasAuthority);
752 758
753 uri = new Uri(scheme: "foo", path: "bar"); 759 uri = new Uri(scheme: "foo", path: "bar");
754 uri = uri.replace( 760 uri = uri.replace(queryParameters: {
755 queryParameters: {"x": ["42", "37"], "y": ["43", "38"]}); 761 "x": ["42", "37"],
762 "y": ["43", "38"]
763 });
756 var params = uri.queryParametersAll; 764 var params = uri.queryParametersAll;
757 Expect.equals(2, params.length); 765 Expect.equals(2, params.length);
758 Expect.listEquals(["42", "37"], params["x"]); 766 Expect.listEquals(["42", "37"], params["x"]);
759 Expect.listEquals(["43", "38"], params["y"]); 767 Expect.listEquals(["43", "38"], params["y"]);
760 768
761 // Test replacing with empty strings. 769 // Test replacing with empty strings.
762 uri = Uri.parse("s://a:1/b/c?d#e"); 770 uri = Uri.parse("s://a:1/b/c?d#e");
763 Expect.equals("s://a:1/b/c?d#", uri.replace(fragment: "").toString()); 771 Expect.equals("s://a:1/b/c?d#", uri.replace(fragment: "").toString());
764 Expect.equals("s://a:1/b/c?#e", uri.replace(query: "").toString()); 772 Expect.equals("s://a:1/b/c?#e", uri.replace(query: "").toString());
765 Expect.equals("s://a:1?d#e", uri.replace(path: "").toString()); 773 Expect.equals("s://a:1?d#e", uri.replace(path: "").toString());
(...skipping 22 matching lines...) Expand all
788 Expect.equals("file%3A///wat", "$uri"); 796 Expect.equals("file%3A///wat", "$uri");
789 Expect.isFalse(uri.hasAuthority); 797 Expect.isFalse(uri.hasAuthority);
790 Expect.isFalse(uri.hasScheme); 798 Expect.isFalse(uri.hasScheme);
791 } 799 }
792 800
793 main() { 801 main() {
794 testUri("http:", true); 802 testUri("http:", true);
795 testUri("file:///", true); 803 testUri("file:///", true);
796 testUri("file", false); 804 testUri("file", false);
797 testUri("http://user@example.com:8080/fisk?query=89&hest=silas", true); 805 testUri("http://user@example.com:8080/fisk?query=89&hest=silas", true);
798 testUri("http://user@example.com:8080/fisk?query=89&hest=silas#fragment", 806 testUri(
799 false); 807 "http://user@example.com:8080/fisk?query=89&hest=silas#fragment", false);
800 Expect.stringEquals("http://user@example.com/a/b/c?query#fragment", 808 Expect.stringEquals(
801 new Uri( 809 "http://user@example.com/a/b/c?query#fragment",
802 scheme: "http", 810 new Uri(
803 userInfo: "user", 811 scheme: "http",
804 host: "example.com", 812 userInfo: "user",
805 port: 80, 813 host: "example.com",
806 path: "/a/b/c", 814 port: 80,
807 query: "query", 815 path: "/a/b/c",
808 fragment: "fragment").toString()); 816 query: "query",
809 Expect.stringEquals("/a/b/c/", 817 fragment: "fragment")
810 new Uri( 818 .toString());
811 scheme: null, 819 Expect.stringEquals(
812 userInfo: null, 820 "/a/b/c/",
813 host: null, 821 new Uri(
814 port: 0, 822 scheme: null,
815 path: "/a/b/c/", 823 userInfo: null,
816 query: null, 824 host: null,
817 fragment: null).toString()); 825 port: 0,
826 path: "/a/b/c/",
827 query: null,
828 fragment: null)
829 .toString());
818 Expect.stringEquals("file:///", Uri.parse("file:").toString()); 830 Expect.stringEquals("file:///", Uri.parse("file:").toString());
819 Expect.stringEquals("file:///", Uri.parse("file:/").toString()); 831 Expect.stringEquals("file:///", Uri.parse("file:/").toString());
820 Expect.stringEquals("file:///", Uri.parse("file:").toString()); 832 Expect.stringEquals("file:///", Uri.parse("file:").toString());
821 Expect.stringEquals("file:///foo", Uri.parse("file:foo").toString()); 833 Expect.stringEquals("file:///foo", Uri.parse("file:foo").toString());
822 Expect.stringEquals("file:///foo", Uri.parse("file:/foo").toString()); 834 Expect.stringEquals("file:///foo", Uri.parse("file:/foo").toString());
823 Expect.stringEquals("file://foo/", Uri.parse("file://foo").toString()); 835 Expect.stringEquals("file://foo/", Uri.parse("file://foo").toString());
824 836
825 testResolvePath("/a/g", "/a/b/c/./../../g"); 837 testResolvePath("/a/g", "/a/b/c/./../../g");
826 testResolvePath("/a/g", "/a/b/c/./../../g"); 838 testResolvePath("/a/g", "/a/b/c/./../../g");
827 testResolvePath("/mid/6", "mid/content=5/../6"); 839 testResolvePath("/mid/6", "mid/content=5/../6");
828 testResolvePath("/a/b/e", "a/b/c/d/../../e"); 840 testResolvePath("/a/b/e", "a/b/c/d/../../e");
829 testResolvePath("/a/b/e", "../a/b/c/d/../../e"); 841 testResolvePath("/a/b/e", "../a/b/c/d/../../e");
830 testResolvePath("/a/b/e", "./a/b/c/d/../../e"); 842 testResolvePath("/a/b/e", "./a/b/c/d/../../e");
831 testResolvePath("/a/b/e", "../a/b/./c/d/../../e"); 843 testResolvePath("/a/b/e", "../a/b/./c/d/../../e");
832 testResolvePath("/a/b/e", "./a/b/./c/d/../../e"); 844 testResolvePath("/a/b/e", "./a/b/./c/d/../../e");
833 testResolvePath("/a/b/e/", "./a/b/./c/d/../../e/."); 845 testResolvePath("/a/b/e/", "./a/b/./c/d/../../e/.");
834 testResolvePath("/a/b/e/", "./a/b/./c/d/../../e/./."); 846 testResolvePath("/a/b/e/", "./a/b/./c/d/../../e/./.");
835 testResolvePath("/a/b/e/", "./a/b/./c/d/../../e/././."); 847 testResolvePath("/a/b/e/", "./a/b/./c/d/../../e/././.");
836 848
837 testUriPerRFCs(); 849 testUriPerRFCs();
838 850
839 Expect.stringEquals( 851 Expect.stringEquals(
840 "http://example.com", 852 "http://example.com", Uri.parse("http://example.com/a/b/c").origin);
841 Uri.parse("http://example.com/a/b/c").origin);
842 Expect.stringEquals( 853 Expect.stringEquals(
843 "https://example.com", 854 "https://example.com", Uri.parse("https://example.com/a/b/c").origin);
844 Uri.parse("https://example.com/a/b/c").origin); 855 Expect.stringEquals("http://example.com:1234",
845 Expect.stringEquals(
846 "http://example.com:1234",
847 Uri.parse("http://example.com:1234/a/b/c").origin); 856 Uri.parse("http://example.com:1234/a/b/c").origin);
848 Expect.stringEquals( 857 Expect.stringEquals("https://example.com:1234",
849 "https://example.com:1234",
850 Uri.parse("https://example.com:1234/a/b/c").origin); 858 Uri.parse("https://example.com:1234/a/b/c").origin);
851 Expect.throws( 859 Expect.throws(() => Uri.parse("http:").origin, (e) {
852 () => Uri.parse("http:").origin, 860 return e is StateError;
853 (e) { return e is StateError; }, 861 }, "origin for URI with empty host should fail");
854 "origin for URI with empty host should fail");
855 Expect.throws( 862 Expect.throws(
856 () => new Uri( 863 () => new Uri(
857 scheme: "http", 864 scheme: "http",
858 userInfo: null, 865 userInfo: null,
859 host: "", 866 host: "",
860 port: 80, 867 port: 80,
861 path: "/a/b/c", 868 path: "/a/b/c",
862 query: "query", 869 query: "query",
863 fragment: "fragment").origin, 870 fragment: "fragment")
864 (e) { return e is StateError; }, 871 .origin, (e) {
865 "origin for URI with empty host should fail"); 872 return e is StateError;
873 }, "origin for URI with empty host should fail");
866 Expect.throws( 874 Expect.throws(
867 () => new Uri( 875 () => new Uri(
868 scheme: null, 876 scheme: null,
869 userInfo: null, 877 userInfo: null,
870 host: "", 878 host: "",
871 port: 80, 879 port: 80,
872 path: "/a/b/c", 880 path: "/a/b/c",
873 query: "query", 881 query: "query",
874 fragment: "fragment").origin, 882 fragment: "fragment")
875 (e) { return e is StateError; }, 883 .origin, (e) {
876 "origin for URI with empty scheme should fail"); 884 return e is StateError;
885 }, "origin for URI with empty scheme should fail");
877 Expect.throws( 886 Expect.throws(
878 () => new Uri( 887 () => new Uri(
879 scheme: "http", 888 scheme: "http",
880 userInfo: null, 889 userInfo: null,
881 host: null, 890 host: null,
882 port: 80, 891 port: 80,
883 path: "/a/b/c", 892 path: "/a/b/c",
884 query: "query", 893 query: "query",
885 fragment: "fragment").origin, 894 fragment: "fragment")
886 (e) { return e is StateError; }, 895 .origin, (e) {
887 "origin for URI with empty host should fail"); 896 return e is StateError;
888 Expect.throws( 897 }, "origin for URI with empty host should fail");
889 () => Uri.parse("http://:80").origin, 898 Expect.throws(() => Uri.parse("http://:80").origin, (e) {
890 (e) { return e is StateError; }, 899 return e is StateError;
891 "origin for URI with empty host should fail"); 900 }, "origin for URI with empty host should fail");
892 Expect.throws( 901 Expect.throws(() => Uri.parse("file://localhost/test.txt").origin, (e) {
893 () => Uri.parse("file://localhost/test.txt").origin, 902 return e is StateError;
894 (e) { return e is StateError; }, 903 }, "origin for non-http/https uri should fail");
895 "origin for non-http/https uri should fail");
896 904
897 // URI encode tests 905 // URI encode tests
898 // Create a string with code point 0x10000 encoded as a surrogate pair. 906 // Create a string with code point 0x10000 encoded as a surrogate pair.
899 var s = UTF8.decode([0xf0, 0x90, 0x80, 0x80]); 907 var s = UTF8.decode([0xf0, 0x90, 0x80, 0x80]);
900 908
901 Expect.stringEquals("\u{10000}", s); 909 Expect.stringEquals("\u{10000}", s);
902 910
903 testEncodeDecode("A + B", "A%20+%20B"); 911 testEncodeDecode("A + B", "A%20+%20B");
904 testEncodeDecode("\uFFFE", "%EF%BF%BE"); 912 testEncodeDecode("\uFFFE", "%EF%BF%BE");
905 testEncodeDecode("\uFFFF", "%EF%BF%BF"); 913 testEncodeDecode("\uFFFF", "%EF%BF%BF");
906 testEncodeDecode("\uFFFE", "%EF%BF%BE"); 914 testEncodeDecode("\uFFFE", "%EF%BF%BE");
907 testEncodeDecode("\uFFFF", "%EF%BF%BF"); 915 testEncodeDecode("\uFFFF", "%EF%BF%BF");
908 testEncodeDecode("\x7f", "%7F"); 916 testEncodeDecode("\x7f", "%7F");
909 testEncodeDecode("\x80", "%C2%80"); 917 testEncodeDecode("\x80", "%C2%80");
910 testEncodeDecode("\u0800", "%E0%A0%80"); 918 testEncodeDecode("\u0800", "%E0%A0%80");
911 // All characters not escaped by encodeFull. 919 // All characters not escaped by encodeFull.
912 var unescapedFull = 920 var unescapedFull = r"abcdefghijklmnopqrstuvwxyz"
913 r"abcdefghijklmnopqrstuvwxyz"
914 r"ABCDEFGHIJKLMNOPQRSTUVWXYZ" 921 r"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
915 r"0123456789!#$&'()*+,-./:;=?@_~"; 922 r"0123456789!#$&'()*+,-./:;=?@_~";
916 // ASCII characters escaped by encodeFull: 923 // ASCII characters escaped by encodeFull:
917 var escapedFull = 924 var escapedFull =
918 "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" 925 "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
919 "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" 926 "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
920 r' "%<>[\]^`{|}' 927 r' "%<>[\]^`{|}'
921 "\x7f"; 928 "\x7f";
922 var escapedTo = 929 var escapedTo = "%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F"
923 "%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F"
924 "%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F" 930 "%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F"
925 "%20%22%25%3C%3E%5B%5C%5D%5E%60%7B%7C%7D%7F"; 931 "%20%22%25%3C%3E%5B%5C%5D%5E%60%7B%7C%7D%7F";
926 testEncodeDecode(unescapedFull, unescapedFull); 932 testEncodeDecode(unescapedFull, unescapedFull);
927 testEncodeDecode(escapedFull, escapedTo); 933 testEncodeDecode(escapedFull, escapedTo);
928 var nonAscii = 934 var nonAscii =
929 "\x80-\xff-\u{100}-\u{7ff}-\u{800}-\u{ffff}-\u{10000}-\u{10ffff}"; 935 "\x80-\xff-\u{100}-\u{7ff}-\u{800}-\u{ffff}-\u{10000}-\u{10ffff}";
930 var nonAsciiEncoding = 936 var nonAsciiEncoding = "%C2%80-%C3%BF-%C4%80-%DF%BF-%E0%A0%80-%EF%BF%BF-"
931 "%C2%80-%C3%BF-%C4%80-%DF%BF-%E0%A0%80-%EF%BF%BF-"
932 "%F0%90%80%80-%F4%8F%BF%BF"; 937 "%F0%90%80%80-%F4%8F%BF%BF";
933 testEncodeDecode(nonAscii, nonAsciiEncoding); 938 testEncodeDecode(nonAscii, nonAsciiEncoding);
934 testEncodeDecode(s, "%F0%90%80%80"); 939 testEncodeDecode(s, "%F0%90%80%80");
935 testEncodeDecodeComponent("A + B", "A%20%2B%20B"); 940 testEncodeDecodeComponent("A + B", "A%20%2B%20B");
936 testEncodeDecodeComponent("\uFFFE", "%EF%BF%BE"); 941 testEncodeDecodeComponent("\uFFFE", "%EF%BF%BE");
937 testEncodeDecodeComponent("\uFFFF", "%EF%BF%BF"); 942 testEncodeDecodeComponent("\uFFFF", "%EF%BF%BF");
938 testEncodeDecodeComponent("\uFFFE", "%EF%BF%BE"); 943 testEncodeDecodeComponent("\uFFFE", "%EF%BF%BE");
939 testEncodeDecodeComponent("\uFFFF", "%EF%BF%BF"); 944 testEncodeDecodeComponent("\uFFFF", "%EF%BF%BF");
940 testEncodeDecodeComponent("\x7f", "%7F"); 945 testEncodeDecodeComponent("\x7f", "%7F");
941 testEncodeDecodeComponent("\x80", "%C2%80"); 946 testEncodeDecodeComponent("\x80", "%C2%80");
942 testEncodeDecodeComponent("\u0800", "%E0%A0%80"); 947 testEncodeDecodeComponent("\u0800", "%E0%A0%80");
943 testEncodeDecodeComponent(":/@',;?&=+\$", "%3A%2F%40'%2C%3B%3F%26%3D%2B%24"); 948 testEncodeDecodeComponent(":/@',;?&=+\$", "%3A%2F%40'%2C%3B%3F%26%3D%2B%24");
944 testEncodeDecodeComponent(s, "%F0%90%80%80"); 949 testEncodeDecodeComponent(s, "%F0%90%80%80");
945 testEncodeDecodeQueryComponent("A + B", "A+%2B+B", "A+%2B+B", "A+%2B+B"); 950 testEncodeDecodeQueryComponent("A + B", "A+%2B+B", "A+%2B+B", "A+%2B+B");
946 testEncodeDecodeQueryComponent( 951 testEncodeDecodeQueryComponent(
947 "æ ø å", "%C3%A6+%C3%B8+%C3%A5", "%E6+%F8+%E5", null); 952 "æ ø å", "%C3%A6+%C3%B8+%C3%A5", "%E6+%F8+%E5", null);
948 testEncodeDecodeComponent(nonAscii, nonAsciiEncoding); 953 testEncodeDecodeComponent(nonAscii, nonAsciiEncoding);
949 954
950 // Invalid URI - : and @ is swapped, port ("host") should be numeric. 955 // Invalid URI - : and @ is swapped, port ("host") should be numeric.
951 Expect.throws( 956 Expect.throws(() => Uri.parse("file://user@password:host/path"),
952 () => Uri.parse("file://user@password:host/path"),
953 (e) => e is FormatException); 957 (e) => e is FormatException);
954 958
955 testValidCharacters(); 959 testValidCharacters();
956 testInvalidUrls(); 960 testInvalidUrls();
957 testNormalization(); 961 testNormalization();
958 testReplace(); 962 testReplace();
959 testRegression28359(); 963 testRegression28359();
960 } 964 }
961 965
962 String dump(Uri uri) { 966 String dump(Uri uri) {
963 return "URI: $uri\n" 967 return "URI: $uri\n"
964 " Scheme: ${uri.scheme} #${uri.scheme.length}\n" 968 " Scheme: ${uri.scheme} #${uri.scheme.length}\n"
965 " User-info: ${uri.userInfo} #${uri.userInfo.length}\n" 969 " User-info: ${uri.userInfo} #${uri.userInfo.length}\n"
966 " Host: ${uri.host} #${uri.host.length}\n" 970 " Host: ${uri.host} #${uri.host.length}\n"
967 " Port: ${uri.port}\n" 971 " Port: ${uri.port}\n"
968 " Path: ${uri.path} #${uri.path.length}\n" 972 " Path: ${uri.path} #${uri.path.length}\n"
969 " Query: ${uri.query} #${uri.query.length}\n" 973 " Query: ${uri.query} #${uri.query.length}\n"
970 " Fragment: ${uri.fragment} #${uri.fragment.length}\n"; 974 " Fragment: ${uri.fragment} #${uri.fragment.length}\n";
971 } 975 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698