echo T.sub: tests of sub and gsub code
# input lines are of form
# pattern replacement input-string sub-output gsub-output
awk '
BEGIN {
FS = "\t"
awk = "../a.out"
}
NF == 0 { next }
$1 ~ /^#/ { next }
$1 != "" { # new pattern
pat = $1
}
$2 != "" { # new replacement
repl = $2
}
$3 != "" { # new input string
str = $3
}
$4 != "" { # new sub output
subout = $4
}
$5 != "" { # new gsub output
gsubout = $5
}
NF < 5 { # weird input line
printf("weird test spec `%s` ignored\n", $0) | "cat 1>&2"
next
}
{ # "" => explicitly empty
# printf(" %3d: %s %s %s %s %s:\n", NR, pat, repl, str, subout, gsubout)
if (pat == "\"\"") pat = ""
if (repl == "\"\"") repl = ""
if (str == "\"\"") str = ""
if (subout == "\"\"") subout = ""
if (gsubout == "\"\"") gsubout = ""
}
{ # generate a test
nt++
gsub(/\\/, "&&", repl) # in case of \ enclosed
test = sprintf("echo '"'"'%s'"'"' | %s '"'\n"'", str, awk) \
sprintf("{ temp = $0; sub(/%s/, \"%s\", temp)\n", pat, repl) \
sprintf(" if (temp != \"%s\") print \" sub %d fails:\", temp, \"should be %s in %s\"\n",
subout, nt, subout, (pat " " repl " " str " " subout)) \
sprintf(" gsub(/%s/, \"%s\")\n", pat, repl) \
sprintf(" if ($0 != \"%s\") print \"gsub %d fails:\", $0, \"should be %s in %s\"\n}",
gsubout, nt, gsubout, (pat " " repl " " str " " gsubout)) \
"'" '"'"
# if (nt >= 55) print "test is: " test
system(test)
# system("bprint -c ../a.out")
}
END { print nt, "tests" }
' <<\!!!!
a x aaa xaa xxx
axa xxa xxx
bbb bbb bbb
"" "" ""
a xy aaa xyaa xyxyxy
axa xyxa xyxxy
bbb bbb bbb
"" "" ""
. x aaa xaa xxx
axa xxa xxx
bbb xbb xxx
"" "" ""
.a x a a a
ax ax ax
aa x x
aaab xab xab
aaaa xaa xx
"" "" ""
$ x a ax ax
"" x x
.$ x "" "" ""
a x x
ab ax ax
a$ x "" "" ""
a x x
b b b
ab ab ab
^ x "" x x
a xa xa
^a$ xx a xx xx
"" "" ""
b b b
aa aa aa
^a.$ xy a a a
"" "" ""
ab xy xy
ba ba ba
^$ x "" x x
a a a
^.a x aa x x
ba x x
ab ab ab
a a a
^.*a xy "" "" ""
a xy xy
b b b
ba xy xy
^.+a xy "" "" ""
a a a
bb bb bb
ba xy xy
a &x&y a axay axay
aa axaya axayaxay
a* x "" x x
z xz xzx
az xz xzx
aza xza xzx
b xxx bxxx bxbxbxb
x& paq xpaq xpxaqx
x\& paq x&paq x&px&qx&
x&y paq xypaq xypxayqxy
x\&y paq x&ypaq x&ypx&yqx&y
a+ x& paq pxaq pxaq
x\& paq px&q px&q
x&y paq pxayq pxayq
x\&y paq px&yq px&yq
aa* x a x x
aa x x
wawa wxwa wxwx
\$ x "" "" ""
a a a
a$ ax ax
$$$ x$$ xxx
z$z$z zxz$z zxzxz
\. x "" "" ""
a a a
a. ax ax
... x.. xxx
z.z.z zxz.z zxzxz
xr+y q xy xy xy
xry q q
xrry q q
xryWxry qWxry qWq
xr?y q AxyB AqB AqB
AxryB AqB AqB
Axrry Axrry Axrry
a?b?c? x "" x x
a x x
b x x
c x x
ac x x
acc xc xx
^a?b?q x "" "" ""
q x x
a a a
aq x x
bq x x
abq x x
qab xab xab
abqabq xabq xabq
[0-9] xyz 0 xyz xyz
00 xyz0 xyzxyz
000 xyz00 xyzxyzxyz
0a xyza xyza
a0 axyz axyz
0a0 xyza0 xyzaxyz
xx xx xx
"" "" ""
^[0-9] xyz 0 xyz xyz
00 xyz0 xyz0
000 xyz00 xyz00
0a xyza xyza
a0 a0 a0
xx xx xx
"" "" ""
[0-9]$ xyz 0 xyz xyz
00 0xyz 0xyz
000 00xyz 00xyz
0a 0a 0a
a0 axyz axyz
xx xx xx
"" "" ""
[0-9]* xyz 0 xyz xyz
000 xyz xyz
0a xyza xyzaxyz
a0 xyza0 xyzaxyz
0a0 xyza0 xyzaxyz
pq xyzpq xyzpxyzqxyz
"" xyz xyz
"" <&> abc <>abc <>a<>b<>c<> fixed 2/07, we think
"" <\&> abc <&>abc <&>a<&>b<&>c<&>
"" <&&> abc <>abc <>a<>b<>c<>
"" <&> "" <> <>
d?abc <&> abc <abc> <abc>
d? <&> abc <>abc <>a<>b<>c<>
x[0-9]+y Q xy xy xy no change
x0y Q Q
x12y Q Q
x1y2 Q2 Q2
x1yax23y Qax23y QaQ
# x[0-9]?y ~ xy
# x1y
# !~ x23y
# x[[]y ~ x[y
# !~ xy
# x[[]y
# x]y
# x[^[]y ~ xay
# !~ x[y
# x[-]y ~ x-y
# !~ xy
# x+y
# x[^-]y ~ x+y
# !~ x-y
# xy
# [0\-9] ~ 0
# -
# 9
# !~ 1
# ""
# [-1] ~ -
# 1
# !~ 0
# [0-] ~ 0
# -
# !~ 1
# [^-0] ~ x
# ^
# !~ -
# 0
# ""
# [^0-] ~ x
# ^
# !~ -
# 0
# ""
# x|y ~ x
# y
# xy
# !~ a
# ""
# ^abc|xyz$ ~ abc
# abcd
# axyz
# xyz
# !~ xabc
# xyza
# ^(abc|xyz)$ ~ abc
# xyz
# !~ abcxyz
# abcx
# cxyz
# ^x\|y$ ~ x|y
# !~ xy
# ^x\\y$ ~ x\y
# !~ xy
# x\\y
# xay
# \141\142 ~ ab
# xab
# abx
# !~ a
# b
# ax
# axb
# x\056y ~ x.y
# !~ x.
# .x
# xxx
# xby because \056 is not the metacharacter .
# xcy ditto
# [\60-\62\65-6\71] ~ 0
# 1
# 2
# 5
# 6
# 9
# !~ 3
# 4
# 7
# 8
# [\60-2\65-6\71] ~ 0
# 1
# 2
# 5
# 6
# 9
# !~ 3
# 4
# 7
# 8
# [\x30-\x32\x35-6\71] ~ 0
# 1
# 2
# 5
# 6
# 9
# !~ 3
# 4
# 7
# 8
# [\x30-2\x35-6\x39] ~ 0
# 1
# 2
# 5
# 6
# 9
# !~ 3
# 4
# 7
# 8
!!!!