OLD | NEW |
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 import 'package:test/test.dart'; | 5 import 'package:test/test.dart'; |
6 import 'package:path/path.dart' as path; | 6 import 'package:path/path.dart' as path; |
7 | 7 |
| 8 import 'utils.dart'; |
| 9 |
8 main() { | 10 main() { |
9 var context = new path.Context( | 11 var context = new path.Context( |
10 style: path.Style.url, current: 'http://dartlang.org/root/path'); | 12 style: path.Style.url, current: 'http://dartlang.org/root/path'); |
11 | 13 |
12 test('separator', () { | 14 test('separator', () { |
13 expect(context.separator, '/'); | 15 expect(context.separator, '/'); |
14 }); | 16 }); |
15 | 17 |
16 test('extension', () { | 18 test('extension', () { |
17 expect(context.extension(''), ''); | 19 expect(context.extension(''), ''); |
(...skipping 13 matching lines...) Expand all Loading... |
31 expect( | 33 expect( |
32 context.rootPrefix('http://dartlang.org/a/c'), 'http://dartlang.org'); | 34 context.rootPrefix('http://dartlang.org/a/c'), 'http://dartlang.org'); |
33 expect(context.rootPrefix('file:///a/c'), 'file://'); | 35 expect(context.rootPrefix('file:///a/c'), 'file://'); |
34 expect(context.rootPrefix('/a/c'), '/'); | 36 expect(context.rootPrefix('/a/c'), '/'); |
35 expect(context.rootPrefix('http://dartlang.org/'), 'http://dartlang.org'); | 37 expect(context.rootPrefix('http://dartlang.org/'), 'http://dartlang.org'); |
36 expect(context.rootPrefix('file:///'), 'file://'); | 38 expect(context.rootPrefix('file:///'), 'file://'); |
37 expect(context.rootPrefix('http://dartlang.org'), 'http://dartlang.org'); | 39 expect(context.rootPrefix('http://dartlang.org'), 'http://dartlang.org'); |
38 expect(context.rootPrefix('file://'), 'file://'); | 40 expect(context.rootPrefix('file://'), 'file://'); |
39 expect(context.rootPrefix('/'), '/'); | 41 expect(context.rootPrefix('/'), '/'); |
40 expect(context.rootPrefix('foo/bar://'), ''); | 42 expect(context.rootPrefix('foo/bar://'), ''); |
| 43 expect(context.rootPrefix('package:foo/bar.dart'), 'package:foo'); |
| 44 expect(context.rootPrefix('foo/bar:baz/qux'), ''); |
41 }); | 45 }); |
42 | 46 |
43 test('dirname', () { | 47 test('dirname', () { |
44 expect(context.dirname(''), '.'); | 48 expect(context.dirname(''), '.'); |
45 expect(context.dirname('a'), '.'); | 49 expect(context.dirname('a'), '.'); |
46 expect(context.dirname('a/b'), 'a'); | 50 expect(context.dirname('a/b'), 'a'); |
47 expect(context.dirname('a/b/c'), 'a/b'); | 51 expect(context.dirname('a/b/c'), 'a/b'); |
48 expect(context.dirname('a/b.c'), 'a'); | 52 expect(context.dirname('a/b.c'), 'a'); |
49 expect(context.dirname('a/'), '.'); | 53 expect(context.dirname('a/'), '.'); |
50 expect(context.dirname('a/.'), 'a'); | 54 expect(context.dirname('a/.'), 'a'); |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
127 expect(context.isAbsolute('file:///a/b'), true); | 131 expect(context.isAbsolute('file:///a/b'), true); |
128 expect(context.isAbsolute('/a/b'), true); | 132 expect(context.isAbsolute('/a/b'), true); |
129 expect(context.isAbsolute('http://dartlang.org/'), true); | 133 expect(context.isAbsolute('http://dartlang.org/'), true); |
130 expect(context.isAbsolute('file:///'), true); | 134 expect(context.isAbsolute('file:///'), true); |
131 expect(context.isAbsolute('http://dartlang.org'), true); | 135 expect(context.isAbsolute('http://dartlang.org'), true); |
132 expect(context.isAbsolute('file://'), true); | 136 expect(context.isAbsolute('file://'), true); |
133 expect(context.isAbsolute('/'), true); | 137 expect(context.isAbsolute('/'), true); |
134 expect(context.isAbsolute('~'), false); | 138 expect(context.isAbsolute('~'), false); |
135 expect(context.isAbsolute('.'), false); | 139 expect(context.isAbsolute('.'), false); |
136 expect(context.isAbsolute('../a'), false); | 140 expect(context.isAbsolute('../a'), false); |
137 expect(context.isAbsolute('C:/a'), false); | 141 expect(context.isAbsolute('C:/a'), true); |
138 expect(context.isAbsolute(r'C:\a'), false); | 142 expect(context.isAbsolute(r'C:\a'), true); |
| 143 expect(context.isAbsolute('package:foo/bar.dart'), true); |
| 144 expect(context.isAbsolute('foo/bar:baz/qux'), false); |
139 expect(context.isAbsolute(r'\\a'), false); | 145 expect(context.isAbsolute(r'\\a'), false); |
140 }); | 146 }); |
141 | 147 |
142 test('isRelative', () { | 148 test('isRelative', () { |
143 expect(context.isRelative(''), true); | 149 expect(context.isRelative(''), true); |
144 expect(context.isRelative('a'), true); | 150 expect(context.isRelative('a'), true); |
145 expect(context.isRelative('a/b'), true); | 151 expect(context.isRelative('a/b'), true); |
146 expect(context.isRelative('http://dartlang.org/a'), false); | 152 expect(context.isRelative('http://dartlang.org/a'), false); |
147 expect(context.isRelative('file:///a'), false); | 153 expect(context.isRelative('file:///a'), false); |
148 expect(context.isRelative('/a'), false); | 154 expect(context.isRelative('/a'), false); |
149 expect(context.isRelative('http://dartlang.org/a/b'), false); | 155 expect(context.isRelative('http://dartlang.org/a/b'), false); |
150 expect(context.isRelative('file:///a/b'), false); | 156 expect(context.isRelative('file:///a/b'), false); |
151 expect(context.isRelative('/a/b'), false); | 157 expect(context.isRelative('/a/b'), false); |
152 expect(context.isRelative('http://dartlang.org/'), false); | 158 expect(context.isRelative('http://dartlang.org/'), false); |
153 expect(context.isRelative('file:///'), false); | 159 expect(context.isRelative('file:///'), false); |
154 expect(context.isRelative('http://dartlang.org'), false); | 160 expect(context.isRelative('http://dartlang.org'), false); |
155 expect(context.isRelative('file://'), false); | 161 expect(context.isRelative('file://'), false); |
156 expect(context.isRelative('/'), false); | 162 expect(context.isRelative('/'), false); |
157 expect(context.isRelative('~'), true); | 163 expect(context.isRelative('~'), true); |
158 expect(context.isRelative('.'), true); | 164 expect(context.isRelative('.'), true); |
159 expect(context.isRelative('../a'), true); | 165 expect(context.isRelative('../a'), true); |
160 expect(context.isRelative('C:/a'), true); | 166 expect(context.isRelative('C:/a'), false); |
161 expect(context.isRelative(r'C:\a'), true); | 167 expect(context.isRelative(r'C:\a'), false); |
| 168 expect(context.isRelative(r'package:foo/bar.dart'), false); |
| 169 expect(context.isRelative('foo/bar:baz/qux'), true); |
162 expect(context.isRelative(r'\\a'), true); | 170 expect(context.isRelative(r'\\a'), true); |
163 }); | 171 }); |
164 | 172 |
165 test('isRootRelative', () { | 173 test('isRootRelative', () { |
166 expect(context.isRootRelative(''), false); | 174 expect(context.isRootRelative(''), false); |
167 expect(context.isRootRelative('a'), false); | 175 expect(context.isRootRelative('a'), false); |
168 expect(context.isRootRelative('a/b'), false); | 176 expect(context.isRootRelative('a/b'), false); |
169 expect(context.isRootRelative('http://dartlang.org/a'), false); | 177 expect(context.isRootRelative('http://dartlang.org/a'), false); |
170 expect(context.isRootRelative('file:///a'), false); | 178 expect(context.isRootRelative('file:///a'), false); |
171 expect(context.isRootRelative('/a'), true); | 179 expect(context.isRootRelative('/a'), true); |
172 expect(context.isRootRelative('http://dartlang.org/a/b'), false); | 180 expect(context.isRootRelative('http://dartlang.org/a/b'), false); |
173 expect(context.isRootRelative('file:///a/b'), false); | 181 expect(context.isRootRelative('file:///a/b'), false); |
174 expect(context.isRootRelative('/a/b'), true); | 182 expect(context.isRootRelative('/a/b'), true); |
175 expect(context.isRootRelative('http://dartlang.org/'), false); | 183 expect(context.isRootRelative('http://dartlang.org/'), false); |
176 expect(context.isRootRelative('file:///'), false); | 184 expect(context.isRootRelative('file:///'), false); |
177 expect(context.isRootRelative('http://dartlang.org'), false); | 185 expect(context.isRootRelative('http://dartlang.org'), false); |
178 expect(context.isRootRelative('file://'), false); | 186 expect(context.isRootRelative('file://'), false); |
179 expect(context.isRootRelative('/'), true); | 187 expect(context.isRootRelative('/'), true); |
180 expect(context.isRootRelative('~'), false); | 188 expect(context.isRootRelative('~'), false); |
181 expect(context.isRootRelative('.'), false); | 189 expect(context.isRootRelative('.'), false); |
182 expect(context.isRootRelative('../a'), false); | 190 expect(context.isRootRelative('../a'), false); |
183 expect(context.isRootRelative('C:/a'), false); | 191 expect(context.isRootRelative('C:/a'), false); |
184 expect(context.isRootRelative(r'C:\a'), false); | 192 expect(context.isRootRelative(r'C:\a'), false); |
| 193 expect(context.isRootRelative(r'package:foo/bar.dart'), false); |
| 194 expect(context.isRootRelative('foo/bar:baz/qux'), false); |
185 expect(context.isRootRelative(r'\\a'), false); | 195 expect(context.isRootRelative(r'\\a'), false); |
186 }); | 196 }); |
187 | 197 |
188 group('join', () { | 198 group('join', () { |
189 test('allows up to eight parts', () { | 199 test('allows up to eight parts', () { |
190 expect(context.join('a'), 'a'); | 200 expect(context.join('a'), 'a'); |
191 expect(context.join('a', 'b'), 'a/b'); | 201 expect(context.join('a', 'b'), 'a/b'); |
192 expect(context.join('a', 'b', 'c'), 'a/b/c'); | 202 expect(context.join('a', 'b', 'c'), 'a/b/c'); |
193 expect(context.join('a', 'b', 'c', 'd'), 'a/b/c/d'); | 203 expect(context.join('a', 'b', 'c', 'd'), 'a/b/c/d'); |
194 expect(context.join('a', 'b', 'c', 'd', 'e'), 'a/b/c/d/e'); | 204 expect(context.join('a', 'b', 'c', 'd', 'e'), 'a/b/c/d/e'); |
(...skipping 12 matching lines...) Expand all Loading... |
207 expect(context.join('a', 'http://dartlang.org', 'b', 'c'), | 217 expect(context.join('a', 'http://dartlang.org', 'b', 'c'), |
208 'http://dartlang.org/b/c'); | 218 'http://dartlang.org/b/c'); |
209 expect(context.join('a', 'file://', 'b', 'c'), 'file:///b/c'); | 219 expect(context.join('a', 'file://', 'b', 'c'), 'file:///b/c'); |
210 expect(context.join('a', '/', 'b', 'c'), '/b/c'); | 220 expect(context.join('a', '/', 'b', 'c'), '/b/c'); |
211 expect(context.join('a', '/b', 'http://dartlang.org/c', 'd'), | 221 expect(context.join('a', '/b', 'http://dartlang.org/c', 'd'), |
212 'http://dartlang.org/c/d'); | 222 'http://dartlang.org/c/d'); |
213 expect(context.join( | 223 expect(context.join( |
214 'a', 'http://google.com/b', 'http://dartlang.org/c', 'd'), | 224 'a', 'http://google.com/b', 'http://dartlang.org/c', 'd'), |
215 'http://dartlang.org/c/d'); | 225 'http://dartlang.org/c/d'); |
216 expect(context.join('a', '/b', '/c', 'd'), '/c/d'); | 226 expect(context.join('a', '/b', '/c', 'd'), '/c/d'); |
217 expect(context.join('a', r'c:\b', 'c', 'd'), r'a/c:\b/c/d'); | 227 expect(context.join('a', r'c:\b', 'c', 'd'), r'c:\b/c/d'); |
| 228 expect(context.join('a', 'package:foo/bar', 'c', 'd'), |
| 229 r'package:foo/bar/c/d'); |
218 expect(context.join('a', r'\\b', 'c', 'd'), r'a/\\b/c/d'); | 230 expect(context.join('a', r'\\b', 'c', 'd'), r'a/\\b/c/d'); |
219 }); | 231 }); |
220 | 232 |
221 test('preserves roots before a root-relative path', () { | 233 test('preserves roots before a root-relative path', () { |
222 expect(context.join('http://dartlang.org', 'a', '/b', 'c'), | 234 expect(context.join('http://dartlang.org', 'a', '/b', 'c'), |
223 'http://dartlang.org/b/c'); | 235 'http://dartlang.org/b/c'); |
224 expect(context.join('file://', 'a', '/b', 'c'), 'file:///b/c'); | 236 expect(context.join('file://', 'a', '/b', 'c'), 'file:///b/c'); |
225 expect(context.join('file://', 'a', '/b', 'c', '/d'), 'file:///d'); | 237 expect(context.join('file://', 'a', '/b', 'c', '/d'), 'file:///d'); |
| 238 expect(context.join('package:foo/bar.dart', '/baz.dart'), |
| 239 'package:foo/baz.dart'); |
226 }); | 240 }); |
227 | 241 |
228 test('ignores trailing nulls', () { | 242 test('ignores trailing nulls', () { |
229 expect(context.join('a', null), equals('a')); | 243 expect(context.join('a', null), equals('a')); |
230 expect(context.join('a', 'b', 'c', null, null), equals('a/b/c')); | 244 expect(context.join('a', 'b', 'c', null, null), equals('a/b/c')); |
231 }); | 245 }); |
232 | 246 |
233 test('ignores empty strings', () { | 247 test('ignores empty strings', () { |
234 expect(context.join(''), ''); | 248 expect(context.join(''), ''); |
235 expect(context.join('', ''), ''); | 249 expect(context.join('', ''), ''); |
236 expect(context.join('', 'a'), 'a'); | 250 expect(context.join('', 'a'), 'a'); |
237 expect(context.join('a', '', 'b', '', '', '', 'c'), 'a/b/c'); | 251 expect(context.join('a', '', 'b', '', '', '', 'c'), 'a/b/c'); |
238 expect(context.join('a', 'b', ''), 'a/b'); | 252 expect(context.join('a', 'b', ''), 'a/b'); |
239 }); | 253 }); |
240 | 254 |
241 test('disallows intermediate nulls', () { | 255 test('disallows intermediate nulls', () { |
242 expect(() => context.join('a', null, 'b'), throwsArgumentError); | 256 expect(() => context.join('a', null, 'b'), throwsArgumentError); |
243 expect(() => context.join(null, 'a'), throwsArgumentError); | 257 expect(() => context.join(null, 'a'), throwsArgumentError); |
244 }); | 258 }); |
245 | 259 |
246 test('Join does not modify internal ., .., or trailing separators', () { | 260 test('does not modify internal ., .., or trailing separators', () { |
247 expect(context.join('a/', 'b/c/'), 'a/b/c/'); | 261 expect(context.join('a/', 'b/c/'), 'a/b/c/'); |
248 expect(context.join('a/b/./c/..//', 'd/.././..//e/f//'), | 262 expect(context.join('a/b/./c/..//', 'd/.././..//e/f//'), |
249 'a/b/./c/..//d/.././..//e/f//'); | 263 'a/b/./c/..//d/.././..//e/f//'); |
250 expect(context.join('a/b', 'c/../../../..'), 'a/b/c/../../../..'); | 264 expect(context.join('a/b', 'c/../../../..'), 'a/b/c/../../../..'); |
251 expect(context.join('a', 'b${context.separator}'), 'a/b/'); | 265 expect(context.join('a', 'b${context.separator}'), 'a/b/'); |
252 }); | 266 }); |
| 267 |
| 268 test('treats drive letters as part of the root for file: URLs', () { |
| 269 expect(context.join('file:///c:/foo/bar', '/baz/qux'), |
| 270 'file:///c:/baz/qux'); |
| 271 expect(context.join('file:///D:/foo/bar', '/baz/qux'), |
| 272 'file:///D:/baz/qux'); |
| 273 expect(context.join('file:///c:/', '/baz/qux'), 'file:///c:/baz/qux'); |
| 274 expect(context.join('file:///c:', '/baz/qux'), 'file:///c:/baz/qux'); |
| 275 expect(context.join('file://host/c:/foo/bar', '/baz/qux'), |
| 276 'file://host/c:/baz/qux'); |
| 277 }); |
| 278 |
| 279 test('treats drive letters as normal components for non-file: URLs', () { |
| 280 expect(context.join('http://foo.com/c:/foo/bar', '/baz/qux'), |
| 281 'http://foo.com/baz/qux'); |
| 282 expect(context.join('misfile:///c:/foo/bar', '/baz/qux'), |
| 283 'misfile:///baz/qux'); |
| 284 expect(context.join('filer:///c:/foo/bar', '/baz/qux'), |
| 285 'filer:///baz/qux'); |
| 286 }); |
253 }); | 287 }); |
254 | 288 |
255 group('joinAll', () { | 289 group('joinAll', () { |
256 test('allows more than eight parts', () { | 290 test('allows more than eight parts', () { |
257 expect(context.joinAll(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']), | 291 expect(context.joinAll(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']), |
258 'a/b/c/d/e/f/g/h/i'); | 292 'a/b/c/d/e/f/g/h/i'); |
259 }); | 293 }); |
260 | 294 |
261 test('ignores parts before an absolute path', () { | 295 test('ignores parts before an absolute path', () { |
262 expect(context.joinAll(['a', 'http://dartlang.org', 'b', 'c']), | 296 expect(context.joinAll(['a', 'http://dartlang.org', 'b', 'c']), |
263 'http://dartlang.org/b/c'); | 297 'http://dartlang.org/b/c'); |
264 expect(context.joinAll(['a', 'file://', 'b', 'c']), 'file:///b/c'); | 298 expect(context.joinAll(['a', 'file://', 'b', 'c']), 'file:///b/c'); |
265 expect(context.joinAll(['a', '/', 'b', 'c']), '/b/c'); | 299 expect(context.joinAll(['a', '/', 'b', 'c']), '/b/c'); |
266 expect(context.joinAll(['a', '/b', 'http://dartlang.org/c', 'd']), | 300 expect(context.joinAll(['a', '/b', 'http://dartlang.org/c', 'd']), |
267 'http://dartlang.org/c/d'); | 301 'http://dartlang.org/c/d'); |
268 expect(context.joinAll([ | 302 expect(context.joinAll([ |
269 'a', | 303 'a', |
270 'http://google.com/b', | 304 'http://google.com/b', |
271 'http://dartlang.org/c', | 305 'http://dartlang.org/c', |
272 'd' | 306 'd' |
273 ]), 'http://dartlang.org/c/d'); | 307 ]), 'http://dartlang.org/c/d'); |
274 expect(context.joinAll(['a', '/b', '/c', 'd']), '/c/d'); | 308 expect(context.joinAll(['a', '/b', '/c', 'd']), '/c/d'); |
275 expect(context.joinAll(['a', r'c:\b', 'c', 'd']), r'a/c:\b/c/d'); | 309 expect(context.joinAll(['a', r'c:\b', 'c', 'd']), r'c:\b/c/d'); |
| 310 expect(context.joinAll(['a', 'package:foo/bar', 'c', 'd']), |
| 311 r'package:foo/bar/c/d'); |
276 expect(context.joinAll(['a', r'\\b', 'c', 'd']), r'a/\\b/c/d'); | 312 expect(context.joinAll(['a', r'\\b', 'c', 'd']), r'a/\\b/c/d'); |
277 }); | 313 }); |
278 | 314 |
279 test('preserves roots before a root-relative path', () { | 315 test('preserves roots before a root-relative path', () { |
280 expect(context.joinAll(['http://dartlang.org', 'a', '/b', 'c']), | 316 expect(context.joinAll(['http://dartlang.org', 'a', '/b', 'c']), |
281 'http://dartlang.org/b/c'); | 317 'http://dartlang.org/b/c'); |
282 expect(context.joinAll(['file://', 'a', '/b', 'c']), 'file:///b/c'); | 318 expect(context.joinAll(['file://', 'a', '/b', 'c']), 'file:///b/c'); |
283 expect(context.joinAll(['file://', 'a', '/b', 'c', '/d']), 'file:///d'); | 319 expect(context.joinAll(['file://', 'a', '/b', 'c', '/d']), 'file:///d'); |
284 }); | 320 }); |
285 }); | 321 }); |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
376 expect(context.normalize('file:///..'), 'file://'); | 412 expect(context.normalize('file:///..'), 'file://'); |
377 expect(context.normalize('/..'), '/'); | 413 expect(context.normalize('/..'), '/'); |
378 expect(context.normalize('http://dartlang.org/../../..'), | 414 expect(context.normalize('http://dartlang.org/../../..'), |
379 'http://dartlang.org'); | 415 'http://dartlang.org'); |
380 expect(context.normalize('file:///../../..'), 'file://'); | 416 expect(context.normalize('file:///../../..'), 'file://'); |
381 expect(context.normalize('/../../..'), '/'); | 417 expect(context.normalize('/../../..'), '/'); |
382 expect(context.normalize('http://dartlang.org/../../../a'), | 418 expect(context.normalize('http://dartlang.org/../../../a'), |
383 'http://dartlang.org/a'); | 419 'http://dartlang.org/a'); |
384 expect(context.normalize('file:///../../../a'), 'file:///a'); | 420 expect(context.normalize('file:///../../../a'), 'file:///a'); |
385 expect(context.normalize('/../../../a'), '/a'); | 421 expect(context.normalize('/../../../a'), '/a'); |
386 expect(context.normalize('c:/..'), '.'); | 422 expect(context.normalize('c:/..'), 'c:'); |
387 expect(context.normalize('A:/../../..'), '../..'); | 423 expect(context.normalize('package:foo/..'), 'package:foo'); |
| 424 expect(context.normalize('A:/../../..'), 'A:'); |
388 expect(context.normalize('a/..'), '.'); | 425 expect(context.normalize('a/..'), '.'); |
389 expect(context.normalize('a/b/..'), 'a'); | 426 expect(context.normalize('a/b/..'), 'a'); |
390 expect(context.normalize('a/../b'), 'b'); | 427 expect(context.normalize('a/../b'), 'b'); |
391 expect(context.normalize('a/./../b'), 'b'); | 428 expect(context.normalize('a/./../b'), 'b'); |
392 expect(context.normalize('a/b/c/../../d/e/..'), 'a/d'); | 429 expect(context.normalize('a/b/c/../../d/e/..'), 'a/d'); |
393 expect(context.normalize('a/b/../../../../c'), '../../c'); | 430 expect(context.normalize('a/b/../../../../c'), '../../c'); |
394 expect(context.normalize('z/a/b/../../..\../c'), 'z/..\../c'); | 431 expect(context.normalize('z/a/b/../../..\../c'), 'z/..\../c'); |
395 expect(context.normalize('a/b\c/../d'), 'a/d'); | 432 expect(context.normalize('a/b\c/../d'), 'a/d'); |
396 }); | 433 }); |
397 | 434 |
398 test('does not walk before root on absolute paths', () { | 435 test('does not walk before root on absolute paths', () { |
399 expect(context.normalize('..'), '..'); | 436 expect(context.normalize('..'), '..'); |
400 expect(context.normalize('../'), '..'); | 437 expect(context.normalize('../'), '..'); |
401 expect( | 438 expect( |
402 context.normalize('http://dartlang.org/..'), 'http://dartlang.org'); | 439 context.normalize('http://dartlang.org/..'), 'http://dartlang.org'); |
403 expect(context.normalize('http://dartlang.org/../a'), | 440 expect(context.normalize('http://dartlang.org/../a'), |
404 'http://dartlang.org/a'); | 441 'http://dartlang.org/a'); |
405 expect(context.normalize('file:///..'), 'file://'); | 442 expect(context.normalize('file:///..'), 'file://'); |
406 expect(context.normalize('file:///../a'), 'file:///a'); | 443 expect(context.normalize('file:///../a'), 'file:///a'); |
407 expect(context.normalize('/..'), '/'); | 444 expect(context.normalize('/..'), '/'); |
408 expect(context.normalize('a/..'), '.'); | 445 expect(context.normalize('a/..'), '.'); |
409 expect(context.normalize('../a'), '../a'); | 446 expect(context.normalize('../a'), '../a'); |
410 expect(context.normalize('/../a'), '/a'); | 447 expect(context.normalize('/../a'), '/a'); |
411 expect(context.normalize('c:/../a'), 'a'); | 448 expect(context.normalize('c:/../a'), 'c:/a'); |
| 449 expect(context.normalize('package:foo/../a'), 'package:foo/a'); |
412 expect(context.normalize('/../a'), '/a'); | 450 expect(context.normalize('/../a'), '/a'); |
413 expect(context.normalize('a/b/..'), 'a'); | 451 expect(context.normalize('a/b/..'), 'a'); |
414 expect(context.normalize('../a/b/..'), '../a'); | 452 expect(context.normalize('../a/b/..'), '../a'); |
415 expect(context.normalize('a/../b'), 'b'); | 453 expect(context.normalize('a/../b'), 'b'); |
416 expect(context.normalize('a/./../b'), 'b'); | 454 expect(context.normalize('a/./../b'), 'b'); |
417 expect(context.normalize('a/b/c/../../d/e/..'), 'a/d'); | 455 expect(context.normalize('a/b/c/../../d/e/..'), 'a/d'); |
418 expect(context.normalize('a/b/../../../../c'), '../../c'); | 456 expect(context.normalize('a/b/../../../../c'), '../../c'); |
419 expect(context.normalize('a/b/c/../../..d/./.e/f././'), 'a/..d/.e/f.'); | 457 expect(context.normalize('a/b/c/../../..d/./.e/f././'), 'a/..d/.e/f.'); |
420 }); | 458 }); |
421 | 459 |
422 test('removes trailing separators', () { | 460 test('removes trailing separators', () { |
423 expect(context.normalize('./'), '.'); | 461 expect(context.normalize('./'), '.'); |
424 expect(context.normalize('.//'), '.'); | 462 expect(context.normalize('.//'), '.'); |
425 expect(context.normalize('a/'), 'a'); | 463 expect(context.normalize('a/'), 'a'); |
426 expect(context.normalize('a/b/'), 'a/b'); | 464 expect(context.normalize('a/b/'), 'a/b'); |
427 expect(context.normalize(r'a/b\'), r'a/b\'); | 465 expect(context.normalize(r'a/b\'), r'a/b\'); |
428 expect(context.normalize('a/b///'), 'a/b'); | 466 expect(context.normalize('a/b///'), 'a/b'); |
429 }); | 467 }); |
| 468 |
| 469 test('when canonicalizing', () { |
| 470 expect(context.canonicalize('.'), 'http://dartlang.org/root/path'); |
| 471 expect(context.canonicalize('foo/bar'), |
| 472 'http://dartlang.org/root/path/foo/bar'); |
| 473 expect(context.canonicalize('FoO'), 'http://dartlang.org/root/path/FoO'); |
| 474 expect(context.canonicalize('/foo'), 'http://dartlang.org/foo'); |
| 475 expect(context.canonicalize('http://google.com/foo'), |
| 476 'http://google.com/foo'); |
| 477 }); |
430 }); | 478 }); |
431 | 479 |
432 group('relative', () { | 480 group('relative', () { |
433 group('from absolute root', () { | 481 group('from absolute root', () { |
434 test('given absolute path in root', () { | 482 test('given absolute path in root', () { |
435 expect(context.relative('http://dartlang.org'), '../..'); | 483 expect(context.relative('http://dartlang.org'), '../..'); |
436 expect(context.relative('http://dartlang.org/'), '../..'); | 484 expect(context.relative('http://dartlang.org/'), '../..'); |
437 expect(context.relative('/'), '../..'); | 485 expect(context.relative('/'), '../..'); |
438 expect(context.relative('http://dartlang.org/root'), '..'); | 486 expect(context.relative('http://dartlang.org/root'), '..'); |
439 expect(context.relative('/root'), '..'); | 487 expect(context.relative('/root'), '..'); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
472 // The path is considered relative to the root, so it basically just | 520 // The path is considered relative to the root, so it basically just |
473 // normalizes. | 521 // normalizes. |
474 expect(context.relative(''), '.'); | 522 expect(context.relative(''), '.'); |
475 expect(context.relative('.'), '.'); | 523 expect(context.relative('.'), '.'); |
476 expect(context.relative('a'), 'a'); | 524 expect(context.relative('a'), 'a'); |
477 expect(context.relative('a/b.txt'), 'a/b.txt'); | 525 expect(context.relative('a/b.txt'), 'a/b.txt'); |
478 expect(context.relative('../a/b.txt'), '../a/b.txt'); | 526 expect(context.relative('../a/b.txt'), '../a/b.txt'); |
479 expect(context.relative('a/./b/../c.txt'), 'a/c.txt'); | 527 expect(context.relative('a/./b/../c.txt'), 'a/c.txt'); |
480 }); | 528 }); |
481 | 529 |
| 530 test('is case-sensitive', () { |
| 531 expect(context.relative('HtTp://dartlang.org/root'), |
| 532 'HtTp://dartlang.org/root'); |
| 533 expect(context.relative('http://DaRtLaNg.OrG/root'), |
| 534 'http://DaRtLaNg.OrG/root'); |
| 535 expect(context.relative('/RoOt'), '../../RoOt'); |
| 536 expect(context.relative('/rOoT/pAtH/a'), '../../rOoT/pAtH/a'); |
| 537 }); |
| 538 |
482 // Regression | 539 // Regression |
483 test('from root-only path', () { | 540 test('from root-only path', () { |
484 expect(context.relative('http://dartlang.org', | 541 expect(context.relative('http://dartlang.org', |
485 from: 'http://dartlang.org'), '.'); | 542 from: 'http://dartlang.org'), '.'); |
486 expect(context.relative('http://dartlang.org/root/path', | 543 expect(context.relative('http://dartlang.org/root/path', |
487 from: 'http://dartlang.org'), 'root/path'); | 544 from: 'http://dartlang.org'), 'root/path'); |
488 }); | 545 }); |
489 }); | 546 }); |
490 | 547 |
491 group('from relative root', () { | 548 group('from relative root', () { |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
658 var r = new path.Context(style: path.Style.url, current: 'foo/bar'); | 715 var r = new path.Context(style: path.Style.url, current: 'foo/bar'); |
659 expect(r.isWithin('.', 'a/b/c'), isTrue); | 716 expect(r.isWithin('.', 'a/b/c'), isTrue); |
660 expect(r.isWithin('.', '../a/b/c'), isFalse); | 717 expect(r.isWithin('.', '../a/b/c'), isFalse); |
661 expect(r.isWithin('.', '../../a/foo/b/c'), isFalse); | 718 expect(r.isWithin('.', '../../a/foo/b/c'), isFalse); |
662 expect(r.isWithin('http://dartlang.org/', 'http://dartlang.org/baz/bang'), | 719 expect(r.isWithin('http://dartlang.org/', 'http://dartlang.org/baz/bang'), |
663 isTrue); | 720 isTrue); |
664 expect(r.isWithin('.', 'http://dartlang.org/baz/bang'), isFalse); | 721 expect(r.isWithin('.', 'http://dartlang.org/baz/bang'), isFalse); |
665 }); | 722 }); |
666 }); | 723 }); |
667 | 724 |
| 725 group('equals and hash', () { |
| 726 test('simple cases', () { |
| 727 expectEquals(context, 'foo/bar', 'foo/bar'); |
| 728 expectNotEquals(context, 'foo/bar', 'foo/bar/baz'); |
| 729 expectNotEquals(context, 'foo/bar', 'foo'); |
| 730 expectNotEquals(context, 'foo/bar', 'foo/baz'); |
| 731 expectEquals(context, 'foo/bar', '../path/foo/bar'); |
| 732 expectEquals(context, 'http://google.com', 'http://google.com'); |
| 733 expectEquals(context, 'http://dartlang.org', '../..'); |
| 734 expectEquals(context, 'baz', '/root/path/baz'); |
| 735 }); |
| 736 |
| 737 test('complex cases', () { |
| 738 expectEquals(context, 'foo/./bar', 'foo/bar'); |
| 739 expectEquals(context, 'foo//bar', 'foo/bar'); |
| 740 expectEquals(context, 'foo/qux/../bar', 'foo/bar'); |
| 741 expectNotEquals(context, 'foo/qux/../bar', 'foo/qux'); |
| 742 expectNotEquals(context, 'foo/bar', 'foo/bar/baz/../..'); |
| 743 expectEquals(context, 'foo/bar', 'foo/bar///'); |
| 744 expectEquals(context, 'foo/.bar', 'foo/.bar'); |
| 745 expectNotEquals(context, 'foo/./bar', 'foo/.bar'); |
| 746 expectEquals(context, 'foo/..bar', 'foo/..bar'); |
| 747 expectNotEquals(context, 'foo/../bar', 'foo/..bar'); |
| 748 expectEquals(context, 'foo/bar', 'foo/bar/baz/..'); |
| 749 expectNotEquals(context, 'FoO/bAr', 'foo/bar'); |
| 750 expectEquals(context, 'http://google.com', 'http://google.com/'); |
| 751 expectEquals(context, 'http://dartlang.org/root', '..'); |
| 752 }); |
| 753 |
| 754 test('with root-relative paths', () { |
| 755 expectEquals(context, '/foo', 'http://dartlang.org/foo'); |
| 756 expectNotEquals(context, '/foo', 'http://google.com/foo'); |
| 757 expectEquals(context, '/root/path/foo/bar', 'foo/bar'); |
| 758 }); |
| 759 |
| 760 test('from a relative root', () { |
| 761 var r = new path.Context(style: path.Style.posix, current: 'foo/bar'); |
| 762 expectEquals(r, 'a/b', 'a/b'); |
| 763 expectNotEquals(r, '.', 'foo/bar'); |
| 764 expectNotEquals(r, '.', '../a/b'); |
| 765 expectEquals(r, '.', '../bar'); |
| 766 expectEquals(r, '/baz/bang', '/baz/bang'); |
| 767 expectNotEquals(r, 'baz/bang', '/baz/bang'); |
| 768 }); |
| 769 }); |
| 770 |
668 group('absolute', () { | 771 group('absolute', () { |
669 test('allows up to seven parts', () { | 772 test('allows up to seven parts', () { |
670 expect(context.absolute('a'), 'http://dartlang.org/root/path/a'); | 773 expect(context.absolute('a'), 'http://dartlang.org/root/path/a'); |
671 expect(context.absolute('a', 'b'), 'http://dartlang.org/root/path/a/b'); | 774 expect(context.absolute('a', 'b'), 'http://dartlang.org/root/path/a/b'); |
672 expect(context.absolute('a', 'b', 'c'), | 775 expect(context.absolute('a', 'b', 'c'), |
673 'http://dartlang.org/root/path/a/b/c'); | 776 'http://dartlang.org/root/path/a/b/c'); |
674 expect(context.absolute('a', 'b', 'c', 'd'), | 777 expect(context.absolute('a', 'b', 'c', 'd'), |
675 'http://dartlang.org/root/path/a/b/c/d'); | 778 'http://dartlang.org/root/path/a/b/c/d'); |
676 expect(context.absolute('a', 'b', 'c', 'd', 'e'), | 779 expect(context.absolute('a', 'b', 'c', 'd', 'e'), |
677 'http://dartlang.org/root/path/a/b/c/d/e'); | 780 'http://dartlang.org/root/path/a/b/c/d/e'); |
678 expect(context.absolute('a', 'b', 'c', 'd', 'e', 'f'), | 781 expect(context.absolute('a', 'b', 'c', 'd', 'e', 'f'), |
679 'http://dartlang.org/root/path/a/b/c/d/e/f'); | 782 'http://dartlang.org/root/path/a/b/c/d/e/f'); |
680 expect(context.absolute('a', 'b', 'c', 'd', 'e', 'f', 'g'), | 783 expect(context.absolute('a', 'b', 'c', 'd', 'e', 'f', 'g'), |
681 'http://dartlang.org/root/path/a/b/c/d/e/f/g'); | 784 'http://dartlang.org/root/path/a/b/c/d/e/f/g'); |
682 }); | 785 }); |
683 | 786 |
684 test('does not add separator if a part ends in one', () { | 787 test('does not add separator if a part ends in one', () { |
685 expect(context.absolute('a/', 'b', 'c/', 'd'), | 788 expect(context.absolute('a/', 'b', 'c/', 'd'), |
686 'http://dartlang.org/root/path/a/b/c/d'); | 789 'http://dartlang.org/root/path/a/b/c/d'); |
687 expect( | 790 expect( |
688 context.absolute(r'a\', 'b'), r'http://dartlang.org/root/path/a\/b'); | 791 context.absolute(r'a\', 'b'), r'http://dartlang.org/root/path/a\/b'); |
689 }); | 792 }); |
690 | 793 |
691 test('ignores parts before an absolute path', () { | 794 test('ignores parts before an absolute path', () { |
692 expect(context.absolute('a', '/b', '/c', 'd'), 'http://dartlang.org/c/d'); | 795 expect(context.absolute('a', '/b', '/c', 'd'), 'http://dartlang.org/c/d'); |
693 expect(context.absolute('a', '/b', 'file:///c', 'd'), 'file:///c/d'); | 796 expect(context.absolute('a', '/b', 'file:///c', 'd'), 'file:///c/d'); |
694 expect(context.absolute('a', r'c:\b', 'c', 'd'), | 797 expect(context.absolute('a', r'c:\b', 'c', 'd'), r'c:\b/c/d'); |
695 r'http://dartlang.org/root/path/a/c:\b/c/d'); | |
696 expect(context.absolute('a', r'\\b', 'c', 'd'), | 798 expect(context.absolute('a', r'\\b', 'c', 'd'), |
697 r'http://dartlang.org/root/path/a/\\b/c/d'); | 799 r'http://dartlang.org/root/path/a/\\b/c/d'); |
698 }); | 800 }); |
699 }); | 801 }); |
700 | 802 |
701 test('withoutExtension', () { | 803 test('withoutExtension', () { |
702 expect(context.withoutExtension(''), ''); | 804 expect(context.withoutExtension(''), ''); |
703 expect(context.withoutExtension('a'), 'a'); | 805 expect(context.withoutExtension('a'), 'a'); |
704 expect(context.withoutExtension('.a'), '.a'); | 806 expect(context.withoutExtension('.a'), '.a'); |
705 expect(context.withoutExtension('a.b'), 'a'); | 807 expect(context.withoutExtension('a.b'), 'a'); |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
782 | 884 |
783 test('with a root-relative URI', () { | 885 test('with a root-relative URI', () { |
784 expect(context.prettyUri('/a/b'), '/a/b'); | 886 expect(context.prettyUri('/a/b'), '/a/b'); |
785 }); | 887 }); |
786 | 888 |
787 test('with a Uri object', () { | 889 test('with a Uri object', () { |
788 expect(context.prettyUri(Uri.parse('a/b')), 'a/b'); | 890 expect(context.prettyUri(Uri.parse('a/b')), 'a/b'); |
789 }); | 891 }); |
790 }); | 892 }); |
791 } | 893 } |
OLD | NEW |