|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
use strict; |
|
|
|
|
|
my $limits = getlimits (); |
|
|
my $UINTMAX_OFLOW = $limits->{UINTMAX_OFLOW}; |
|
|
|
|
|
(my $program_name = $0) =~ s|.*/||; |
|
|
my $prog = 'expand'; |
|
|
|
|
|
# Turn off localization of executable's output. |
|
|
@ENV{qw(LANGUAGE LANG LC_ALL)} = ('C') x 3; |
|
|
|
|
|
my @Tests = |
|
|
( |
|
|
['t1', '--tabs=3', {IN=>"a\tb"}, {OUT=>"a b"}], |
|
|
['t2', '--tabs=3,6,9', {IN=>"a\tb\tc\td\te"}, {OUT=>"a b c d e"}], |
|
|
['t3', '--tabs="3 6 9"', {IN=>"a\tb\tc\td\te"}, {OUT=>"a b c d e"}], |
|
|
# Leading space/commas are silently ignored; Mixing space/commas is allowed. |
|
|
|
|
|
['t4', '--tabs=", 3,6 9"', {IN=>"a\tb\tc\td\te"}, {OUT=>"a b c d e"}], |
|
|
|
|
|
['t5', '--tabs=""', {IN=>"a\tb\tc"}, {OUT=>"a b c"}], |
|
|
['t6', '--tabs=","', {IN=>"a\tb\tc"}, {OUT=>"a b c"}], |
|
|
['t7', '--tabs=" "', {IN=>"a\tb\tc"}, {OUT=>"a b c"}], |
|
|
['t8', '--tabs="/"', {IN=>"a\tb\tc"}, {OUT=>"a b c"}], |
|
|
|
|
|
|
|
|
['if', '--tabs=6,9', {IN=>"a\tbbbbbbbbbbbbb\tc"}, |
|
|
{OUT=>"a bbbbbbbbbbbbb c"}], |
|
|
|
|
|
['i1', '--tabs=3 -i', {IN=>"\ta\tb"}, {OUT=>" a\tb"}], |
|
|
['i2', '--tabs=3 -i', {IN=>" \ta\tb"}, {OUT=>" a\tb"}], |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
['u1', '-3', {IN=>"a\tb\tc"}, {OUT=>"a b c"}], |
|
|
['u2', '-4 -9', {IN=>"a\tb\tc"}, {OUT=>"a b c"}], |
|
|
['u3', '-11', {IN=>"a\tb\tc"}, {OUT=>"a b c"}], |
|
|
|
|
|
['u4', '-2 -6', {IN=>"a\tb\tc"}, {OUT=>"a b c"}], |
|
|
['u5', '-7', {IN=>"a\tb"}, {OUT=>"a b"}], |
|
|
['u6', '-8', {IN=>"a\tb"}, {OUT=>"a b"}], |
|
|
|
|
|
['u7', '-3,9', {IN=>"a\tb\tc"}, {OUT=>"a b c"}], |
|
|
|
|
|
|
|
|
['f1', '--tabs=4', |
|
|
{IN=>{"in1" => "a\tb\n"}}, {IN=>{"in2" => "c\td\n"}}, |
|
|
{OUT=>"a b\nc d\n"}], |
|
|
|
|
|
['f2', '--tabs=4', |
|
|
{IN=>{"in1" => ""}}, {IN=>{"in2" => "c\td\n"}}, |
|
|
{OUT=>"c d\n"}], |
|
|
|
|
|
['f3', '--tabs=4', |
|
|
{IN=>{"in1" => "a\tb\n"}}, {IN=>{"in2" => ""}}, |
|
|
{OUT=>"a b\n"}], |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
['b1','', {IN=>"aaa\b\b\bc\td\n"}, {OUT=>"aaa\b\b\bc d\n"}], |
|
|
|
|
|
|
|
|
['b2','', {IN=>"\bc\td"}, {OUT=>"\bc d"}], |
|
|
|
|
|
|
|
|
|
|
|
['b3','--tabs 2,4,6,10', |
|
|
{IN=>"1\t2\t3\t4\t5\n" . |
|
|
"a\tb\tc\td\te\n"}, |
|
|
{OUT=>"1 2 3 4 5\n" . |
|
|
"a b c d e\n"}], |
|
|
|
|
|
|
|
|
['b4','--tabs 2,4,6,10', |
|
|
{IN=>"1\t2\t3\t4\t5\n" . |
|
|
"a\tbHELLO\b\b\b\b\b\tc\td\te\n"}, |
|
|
{OUT=>"1 2 3 4 5\n" . |
|
|
"a bHELLO\b\b\b\b\b c d e\n"}], |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
['b5','--tabs 2,4,6,10', |
|
|
{IN=>"1\t2\t3\t4\t5\n" . |
|
|
"a\tbHELLO\b\b\b\tc\td\te\n"}, |
|
|
{OUT=>"1 2 3 4 5\n" . |
|
|
"a bHELLO\b\b\b c d e\n"}], |
|
|
|
|
|
|
|
|
|
|
|
['trail1', '--tabs=1,/5', {IN=>"\ta\tb\tc"}, {OUT=>" a b c"}], |
|
|
['trail2', '--tabs=2,/5', {IN=>"\ta\tb\tc"}, {OUT=>" a b c"}], |
|
|
['trail3', '--tabs=1,2,/5', {IN=>"\ta\tb\tc"}, {OUT=>" a b c"}], |
|
|
['trail4', '--tabs=/5', {IN=>"\ta\tb"}, {OUT=>" a b"}], |
|
|
['trail5', '--tabs=//5', {IN=>"\ta\tb"}, {OUT=>" a b"}], |
|
|
['trail5a','--tabs=+/5', {IN=>"\ta\tb"}, {OUT=>" a b"}], |
|
|
['trail6', '--tabs=/,/5', {IN=>"\ta\tb"}, {OUT=>" a b"}], |
|
|
['trail7', '--tabs=,/5', {IN=>"\ta\tb"}, {OUT=>" a b"}], |
|
|
['trail8', '--tabs=1 -t/5', {IN=>"\ta\tb\tc"}, {OUT=>" a b c"}], |
|
|
['trail9', '--tab=1,2 -t/5',{IN=>"\ta\tb\tc"}, {OUT=>" a b c"}], |
|
|
|
|
|
|
|
|
|
|
|
['incre0', '--tab=1,+5', {IN=>"+\t\ta\tb"}, {OUT=>"+ a b"}], |
|
|
['incre1', '--tabs=1,+5', {IN=>"\ta\tb\tc"}, {OUT=>" a b c"}], |
|
|
['incre2', '--tabs=2,+5', {IN=>"\ta\tb\tc"}, {OUT=>" a b c"}], |
|
|
['incre3', '--tabs=1,2,+5', {IN=>"\ta\tb\tc"}, {OUT=>" a b c"}], |
|
|
['incre4', '--tabs=+5', {IN=>"\ta\tb"}, {OUT=>" a b"}], |
|
|
['incre5', '--tabs=++5', {IN=>"\ta\tb"}, {OUT=>" a b"}], |
|
|
['incre5a','--tabs=/+5', {IN=>"\ta\tb"}, {OUT=>" a b"}], |
|
|
['incre6', '--tabs=+,+5', {IN=>"\ta\tb"}, {OUT=>" a b"}], |
|
|
['incre7', '--tabs=,+5', {IN=>"\ta\tb"}, {OUT=>" a b"}], |
|
|
['incre8', '--tabs=1 -t+5', {IN=>"\ta\tb\tc"}, {OUT=>" a b c"}], |
|
|
['incre9', '--tab=1,2 -t+5',{IN=>"\ta\tb\tc"}, {OUT=>" a b c"}], |
|
|
|
|
|
|
|
|
|
|
|
['e1', '--tabs="a"', {IN=>''}, {OUT=>''}, {EXIT=>1}, |
|
|
{ERR => "$prog: tab size contains invalid character(s): 'a'\n"}], |
|
|
['e2', "-t $UINTMAX_OFLOW", {IN=>''}, {OUT=>''}, {EXIT=>1}, |
|
|
{ERR => "$prog: tab stop is too large '$UINTMAX_OFLOW'\n"}], |
|
|
['e3', '--tabs=0', {IN=>''}, {OUT=>''}, {EXIT=>1}, |
|
|
{ERR => "$prog: tab size cannot be 0\n"}], |
|
|
['e4', '--tabs=3,3', {IN=>''}, {OUT=>''}, {EXIT=>1}, |
|
|
{ERR => "$prog: tab sizes must be ascending\n"}], |
|
|
['e5', '--tabs=/3,6,8', {IN=>''}, {OUT=>''}, {EXIT=>1}, |
|
|
{ERR => "$prog: '/' specifier only allowed with the last value\n"}], |
|
|
['e6', '-t/3 -t/6', {IN=>''}, {OUT=>''}, {EXIT=>1}, |
|
|
{ERR => "$prog: '/' specifier only allowed with the last value\n"}], |
|
|
['e7', '--tabs=3/', {IN=>''}, {OUT=>''}, {EXIT=>1}, |
|
|
{ERR => "$prog: '/' specifier not at start of number: '/'\n"}], |
|
|
); |
|
|
|
|
|
my $save_temps = $ENV{DEBUG}; |
|
|
my $verbose = $ENV{VERBOSE}; |
|
|
|
|
|
my $fail = run_tests ($program_name, $prog, \@Tests, $save_temps, $verbose); |
|
|
exit $fail; |
|
|
|