| // show that no match events happen while paused. |
| var tap = require("tap") |
| , child_process = require("child_process") |
| // just some gnarly pattern with lots of matches |
| , pattern = "test/a/symlink/a/b/c/a/b/c/a/b/c//a/b/c////a/b/c/**/b/c/**" |
| , glob = require("../") |
| , Glob = glob.Glob |
| , path = require("path") |
| |
| // run from the root of the project |
| // this is usually where you're at anyway, but be sure. |
| process.chdir(path.resolve(__dirname, "..")) |
| |
| function alphasort (a, b) { |
| a = a.toLowerCase() |
| b = b.toLowerCase() |
| return a > b ? 1 : a < b ? -1 : 0 |
| } |
| |
| function cleanResults (m) { |
| // normalize discrepancies in ordering, duplication, |
| // and ending slashes. |
| return m.map(function (m) { |
| return m.replace(/\/+/g, "/").replace(/\/$/, "") |
| }).sort(alphasort).reduce(function (set, f) { |
| if (f !== set[set.length - 1]) set.push(f) |
| return set |
| }, []).sort(alphasort) |
| } |
| |
| function flatten (chunks) { |
| var s = 0 |
| chunks.forEach(function (c) { s += c.length }) |
| var out = new Buffer(s) |
| s = 0 |
| chunks.forEach(function (c) { |
| c.copy(out, s) |
| s += c.length |
| }) |
| |
| return out.toString().trim() |
| } |
| var bashResults |
| tap.test("get bash output", function (t) { |
| var bashPattern = pattern |
| , cmd = "shopt -s globstar && " + |
| "shopt -s extglob && " + |
| "shopt -s nullglob && " + |
| // "shopt >&2; " + |
| "eval \'for i in " + bashPattern + "; do echo $i; done\'" |
| , cp = child_process.spawn("bash", ["-c",cmd]) |
| , out = [] |
| , globResult |
| cp.stdout.on("data", function (c) { |
| out.push(c) |
| }) |
| cp.stderr.on("data", function (c) { |
| process.stderr.write(c) |
| }) |
| cp.stdout.on("close", function () { |
| bashResults = flatten(out) |
| if (!bashResults) return t.fail("Didn't get results from bash") |
| else { |
| bashResults = cleanResults(bashResults.split(/\r*\n/)) |
| } |
| t.ok(bashResults.length, "got some results") |
| t.end() |
| }) |
| }) |
| |
| var globResults = [] |
| tap.test("use a Glob object, and pause/resume it", function (t) { |
| var g = new Glob(pattern) |
| , paused = false |
| , res = [] |
| |
| g.on("match", function (m) { |
| t.notOk(g.paused, "must not be paused") |
| globResults.push(m) |
| g.pause() |
| t.ok(g.paused, "must be paused") |
| setTimeout(g.resume.bind(g), 1) |
| }) |
| |
| g.on("end", function (matches) { |
| t.pass("reached glob end") |
| globResults = cleanResults(globResults) |
| matches = cleanResults(matches) |
| t.deepEqual(matches, globResults, |
| "end event matches should be the same as match events") |
| |
| t.deepEqual(matches, bashResults, |
| "glob matches should be the same as bash results") |
| |
| t.end() |
| }) |
| }) |
| |