summaryrefslogtreecommitdiff
path: root/deps/npm/node_modules/glob/test/bash-comparison.js
diff options
context:
space:
mode:
Diffstat (limited to 'deps/npm/node_modules/glob/test/bash-comparison.js')
-rw-r--r--deps/npm/node_modules/glob/test/bash-comparison.js119
1 files changed, 119 insertions, 0 deletions
diff --git a/deps/npm/node_modules/glob/test/bash-comparison.js b/deps/npm/node_modules/glob/test/bash-comparison.js
new file mode 100644
index 0000000000..fbadc314cc
--- /dev/null
+++ b/deps/npm/node_modules/glob/test/bash-comparison.js
@@ -0,0 +1,119 @@
+// basic test
+// show that it does the same thing by default as the shell.
+var tap = require("tap")
+, child_process = require("child_process")
+
+// put more patterns here.
+, globs =
+ [
+ "test/a/*/+(c|g)/./d"
+ ,"test/a/**/[cg]/../[cg]"
+ ,"test/a/{b,c,d,e,f}/**/g"
+ ,"test/a/b/**"
+ ,"test/**/g"
+ ,"test/a/abc{fed,def}/g/h"
+ ,"test/a/abc{fed/g,def}/**/"
+ ,"test/a/abc{fed/g,def}/**///**/"
+ ,"test/**/a/**/"
+ ,"test/+(a|b|c)/a{/,bc*}/**"
+ ,"test/*/*/*/f"
+ ,"test/**/f"
+ ,"test/a/symlink/a/b/c/a/b/c/a/b/c//a/b/c////a/b/c/**/b/c/**"
+ ,"{./*/*,/usr/local/*}"
+ ,"{/*,*}" // evil owl face! how you taunt me!
+ ]
+, glob = require("../")
+, 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
+}
+
+globs.forEach(function (pattern) {
+ var echoOutput
+ tap.test(pattern, 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 () {
+ echoOutput = flatten(out)
+ if (!echoOutput) echoOutput = []
+ else {
+ echoOutput = echoOutput.split(/\r*\n/).map(function (m) {
+ // Bash is a oddly inconsistent with slashes in the
+ // the results. This implementation is a bit more
+ // normalized. Account for this in the test results.
+ return m.replace(/\/+/g, "/").replace(/\/$/, "")
+ }).sort(alphasort).reduce(function (set, f) {
+ if (f !== set[set.length - 1]) set.push(f)
+ return set
+ }, []).sort(alphasort)
+ }
+ next()
+ })
+
+ glob(pattern, function (er, matches) {
+ // sort and unpark, just to match the shell results
+ matches = matches.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)
+
+ t.ifError(er, pattern + " should not error")
+ globResult = matches
+ next()
+ })
+
+ function next () {
+ if (!echoOutput || !globResult) return
+
+ t.deepEqual(globResult, echoOutput, "should match shell")
+ t.end()
+ }
+ })
+
+ tap.test(pattern + " sync", function (t) {
+ var matches = glob.sync(pattern).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)
+
+ t.deepEqual(matches, echoOutput, "should match shell")
+ t.end()
+ })
+})
+
+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()
+}