summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTavian Barnes <tavianator@tavianator.com>2016-11-21 14:05:06 -0500
committerTavian Barnes <tavianator@tavianator.com>2016-11-21 14:19:50 -0500
commit059e23e9227d300c1608262808c5f4043abe50f1 (patch)
tree02d065aeabd86c05223a7b45cd100de5d29b8209
parenta7e08e893eb796637ca2c53cd32a529f453ace12 (diff)
downloadbfs-059e23e9227d300c1608262808c5f4043abe50f1.tar.xz
tests: Don't rely on the system 'find' for the expected output.
-rwxr-xr-xtests.sh353
-rw-r--r--tests/test_0001.out19
-rw-r--r--tests/test_0002.out12
-rw-r--r--tests/test_0003.out7
-rw-r--r--tests/test_0004.out18
-rw-r--r--tests/test_0005.out10
-rw-r--r--tests/test_0006.out18
-rw-r--r--tests/test_0007.out9
-rw-r--r--tests/test_0008.out10
-rw-r--r--tests/test_0009.out16
-rw-r--r--tests/test_0010.out4
-rw-r--r--tests/test_0011.out7
-rw-r--r--tests/test_0012.out4
-rw-r--r--tests/test_0013.out5
-rw-r--r--tests/test_0014.out5
-rw-r--r--tests/test_0015.out9
-rw-r--r--tests/test_0016.out19
-rw-r--r--tests/test_0017.out19
-rw-r--r--tests/test_0018.out19
-rw-r--r--tests/test_0019.out19
-rw-r--r--tests/test_0020.out19
-rw-r--r--tests/test_0021.out19
-rw-r--r--tests/test_0022.out4
-rw-r--r--tests/test_0023.out4
-rw-r--r--tests/test_0024.out3
-rw-r--r--tests/test_0025.out4
-rw-r--r--tests/test_0026.out6
-rw-r--r--tests/test_0027.out1
-rw-r--r--tests/test_0028.out1
-rw-r--r--tests/test_0029.out1
-rw-r--r--tests/test_0030.out1
-rw-r--r--tests/test_0031.out4
-rw-r--r--tests/test_0032.out1
-rw-r--r--tests/test_0033.out12
-rw-r--r--tests/test_0034.out12
-rw-r--r--tests/test_0035.out12
-rw-r--r--tests/test_0036.out2
-rw-r--r--tests/test_0037.out1
-rw-r--r--tests/test_0038.out3
-rw-r--r--tests/test_0039.out5
-rw-r--r--tests/test_0040.out2
-rw-r--r--tests/test_0041.out1
-rw-r--r--tests/test_0042.out1
-rw-r--r--tests/test_0043.out1
-rw-r--r--tests/test_0044.out1
-rw-r--r--tests/test_0045.out4
-rw-r--r--tests/test_0046.out7
-rw-r--r--tests/test_0047.out2
-rw-r--r--tests/test_0048.out2
-rw-r--r--tests/test_0049.out2
-rw-r--r--tests/test_0050.out2
-rw-r--r--tests/test_0051.out19
-rw-r--r--tests/test_0052.out19
-rw-r--r--tests/test_0053.out19
-rw-r--r--tests/test_0054.out19
-rw-r--r--tests/test_0055.out19
-rw-r--r--tests/test_0056.out19
-rw-r--r--tests/test_0057.out4
-rw-r--r--tests/test_0058.out7
-rw-r--r--tests/test_0059.out12
-rw-r--r--tests/test_0060.out12
-rw-r--r--tests/test_0061.out0
-rw-r--r--tests/test_0062.out19
-rw-r--r--tests/test_0063.out19
-rw-r--r--tests/test_0064.out19
-rw-r--r--tests/test_0065.out19
-rw-r--r--tests/test_0066.out19
-rw-r--r--tests/test_0067.out4
-rw-r--r--tests/test_0068.out23
-rw-r--r--tests/test_0069.out28
-rw-r--r--tests/test_0070.out28
-rw-r--r--tests/test_0071.out2
-rw-r--r--tests/test_0072.out15
-rw-r--r--tests/test_0073.out19
-rw-r--r--tests/test_0074.out7
-rw-r--r--tests/test_0075.out7
-rw-r--r--tests/test_0078.out1
-rw-r--r--tests/test_0079.out1
-rw-r--r--tests/test_0080.out5
-rw-r--r--tests/test_0081.out1
-rw-r--r--tests/test_0082.out3
-rw-r--r--tests/test_0083.out7
-rw-r--r--tests/test_0084.out0
-rw-r--r--tests/test_0085.out3
-rw-r--r--tests/test_0086.out7
-rw-r--r--tests/test_0090.out0
-rw-r--r--tests/test_0091.out7
-rw-r--r--tests/test_0096.out19
88 files changed, 1011 insertions, 142 deletions
diff --git a/tests.sh b/tests.sh
index d9ee9c9..ba731eb 100755
--- a/tests.sh
+++ b/tests.sh
@@ -1,5 +1,14 @@
#!/bin/bash
+# The temporary directory that will hold our test data
+TMP="$(mktemp -d "${TMPDIR:-/tmp}"/bfs.XXXXXXXXXX)"
+
+# Clean up temporary directories on exit
+function cleanup() {
+ rm -rf "$TMP"
+}
+trap cleanup EXIT
+
# Like a mythical touch -p
function touchp() {
install -Dm644 /dev/null "$1"
@@ -17,9 +26,7 @@ function make_basic() {
touchp "$1/k/foo/bar"
touchp "$1/l/foo/bar/baz"
}
-
-basic="$(mktemp -d "${TMPDIR:-/tmp}"/bfs.basic.XXXXXXXXXX)"
-make_basic "$basic"
+make_basic "$TMP/basic"
# Creates a file+directory structure with various permissions for tests
function make_perms() {
@@ -30,9 +37,7 @@ function make_perms() {
install -Dm311 /dev/null "$1/wx"
install -Dm755 /dev/null "$1/rwx"
}
-
-perms="$(mktemp -d "${TMPDIR:-/tmp}"/bfs.perms.XXXXXXXXXX)"
-make_perms "$perms"
+make_perms "$TMP/perms"
# Creates a file+directory structure with various symbolic and hard links
function make_links() {
@@ -44,9 +49,19 @@ function make_links() {
ln -s d/e "$1/h"
ln -s q "$1/d/e/i"
}
+make_links "$TMP/links"
-links="$(mktemp -d "${TMPDIR:-/tmp}"/bfs.links.XXXXXXXXXX)"
-make_links "$links"
+# Creates a file+directory structure with varying timestamps
+function make_times() {
+ mkdir -p "$1"
+ touch -t 199112140000 "$1/a"
+ touch -t 199112140001 "$1/b"
+ touch -t 199112140002 "$1/c"
+ ln -s a "$1/l"
+ touch -h -t 199112140003 "$1/l"
+ touch -t 199112140004 "$1"
+}
+make_times "$TMP/times"
# Creates a file+directory structure with various weird file/directory names
function make_weirdnames() {
@@ -58,22 +73,13 @@ function make_weirdnames() {
touchp "$1/,/f"
touchp "$1/)/g"
}
+make_weirdnames "$TMP/weirdnames"
-weirdnames="$(mktemp -d "${TMPDIR:-/tmp}"/bfs.weirdnames.XXXXXXXXXX)"
-make_weirdnames "$weirdnames"
-
-# Create a scratch directory that tests can modify
-scratch="$(mktemp -d "${TMPDIR:-/tmp}"/bfs.weirdnames.XXXXXXXXXX)"
-
-# Clean up temporary directories on exit
-function cleanup() {
- rm -rf "$scratch"
- rm -rf "$weirdnames"
- rm -rf "$links"
- rm -rf "$perms"
- rm -rf "$basic"
+# Creates a scratch directory that tests can modify
+function make_scratch() {
+ mkdir -p "$1"
}
-trap cleanup EXIT
+make_scratch "$TMP/scratch"
function _realpath() {
(
@@ -83,377 +89,440 @@ function _realpath() {
}
BFS="$(_realpath ./bfs)"
+TESTS="$(_realpath ./tests)"
+
+if [ "$1" == "update" ]; then
+ UPDATE="update"
+fi
-# Checks for any (order-independent) differences between bfs and find
-function find_diff() {
- diff -u <("$BFS" "$@" | sort) <(find "$@" | sort)
+function bfs_sort() {
+ LC_ALL=C awk -F/ '{ print NF - 1 " " $0 }' | sort -n | awk '{ print $2 }'
}
+function bfs_diff() {
+ local OUT="$TESTS/${FUNCNAME[1]}.out"
+ if [ "$UPDATE" ]; then
+ "$BFS" "$@" | bfs_sort >"$OUT"
+ else
+ diff -u "$OUT" <("$BFS" "$@" | bfs_sort)
+ fi
+}
+
+cd "$TMP"
+
# Test cases
function test_0001() {
- find_diff "$basic"
+ bfs_diff basic
}
function test_0002() {
- find_diff "$basic" -type d
+ bfs_diff basic -type d
}
function test_0003() {
- find_diff "$basic" -type f
+ bfs_diff basic -type f
}
function test_0004() {
- find_diff "$basic" -mindepth 1
+ bfs_diff basic -mindepth 1
}
function test_0005() {
- find_diff "$basic" -maxdepth 1
+ bfs_diff basic -maxdepth 1
}
function test_0006() {
- find_diff "$basic" -mindepth 1 -depth
+ bfs_diff basic -mindepth 1 -depth
}
function test_0007() {
- find_diff "$basic" -mindepth 2 -depth
+ bfs_diff basic -mindepth 2 -depth
}
function test_0008() {
- find_diff "$basic" -maxdepth 1 -depth
+ bfs_diff basic -maxdepth 1 -depth
}
function test_0009() {
- find_diff "$basic" -maxdepth 2 -depth
+ bfs_diff basic -maxdepth 2 -depth
}
function test_0010() {
- find_diff "$basic" -name '*f*'
+ bfs_diff basic -name '*f*'
}
function test_0011() {
- find_diff "$basic" -path "$basic/*f*"
+ bfs_diff basic -path 'basic/*f*'
}
function test_0012() {
- find_diff "$perms" -executable
+ bfs_diff perms -executable
}
function test_0013() {
- find_diff "$perms" -readable
+ bfs_diff perms -readable
}
function test_0014() {
- find_diff "$perms" -writable
+ bfs_diff perms -writable
}
function test_0015() {
- find_diff "$basic" -empty
+ bfs_diff basic -empty
}
function test_0016() {
- find_diff "$basic" -gid "$(id -g)" && \
- find_diff "$basic" -gid +0 && \
- find_diff "$basic" -gid -10000
+ bfs_diff basic -gid "$(id -g)"
}
function test_0017() {
- find_diff "$basic" -uid "$(id -u)" && \
- find_diff "$basic" -uid +0 && \
- find_diff "$basic" -uid -10000
+ bfs_diff basic -gid +0
}
function test_0018() {
- find_diff "$basic" -newer "$basic/e/f"
+ bfs_diff basic -gid "-$(($(id -g) + 1))"
}
function test_0019() {
- find_diff "$basic" -cnewer "$basic/e/f"
+ bfs_diff basic -uid "$(id -u)"
}
function test_0020() {
- find_diff "$links" -links 2 && \
- find_diff "$links" -links -2 && \
- find_diff "$links" -links +1
+ bfs_diff basic -uid +0
}
function test_0021() {
- find_diff -P "$links/d/e/f" && \
- find_diff -P "$links/d/e/f/"
+ bfs_diff basic -uid "-$(($(id -u) + 1))"
}
function test_0022() {
- find_diff -H "$links/d/e/f" && \
- find_diff -H "$links/d/e/f/"
+ bfs_diff times -newer times/a
}
function test_0023() {
- find_diff -H "$links" -newer "$links/d/e/f"
+ bfs_diff times -anewer times/a
}
function test_0024() {
- find_diff -H "$links/d/e/i"
+ bfs_diff links -links 2
}
function test_0025() {
- find_diff -L "$links" 2>/dev/null
+ bfs_diff links -links -2
}
function test_0026() {
- find_diff "$links" -follow 2>/dev/null
+ bfs_diff links -links +1
}
function test_0027() {
- find_diff -L "$links" -depth 2>/dev/null
+ bfs_diff -P links/d/e/f
}
function test_0028() {
- find_diff "$links" -samefile "$links/a"
+ bfs_diff -P links/d/e/f/
}
function test_0029() {
- find_diff "$links" -xtype l
+ bfs_diff -H links/d/e/f
}
function test_0030() {
- find_diff "$links" -xtype f
+ bfs_diff -H links/d/e/f/
}
function test_0031() {
- find_diff -L "$links" -xtype l 2>/dev/null
+ bfs_diff -H times -newer times/l
}
function test_0032() {
- find_diff -L "$links" -xtype f 2>/dev/null
+ bfs_diff -H links/d/e/i
}
function test_0033() {
- find_diff "$basic/a" -name 'a'
+ bfs_diff -L links 2>/dev/null
}
function test_0034() {
- find_diff "$basic/g/" -name 'g'
+ bfs_diff links -follow 2>/dev/null
}
function test_0035() {
- find_diff "/" -maxdepth 0 -name '/' 2>/dev/null
+ bfs_diff -L links -depth 2>/dev/null
}
function test_0036() {
- find_diff "//" -maxdepth 0 -name '/' 2>/dev/null
+ bfs_diff links -samefile links/a
}
function test_0037() {
- find_diff "$basic" -iname '*F*'
+ bfs_diff links -xtype l
}
function test_0038() {
- find_diff "$basic" -ipath "$basic/*F*"
+ bfs_diff links -xtype f
}
function test_0039() {
- find_diff "$links" -lname '[aq]'
+ bfs_diff -L links -xtype l 2>/dev/null
}
function test_0040() {
- find_diff "$links" -ilname '[AQ]'
+ bfs_diff -L links -xtype f 2>/dev/null
}
function test_0041() {
- find_diff -L "$links" -lname '[aq]' 2>/dev/null
+ bfs_diff basic/a -name a
}
function test_0042() {
- find_diff -L "$links" -lname '[AQ]' 2>/dev/null
+ bfs_diff basic/g/ -name g
}
function test_0043() {
- find_diff -L "$basic" -user "$(id -un)"
+ bfs_diff / -maxdepth 0 -name / 2>/dev/null
}
function test_0044() {
- find_diff -L "$basic" -user "$(id -u)"
+ bfs_diff // -maxdepth 0 -name / 2>/dev/null
}
function test_0045() {
- find_diff -L "$basic" -group "$(id -gn)"
+ bfs_diff basic -iname '*F*'
}
function test_0046() {
- find_diff -L "$basic" -group "$(id -g)"
+ bfs_diff basic -ipath 'basic/*F*'
}
function test_0047() {
- find_diff "$basic" -daystart -mtime 0
+ bfs_diff links -lname '[aq]'
}
function test_0048() {
- find_diff "$basic" -daystart -daystart -mtime 0
+ bfs_diff links -ilname '[AQ]'
}
function test_0049() {
- find_diff "$basic" -newermc "$basic/e/f"
+ bfs_diff -L links -lname '[aq]' 2>/dev/null
}
function test_0050() {
- find_diff "$basic" -size 0
+ bfs_diff -L links -ilname '[AQ]' 2>/dev/null
}
function test_0051() {
- find_diff "$basic" -size +0
+ bfs_diff -L basic -user "$(id -un)"
}
function test_0052() {
- find_diff "$basic" -size +0c
+ bfs_diff -L basic -user "$(id -u)"
}
function test_0053() {
- find_diff "$basic" -size 9223372036854775807
+ bfs_diff -L basic -group "$(id -gn)"
}
function test_0054() {
- find_diff "$basic" -exec echo '{}' ';'
+ bfs_diff -L basic -group "$(id -g)"
}
function test_0055() {
- find_diff "$basic" -exec echo '-{}-' ';'
+ bfs_diff basic -daystart -mtime 0
}
function test_0056() {
- find_diff "$basic" -execdir pwd ';'
+ bfs_diff basic -daystart -daystart -mtime 0
}
function test_0057() {
- find_diff "$basic" -execdir echo '{}' ';'
+ bfs_diff times -newerma times/a
}
function test_0058() {
- find_diff "$basic" -execdir echo '-{}-' ';'
+ bfs_diff basic -size 0
}
function test_0059() {
- find_diff "$basic" \( -name '*f*' \)
+ bfs_diff basic -size +0
}
function test_0060() {
- find_diff "$basic" -name '*f*' -print , -print
+ bfs_diff basic -size +0c
}
function test_0061() {
- cd "$weirdnames"
- find_diff '-' '(-' '!-' ',' ')' './(' './!' \( \! -print , -print \)
+ bfs_diff basic -size 9223372036854775807
}
function test_0062() {
- cd "$weirdnames"
- find_diff -L '-' '(-' '!-' ',' ')' './(' './!' \( \! -print , -print \)
+ bfs_diff basic -exec echo '{}' ';'
}
function test_0063() {
- cd "$weirdnames"
- find_diff -L ',' -true
+ bfs_diff basic -exec echo '-{}-' ';'
}
function test_0064() {
- cd "$weirdnames"
- find_diff -follow ',' -true
+ local OFFSET="$((${#TMP} + 2))"
+ bfs_diff basic -execdir bash -c "pwd | cut -b$OFFSET-" ';'
}
function test_0065() {
- find "$basic" -fprint "$scratch/out.find"
- "$BFS" "$basic" -fprint "$scratch/out.bfs"
-
- sort -o "$scratch/out.find" "$scratch/out.find"
- sort -o "$scratch/out.bfs" "$scratch/out.bfs"
- diff -u "$scratch/out.find" "$scratch/out.bfs"
+ bfs_diff basic -execdir echo '{}' ';'
}
function test_0066() {
- cd "$basic"
- find_diff -- -type f
+ bfs_diff basic -execdir echo '-{}-' ';'
}
function test_0067() {
- cd "$basic"
- find_diff -L -- -type f
+ bfs_diff basic \( -name '*f*' \)
}
function test_0068() {
- # Make sure -ignore_readdir_race doesn't suppress ENOENT at the root
- ! "$BFS" "$basic/nonexistent" -ignore_readdir_race 2>/dev/null
+ bfs_diff basic -name '*f*' -print , -print
}
function test_0069() {
- rm -rf "$scratch"/*
- touch "$scratch"/{foo,bar}
-
- # -links 1 forces a stat() call, which will fail for the second file
- "$BFS" "$scratch" -mindepth 1 -ignore_readdir_race -links 1 -exec ./tests/remove-sibling.sh '{}' ';'
+ cd weirdnames
+ bfs_diff '-' '(-' '!-' ',' ')' './(' './!' \( \! -print , -print \)
}
function test_0070() {
- find_diff "$perms" -perm 222 && \
- find_diff "$perms" -perm -222 && \
- find_diff "$perms" -perm /222
+ cd weirdnames
+ bfs_diff -L '-' '(-' '!-' ',' ')' './(' './!' \( \! -print , -print \)
}
function test_0071() {
- find_diff "$perms" -perm 644 && \
- find_diff "$perms" -perm -644 && \
- find_diff "$perms" -perm /644
+ cd weirdnames
+ bfs_diff -L ',' -true
}
function test_0072() {
- find_diff "$perms" -perm a+r,u=wX,g+wX-w && \
- find_diff "$perms" -perm -a+r,u=wX,g+wX-w && \
- find_diff "$perms" -perm /a+r,u=wX,g+wX-w
+ cd weirdnames
+ bfs_diff -follow ',' -true
}
function test_0073() {
- ! "$BFS" "$perms" -perm a+r, 2>/dev/null
+ if [ "$UPDATE" ]; then
+ "$BFS" basic -fprint "$TESTS/test_0073.out"
+ sort -o "$TESTS/test_0073.out" "$TESTS/test_0073.out"
+ else
+ "$BFS" basic -fprint scratch/test_0073.out
+ sort -o scratch/test_0073.out scratch/test_0073.out
+ diff -u scratch/test_0073.out "$TESTS/test_0073.out"
+ fi
}
function test_0074() {
- ! "$BFS" "$perms" -perm a+r,,u+w 2>/dev/null
+ cd basic
+ bfs_diff -- -type f
}
function test_0075() {
- ! "$BFS" "$perms" -perm a 2>/dev/null
+ cd basic
+ bfs_diff -L -- -type f
}
function test_0076() {
- find_diff "$perms" -perm -+rwx && \
- find_diff "$perms" -perm /+rwx
+ # Make sure -ignore_readdir_race doesn't suppress ENOENT at the root
+ ! "$BFS" basic/nonexistent -ignore_readdir_race 2>/dev/null
}
function test_0077() {
- ! "$BFS" "$perms" -perm +rwx 2>/dev/null
+ rm -rf scratch/*
+ touch scratch/{foo,bar}
+
+ # -links 1 forces a stat() call, which will fail for the second file
+ "$BFS" scratch -mindepth 1 -ignore_readdir_race -links 1 -exec "$TESTS/remove-sibling.sh" '{}' ';'
}
function test_0078() {
- ! "$BFS" "$perms" -perm +777 2>/dev/null
+ bfs_diff perms -perm 222
}
function test_0079() {
- # -ok should close stdin for the executed command
- yes | "$BFS" "$basic" -ok cat ';' 2>/dev/null
+ bfs_diff perms -perm -222
}
function test_0080() {
- # -okdir should close stdin for the executed command
- yes | "$BFS" "$basic" -okdir cat ';' 2>/dev/null
+ bfs_diff perms -perm /222
}
function test_0081() {
- find_diff "$basic/" -depth
+ bfs_diff perms -perm 644
}
function test_0082() {
- # Don't try to delete .
- (cd "$scratch" && "$BFS" -delete)
+ bfs_diff perms -perm -644
+}
+
+function test_0083() {
+ bfs_diff perms -perm /644
+}
+
+function test_0084() {
+ bfs_diff perms -perm a+r,u=wX,g+wX-w
+}
+
+function test_0085() {
+ bfs_diff perms -perm -a+r,u=wX,g+wX-w
+}
+
+function test_0086() {
+ bfs_diff perms -perm /a+r,u=wX,g+wX-w
+}
+
+function test_0087() {
+ ! "$BFS" perms -perm a+r, 2>/dev/null
+}
+
+function test_0088() {
+ ! "$BFS" perms -perm a+r,,u+w 2>/dev/null
+}
+
+function test_0089() {
+ ! "$BFS" perms -perm a 2>/dev/null
+}
+
+function test_0090() {
+ bfs_diff perms -perm -+rwx
+}
+
+function test_0091() {
+ bfs_diff perms -perm /+rwx
+}
+
+function test_0092() {
+ ! "$BFS" perms -perm +rwx 2>/dev/null
+}
+
+function test_0093() {
+ ! "$BFS" perms -perm +777 2>/dev/null
+}
+
+function test_0094() {
+ # -ok should close stdin for the executed command
+ yes | "$BFS" basic -ok cat ';' 2>/dev/null
+}
+
+function test_0095() {
+ # -okdir should close stdin for the executed command
+ yes | "$BFS" basic -okdir cat ';' 2>/dev/null
+}
+
+function test_0096() {
+ bfs_diff basic/ -depth
+}
+
+function test_0097() {
+ # Don't try to delete '.'
+ (cd scratch && "$BFS" -delete)
}
-for i in {1..82}; do
+for i in {1..97}; do
test="test_$(printf '%04d' $i)"
if [ -t 1 ]; then
diff --git a/tests/test_0001.out b/tests/test_0001.out
new file mode 100644
index 0000000..bb3cd8d
--- /dev/null
+++ b/tests/test_0001.out
@@ -0,0 +1,19 @@
+basic
+basic/a
+basic/b
+basic/c
+basic/e
+basic/g
+basic/i
+basic/j
+basic/k
+basic/l
+basic/c/d
+basic/e/f
+basic/g/h
+basic/j/foo
+basic/k/foo
+basic/l/foo
+basic/k/foo/bar
+basic/l/foo/bar
+basic/l/foo/bar/baz
diff --git a/tests/test_0002.out b/tests/test_0002.out
new file mode 100644
index 0000000..1e72fd9
--- /dev/null
+++ b/tests/test_0002.out
@@ -0,0 +1,12 @@
+basic
+basic/c
+basic/e
+basic/g
+basic/i
+basic/j
+basic/k
+basic/l
+basic/g/h
+basic/k/foo
+basic/l/foo
+basic/l/foo/bar
diff --git a/tests/test_0003.out b/tests/test_0003.out
new file mode 100644
index 0000000..6218a0c
--- /dev/null
+++ b/tests/test_0003.out
@@ -0,0 +1,7 @@
+basic/a
+basic/b
+basic/c/d
+basic/e/f
+basic/j/foo
+basic/k/foo/bar
+basic/l/foo/bar/baz
diff --git a/tests/test_0004.out b/tests/test_0004.out
new file mode 100644
index 0000000..1f00c58
--- /dev/null
+++ b/tests/test_0004.out
@@ -0,0 +1,18 @@
+basic/a
+basic/b
+basic/c
+basic/e
+basic/g
+basic/i
+basic/j
+basic/k
+basic/l
+basic/c/d
+basic/e/f
+basic/g/h
+basic/j/foo
+basic/k/foo
+basic/l/foo
+basic/k/foo/bar
+basic/l/foo/bar
+basic/l/foo/bar/baz
diff --git a/tests/test_0005.out b/tests/test_0005.out
new file mode 100644
index 0000000..7575ae4
--- /dev/null
+++ b/tests/test_0005.out
@@ -0,0 +1,10 @@
+basic
+basic/a
+basic/b
+basic/c
+basic/e
+basic/g
+basic/i
+basic/j
+basic/k
+basic/l
diff --git a/tests/test_0006.out b/tests/test_0006.out
new file mode 100644
index 0000000..1f00c58
--- /dev/null
+++ b/tests/test_0006.out
@@ -0,0 +1,18 @@
+basic/a
+basic/b
+basic/c
+basic/e
+basic/g
+basic/i
+basic/j
+basic/k
+basic/l
+basic/c/d
+basic/e/f
+basic/g/h
+basic/j/foo
+basic/k/foo
+basic/l/foo
+basic/k/foo/bar
+basic/l/foo/bar
+basic/l/foo/bar/baz
diff --git a/tests/test_0007.out b/tests/test_0007.out
new file mode 100644
index 0000000..4198bf9
--- /dev/null
+++ b/tests/test_0007.out
@@ -0,0 +1,9 @@
+basic/c/d
+basic/e/f
+basic/g/h
+basic/j/foo
+basic/k/foo
+basic/l/foo
+basic/k/foo/bar
+basic/l/foo/bar
+basic/l/foo/bar/baz
diff --git a/tests/test_0008.out b/tests/test_0008.out
new file mode 100644
index 0000000..7575ae4
--- /dev/null
+++ b/tests/test_0008.out
@@ -0,0 +1,10 @@
+basic
+basic/a
+basic/b
+basic/c
+basic/e
+basic/g
+basic/i
+basic/j
+basic/k
+basic/l
diff --git a/tests/test_0009.out b/tests/test_0009.out
new file mode 100644
index 0000000..b79fef1
--- /dev/null
+++ b/tests/test_0009.out
@@ -0,0 +1,16 @@
+basic
+basic/a
+basic/b
+basic/c
+basic/e
+basic/g
+basic/i
+basic/j
+basic/k
+basic/l
+basic/c/d
+basic/e/f
+basic/g/h
+basic/j/foo
+basic/k/foo
+basic/l/foo
diff --git a/tests/test_0010.out b/tests/test_0010.out
new file mode 100644
index 0000000..a9e5d42
--- /dev/null
+++ b/tests/test_0010.out
@@ -0,0 +1,4 @@
+basic/e/f
+basic/j/foo
+basic/k/foo
+basic/l/foo
diff --git a/tests/test_0011.out b/tests/test_0011.out
new file mode 100644
index 0000000..0d36df9
--- /dev/null
+++ b/tests/test_0011.out
@@ -0,0 +1,7 @@
+basic/e/f
+basic/j/foo
+basic/k/foo
+basic/l/foo
+basic/k/foo/bar
+basic/l/foo/bar
+basic/l/foo/bar/baz
diff --git a/tests/test_0012.out b/tests/test_0012.out
new file mode 100644
index 0000000..49c1b21
--- /dev/null
+++ b/tests/test_0012.out
@@ -0,0 +1,4 @@
+perms
+perms/rwx
+perms/rx
+perms/wx
diff --git a/tests/test_0013.out b/tests/test_0013.out
new file mode 100644
index 0000000..386feba
--- /dev/null
+++ b/tests/test_0013.out
@@ -0,0 +1,5 @@
+perms
+perms/r
+perms/rw
+perms/rwx
+perms/rx
diff --git a/tests/test_0014.out b/tests/test_0014.out
new file mode 100644
index 0000000..9a5b95a
--- /dev/null
+++ b/tests/test_0014.out
@@ -0,0 +1,5 @@
+perms
+perms/rw
+perms/rwx
+perms/w
+perms/wx
diff --git a/tests/test_0015.out b/tests/test_0015.out
new file mode 100644
index 0000000..1dbddc7
--- /dev/null
+++ b/tests/test_0015.out
@@ -0,0 +1,9 @@
+basic/a
+basic/b
+basic/i
+basic/c/d
+basic/e/f
+basic/g/h
+basic/j/foo
+basic/k/foo/bar
+basic/l/foo/bar/baz
diff --git a/tests/test_0016.out b/tests/test_0016.out
new file mode 100644
index 0000000..bb3cd8d
--- /dev/null
+++ b/tests/test_0016.out
@@ -0,0 +1,19 @@
+basic
+basic/a
+basic/b
+basic/c
+basic/e
+basic/g
+basic/i
+basic/j
+basic/k
+basic/l
+basic/c/d
+basic/e/f
+basic/g/h
+basic/j/foo
+basic/k/foo
+basic/l/foo
+basic/k/foo/bar
+basic/l/foo/bar
+basic/l/foo/bar/baz
diff --git a/tests/test_0017.out b/tests/test_0017.out
new file mode 100644
index 0000000..bb3cd8d
--- /dev/null
+++ b/tests/test_0017.out
@@ -0,0 +1,19 @@
+basic
+basic/a
+basic/b
+basic/c
+basic/e
+basic/g
+basic/i
+basic/j
+basic/k
+basic/l
+basic/c/d
+basic/e/f
+basic/g/h
+basic/j/foo
+basic/k/foo
+basic/l/foo
+basic/k/foo/bar
+basic/l/foo/bar
+basic/l/foo/bar/baz
diff --git a/tests/test_0018.out b/tests/test_0018.out
new file mode 100644
index 0000000..bb3cd8d
--- /dev/null
+++ b/tests/test_0018.out
@@ -0,0 +1,19 @@
+basic
+basic/a
+basic/b
+basic/c
+basic/e
+basic/g
+basic/i
+basic/j
+basic/k
+basic/l
+basic/c/d
+basic/e/f
+basic/g/h
+basic/j/foo
+basic/k/foo
+basic/l/foo
+basic/k/foo/bar
+basic/l/foo/bar
+basic/l/foo/bar/baz
diff --git a/tests/test_0019.out b/tests/test_0019.out
new file mode 100644
index 0000000..bb3cd8d
--- /dev/null
+++ b/tests/test_0019.out
@@ -0,0 +1,19 @@
+basic
+basic/a
+basic/b
+basic/c
+basic/e
+basic/g
+basic/i
+basic/j
+basic/k
+basic/l
+basic/c/d
+basic/e/f
+basic/g/h
+basic/j/foo
+basic/k/foo
+basic/l/foo
+basic/k/foo/bar
+basic/l/foo/bar
+basic/l/foo/bar/baz
diff --git a/tests/test_0020.out b/tests/test_0020.out
new file mode 100644
index 0000000..bb3cd8d
--- /dev/null
+++ b/tests/test_0020.out
@@ -0,0 +1,19 @@
+basic
+basic/a
+basic/b
+basic/c
+basic/e
+basic/g
+basic/i
+basic/j
+basic/k
+basic/l
+basic/c/d
+basic/e/f
+basic/g/h
+basic/j/foo
+basic/k/foo
+basic/l/foo
+basic/k/foo/bar
+basic/l/foo/bar
+basic/l/foo/bar/baz
diff --git a/tests/test_0021.out b/tests/test_0021.out
new file mode 100644
index 0000000..bb3cd8d
--- /dev/null
+++ b/tests/test_0021.out
@@ -0,0 +1,19 @@
+basic
+basic/a
+basic/b
+basic/c
+basic/e
+basic/g
+basic/i
+basic/j
+basic/k
+basic/l
+basic/c/d
+basic/e/f
+basic/g/h
+basic/j/foo
+basic/k/foo
+basic/l/foo
+basic/k/foo/bar
+basic/l/foo/bar
+basic/l/foo/bar/baz
diff --git a/tests/test_0022.out b/tests/test_0022.out
new file mode 100644
index 0000000..7f6c0dd
--- /dev/null
+++ b/tests/test_0022.out
@@ -0,0 +1,4 @@
+times
+times/b
+times/c
+times/l
diff --git a/tests/test_0023.out b/tests/test_0023.out
new file mode 100644
index 0000000..7f6c0dd
--- /dev/null
+++ b/tests/test_0023.out
@@ -0,0 +1,4 @@
+times
+times/b
+times/c
+times/l
diff --git a/tests/test_0024.out b/tests/test_0024.out
new file mode 100644
index 0000000..a3dcbb2
--- /dev/null
+++ b/tests/test_0024.out
@@ -0,0 +1,3 @@
+links/a
+links/c
+links/d/e/f
diff --git a/tests/test_0025.out b/tests/test_0025.out
new file mode 100644
index 0000000..092fe54
--- /dev/null
+++ b/tests/test_0025.out
@@ -0,0 +1,4 @@
+links/b
+links/h
+links/d/e/g
+links/d/e/i
diff --git a/tests/test_0026.out b/tests/test_0026.out
new file mode 100644
index 0000000..1f94970
--- /dev/null
+++ b/tests/test_0026.out
@@ -0,0 +1,6 @@
+links
+links/a
+links/c
+links/d
+links/d/e
+links/d/e/f
diff --git a/tests/test_0027.out b/tests/test_0027.out
new file mode 100644
index 0000000..a4beda4
--- /dev/null
+++ b/tests/test_0027.out
@@ -0,0 +1 @@
+links/d/e/f
diff --git a/tests/test_0028.out b/tests/test_0028.out
new file mode 100644
index 0000000..0a4fc77
--- /dev/null
+++ b/tests/test_0028.out
@@ -0,0 +1 @@
+links/d/e/f/
diff --git a/tests/test_0029.out b/tests/test_0029.out
new file mode 100644
index 0000000..a4beda4
--- /dev/null
+++ b/tests/test_0029.out
@@ -0,0 +1 @@
+links/d/e/f
diff --git a/tests/test_0030.out b/tests/test_0030.out
new file mode 100644
index 0000000..0a4fc77
--- /dev/null
+++ b/tests/test_0030.out
@@ -0,0 +1 @@
+links/d/e/f/
diff --git a/tests/test_0031.out b/tests/test_0031.out
new file mode 100644
index 0000000..7f6c0dd
--- /dev/null
+++ b/tests/test_0031.out
@@ -0,0 +1,4 @@
+times
+times/b
+times/c
+times/l
diff --git a/tests/test_0032.out b/tests/test_0032.out
new file mode 100644
index 0000000..e5e13fc
--- /dev/null
+++ b/tests/test_0032.out
@@ -0,0 +1 @@
+links/d/e/i
diff --git a/tests/test_0033.out b/tests/test_0033.out
new file mode 100644
index 0000000..36087e8
--- /dev/null
+++ b/tests/test_0033.out
@@ -0,0 +1,12 @@
+links
+links/a
+links/b
+links/c
+links/d
+links/h
+links/d/e
+links/h/f
+links/h/g
+links/h/i
+links/d/e/f
+links/d/e/i
diff --git a/tests/test_0034.out b/tests/test_0034.out
new file mode 100644
index 0000000..36087e8
--- /dev/null
+++ b/tests/test_0034.out
@@ -0,0 +1,12 @@
+links
+links/a
+links/b
+links/c
+links/d
+links/h
+links/d/e
+links/h/f
+links/h/g
+links/h/i
+links/d/e/f
+links/d/e/i
diff --git a/tests/test_0035.out b/tests/test_0035.out
new file mode 100644
index 0000000..36087e8
--- /dev/null
+++ b/tests/test_0035.out
@@ -0,0 +1,12 @@
+links
+links/a
+links/b
+links/c
+links/d
+links/h
+links/d/e
+links/h/f
+links/h/g
+links/h/i
+links/d/e/f
+links/d/e/i
diff --git a/tests/test_0036.out b/tests/test_0036.out
new file mode 100644
index 0000000..892c879
--- /dev/null
+++ b/tests/test_0036.out
@@ -0,0 +1,2 @@
+links/a
+links/c
diff --git a/tests/test_0037.out b/tests/test_0037.out
new file mode 100644
index 0000000..e5e13fc
--- /dev/null
+++ b/tests/test_0037.out
@@ -0,0 +1 @@
+links/d/e/i
diff --git a/tests/test_0038.out b/tests/test_0038.out
new file mode 100644
index 0000000..2a65132
--- /dev/null
+++ b/tests/test_0038.out
@@ -0,0 +1,3 @@
+links/a
+links/b
+links/c
diff --git a/tests/test_0039.out b/tests/test_0039.out
new file mode 100644
index 0000000..1052fc0
--- /dev/null
+++ b/tests/test_0039.out
@@ -0,0 +1,5 @@
+links/b
+links/h
+links/h/g
+links/h/i
+links/d/e/i
diff --git a/tests/test_0040.out b/tests/test_0040.out
new file mode 100644
index 0000000..892c879
--- /dev/null
+++ b/tests/test_0040.out
@@ -0,0 +1,2 @@
+links/a
+links/c
diff --git a/tests/test_0041.out b/tests/test_0041.out
new file mode 100644
index 0000000..511198f
--- /dev/null
+++ b/tests/test_0041.out
@@ -0,0 +1 @@
+basic/a
diff --git a/tests/test_0042.out b/tests/test_0042.out
new file mode 100644
index 0000000..daff2f5
--- /dev/null
+++ b/tests/test_0042.out
@@ -0,0 +1 @@
+basic/g/
diff --git a/tests/test_0043.out b/tests/test_0043.out
new file mode 100644
index 0000000..b498fd4
--- /dev/null
+++ b/tests/test_0043.out
@@ -0,0 +1 @@
+/
diff --git a/tests/test_0044.out b/tests/test_0044.out
new file mode 100644
index 0000000..8337712
--- /dev/null
+++ b/tests/test_0044.out
@@ -0,0 +1 @@
+//
diff --git a/tests/test_0045.out b/tests/test_0045.out
new file mode 100644
index 0000000..a9e5d42
--- /dev/null
+++ b/tests/test_0045.out
@@ -0,0 +1,4 @@
+basic/e/f
+basic/j/foo
+basic/k/foo
+basic/l/foo
diff --git a/tests/test_0046.out b/tests/test_0046.out
new file mode 100644
index 0000000..0d36df9
--- /dev/null
+++ b/tests/test_0046.out
@@ -0,0 +1,7 @@
+basic/e/f
+basic/j/foo
+basic/k/foo
+basic/l/foo
+basic/k/foo/bar
+basic/l/foo/bar
+basic/l/foo/bar/baz
diff --git a/tests/test_0047.out b/tests/test_0047.out
new file mode 100644
index 0000000..45cc127
--- /dev/null
+++ b/tests/test_0047.out
@@ -0,0 +1,2 @@
+links/b
+links/d/e/i
diff --git a/tests/test_0048.out b/tests/test_0048.out
new file mode 100644
index 0000000..45cc127
--- /dev/null
+++ b/tests/test_0048.out
@@ -0,0 +1,2 @@
+links/b
+links/d/e/i
diff --git a/tests/test_0049.out b/tests/test_0049.out
new file mode 100644
index 0000000..b7e42dd
--- /dev/null
+++ b/tests/test_0049.out
@@ -0,0 +1,2 @@
+links/h/i
+links/d/e/i
diff --git a/tests/test_0050.out b/tests/test_0050.out
new file mode 100644
index 0000000..b7e42dd
--- /dev/null
+++ b/tests/test_0050.out
@@ -0,0 +1,2 @@
+links/h/i
+links/d/e/i
diff --git a/tests/test_0051.out b/tests/test_0051.out
new file mode 100644
index 0000000..bb3cd8d
--- /dev/null
+++ b/tests/test_0051.out
@@ -0,0 +1,19 @@
+basic
+basic/a
+basic/b
+basic/c
+basic/e
+basic/g
+basic/i
+basic/j
+basic/k
+basic/l
+basic/c/d
+basic/e/f
+basic/g/h
+basic/j/foo
+basic/k/foo
+basic/l/foo
+basic/k/foo/bar
+basic/l/foo/bar
+basic/l/foo/bar/baz
diff --git a/tests/test_0052.out b/tests/test_0052.out
new file mode 100644
index 0000000..bb3cd8d
--- /dev/null
+++ b/tests/test_0052.out
@@ -0,0 +1,19 @@
+basic
+basic/a
+basic/b
+basic/c
+basic/e
+basic/g
+basic/i
+basic/j
+basic/k
+basic/l
+basic/c/d
+basic/e/f
+basic/g/h
+basic/j/foo
+basic/k/foo
+basic/l/foo
+basic/k/foo/bar
+basic/l/foo/bar
+basic/l/foo/bar/baz
diff --git a/tests/test_0053.out b/tests/test_0053.out
new file mode 100644
index 0000000..bb3cd8d
--- /dev/null
+++ b/tests/test_0053.out
@@ -0,0 +1,19 @@
+basic
+basic/a
+basic/b
+basic/c
+basic/e
+basic/g
+basic/i
+basic/j
+basic/k
+basic/l
+basic/c/d
+basic/e/f
+basic/g/h
+basic/j/foo
+basic/k/foo
+basic/l/foo
+basic/k/foo/bar
+basic/l/foo/bar
+basic/l/foo/bar/baz
diff --git a/tests/test_0054.out b/tests/test_0054.out
new file mode 100644
index 0000000..bb3cd8d
--- /dev/null
+++ b/tests/test_0054.out
@@ -0,0 +1,19 @@
+basic
+basic/a
+basic/b
+basic/c
+basic/e
+basic/g
+basic/i
+basic/j
+basic/k
+basic/l
+basic/c/d
+basic/e/f
+basic/g/h
+basic/j/foo
+basic/k/foo
+basic/l/foo
+basic/k/foo/bar
+basic/l/foo/bar
+basic/l/foo/bar/baz
diff --git a/tests/test_0055.out b/tests/test_0055.out
new file mode 100644
index 0000000..bb3cd8d
--- /dev/null
+++ b/tests/test_0055.out
@@ -0,0 +1,19 @@
+basic
+basic/a
+basic/b
+basic/c
+basic/e
+basic/g
+basic/i
+basic/j
+basic/k
+basic/l
+basic/c/d
+basic/e/f
+basic/g/h
+basic/j/foo
+basic/k/foo
+basic/l/foo
+basic/k/foo/bar
+basic/l/foo/bar
+basic/l/foo/bar/baz
diff --git a/tests/test_0056.out b/tests/test_0056.out
new file mode 100644
index 0000000..bb3cd8d
--- /dev/null
+++ b/tests/test_0056.out
@@ -0,0 +1,19 @@
+basic
+basic/a
+basic/b
+basic/c
+basic/e
+basic/g
+basic/i
+basic/j
+basic/k
+basic/l
+basic/c/d
+basic/e/f
+basic/g/h
+basic/j/foo
+basic/k/foo
+basic/l/foo
+basic/k/foo/bar
+basic/l/foo/bar
+basic/l/foo/bar/baz
diff --git a/tests/test_0057.out b/tests/test_0057.out
new file mode 100644
index 0000000..7f6c0dd
--- /dev/null
+++ b/tests/test_0057.out
@@ -0,0 +1,4 @@
+times
+times/b
+times/c
+times/l
diff --git a/tests/test_0058.out b/tests/test_0058.out
new file mode 100644
index 0000000..6218a0c
--- /dev/null
+++ b/tests/test_0058.out
@@ -0,0 +1,7 @@
+basic/a
+basic/b
+basic/c/d
+basic/e/f
+basic/j/foo
+basic/k/foo/bar
+basic/l/foo/bar/baz
diff --git a/tests/test_0059.out b/tests/test_0059.out
new file mode 100644
index 0000000..1e72fd9
--- /dev/null
+++ b/tests/test_0059.out
@@ -0,0 +1,12 @@
+basic
+basic/c
+basic/e
+basic/g
+basic/i
+basic/j
+basic/k
+basic/l
+basic/g/h
+basic/k/foo
+basic/l/foo
+basic/l/foo/bar
diff --git a/tests/test_0060.out b/tests/test_0060.out
new file mode 100644
index 0000000..1e72fd9
--- /dev/null
+++ b/tests/test_0060.out
@@ -0,0 +1,12 @@
+basic
+basic/c
+basic/e
+basic/g
+basic/i
+basic/j
+basic/k
+basic/l
+basic/g/h
+basic/k/foo
+basic/l/foo
+basic/l/foo/bar
diff --git a/tests/test_0061.out b/tests/test_0061.out
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/test_0061.out
diff --git a/tests/test_0062.out b/tests/test_0062.out
new file mode 100644
index 0000000..bb3cd8d
--- /dev/null
+++ b/tests/test_0062.out
@@ -0,0 +1,19 @@
+basic
+basic/a
+basic/b
+basic/c
+basic/e
+basic/g
+basic/i
+basic/j
+basic/k
+basic/l
+basic/c/d
+basic/e/f
+basic/g/h
+basic/j/foo
+basic/k/foo
+basic/l/foo
+basic/k/foo/bar
+basic/l/foo/bar
+basic/l/foo/bar/baz
diff --git a/tests/test_0063.out b/tests/test_0063.out
new file mode 100644
index 0000000..1c58fb2
--- /dev/null
+++ b/tests/test_0063.out
@@ -0,0 +1,19 @@
+-basic-
+-basic/a-
+-basic/b-
+-basic/c-
+-basic/e-
+-basic/g-
+-basic/i-
+-basic/j-
+-basic/k-
+-basic/l-
+-basic/c/d-
+-basic/e/f-
+-basic/g/h-
+-basic/j/foo-
+-basic/k/foo-
+-basic/l/foo-
+-basic/k/foo/bar-
+-basic/l/foo/bar-
+-basic/l/foo/bar/baz-
diff --git a/tests/test_0064.out b/tests/test_0064.out
new file mode 100644
index 0000000..97e97f9
--- /dev/null
+++ b/tests/test_0064.out
@@ -0,0 +1,19 @@
+basic
+basic
+basic
+basic
+basic
+basic
+basic
+basic
+basic
+basic
+basic/c
+basic/e
+basic/g
+basic/j
+basic/k
+basic/l
+basic/k/foo
+basic/l/foo
+basic/l/foo/bar
diff --git a/tests/test_0065.out b/tests/test_0065.out
new file mode 100644
index 0000000..62b31f6
--- /dev/null
+++ b/tests/test_0065.out
@@ -0,0 +1,19 @@
+./a
+./b
+./bar
+./bar
+./basic
+./baz
+./c
+./d
+./e
+./f
+./foo
+./foo
+./foo
+./g
+./h
+./i
+./j
+./k
+./l
diff --git a/tests/test_0066.out b/tests/test_0066.out
new file mode 100644
index 0000000..f7a9ac0
--- /dev/null
+++ b/tests/test_0066.out
@@ -0,0 +1,19 @@
+-./a-
+-./b-
+-./bar-
+-./bar-
+-./basic-
+-./baz-
+-./c-
+-./d-
+-./e-
+-./f-
+-./foo-
+-./foo-
+-./foo-
+-./g-
+-./h-
+-./i-
+-./j-
+-./k-
+-./l-
diff --git a/tests/test_0067.out b/tests/test_0067.out
new file mode 100644
index 0000000..a9e5d42
--- /dev/null
+++ b/tests/test_0067.out
@@ -0,0 +1,4 @@
+basic/e/f
+basic/j/foo
+basic/k/foo
+basic/l/foo
diff --git a/tests/test_0068.out b/tests/test_0068.out
new file mode 100644
index 0000000..56b2bde
--- /dev/null
+++ b/tests/test_0068.out
@@ -0,0 +1,23 @@
+basic
+basic/a
+basic/b
+basic/c
+basic/e
+basic/g
+basic/i
+basic/j
+basic/k
+basic/l
+basic/c/d
+basic/e/f
+basic/e/f
+basic/g/h
+basic/j/foo
+basic/j/foo
+basic/k/foo
+basic/k/foo
+basic/l/foo
+basic/l/foo
+basic/k/foo/bar
+basic/l/foo/bar
+basic/l/foo/bar/baz
diff --git a/tests/test_0069.out b/tests/test_0069.out
new file mode 100644
index 0000000..d06572a
--- /dev/null
+++ b/tests/test_0069.out
@@ -0,0 +1,28 @@
+-
+-
+,
+,
+!-
+!-
+(-
+(-
+)
+)
+./!
+./!
+./(
+./(
+-/a
+-/a
+(-/c
+(-/c
+!-/e
+!-/e
+,/f
+,/f
+)/g
+)/g
+./(/b
+./(/b
+./!/d
+./!/d
diff --git a/tests/test_0070.out b/tests/test_0070.out
new file mode 100644
index 0000000..d06572a
--- /dev/null
+++ b/tests/test_0070.out
@@ -0,0 +1,28 @@
+-
+-
+,
+,
+!-
+!-
+(-
+(-
+)
+)
+./!
+./!
+./(
+./(
+-/a
+-/a
+(-/c
+(-/c
+!-/e
+!-/e
+,/f
+,/f
+)/g
+)/g
+./(/b
+./(/b
+./!/d
+./!/d
diff --git a/tests/test_0071.out b/tests/test_0071.out
new file mode 100644
index 0000000..3574388
--- /dev/null
+++ b/tests/test_0071.out
@@ -0,0 +1,2 @@
+,
+,/f
diff --git a/tests/test_0072.out b/tests/test_0072.out
new file mode 100644
index 0000000..bbe4f7f
--- /dev/null
+++ b/tests/test_0072.out
@@ -0,0 +1,15 @@
+.
+./-
+./,
+./!
+./!-
+./(
+./(-
+./)
+./-/a
+./(/b
+./(-/c
+./!/d
+./!-/e
+./,/f
+./)/g
diff --git a/tests/test_0073.out b/tests/test_0073.out
new file mode 100644
index 0000000..a7ccfe4
--- /dev/null
+++ b/tests/test_0073.out
@@ -0,0 +1,19 @@
+basic
+basic/a
+basic/b
+basic/c
+basic/c/d
+basic/e
+basic/e/f
+basic/g
+basic/g/h
+basic/i
+basic/j
+basic/j/foo
+basic/k
+basic/k/foo
+basic/k/foo/bar
+basic/l
+basic/l/foo
+basic/l/foo/bar
+basic/l/foo/bar/baz
diff --git a/tests/test_0074.out b/tests/test_0074.out
new file mode 100644
index 0000000..774cc7c
--- /dev/null
+++ b/tests/test_0074.out
@@ -0,0 +1,7 @@
+./a
+./b
+./c/d
+./e/f
+./j/foo
+./k/foo/bar
+./l/foo/bar/baz
diff --git a/tests/test_0075.out b/tests/test_0075.out
new file mode 100644
index 0000000..774cc7c
--- /dev/null
+++ b/tests/test_0075.out
@@ -0,0 +1,7 @@
+./a
+./b
+./c/d
+./e/f
+./j/foo
+./k/foo/bar
+./l/foo/bar/baz
diff --git a/tests/test_0078.out b/tests/test_0078.out
new file mode 100644
index 0000000..1690e43
--- /dev/null
+++ b/tests/test_0078.out
@@ -0,0 +1 @@
+perms/w
diff --git a/tests/test_0079.out b/tests/test_0079.out
new file mode 100644
index 0000000..1690e43
--- /dev/null
+++ b/tests/test_0079.out
@@ -0,0 +1 @@
+perms/w
diff --git a/tests/test_0080.out b/tests/test_0080.out
new file mode 100644
index 0000000..9a5b95a
--- /dev/null
+++ b/tests/test_0080.out
@@ -0,0 +1,5 @@
+perms
+perms/rw
+perms/rwx
+perms/w
+perms/wx
diff --git a/tests/test_0081.out b/tests/test_0081.out
new file mode 100644
index 0000000..4e64e49
--- /dev/null
+++ b/tests/test_0081.out
@@ -0,0 +1 @@
+perms/rw
diff --git a/tests/test_0082.out b/tests/test_0082.out
new file mode 100644
index 0000000..2e2576b
--- /dev/null
+++ b/tests/test_0082.out
@@ -0,0 +1,3 @@
+perms
+perms/rw
+perms/rwx
diff --git a/tests/test_0083.out b/tests/test_0083.out
new file mode 100644
index 0000000..7e5ae98
--- /dev/null
+++ b/tests/test_0083.out
@@ -0,0 +1,7 @@
+perms
+perms/r
+perms/rw
+perms/rwx
+perms/rx
+perms/w
+perms/wx
diff --git a/tests/test_0084.out b/tests/test_0084.out
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/test_0084.out
diff --git a/tests/test_0085.out b/tests/test_0085.out
new file mode 100644
index 0000000..2e2576b
--- /dev/null
+++ b/tests/test_0085.out
@@ -0,0 +1,3 @@
+perms
+perms/rw
+perms/rwx
diff --git a/tests/test_0086.out b/tests/test_0086.out
new file mode 100644
index 0000000..7e5ae98
--- /dev/null
+++ b/tests/test_0086.out
@@ -0,0 +1,7 @@
+perms
+perms/r
+perms/rw
+perms/rwx
+perms/rx
+perms/w
+perms/wx
diff --git a/tests/test_0090.out b/tests/test_0090.out
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/test_0090.out
diff --git a/tests/test_0091.out b/tests/test_0091.out
new file mode 100644
index 0000000..7e5ae98
--- /dev/null
+++ b/tests/test_0091.out
@@ -0,0 +1,7 @@
+perms
+perms/r
+perms/rw
+perms/rwx
+perms/rx
+perms/w
+perms/wx
diff --git a/tests/test_0096.out b/tests/test_0096.out
new file mode 100644
index 0000000..7ce7a82
--- /dev/null
+++ b/tests/test_0096.out
@@ -0,0 +1,19 @@
+basic/
+basic/a
+basic/b
+basic/c
+basic/e
+basic/g
+basic/i
+basic/j
+basic/k
+basic/l
+basic/c/d
+basic/e/f
+basic/g/h
+basic/j/foo
+basic/k/foo
+basic/l/foo
+basic/k/foo/bar
+basic/l/foo/bar
+basic/l/foo/bar/baz