Ok, I've converted the contents of the "testing/sed" directory into a

sed.tests file.  My brain hurts now.  (Lots of boggling at sed minutiae and 
corner cases and going "why is gnu giving that output".  The behavior of N 
and n with regard to EOF are only understandable if you read the Open Group 
spec, not if you read the sed info page, by the way...)

Some of the existing sed tests are just nuts.  For example, sed-next-line is 
testing for our behavior (which is wrong), and would fail if run against gnu 
sed (which was getting it right.  Again, this was a spec-boggling moment, 
with much head scratching.  I've got to add a debug mode where the stuff 
output by the p command is a different color from the stuff output by normal 
end of script printing (when not suppressed by -n).)

As for sed-handles-unsatisifed-backrefs: what is this test trying to _do_?  I 
ran it against gnu sed and got an error message, and this behavior sounds 
perfectly reasonable.  (It _is_ an unsatisfied backref.)  The fact we 
currently ignore this case (and treat \1 as an empty string) isn't really 
behavior we should have a test depend on for success.

The remaining one is sed-aic-commands, which is long and complicated.  I'm
trying to figure out if I should chop this into a number of smaller tests, or
if having one big "does-many-things" test is a good idea.

In any case, the _next_ step is to go through the Open Group standard and
make tests for every case not yet covered.  (And there are plenty.  There
are few comments in the file already.)  Plus I have notes about corner
cases from development that I need to collate and put into here.  This file
is maybe the first 1/3 of a truly comprehensive sed test.

Rob
This commit is contained in:
Rob Landley 2005-11-10 06:26:40 +00:00
parent ecfd1f6a35
commit 990025a7d9
23 changed files with 109 additions and 276 deletions

109
testsuite/sed.tests Executable file
View File

@ -0,0 +1,109 @@
#!/bin/sh
# SUSv3 compliant sed tests.
# Copyright 2005 by Rob Landley <rob@landley.net>
# Licensed under GPL v2, see file LICENSE for details.
[ -z "$COMMAND" ] && COMMAND=sed
. testing.sh
# testing "description" "arguments" "result" "infile" "stdin"
# Corner cases
testing "sed as cat" '"" -' "hello\n" "" "hello\n"
testing "sed handles empty lines" "-e 's/\$/@/'" "@\n" "" "\n"
# no files (stdin)
# explicit stdin
# mix files and stdin (various orders)
# list stdin twice
# Trailing EOF.
# Multiple files: first no EOF, second length 0.
# Match $, at end of each file or all files?
# First no EOF, second no matches at all.
# -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
# command list
testing "sed accepts blanks before command" "-e '1 d'" "" "" ""
testing "sed accepts newlines in -e" "-e 'i\
1
a\
3'" "1\n2\n3\n" "" "2\n"
testing "sed accepts multiple -e" "-e 'i\' -e '1' -e 'a\' -e '3'" \
"1\n2\n3\n" "" "2\n"
# substitutions
testing "sed -n" "-n -e s/foo/bar/ -e s/bar/baz/" "" "" "foo\n"
testing "sed s//p" "-e s/foo/bar/p -e s/bar/baz/p" "bar\nbaz\nbaz\n" \
"" "foo\n"
testing "sed -n s//p" "-ne s/abc/def/p" "def\n" "" "abc\n"
testing "sed s//g (exhaustive)" "-e 's/[[:space:]]*/,/g'" ",1,2,3,4,5,\n" \
"" "12345\n"
testing "sed s arbitrary delimiter" "-e 's woo boing '" "boing\n" "" "woo\n"
testing "sed s chains" "-e s/foo/bar/ -e s/bar/baz/" "baz\n" "" "foo\n"
testing "sed s chains2" "-e s/foo/bar/ -e s/baz/nee/" "bar\n" "" "foo\n"
testing "sed s [delimiter]" "-e 's@[@]@@'" "onetwo" "" "one@two"
# branch
testing "sed b (branch)" "-e 'b one;p;: one'" "foo\n" "" "foo\n"
testing "sed b (branch with no label jumps to end)" "-e 'b;p'" \
"foo\n" "" "foo\n"
# test and branch
testing "sed t (test/branch)" "-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)" "-e 's/a/b/;:loop;t loop'" \
"b\nb\nc\n" "" "a\nb\nc\n"
testing "sed T (!test/branch)" "-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)" "-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)" "-e 'N;p'" \
"a\nb\na\nb\nc\n" "" "a\nb\nc\n"
testing "sed address match newline" '"/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)" \
"-n 'N;P;p'" "a\na\nb\n" "" "a\nb\nc\n"
# Hold space
testing "sed G (append hold space to pattern space)" '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" \
"-e '/ook/d;s/ook/ping/p;i woot'" "" "" "ook\n"
testing "sed d ends script iteration (2)" \
"-e '/ook/d;a\' -e 'bang'" "woot\nbang\n" "" "ook\nwoot\n"
# Ponder this a bit more, why "woo not found" from gnu version?
#testing "sed doesn't substitute in deleted line" \
# "-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

View File

@ -1 +0,0 @@
busybox sed -e '1 d' </dev/null

View File

