4bb1b04fd1
$COMMAND environment variable, instead put full command line (including command to run) in second argument. Modify $PATH to have test versions of commands at start of path. (Also more infrastructure for testing as root, work in progress...)
186 lines
6.7 KiB
Bash
Executable File
186 lines
6.7 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
# SUSv3 compliant sed tests.
|
|
# Copyright 2005 by Rob Landley <rob@landley.net>
|
|
# Licensed under GPL v2, see file LICENSE for details.
|
|
|
|
. testing.sh
|
|
|
|
# testing "description" "arguments" "result" "infile" "stdin"
|
|
|
|
# Corner cases
|
|
testing "sed no files (stdin)" 'sed ""' "hello\n" "" "hello\n"
|
|
testing "sed explicit stdin" 'sed "" -' "hello\n" "" "hello\n"
|
|
testing "sed handles empty lines" "sed -e 's/\$/@/'" "@\n" "" "\n"
|
|
testing "sed stdin twice" 'sed "" - -' "hello" "" "hello"
|
|
|
|
# Trailing EOF.
|
|
# Match $, at end of each file or all files?
|
|
|
|
# -e corner cases
|
|
# without -e
|
|
# multiple -e
|
|
# interact with a
|
|
# -eee arg1 arg2 arg3
|
|
# -f corner cases
|
|
# -e -f -e
|
|
# -n corner cases
|
|
# no newline at EOF?
|
|
# -r corner cases
|
|
# Just make sure it works.
|
|
# -i corner cases:
|
|
# sed -i -
|
|
# permissions
|
|
# -i on a symlink
|
|
# on a directory
|
|
# With $ last-line test
|
|
# Continue with \
|
|
# End of script with trailing \
|
|
|
|
# command list
|
|
testing "sed accepts blanks before command" "sed -e '1 d'" "" "" ""
|
|
testing "sed accepts newlines in -e" "sed -e 'i\
|
|
1
|
|
a\
|
|
3'" "1\n2\n3\n" "" "2\n"
|
|
testing "sed accepts multiple -e" "sed -e 'i\' -e '1' -e 'a\' -e '3'" \
|
|
"1\n2\n3\n" "" "2\n"
|
|
|
|
# substitutions
|
|
testing "sed -n" "sed -n -e s/foo/bar/ -e s/bar/baz/" "" "" "foo\n"
|
|
testing "sed s//p" "sed -e s/foo/bar/p -e s/bar/baz/p" "bar\nbaz\nbaz\n" \
|
|
"" "foo\n"
|
|
testing "sed -n s//p" "sed -ne s/abc/def/p" "def\n" "" "abc\n"
|
|
testing "sed s//g (exhaustive)" "sed -e 's/[[:space:]]*/,/g'" ",1,2,3,4,5,\n" \
|
|
"" "12345\n"
|
|
testing "sed s arbitrary delimiter" "sed -e 's woo boing '" "boing\n" "" "woo\n"
|
|
testing "sed s chains" "sed -e s/foo/bar/ -e s/bar/baz/" "baz\n" "" "foo\n"
|
|
testing "sed s chains2" "sed -e s/foo/bar/ -e s/baz/nee/" "bar\n" "" "foo\n"
|
|
testing "sed s [delimiter]" "sed -e 's@[@]@@'" "onetwo" "" "one@two"
|
|
|
|
# branch
|
|
testing "sed b (branch)" "sed -e 'b one;p;: one'" "foo\n" "" "foo\n"
|
|
testing "sed b (branch with no label jumps to end)" "sed -e 'b;p'" \
|
|
"foo\n" "" "foo\n"
|
|
|
|
# test and branch
|
|
testing "sed t (test/branch)" "sed -e 's/a/1/;t one;p;: one;p'" \
|
|
"1\n1\nb\nb\nb\nc\nc\nc\n" "" "a\nb\nc\n"
|
|
testing "sed t (test/branch clears test bit)" "sed -e 's/a/b/;:loop;t loop'" \
|
|
"b\nb\nc\n" "" "a\nb\nc\n"
|
|
testing "sed T (!test/branch)" "sed -e 's/a/1/;T notone;p;: notone;p'" \
|
|
"1\n1\n1\nb\nb\nc\nc\n" "" "a\nb\nc\n"
|
|
|
|
# Normal sed end-of-script doesn't print "c" because n flushed the pattern
|
|
# space. If n hits EOF, pattern space is empty when script ends.
|
|
# Query: how does this interact with no newline at EOF?
|
|
testing "sed n (flushes pattern space, terminates early)" "sed -e 'n;p'" \
|
|
"a\nb\nb\nc\n" "" "a\nb\nc\n"
|
|
# N does _not_ flush pattern space, therefore c is still in there @ script end.
|
|
testing "sed N (doesn't flush pattern space when terminating)" "sed -e 'N;p'" \
|
|
"a\nb\na\nb\nc\n" "" "a\nb\nc\n"
|
|
testing "sed address match newline" 'sed "/b/N;/b\\nc/i woo"' \
|
|
"a\nwoo\nb\nc\nd\n" "" "a\nb\nc\nd\n"
|
|
|
|
# Multiple lines in pattern space
|
|
testing "sed N (stops at end of input) and P (prints to first newline only)" \
|
|
"sed -n 'N;P;p'" "a\na\nb\n" "" "a\nb\nc\n"
|
|
|
|
# Hold space
|
|
testing "sed G (append hold space to pattern space)" 'sed G' "a\n\nb\n\nc\n\n" \
|
|
"" "a\nb\nc\n"
|
|
#testing "sed g/G (swap/append hold and patter space)"
|
|
#testing "sed g (swap hold/pattern space)"
|
|
|
|
testing "sed d ends script iteration" \
|
|
"sed -e '/ook/d;s/ook/ping/p;i woot'" "" "" "ook\n"
|
|
testing "sed d ends script iteration (2)" \
|
|
"sed -e '/ook/d;a\' -e 'bang'" "woot\nbang\n" "" "ook\nwoot\n"
|
|
|
|
# Multiple files, with varying newlines and NUL bytes
|
|
testing "sed embedded NUL" "sed -e 's/woo/bang/'" "\0bang\0woo\0" "" \
|
|
"\0woo\0woo\0"
|
|
testing "sed embedded NUL g" "sed -e 's/woo/bang/g'" "bang\0bang\0" "" \
|
|
"woo\0woo\0"
|
|
echo -e "/woo/a he\0llo" > sed.commands
|
|
testing "sed NUL in command" "sed -f sed.commands" "woo\nhe\0llo\n" "" "woo"
|
|
rm sed.commands
|
|
|
|
# sed has funky behavior with newlines at the end of file. Test lots of
|
|
# corner cases with the optional newline appending behavior.
|
|
|
|
testing "sed normal newlines" "sed -e 's/woo/bang/' input -" "bang\nbang\n" \
|
|
"woo\n" "woo\n"
|
|
testing "sed leave off trailing newline" "sed -e 's/woo/bang/' input -" \
|
|
"bang\nbang" "woo\n" "woo"
|
|
testing "sed autoinsert newline" "sed -e 's/woo/bang/' input -" "bang\nbang" \
|
|
"woo" "woo"
|
|
testing "sed empty file plus cat" "sed -e 's/nohit//' input -" "one\ntwo" \
|
|
"" "one\ntwo"
|
|
testing "sed cat plus empty file" "sed -e 's/nohit//' input -" "one\ntwo" \
|
|
"one\ntwo" ""
|
|
testing "sed append autoinserts newline" "sed -e '/woot/a woo' -" \
|
|
"woot\nwoo\n" "" "woot"
|
|
testing "sed insert doesn't autoinsert newline" "sed -e '/woot/i woo' -" \
|
|
"woo\nwoot" "" "woot"
|
|
testing "sed print autoinsert newlines" "sed -e 'p' -" "one\none" "" "one"
|
|
testing "sed print autoinsert newlines two files" "sed -e 'p' input -" \
|
|
"one\none\ntwo\ntwo" "one" "two"
|
|
testing "sed noprint, no match, no newline" "sed -ne 's/woo/bang/' input" \
|
|
"" "no\n" ""
|
|
testing "sed selective matches with one nl" "sed -ne 's/woo/bang/p' input -" \
|
|
"a bang\nc bang\n" "a woo\nb no" "c woo\nd no"
|
|
testing "sed selective matches insert newline" \
|
|
"sed -ne 's/woo/bang/p' input -" "a bang\nb bang\nd bang" \
|
|
"a woo\nb woo" "c no\nd woo"
|
|
testing "sed selective matches noinsert newline" \
|
|
"sed -ne 's/woo/bang/p' input -" "a bang\nb bang" "a woo\nb woo" \
|
|
"c no\nd no"
|
|
testing "sed clusternewline" \
|
|
"sed -e '/one/a 111' -e '/two/i 222' -e p input -" \
|
|
"one\none\n111\n222\ntwo\ntwo" "one" "two"
|
|
|
|
# Test end-of-file matching behavior
|
|
|
|
testing "sed match EOF" "sed -e '"'$p'"'" "hello\nthere\nthere" "" \
|
|
"hello\nthere"
|
|
testing "sed match EOF two files" "sed -e '"'$p'"' input -" \
|
|
"one\ntwo\nthree\nfour\nfour" "one\ntwo" "three\nfour"
|
|
echo -ne "three\nfour" > input2
|
|
testing "sed match EOF inline" \
|
|
"sed -e '"'$i ook'"' -i input input2 && cat input input2" \
|
|
"one\nook\ntwothree\nook\nfour" "one\ntwo" ""
|
|
rm input2
|
|
|
|
# Test lie-to-autoconf
|
|
|
|
testing "sed lie-to-autoconf" "sed --version | grep -o 'GNU sed version '" \
|
|
"GNU sed version \n" "" ""
|
|
|
|
# Jump to nonexistent label
|
|
testing "sed nonexistent label" "sed -e 'b walrus' 2> /dev/null || echo yes" \
|
|
"yes\n" "" ""
|
|
|
|
testing "sed backref from empty s uses range regex" \
|
|
"sed -e '/woot/s//eep \0 eep/'" "eep woot eep" "" "woot"
|
|
|
|
testing "sed backref from empty s uses range regex with newline" \
|
|
"sed -e '/woot/s//eep \0 eep/'" "eep woot eep\n" "" "woot\n"
|
|
|
|
# -i with no filename
|
|
|
|
touch ./- # Detect gnu failure mode here.
|
|
testing "sed -i with no arg [GNUFAIL]" "sed -e '' -i 2> /dev/null || echo yes" \
|
|
"yes\n" "" ""
|
|
rm ./- # Clean up
|
|
|
|
# Ponder this a bit more, why "woo not found" from gnu version?
|
|
#testing "sed doesn't substitute in deleted line" \
|
|
# "sed -e '/ook/d;s/ook//;t woo;a bang;'" "bang" "" "ook\n"
|
|
|
|
# This makes both seds very unhappy. Why?
|
|
#testing "sed -g (exhaustive)" "sed -e 's/[[:space:]]*/,/g'" ",1,2,3,4,5," \
|
|
# "" "12345"
|
|
|
|
exit $FAILCOUNT
|