OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 'dart:async'; | 5 import 'dart:async'; |
6 import 'dart:io'; | 6 import 'dart:io'; |
7 | 7 |
8 import 'package:glob/glob.dart'; | 8 import 'package:glob/glob.dart'; |
9 import 'package:glob/src/utils.dart'; | 9 import 'package:glob/src/utils.dart'; |
10 import 'package:path/path.dart' as p; | 10 import 'package:path/path.dart' as p; |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
48 schedule(() { | 48 schedule(() { |
49 expect(new Glob("non/existent/**").listSync, | 49 expect(new Glob("non/existent/**").listSync, |
50 throwsA(new isInstanceOf<FileSystemException>())); | 50 throwsA(new isInstanceOf<FileSystemException>())); |
51 }); | 51 }); |
52 }); | 52 }); |
53 }); | 53 }); |
54 | 54 |
55 syncAndAsync((list) { | 55 syncAndAsync((list) { |
56 group("literals", () { | 56 group("literals", () { |
57 test("lists a single literal", () { | 57 test("lists a single literal", () { |
58 expect(list("foo/baz/qux"), completion(equals(["foo/baz/qux"]))); | 58 expect(list("foo/baz/qux"), |
| 59 completion(equals([p.join("foo", "baz", "qux")]))); |
59 }); | 60 }); |
60 | 61 |
61 test("lists a non-matching literal", () { | 62 test("lists a non-matching literal", () { |
62 expect(list("foo/baz/nothing"), completion(isEmpty)); | 63 expect(list("foo/baz/nothing"), completion(isEmpty)); |
63 }); | 64 }); |
64 }); | 65 }); |
65 | 66 |
66 group("star", () { | 67 group("star", () { |
67 test("lists within filenames but not across directories", () { | 68 test("lists within filenames but not across directories", () { |
68 expect(list("foo/b*"), | 69 expect(list("foo/b*"), completion(unorderedEquals([ |
69 completion(unorderedEquals(["foo/bar", "foo/baz"]))); | 70 p.join("foo", "bar"), |
| 71 p.join("foo", "baz") |
| 72 ]))); |
70 }); | 73 }); |
71 | 74 |
72 test("lists the empy string", () { | 75 test("lists the empy string", () { |
73 expect(list("foo/bar*"), completion(equals(["foo/bar"]))); | 76 expect(list("foo/bar*"), completion(equals([p.join("foo", "bar")]))); |
74 }); | 77 }); |
75 }); | 78 }); |
76 | 79 |
77 group("double star", () { | 80 group("double star", () { |
78 test("lists within filenames", () { | 81 test("lists within filenames", () { |
79 expect(list("foo/baz/**"), | 82 expect(list("foo/baz/**"), completion(unorderedEquals([ |
80 completion(unorderedEquals(["foo/baz/qux", "foo/baz/bang"]))); | 83 p.join("foo", "baz", "qux"), |
| 84 p.join("foo", "baz", "bang") |
| 85 ]))); |
81 }); | 86 }); |
82 | 87 |
83 test("lists the empty string", () { | 88 test("lists the empty string", () { |
84 expect(list("foo/bar**"), completion(equals(["foo/bar"]))); | 89 expect(list("foo/bar**"), completion(equals([p.join("foo", "bar")]))); |
85 }); | 90 }); |
86 | 91 |
87 test("lists recursively", () { | 92 test("lists recursively", () { |
88 expect(list("foo/**"), completion(unorderedEquals( | 93 expect(list("foo/**"), completion(unorderedEquals([ |
89 ["foo/bar", "foo/baz", "foo/baz/qux", "foo/baz/bang"]))); | 94 p.join("foo", "bar"), |
| 95 p.join("foo", "baz"), |
| 96 p.join("foo", "baz", "qux"), |
| 97 p.join("foo", "baz", "bang") |
| 98 ]))); |
90 }); | 99 }); |
91 | 100 |
92 test("combines with literals", () { | 101 test("combines with literals", () { |
93 expect(list("foo/ba**"), completion(unorderedEquals( | 102 expect(list("foo/ba**"), completion(unorderedEquals([ |
94 ["foo/bar", "foo/baz", "foo/baz/qux", "foo/baz/bang"]))); | 103 p.join("foo", "bar"), |
| 104 p.join("foo", "baz"), |
| 105 p.join("foo", "baz", "qux"), |
| 106 p.join("foo", "baz", "bang") |
| 107 ]))); |
95 }); | 108 }); |
96 | 109 |
97 test("lists recursively in the middle of a glob", () { | 110 test("lists recursively in the middle of a glob", () { |
98 d.dir("deep", [ | 111 d.dir("deep", [ |
99 d.dir("a", [ | 112 d.dir("a", [ |
100 d.dir("b", [ | 113 d.dir("b", [ |
101 d.dir("c", [ | 114 d.dir("c", [ |
102 d.file("d"), | 115 d.file("d"), |
103 d.file("long-file") | 116 d.file("long-file") |
104 ]), | 117 ]), |
105 d.dir("long-dir", [d.file("x")]) | 118 d.dir("long-dir", [d.file("x")]) |
106 ]) | 119 ]) |
107 ]) | 120 ]) |
108 ]).create(); | 121 ]).create(); |
109 | 122 |
110 expect(list("deep/**/?/?"), | 123 expect(list("deep/**/?/?"), completion(unorderedEquals([ |
111 completion(unorderedEquals(["deep/a/b/c", "deep/a/b/c/d"]))); | 124 p.join("deep", "a", "b", "c"), |
| 125 p.join("deep", "a", "b", "c", "d") |
| 126 ]))); |
112 }); | 127 }); |
113 }); | 128 }); |
114 | 129 |
115 group("any char", () { | 130 group("any char", () { |
116 test("matches a character", () { | 131 test("matches a character", () { |
117 expect(list("foo/ba?"), | 132 expect(list("foo/ba?"), completion(unorderedEquals([ |
118 completion(unorderedEquals(["foo/bar", "foo/baz"]))); | 133 p.join("foo", "bar"), |
| 134 p.join("foo", "baz") |
| 135 ]))); |
119 }); | 136 }); |
120 | 137 |
121 test("doesn't match a separator", () { | 138 test("doesn't match a separator", () { |
122 expect(list("foo?bar"), completion(isEmpty)); | 139 expect(list("foo?bar"), completion(isEmpty)); |
123 }); | 140 }); |
124 }); | 141 }); |
125 | 142 |
126 group("range", () { | 143 group("range", () { |
127 test("matches a range of characters", () { | 144 test("matches a range of characters", () { |
128 expect(list("foo/ba[a-z]"), | 145 expect(list("foo/ba[a-z]"), completion(unorderedEquals([ |
129 completion(unorderedEquals(["foo/bar", "foo/baz"]))); | 146 p.join("foo", "bar"), |
| 147 p.join("foo", "baz") |
| 148 ]))); |
130 }); | 149 }); |
131 | 150 |
132 test("matches a specific list of characters", () { | 151 test("matches a specific list of characters", () { |
133 expect(list("foo/ba[rz]"), | 152 expect(list("foo/ba[rz]"), completion(unorderedEquals([ |
134 completion(unorderedEquals(["foo/bar", "foo/baz"]))); | 153 p.join("foo", "bar"), |
| 154 p.join("foo", "baz") |
| 155 ]))); |
135 }); | 156 }); |
136 | 157 |
137 test("doesn't match outside its range", () { | 158 test("doesn't match outside its range", () { |
138 expect(list("foo/ba[a-x]"), | 159 expect(list("foo/ba[a-x]"), |
139 completion(unorderedEquals(["foo/bar"]))); | 160 completion(unorderedEquals([p.join("foo", "bar")]))); |
140 }); | 161 }); |
141 | 162 |
142 test("doesn't match outside its specific list", () { | 163 test("doesn't match outside its specific list", () { |
143 expect(list("foo/ba[rx]"), | 164 expect(list("foo/ba[rx]"), |
144 completion(unorderedEquals(["foo/bar"]))); | 165 completion(unorderedEquals([p.join("foo", "bar")]))); |
145 }); | 166 }); |
146 }); | 167 }); |
147 | 168 |
148 test("the same file shouldn't be non-recursively listed multiple times", | 169 test("the same file shouldn't be non-recursively listed multiple times", |
149 () { | 170 () { |
150 d.dir("multi", [ | 171 d.dir("multi", [ |
151 d.dir("start-end", [d.file("file")]) | 172 d.dir("start-end", [d.file("file")]) |
152 ]).create(); | 173 ]).create(); |
153 | 174 |
154 expect(list("multi/{start-*/f*,*-end/*e}"), | 175 expect(list("multi/{start-*/f*,*-end/*e}"), |
155 completion(equals(["multi/start-end/file"]))); | 176 completion(equals([p.join("multi", "start-end", "file")]))); |
156 }); | 177 }); |
157 | 178 |
158 test("the same file shouldn't be recursively listed multiple times", () { | 179 test("the same file shouldn't be recursively listed multiple times", () { |
159 d.dir("multi", [ | 180 d.dir("multi", [ |
160 d.dir("a", [ | 181 d.dir("a", [ |
161 d.dir("b", [ | 182 d.dir("b", [ |
162 d.file("file"), | 183 d.file("file"), |
163 d.dir("c", [ | 184 d.dir("c", [ |
164 d.file("file") | 185 d.file("file") |
165 ]) | 186 ]) |
166 ]), | 187 ]), |
167 d.dir("x", [ | 188 d.dir("x", [ |
168 d.dir("y", [ | 189 d.dir("y", [ |
169 d.file("file") | 190 d.file("file") |
170 ]) | 191 ]) |
171 ]) | 192 ]) |
172 ]) | 193 ]) |
173 ]).create(); | 194 ]).create(); |
174 | 195 |
175 expect(list("multi/{*/*/*/file,a/**/file}"), completion(unorderedEquals([ | 196 expect(list("multi/{*/*/*/file,a/**/file}"), completion(unorderedEquals([ |
176 "multi/a/b/file", "multi/a/b/c/file", "multi/a/x/y/file" | 197 p.join("multi", "a", "b", "file"), |
| 198 p.join("multi", "a", "b", "c", "file"), |
| 199 p.join("multi", "a", "x", "y", "file") |
177 ]))); | 200 ]))); |
178 }); | 201 }); |
179 | 202 |
180 group("with symlinks", () { | 203 group("with symlinks", () { |
181 setUp(() { | 204 setUp(() { |
182 schedule(() { | 205 schedule(() { |
183 return new Link(p.join(sandbox, "dir", "link")) | 206 return new Link(p.join(sandbox, "dir", "link")) |
184 .create(p.join(sandbox, "foo", "baz"), recursive: true); | 207 .create(p.join(sandbox, "foo", "baz"), recursive: true); |
185 }, "symlink foo/baz to dir/link"); | 208 }, "symlink foo/baz to dir/link"); |
186 }); | 209 }); |
187 | 210 |
188 test("follows symlinks by default", () { | 211 test("follows symlinks by default", () { |
189 expect(list("dir/**"), completion(unorderedEquals([ | 212 expect(list("dir/**"), completion(unorderedEquals([ |
190 "dir/link", "dir/link/bang", "dir/link/qux" | 213 p.join("dir", "link"), |
| 214 p.join("dir", "link", "bang"), |
| 215 p.join("dir", "link", "qux") |
191 ]))); | 216 ]))); |
192 }); | 217 }); |
193 | 218 |
194 test("doesn't follow symlinks with followLinks: false", () { | 219 test("doesn't follow symlinks with followLinks: false", () { |
195 expect(list("dir/**", followLinks: false), | 220 expect(list("dir/**", followLinks: false), |
196 completion(equals(["dir/link"]))); | 221 completion(equals([p.join("dir", "link")]))); |
197 }); | 222 }); |
198 | 223 |
199 test("shouldn't crash on broken symlinks", () { | 224 test("shouldn't crash on broken symlinks", () { |
200 schedule(() { | 225 schedule(() { |
201 return new Directory(p.join(sandbox, "foo")).delete(recursive: true); | 226 return new Directory(p.join(sandbox, "foo")).delete(recursive: true); |
202 }); | 227 }); |
203 | 228 |
204 expect(list("dir/**"), completion(equals(["dir/link"]))); | 229 expect(list("dir/**"), completion(equals([p.join("dir", "link")]))); |
205 }); | 230 }); |
206 }); | 231 }); |
207 | 232 |
208 test("always lists recursively with recursive: true", () { | 233 test("always lists recursively with recursive: true", () { |
209 expect(list("foo", recursive: true), completion(unorderedEquals( | 234 expect(list("foo", recursive: true), completion(unorderedEquals([ |
210 ["foo", "foo/bar", "foo/baz", "foo/baz/qux", "foo/baz/bang"]))); | 235 "foo", |
| 236 p.join("foo", "bar"), |
| 237 p.join("foo", "baz"), |
| 238 p.join("foo", "baz", "qux"), |
| 239 p.join("foo", "baz", "bang") |
| 240 ]))); |
211 }); | 241 }); |
212 | 242 |
213 test("lists an absolute glob", () { | 243 test("lists an absolute glob", () { |
214 expect(schedule(() { | 244 expect(schedule(() { |
215 var pattern = separatorToForwardSlash( | 245 var pattern = separatorToForwardSlash( |
216 p.absolute(p.join(sandbox, 'foo/baz/**'))); | 246 p.absolute(p.join(sandbox, 'foo/baz/**'))); |
217 | 247 |
218 return list(pattern); | 248 return list(pattern); |
219 }), completion(unorderedEquals(["foo/baz/bang", "foo/baz/qux"]))); | 249 }), completion(unorderedEquals([ |
| 250 p.join("foo", "baz", "bang"), |
| 251 p.join("foo", "baz", "qux") |
| 252 ]))); |
220 }); | 253 }); |
221 }); | 254 }); |
222 } | 255 } |
223 | 256 |
224 typedef Future<List<String>> ListFn(String glob, | 257 typedef Future<List<String>> ListFn(String glob, |
225 {bool recursive, bool followLinks}); | 258 {bool recursive, bool followLinks}); |
226 | 259 |
227 /// Runs [callback] in two groups with two values of [listFn]: one that uses | 260 /// Runs [callback] in two groups with two values of [listFn]: one that uses |
228 /// [Glob.list], one that uses [Glob.listSync]. | 261 /// [Glob.list], one that uses [Glob.listSync]. |
229 void syncAndAsync(callback(ListFn listFn)) { | 262 void syncAndAsync(callback(ListFn listFn)) { |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
263 }, 'creating sandbox'); | 296 }, 'creating sandbox'); |
264 | 297 |
265 currentSchedule.onComplete.schedule(() { | 298 currentSchedule.onComplete.schedule(() { |
266 d.defaultRoot = null; | 299 d.defaultRoot = null; |
267 if (sandbox == null) return null; | 300 if (sandbox == null) return null; |
268 var oldSandbox = sandbox; | 301 var oldSandbox = sandbox; |
269 sandbox = null; | 302 sandbox = null; |
270 return new Directory(oldSandbox).delete(recursive: true); | 303 return new Directory(oldSandbox).delete(recursive: true); |
271 }); | 304 }); |
272 } | 305 } |
OLD | NEW |