#!/bin/rcecho T.sub: tests of sub and gsub code# input lines are of form# pattern replacement input-string sub-output gsub-outputawk 'BEGIN { FS = "\t" awk = ENVIRON["awk"]}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)}#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 axa$ 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 xya &x&y a axay axay aa axaya axayaxaya* 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&ya+ x& paq pxaq pxaq x\& paq px&q px&q x&y paq pxayq pxayq x\&y paq px&yq px&yqaa* 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 zxzxzxr+y q xy xy xy xry q q xrry q q xryWxry qWxry qWqxr?y q AxyB AqB AqB AxryB AqB AqB Axrry Axrry Axrrya?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!!!!
#!/bin/rc
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 = ENVIRON["awk"]
}
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)
}
#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
!!!!