(List (AndOr OP_OR_IF (Com {[LIT_CHARS source]} {[DQ [ComSub (AndOr OP_AND_IF (Com {[LIT_CHARS cd]} {[DQ [ComSub (Com {[LIT_CHARS dirname]} {[DQ [VarSub BASH_SOURCE bracket_op=(Index {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 0]}})]]})]]}) (Com {[LIT_CHARS pwd]}) )][LIT_CHARS /unittest.bash]]}) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Could not source unittest.sh"]]} < (DescriptorRedirectNode target={[LIT_CHARS 2]} &"> 1), > ) (Com {[LIT_CHARS exit]} {[LIT_CHARS 1]}) ) ) (AndOr OP_OR_IF (Com {[LIT_CHARS source]} {[DQ [ComSub (AndOr OP_AND_IF (Com {[LIT_CHARS cd]} {[DQ [ComSub (Com {[LIT_CHARS dirname]} {[DQ [VarSub BASH_SOURCE bracket_op=(Index {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 0]}})]]})]]}) (Com {[LIT_CHARS pwd]}) )][LIT_CHARS /shell_utils.sh]]}) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "shell_utils.sh not found!"]]} < (DescriptorRedirectNode target={[LIT_CHARS 2]} &"> 1), > ) (Com {[LIT_CHARS exit]} {[LIT_CHARS 1]}) ) ) (Com {[LIT_CHARS set]} {[LIT_CHARS -eu]}) (Com {[LIT_CHARS cd]} {[DQ [VarSub TEST_TMPDIR]]}) (FunctionDef assert_fails_to [] (List (= scope= flags=0 words=[{[LIT_CHARS -r]}] bindings=[('method', {[DQ [VarSub 1]]})]) (= scope= flags=0 words=[{[LIT_CHARS -r]}] bindings=[('arg', {[DQ [VarSub 2 test_op=VS_TEST_COLON_HYPHEN {}]]})]) (If (Com {[LIT_OTHER "["]} {[LIT_CHARS -n]} {[DQ [VarSub arg]]} {[LIT_OTHER "]"]}) (AndOr OP_AND_IF (Com {[DQ [VarSub method]]} {[DQ [VarSub arg]]}) (Com {[LIT_CHARS fail]} {[DQ [LIT_CHARS "'"][VarSub method][LIT_CHARS "' should have failed for '"][VarSub arg][LIT_CHARS "'"]]}) ) (ElseTrue) (AndOr OP_AND_IF (Com {[DQ [VarSub method]]}) (Com {[LIT_CHARS fail]} {[DQ [LIT_CHARS "'"][VarSub method][LIT_CHARS "' should have failed for empty argument"]]}) ) ) (Com {[LIT_CHARS true]}) ) ) (FunctionDef test_resolve_bad_links [] (List (= scope= flags=0 words=[{[LIT_CHARS -r]}] bindings=[('dir', {[DQ [VarSub FUNCNAME bracket_op=(Index {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 0]}})]]})]) (AndOr OP_OR_IF (Com {[LIT_CHARS mkdir]} {[LIT_CHARS -p]} {[DQ [VarSub dir]]}) (Com {[LIT_CHARS fail]} {[DQ [LIT_CHARS "mkdir -p "][VarSub dir]]}) ) (Com {[LIT_CHARS assert_fails_to]} {[LIT_CHARS resolve_links]} {[DQ [ComSub (Com {[LIT_CHARS pwd]})][LIT_CHARS /][VarSub dir][LIT_CHARS /non-existent]]}) (Com {[LIT_CHARS assert_fails_to]} {[LIT_CHARS resolve_links]} {[DQ [VarSub dir][LIT_CHARS /non-existent]]}) (Com {[LIT_CHARS ln]} {[LIT_CHARS -s]} {[DQ [LIT_CHARS /non-existent]]} {[DQ [VarSub dir][LIT_CHARS /bad-absolute.sym]]}) (Com {[LIT_CHARS assert_fails_to]} {[LIT_CHARS resolve_links]} {[DQ [ComSub (Com {[LIT_CHARS pwd]})][LIT_CHARS /][VarSub dir][LIT_CHARS /bad-absolute.sym]]}) (Com {[LIT_CHARS assert_fails_to]} {[LIT_CHARS resolve_links]} {[DQ [VarSub dir][LIT_CHARS /bad-absolute.sym]]}) (Com {[LIT_CHARS ln]} {[LIT_CHARS -s]} {[DQ [LIT_CHARS non-existent]]} {[DQ [VarSub dir][LIT_CHARS /bad-relative.sym]]}) (Com {[LIT_CHARS assert_fails_to]} {[LIT_CHARS resolve_links]} {[DQ [ComSub (Com {[LIT_CHARS pwd]})][LIT_CHARS /][VarSub dir][LIT_CHARS /bad-relative.sym]]}) (Com {[LIT_CHARS assert_fails_to]} {[LIT_CHARS resolve_links]} {[DQ [VarSub dir][LIT_CHARS /bad-relative.sym]]}) (Com {[LIT_CHARS ln]} {[LIT_CHARS -s]} {[DQ [LIT_CHARS circular.sym]]} {[DQ [VarSub dir][LIT_CHARS /circular.sym]]}) (Com {[LIT_CHARS assert_fails_to]} {[LIT_CHARS resolve_links]} {[DQ [ComSub (Com {[LIT_CHARS pwd]})][LIT_CHARS /][VarSub dir][LIT_CHARS /circular.sym]]}) (Com {[LIT_CHARS assert_fails_to]} {[LIT_CHARS resolve_links]} {[DQ [VarSub dir][LIT_CHARS /circular.sym]]}) ) ) (FunctionDef test_resolve_non_links [] (List (= scope= flags=0 words=[{[LIT_CHARS -r]}] bindings=[('dir', {[DQ [VarSub FUNCNAME bracket_op=(Index {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 0]}})]]})]) (AndOr OP_OR_IF (Com {[LIT_CHARS mkdir]} {[LIT_CHARS -p]} {[DQ [VarSub dir]]}) (Com {[LIT_CHARS fail]} {[DQ [LIT_CHARS "mkdir -p "][VarSub dir]]}) ) (Com {[LIT_CHARS echo]} {[LIT_CHARS hello]} < (FilenameRedirectNode filename={[DQ [VarSub dir][LIT_CHARS /hello.txt]]} "> 1), > ) (Com {[LIT_CHARS assert_equals]} {[DQ [ComSub (Com {[LIT_CHARS pwd]})]]} {[DQ [ComSub (Com {[LIT_CHARS resolve_links]} {[DQ [ComSub (Com {[LIT_CHARS pwd]})]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [VarSub dir]]} {[DQ [ComSub (Com {[LIT_CHARS resolve_links]} {[DQ [VarSub dir]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [VarSub dir][LIT_CHARS /hello.txt]]} {[DQ [ComSub (Com {[LIT_CHARS resolve_links]} {[DQ [VarSub dir][LIT_CHARS /hello.txt]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [ComSub (Com {[LIT_CHARS pwd]})][LIT_CHARS /][VarSub dir][LIT_CHARS /hello.txt]]} {[DQ [ComSub (Com {[LIT_CHARS resolve_links]} {[DQ [ComSub (Com {[LIT_CHARS pwd]})][LIT_CHARS /][VarSub dir][LIT_CHARS /hello.txt]]})]]}) ) ) (FunctionDef test_resolve_symlinks [] (List (= scope= flags=0 words=[{[LIT_CHARS -r]}] bindings=[('dir', {[DQ [VarSub FUNCNAME bracket_op=(Index {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 0]}})]]})]) (AndOr OP_OR_IF (Com {[LIT_CHARS mkdir]} {[LIT_CHARS -p]} {[DQ [VarSub dir][LIT_CHARS /a/b]]}) (Com {[LIT_CHARS fail]} {[DQ [LIT_CHARS "mkdir -p "][VarSub dir][LIT_CHARS /a/b]]}) ) (Com {[LIT_CHARS echo]} {[LIT_CHARS hello]} < (FilenameRedirectNode filename={[DQ [VarSub dir][LIT_CHARS /hello.txt]]} "> 1), > ) (Com {[LIT_CHARS ln]} {[LIT_CHARS -s]} {[DQ [LIT_CHARS .]]} {[DQ [VarSub dir][LIT_CHARS /self]]}) (Com {[LIT_CHARS ln]} {[LIT_CHARS -s]} {[DQ [LIT_CHARS ../hello.txt]]} {[DQ [VarSub dir][LIT_CHARS /a/sym]]}) (Com {[LIT_CHARS ln]} {[LIT_CHARS -s]} {[DQ [LIT_CHARS ../sym]]} {[DQ [VarSub dir][LIT_CHARS /a/b/sym]]}) (Com {[LIT_CHARS ln]} {[LIT_CHARS -s]} {[DQ [LIT_CHARS .././sym]]} {[DQ [VarSub dir][LIT_CHARS /a/b/sym-not-normalized]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [VarSub dir][LIT_CHARS /.]]} {[DQ [ComSub (Com {[LIT_CHARS resolve_links]} {[DQ [VarSub dir][LIT_CHARS /self]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [VarSub dir][LIT_CHARS /a/../hello.txt]]} {[DQ [ComSub (Com {[LIT_CHARS resolve_links]} {[DQ [VarSub dir][LIT_CHARS /a/sym]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [VarSub dir][LIT_CHARS /a/b/../../hello.txt]]} {[DQ [ComSub (Com {[LIT_CHARS resolve_links]} {[DQ [VarSub dir][LIT_CHARS /a/b/sym]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [VarSub dir][LIT_CHARS /a/b/.././../hello.txt]]} {[DQ [ComSub (Com {[LIT_CHARS resolve_links]} {[DQ [VarSub dir][LIT_CHARS /a/b/sym-not-normalized]]})]]}) (Com {[LIT_CHARS cd]} {[DQ [VarSub dir]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [LIT_CHARS ./.]]} {[DQ [ComSub (Com {[LIT_CHARS resolve_links]} {[DQ [LIT_CHARS self]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [LIT_CHARS ./.]]} {[DQ [ComSub (Com {[LIT_CHARS resolve_links]} {[DQ [LIT_CHARS ./self]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [LIT_CHARS a/../hello.txt]]} {[DQ [ComSub (Com {[LIT_CHARS resolve_links]} {[DQ [LIT_CHARS a/sym]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [LIT_CHARS a/b/../../hello.txt]]} {[DQ [ComSub (Com {[LIT_CHARS resolve_links]} {[DQ [LIT_CHARS a/b/sym]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [LIT_CHARS a/b/.././../hello.txt]]} {[DQ [ComSub (Com {[LIT_CHARS resolve_links]} {[DQ [LIT_CHARS a/b/sym-not-normalized]]})]]}) (Com {[LIT_CHARS cd]} {[LIT_CHARS a]}) (Com {[LIT_CHARS assert_equals]} {[DQ [LIT_CHARS ../.]]} {[DQ [ComSub (Com {[LIT_CHARS resolve_links]} {[DQ [LIT_CHARS ../self]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [LIT_CHARS ./../hello.txt]]} {[DQ [ComSub (Com {[LIT_CHARS resolve_links]} {[DQ [LIT_CHARS sym]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [LIT_CHARS ./../hello.txt]]} {[DQ [ComSub (Com {[LIT_CHARS resolve_links]} {[DQ [LIT_CHARS ./sym]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [LIT_CHARS b/../../hello.txt]]} {[DQ [ComSub (Com {[LIT_CHARS resolve_links]} {[DQ [LIT_CHARS b/sym]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [LIT_CHARS b/.././../hello.txt]]} {[DQ [ComSub (Com {[LIT_CHARS resolve_links]} {[DQ [LIT_CHARS b/sym-not-normalized]]})]]}) (Com {[LIT_CHARS cd]} {[LIT_CHARS b]}) (Com {[LIT_CHARS assert_equals]} {[DQ [LIT_CHARS ../../.]]} {[DQ [ComSub (Com {[LIT_CHARS resolve_links]} {[DQ [LIT_CHARS ../../self]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [LIT_CHARS ../../hello.txt]]} {[DQ [ComSub (Com {[LIT_CHARS resolve_links]} {[DQ [LIT_CHARS ../sym]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [LIT_CHARS ./../../hello.txt]]} {[DQ [ComSub (Com {[LIT_CHARS resolve_links]} {[DQ [LIT_CHARS sym]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [LIT_CHARS ./../../hello.txt]]} {[DQ [ComSub (Com {[LIT_CHARS resolve_links]} {[DQ [LIT_CHARS ./sym]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [LIT_CHARS ./.././../hello.txt]]} {[DQ [ComSub (Com {[LIT_CHARS resolve_links]} {[DQ [LIT_CHARS sym-not-normalized]]})]]}) ) ) (FunctionDef test_normalize_path [] (List (Com {[LIT_CHARS assert_equals]} {[DQ [LIT_CHARS .]]} {[DQ [ComSub (Com {[LIT_CHARS normalize_path]} {[DQ ]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [LIT_CHARS .]]} {[DQ [ComSub (Com {[LIT_CHARS normalize_path]} {[DQ [LIT_CHARS .]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [LIT_CHARS .]]} {[DQ [ComSub (Com {[LIT_CHARS normalize_path]} {[DQ [LIT_CHARS ./.]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [LIT_CHARS ..]]} {[DQ [ComSub (Com {[LIT_CHARS normalize_path]} {[DQ [LIT_CHARS ..]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [LIT_CHARS ..]]} {[DQ [ComSub (Com {[LIT_CHARS normalize_path]} {[DQ [LIT_CHARS ./..]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [LIT_CHARS ..]]} {[DQ [ComSub (Com {[LIT_CHARS normalize_path]} {[DQ [LIT_CHARS ../.]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [LIT_CHARS ../..]]} {[DQ [ComSub (Com {[LIT_CHARS normalize_path]} {[DQ [LIT_CHARS ../././..]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [LIT_CHARS blah]]} {[DQ [ComSub (Com {[LIT_CHARS normalize_path]} {[DQ [LIT_CHARS blah]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [LIT_CHARS blah]]} {[DQ [ComSub (Com {[LIT_CHARS normalize_path]} {[DQ [LIT_CHARS blah/.]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [LIT_CHARS blah]]} {[DQ [ComSub (Com {[LIT_CHARS normalize_path]} {[DQ [LIT_CHARS blah/./hello/..]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [LIT_CHARS blah]]} {[DQ [ComSub (Com {[LIT_CHARS normalize_path]} {[DQ [LIT_CHARS blah/./hello/../]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [LIT_CHARS blah/hello]]} {[DQ [ComSub (Com {[LIT_CHARS normalize_path]} {[DQ [LIT_CHARS blah/./hello/../a/b/.././.././hello]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [LIT_CHARS .]]} {[DQ [ComSub (Com {[LIT_CHARS normalize_path]} {[DQ [LIT_CHARS blah/./hello/../a/b/.././.././..]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [LIT_CHARS ..]]} {[DQ [ComSub (Com {[LIT_CHARS normalize_path]} {[DQ [LIT_CHARS blah/.././..]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [LIT_CHARS ../..]]} {[DQ [ComSub (Com {[LIT_CHARS normalize_path]} {[DQ [LIT_CHARS blah/.././../..]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [LIT_CHARS /]]} {[DQ [ComSub (Com {[LIT_CHARS normalize_path]} {[DQ [LIT_CHARS /]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [LIT_CHARS /]]} {[DQ [ComSub (Com {[LIT_CHARS normalize_path]} {[DQ [LIT_CHARS /.]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [LIT_CHARS /]]} {[DQ [ComSub (Com {[LIT_CHARS normalize_path]} {[DQ [LIT_CHARS /./.]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [LIT_CHARS /blah]]} {[DQ [ComSub (Com {[LIT_CHARS normalize_path]} {[DQ [LIT_CHARS /blah]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [LIT_CHARS /blah]]} {[DQ [ComSub (Com {[LIT_CHARS normalize_path]} {[DQ [LIT_CHARS /blah/.]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [LIT_CHARS /blah]]} {[DQ [ComSub (Com {[LIT_CHARS normalize_path]} {[DQ [LIT_CHARS /blah/./hello/..]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [LIT_CHARS /blah]]} {[DQ [ComSub (Com {[LIT_CHARS normalize_path]} {[DQ [LIT_CHARS /blah/./hello/../]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [LIT_CHARS /blah]]} {[DQ [ComSub (Com {[LIT_CHARS normalize_path]} {[DQ [LIT_CHARS /blah/./hello/../a/b/.././../.]]})]]}) ) ) (FunctionDef test_get_realpath [] (List (= scope= flags=0 words=[{[LIT_CHARS -r]}] bindings=[('dir', {[DQ [VarSub FUNCNAME bracket_op=(Index {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 0]}})]]})]) (AndOr OP_OR_IF (Com {[LIT_CHARS mkdir]} {[LIT_CHARS -p]} {[DQ [VarSub dir][LIT_CHARS /a/b]]}) (Com {[LIT_CHARS fail]} {[DQ [LIT_CHARS "mkdir -p "][VarSub dir][LIT_CHARS /a/b]]}) ) (Com {[LIT_CHARS echo]} {[LIT_CHARS hello]} < (FilenameRedirectNode filename={[DQ [VarSub dir][LIT_CHARS /hello.txt]]} "> 1), > ) (Com {[LIT_CHARS ln]} {[LIT_CHARS -s]} {[DQ [LIT_CHARS .]]} {[DQ [VarSub dir][LIT_CHARS /self]]}) (Com {[LIT_CHARS ln]} {[LIT_CHARS -s]} {[DQ [LIT_CHARS ../hello.txt]]} {[DQ [VarSub dir][LIT_CHARS /a/sym]]}) (Com {[LIT_CHARS ln]} {[LIT_CHARS -s]} {[DQ [LIT_CHARS ../sym]]} {[DQ [VarSub dir][LIT_CHARS /a/b/sym]]}) (Com {[LIT_CHARS ln]} {[LIT_CHARS -s]} {[DQ [LIT_CHARS .././sym]]} {[DQ [VarSub dir][LIT_CHARS /a/b/sym-not-normalized]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [ComSub (Com {[LIT_CHARS pwd]})][LIT_CHARS /][VarSub dir]]} {[DQ [ComSub (Com {[LIT_CHARS get_real_path]} {[DQ [VarSub dir][LIT_CHARS /self]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [ComSub (Com {[LIT_CHARS pwd]})][LIT_CHARS /][VarSub dir][LIT_CHARS /hello.txt]]} {[DQ [ComSub (Com {[LIT_CHARS get_real_path]} {[DQ [VarSub dir][LIT_CHARS /a/sym]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [ComSub (Com {[LIT_CHARS pwd]})][LIT_CHARS /][VarSub dir][LIT_CHARS /hello.txt]]} {[DQ [ComSub (Com {[LIT_CHARS get_real_path]} {[DQ [VarSub dir][LIT_CHARS /a/b/sym]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [ComSub (Com {[LIT_CHARS pwd]})][LIT_CHARS /][VarSub dir][LIT_CHARS /hello.txt]]} {[DQ [ComSub (Com {[LIT_CHARS get_real_path]} {[DQ [VarSub dir][LIT_CHARS /a/b/sym-not-normalized]]})]]}) (Com {[LIT_CHARS cd]} {[DQ [VarSub dir]]}) (= scope= flags=0 words=[{[LIT_CHARS -r]}] bindings=[('abs_dir', {[ComSub (Com {[LIT_CHARS pwd]})]})]) (Com {[LIT_CHARS assert_equals]} {[DQ [VarSub abs_dir]]} {[DQ [ComSub (Com {[LIT_CHARS get_real_path]} {[DQ [LIT_CHARS self]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [VarSub abs_dir]]} {[DQ [ComSub (Com {[LIT_CHARS get_real_path]} {[DQ [LIT_CHARS ./self]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [VarSub abs_dir][LIT_CHARS /hello.txt]]} {[DQ [ComSub (Com {[LIT_CHARS get_real_path]} {[DQ [LIT_CHARS a/sym]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [VarSub abs_dir][LIT_CHARS /hello.txt]]} {[DQ [ComSub (Com {[LIT_CHARS get_real_path]} {[DQ [LIT_CHARS a/b/sym]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [VarSub abs_dir][LIT_CHARS /hello.txt]]} {[DQ [ComSub (Com {[LIT_CHARS get_real_path]} {[DQ [LIT_CHARS a/b/sym-not-normalized]]})]]}) (Com {[LIT_CHARS cd]} {[LIT_CHARS a]}) (Com {[LIT_CHARS assert_equals]} {[DQ [VarSub abs_dir]]} {[DQ [ComSub (Com {[LIT_CHARS get_real_path]} {[DQ [LIT_CHARS ../self]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [VarSub abs_dir][LIT_CHARS /hello.txt]]} {[DQ [ComSub (Com {[LIT_CHARS get_real_path]} {[DQ [LIT_CHARS sym]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [VarSub abs_dir][LIT_CHARS /hello.txt]]} {[DQ [ComSub (Com {[LIT_CHARS get_real_path]} {[DQ [LIT_CHARS ./sym]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [VarSub abs_dir][LIT_CHARS /hello.txt]]} {[DQ [ComSub (Com {[LIT_CHARS get_real_path]} {[DQ [LIT_CHARS b/sym]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [VarSub abs_dir][LIT_CHARS /hello.txt]]} {[DQ [ComSub (Com {[LIT_CHARS get_real_path]} {[DQ [LIT_CHARS b/sym-not-normalized]]})]]}) (Com {[LIT_CHARS cd]} {[LIT_CHARS b]}) (Com {[LIT_CHARS assert_equals]} {[DQ [VarSub abs_dir]]} {[DQ [ComSub (Com {[LIT_CHARS get_real_path]} {[DQ [LIT_CHARS ../../self]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [VarSub abs_dir][LIT_CHARS /hello.txt]]} {[DQ [ComSub (Com {[LIT_CHARS get_real_path]} {[DQ [LIT_CHARS ../sym]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [VarSub abs_dir][LIT_CHARS /hello.txt]]} {[DQ [ComSub (Com {[LIT_CHARS get_real_path]} {[DQ [LIT_CHARS sym]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [VarSub abs_dir][LIT_CHARS /hello.txt]]} {[DQ [ComSub (Com {[LIT_CHARS get_real_path]} {[DQ [LIT_CHARS ./sym]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [VarSub abs_dir][LIT_CHARS /hello.txt]]} {[DQ [ComSub (Com {[LIT_CHARS get_real_path]} {[DQ [LIT_CHARS sym-not-normalized]]})]]}) (Com {[LIT_CHARS assert_fails_to]} {[LIT_CHARS get_real_path]} {[DQ [LIT_CHARS non-existent]]}) (Com {[LIT_CHARS ln]} {[LIT_CHARS -s]} {[LIT_CHARS self]} {[LIT_CHARS self]}) (Com {[LIT_CHARS assert_fails_to]} {[LIT_CHARS get_real_path]} {[DQ [LIT_CHARS self]]}) ) ) (FunctionDef test_md5_sum [] (List (= scope= flags=0 words=[{[LIT_CHARS -r]}] bindings=[('dir', {[DQ [VarSub FUNCNAME bracket_op=(Index {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 0]}})]]})]) (AndOr OP_OR_IF (Com {[LIT_CHARS mkdir]} {[DQ [VarSub dir]]}) (Com {[LIT_CHARS fail]} {[DQ [LIT_CHARS "mkdir "][VarSub dir]]}) ) (Com {[LIT_CHARS echo]} {[LIT_CHARS hello]} < (FilenameRedirectNode filename={[DQ [VarSub dir][LIT_CHARS /a.txt]]} "> 1), > ) (Com {[LIT_CHARS echo]} {[LIT_CHARS world]} < (FilenameRedirectNode filename={[DQ [VarSub dir][LIT_CHARS /b.txt]]} "> 1), > ) (Com {[LIT_CHARS assert_fails_to]} {[LIT_CHARS md5_file]}) (Com {[LIT_CHARS assert_fails_to]} {[LIT_CHARS md5_file]} {[DQ [LIT_CHARS non-existent]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [LIT_CHARS b1946ac92492d2347c6235b4d2611184]]} {[DQ [ComSub (Com {[LIT_CHARS md5_file]} {[DQ [VarSub dir][LIT_CHARS /a.txt]]})]]}) (Com {[LIT_CHARS assert_equals]} {[DQ [LIT_CHARS 591785b794601e212b260e25925636fd]]} {[DQ [ComSub (Com {[LIT_CHARS md5_file]} {[DQ [VarSub dir][LIT_CHARS /b.txt]]})]]}) (= scope= flags=0 words=[] bindings=[('sums', {[DQ [ComSub (Com {[LIT_CHARS echo]} {[LIT_CHARS -e]} {[DQ [LIT_CHARS b1946ac92492d2347c6235b4d2611184][\ LIT_ESCAPED_CHAR "\\n"][LIT_CHARS 591785b794601e212b260e25925636fd]]})]]})]) (Com {[LIT_CHARS assert_equals]} {[DQ [VarSub sums]]} {[DQ [ComSub (Com {[LIT_CHARS md5_file]} {[DQ [VarSub dir][LIT_CHARS /a.txt]]} {[DQ [VarSub dir][LIT_CHARS /b.txt]]})]]}) ) ) (Com {[LIT_CHARS run_suite]} {[DQ [LIT_CHARS "Tests for Bash utilities"]]}) )