@ -1,134 +0,0 @@
cat - >input <<EOF
2i\\
before 2
5c\\
Change 5
10a\\
After 10
22i\\
before 22\\
Continued
25c\\
Change 25\\
Continued
20a\\
After 20\\
Continued
32i\\
before 32\\
Continued 1\\
Continued 2\\
Continued 3
35c\\
Change 35\\
Continued 1\\
Continued 2\\
Continued 3
30a\\
After 30\\
Continued 1\\
Continued 2\\
Continued 3
EOF
busybox sed -f input >output <<EOF
1 y
2 y
3 y
4 y
5 y
6 y
7 y
8 y
9 y
10 y
11 y
12 y
13 y
14 y
15 y
16 y
17 y
18 y
19 y
20 y
21 y
22 y
23 y
24 y
25 y
26 y
27 y
28 y
29 y
30 y
31 y
32 y
33 y
34 y
35 y
36 y
37 y
38 y
39 y
40 y
EOF
cmp -s output - <<EOF
1 y
before 2
2 y
3 y
4 y
Change 5
6 y
7 y
8 y
9 y
10 y
After 10
11 y
12 y
13 y
14 y
15 y
16 y
17 y
18 y
19 y
20 y
After 20
Continued
21 y
before 22
Continued
22 y
23 y
24 y
Change 25
Continued
26 y
27 y
28 y
29 y
30 y
After 30
Continued 1
Continued 2
Continued 3
31 y
before 32
Continued 1
Continued 2
Continued 3
32 y
33 y
34 y
Change 35
Continued 1
Continued 2
Continued 3
36 y
37 y
38 y
39 y
40 y
EOF

View File

@ -1,13 +0,0 @@
busybox sed 'G'>output <<EOF
a
b
c
EOF
cmp -s output - <<EOF
a
b
c
EOF

View File

@ -1,19 +0,0 @@
# This will fail if CONFIG_FEATURE_SED_GNU_COMPATABILITY is defined
busybox sed 'N;p'>output <<EOF
a
b
c
EOF
set +e
cmp -s output - <<EOF
a
b
a
b
c
EOF
if [ $? != 0 ] ; then
exit 0;
fi
exit 1;

View File

@ -1 +0,0 @@
test "$(echo foo | busybox sed 'b one;p;: one')" = foo

View File

@ -1,15 +0,0 @@
busybox sed 's/a/1/;t one;p;: one;p'>output <<EOF
a
b
c
EOF
cmp -s output - <<EOF
1
1
b
b
b
c
c
c
EOF

View File

@ -1,14 +0,0 @@
busybox sed 's/a/1/;T notone;p;: notone;p'>output <<EOF
a
b
c
EOF
cmp -s output - <<EOF
1
1
1
b
b
c
c
EOF

View File

@ -1,11 +0,0 @@
#XFAIL
busybox sed 's/a/b/;:loop;t loop'>output <<EOF
a
b
c
EOF
cmp -s output - <<EOF
b
b
c
EOF

View File

@ -1 +0,0 @@
test "$(echo foo | busybox sed 'b;p')" = foo

View File

@ -1 +0,0 @@
test "$(echo foo | busybox sed -e s/foo/bar/ -e s/bar/baz/)" = baz

View File

@ -1 +0,0 @@
test x"$(echo foo | busybox -n sed -e s/foo/bar/ -e s/foo/baz/)" = x

View File

@ -1,2 +0,0 @@
echo foo | busybox sed -e /foo/d -e s/foo/bar/ >foo
cmp foo /dev/null

View File

@ -1 +0,0 @@
test "$(echo fu/bar | busybox sed -e 's/[/]//')" = fubar

View File

@ -1 +0,0 @@
test `echo | busybox sed -e 's/$/@/'` = @

View File

@ -1,6 +0,0 @@
busybox sed -e 's/.*root=/\1/' >output <<EOF
BOOT_IMAGE=vmlinuz root=/dev/hda5 initrd=init1
EOF
cmp -s output - <<EOF
/dev/hda5 initrd=init1
EOF

View File

@ -1,12 +0,0 @@
busybox sed 'n;p'>output <<EOF
a
b
c
EOF
cmp -s output - <<EOF
a
b
b
c
c
EOF

View File

@ -1,4 +0,0 @@
busybox sed -e s/1/2/g -e s/3/4/g >output <<EOF
1
EOF
echo 2 | cmp -s output -

View File

@ -1 +0,0 @@
test "`echo '12345' | busybox sed -e 's/[[:space:]]*/,/g')` = ',1,2,3,4,5,'"

View File

@ -1,10 +0,0 @@
# FEATURE: CONFIG_FEATURE_SED_EMBEDED_NEWLINE
busybox sed -n 'N;/a\nb/p'>output <<EOF
a
b
c
EOF
cmp -s output - <<EOF
a
b
EOF

View File

@ -1,9 +0,0 @@
echo 2 | busybox sed -e 'i\
1
a\
3' > output
cmp output - <<EOF
1
2
3
EOF

View File

@ -1,9 +0,0 @@
busybox sed 's/foo/bar/p'>output <<EOF
foo
bar
EOF
cmp -s output - <<EOF
bar
bar
bar
EOF

View File

@ -1,10 +0,0 @@
busybox sed -n 'N;P;p'>output <<EOF
a
b
c
EOF
cmp -s output - <<EOF
a
a
b
EOF