94527da10c28c750debab694ae77dbdd6e686710
[platform/upstream/coreutils.git] / tests / expr / basic
1 #!/bin/sh
2 # -*-perl-*-
3
4 : ${PERL=perl}
5 : ${srcdir=.}
6
7 $PERL -e 1 > /dev/null 2>&1 || {
8   echo 1>&2 "$0: configure didn't find a usable version of Perl," \
9     "so can't run this test"
10   exit 77
11 }
12
13 d=$srcdir/..
14 exec $PERL -w -I$d -MCoreutils -- - << \EOF
15 require 5.003;
16 use strict;
17
18 (my $program_name = $0) =~ s|.*/||;
19
20 # Turn off localisation of executable's ouput.
21 @ENV{qw(LANGUAGE LANG LC_ALL)} = ('C') x 3;
22
23 my $prog = $ENV{PROG} || die "$0: \$PROG not specified in environment\n";
24
25 my @Tests =
26     (
27      ['a', '5 + 6', {OUT => '11'}],
28      ['b', '5 - 6', {OUT => '-1'}],
29      ['c', '5 \* 6', {OUT => '30'}],
30      ['d', '100 / 6', {OUT => '16'}],
31      ['e', '100 % 6', {OUT => '4'}],
32      ['f', '3 + -2', {OUT => '1'}],
33      ['g', '-2 + -2', {OUT => '-4'}],
34
35      ['paren1', '\( 100 % 6 \)', {OUT => '4'}],
36      ['paren2', '\( 100 % 6 \) - 8', {OUT => '-4'}],
37      ['paren3', '9 / \( 100 % 6 \) - 8', {OUT => '-6'}],
38      ['paren4', '9 / \( \( 100 % 6 \) - 8 \)', {OUT => '-2'}],
39      ['paren5', '9 + \( 100 % 6 \)', {OUT => '13'}],
40
41      # Before 2.0.12, this would output `1'.
42      ['0bang', '00 \< 0!', {OUT => '0'}, {EXIT => 1}],
43
44      # In 5.1.3 and earlier, these would exit with status 0.
45      ['00', '00', {OUT => '00'}, {EXIT => 1}],
46      ['minus0', '-0', {OUT => '-0'}, {EXIT => 1}],
47
48      # In 5.1.3 and earlier, these would report errors.
49      ['andand', '0 \& 1 / 0', {OUT => '0'}, {EXIT => 1}],
50      ['oror', '1 \| 1 / 0', {OUT => '1'}, {EXIT => 0}],
51
52      # In 5.1.3 and earlier, this would output the empty string.
53      ['orempty', '"" \| ""', {OUT => '0'}, {EXIT => 1}],
54
55      # This evoked a syntax error diagnostic before 2.0.12.
56      ['minus2', '-- 2 + 2', {OUT => '4'}],
57
58      # This erroneously succeeded and output `3' before 2.0.12.
59      ['fail-a', '3 + -', {ERR => "$prog: non-numeric argument\n"},
60       {EXIT => 2}],
61
62      # This erroneously succeeded before 5.3.1.
63      ['bigcmp', '-- -2417851639229258349412352 \< 2417851639229258349412352',
64       {OUT => '1'}, {EXIT => 0}],
65
66      # In 5.94 and earlier, anchors incorrectly matched newlines.
67      ['anchor', "'a\nb' : 'a\$'", {OUT => '0'}, {EXIT => 1}],
68
69      # These tests are taken from grep/tests/bre.tests.
70      ['bre1', '"abc" : "a\\(b\\)c"', {OUT => 'b'}],
71      ['bre2', '"a(" : "a("', {OUT => '2'}],
72      ['bre3', '_ : "a\\("',
73       {ERR => "$prog: Unmatched ( or \\(\n"}, {EXIT => 2}],
74      ['bre4', '_ : "a\\(b"',
75       {ERR => "$prog: Unmatched ( or \\(\n"}, {EXIT => 2}],
76      ['bre5', '"a(b" : "a(b"', {OUT => '3'}],
77      ['bre6', '"a)" : "a)"', {OUT => '2'}],
78      ['bre7', '_ : "a\\)"',
79       {ERR => "$prog: Unmatched ) or \\)\n"}, {EXIT => 2}],
80      ['bre8', '_ : "\\)"',
81       {ERR => "$prog: Unmatched ) or \\)\n"}, {EXIT => 2}],
82      ['bre9', '"ab" : "a\\(\\)b"', {OUT => ''}, {EXIT => 1}],
83      ['bre10', '"a^b" : "a^b"', {OUT => '3'}],
84      ['bre11', '"a\$b" : "a\$b"', {OUT => '3'}],
85      ['bre12', '"" : "\\($\\)\\(^\\)"', {OUT => ''}, {EXIT => 1}],
86      ['bre13', '"b" : "a*\\(^b\$\\)c*"', {OUT => 'b'}],
87      ['bre14', '"X|" : "X\\(|\\)" : "(" "X|" : "X\\(|\\)" ")"', {OUT => '1'}],
88      ['bre15', '"X*" : "X\\(*\\)" : "(" "X*" : "X\\(*\\)" ")"', {OUT => '1'}],
89      ['bre16', '"abc" : "\\(\\)"', {OUT => ''}, {EXIT => 1}],
90      ['bre17', '"{1}a" : "\\(\\{1\\}a\\)"', {OUT => '{1}a'}],
91      ['bre18', '"X*" : "X\\(*\\)" : "^*"', {OUT => '1'}],
92      ['bre19', '"{1}" : "^\\{1\\}"', {OUT => '3'}],
93      ['bre20', '"{" : "{"', {OUT => '1'}],
94      ['bre21', '"abbcbd" : "a\\(b*\\)c\\1d"', {OUT => ''}, {EXIT => 1}],
95      ['bre22', '"abbcbbbd" : "a\\(b*\\)c\\1d"', {OUT => ''}, {EXIT => 1}],
96      ['bre23', '"abc" : "\\(.\\)\\1"', {OUT => ''}, {EXIT => 1}],
97      ['bre24', '"abbccd" : "a\\(\\([bc]\\)\\2\\)*d"', {OUT => 'cc'}],
98      ['bre25', '"abbcbd" : "a\\(\\([bc]\\)\\2\\)*d"',
99       {OUT => ''}, {EXIT => 1}],
100      ['bre26', '"abbbd" : "a\\(\\(b\\)*\\2\\)*d"', {OUT => 'bbb'}],
101      ['bre27', '"aabcd" : "\\(a\\)\\1bcd"', {OUT => 'a'}],
102      ['bre28', '"aabcd" : "\\(a\\)\\1bc*d"', {OUT => 'a'}],
103      ['bre29', '"aabd" : "\\(a\\)\\1bc*d"', {OUT => 'a'}],
104      ['bre30', '"aabcccd" : "\\(a\\)\\1bc*d"', {OUT => 'a'}],
105      ['bre31', '"aabcccd" : "\\(a\\)\\1bc*[ce]d"', {OUT => 'a'}],
106      ['bre32', '"aabcccd" : "\\(a\\)\\1b\\(c\\)*cd\$"', {OUT => 'a'}],
107      ['bre33', '"a*b" : "a\\(*\\)b"', {OUT => '*'}],
108      ['bre34', '"ab" : "a\\(**\\)b"', {OUT => ''}, {EXIT => 1}],
109      ['bre35', '"ab" : "a\\(***\\)b"', {OUT => ''}, {EXIT => 1}],
110      ['bre36', '"*a" : "*a"', {OUT => '2'}],
111      ['bre37', '"a" : "**a"', {OUT => '1'}],
112      ['bre38', '"a" : "***a"', {OUT => '1'}],
113      ['bre39', '"ab" : "a\\{1\\}b"', {OUT => '2'}],
114      ['bre40', '"ab" : "a\\{1,\\}b"', {OUT => '2'}],
115      ['bre41', '"aab" : "a\\{1,2\\}b"', {OUT => '3'}],
116      ['bre42', '_ : "a\\{1"',
117       {ERR => "$prog: Unmatched \\{\n"}, {EXIT => 2}],
118      ['bre43', '_ : "a\\{1a"',
119       {ERR => "$prog: Unmatched \\{\n"}, {EXIT => 2}],
120      ['bre44', '_ : "a\\{1a\\}"',
121       {ERR => "$prog: Invalid content of \\{\\}\n"}, {EXIT => 2}],
122      ['bre45', '"a" : "a\\{,2\\}"', {OUT => '1'}],
123      ['bre46', '"a" : "a\\{,\\}"', {OUT => '1'}],
124      ['bre47', '_ : "a\\{1,x\\}"',
125       {ERR => "$prog: Invalid content of \\{\\}\n"}, {EXIT => 2}],
126      ['bre48', '_ : "a\\{1,x"',
127       {ERR => "$prog: Unmatched \\{\n"}, {EXIT => 2}],
128      ['bre49', '_ : "a\\{32768\\}"',
129       {ERR => "$prog: Invalid content of \\{\\}\n"}, {EXIT => 2}],
130      ['bre50', '_ : "a\\{1,0\\}"',
131       {ERR => "$prog: Invalid content of \\{\\}\n"}, {EXIT => 2}],
132      ['bre51', '"acabc" : ".*ab\\{0,0\\}c"', {OUT => '2'}],
133      ['bre52', '"abcac" : "ab\\{0,1\\}c"', {OUT => '3'}],
134      ['bre53', '"abbcac" : "ab\\{0,3\\}c"', {OUT => '4'}],
135      ['bre54', '"abcac" : ".*ab\\{1,1\\}c"', {OUT => '3'}],
136      ['bre55', '"abcac" : ".*ab\\{1,3\\}c"', {OUT => '3'}],
137      ['bre56', '"abbcabc" : ".*ab\{2,2\}c"', {OUT => '4'}],
138      ['bre57', '"abbcabc" : ".*ab\{2,4\}c"', {OUT => '4'}],
139      ['bre58', '"aa" : "a\\{1\\}\\{1\\}"', {OUT => '1'}],
140      ['bre59', '"aa" : "a*\\{1\\}"', {OUT => '2'}],
141      ['bre60', '"aa" : "a\\{1\\}*"', {OUT => '2'}],
142      ['bre61', '"acd" : "a\\(b\\)?c\\1d"', {OUT => ''}, {EXIT => 1}],
143      ['bre62', '-- "-5" : "-\\{0,1\\}[0-9]*\$"', {OUT => '2'}],
144
145      ['fail-b', '9 9', {ERR => "$prog: syntax error\n"},
146       {EXIT => 2}],
147      ['fail-c', {ERR => "$prog: missing operand\n"
148                  . "Try `$prog --help' for more information.\n"},
149       {EXIT => 2}],
150     );
151
152 # Append a newline to end of each expected `OUT' string.
153 my $t;
154 foreach $t (@Tests)
155   {
156     my $arg1 = $t->[1];
157     my $e;
158     foreach $e (@$t)
159       {
160         $e->{OUT} .= "\n"
161           if ref $e eq 'HASH' and exists $e->{OUT};
162       }
163   }
164
165 my $save_temps = $ENV{SAVE_TEMPS};
166 my $verbose = $ENV{VERBOSE};
167
168 my $fail = run_tests ($program_name, $prog, \@Tests, $save_temps, $verbose);
169 exit $fail;
170 EOF