1# $NetBSD: t_expr.sh,v 1.7 2023/05/02 00:11:27 gutteridge Exp $ 2# 3# Copyright (c) 2007 The NetBSD Foundation, Inc. 4# All rights reserved. 5# 6# Redistribution and use in source and binary forms, with or without 7# modification, are permitted provided that the following conditions 8# are met: 9# 1. Redistributions of source code must retain the above copyright 10# notice, this list of conditions and the following disclaimer. 11# 2. Redistributions in binary form must reproduce the above copyright 12# notice, this list of conditions and the following disclaimer in the 13# documentation and/or other materials provided with the distribution. 14# 15# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 16# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 17# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 18# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 19# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25# POSSIBILITY OF SUCH DAMAGE. 26# 27 28# The first arg will get eval'd so escape any meta characters 29# The 2nd arg is an expected string/response from expr for that op. 30test_expr() { 31 echo "Expression '${1}', expecting '${2}'" 32 res=`eval expr $1 2>&1` 33 if [ "$res" != "$2" ]; then 34 atf_fail "Expected $2, got $res from expression: " \ 35 "`eval echo $1`" 36 fi 37} 38 39atf_test_case lang 40lang_head() { 41 atf_set "descr" "Test that expr(1) works with non-C LANG (PR bin/2486)" 42} 43lang_body() { 44 45 export LANG=nonexistent 46 atf_check -s exit:0 -o inline:"21\n" -e empty -x "expr 10 + 11" 47 48 export LANG=ru_RU.KOI8-R 49 atf_check -s exit:0 -o inline:"21\n" -e empty -x "expr 10 + 11" 50} 51 52atf_test_case overflow 53overflow_head() { 54 atf_set "descr" "Test overflow cases" 55} 56overflow_body() { 57 test_expr '4611686018427387904 + 4611686018427387903' \ 58 '9223372036854775807' 59 test_expr '4611686018427387904 + 4611686018427387904' \ 60 "expr: integer overflow or underflow occurred for operation '4611686018427387904 + 4611686018427387904'" 61 test_expr '4611686018427387904 - -4611686018427387904' \ 62 "expr: integer overflow or underflow occurred for operation '4611686018427387904 - -4611686018427387904'" 63 test_expr '-4611686018427387904 - 4611686018427387903' \ 64 '-9223372036854775807' 65 test_expr '-4611686018427387904 - 4611686018427387905' \ 66 "expr: integer overflow or underflow occurred for operation '-4611686018427387904 - 4611686018427387905'" 67 test_expr '-4611686018427387904 \* 1' '-4611686018427387904' 68 test_expr '-4611686018427387904 \* -1' '4611686018427387904' 69 test_expr '-4611686018427387904 \* 2' '-9223372036854775808' 70 test_expr '-4611686018427387904 \* 3' \ 71 "expr: integer overflow or underflow occurred for operation '-4611686018427387904 * 3'" 72 test_expr '-4611686018427387904 \* -2' \ 73 "expr: integer overflow or underflow occurred for operation '-4611686018427387904 * -2'" 74 test_expr '4611686018427387904 \* 1' '4611686018427387904' 75 test_expr '4611686018427387904 \* 2' \ 76 "expr: integer overflow or underflow occurred for operation '4611686018427387904 * 2'" 77 test_expr '4611686018427387904 \* 3' \ 78 "expr: integer overflow or underflow occurred for operation '4611686018427387904 * 3'" 79 test_expr '-9223372036854775808 % -1' \ 80 "expr: integer overflow or underflow occurred for operation '-9223372036854775808 % -1'" 81 test_expr '-9223372036854775808 / -1' \ 82 "expr: integer overflow or underflow occurred for operation '-9223372036854775808 / -1'" 83 test_expr '0 + -9223372036854775808' '-9223372036854775808' 84 test_expr '0 + -1' '-1' 85 test_expr '0 + 0' '0' 86 test_expr '0 + 1' '1' 87 test_expr '0 + 9223372036854775807' '9223372036854775807' 88 test_expr '-9223372036854775808 + 0' '-9223372036854775808' 89 test_expr '9223372036854775807 + 0' '9223372036854775807' 90 test_expr '4611686018427387904 \* -1' '-4611686018427387904' 91 test_expr '4611686018427387904 \* -2' '-9223372036854775808' 92 test_expr '4611686018427387904 \* -3' \ 93 "expr: integer overflow or underflow occurred for operation '4611686018427387904 * -3'" 94 test_expr '-4611686018427387904 \* -1' '4611686018427387904' 95 test_expr '-4611686018427387904 \* -2' \ 96 "expr: integer overflow or underflow occurred for operation '-4611686018427387904 * -2'" 97 test_expr '-4611686018427387904 \* -3' \ 98 "expr: integer overflow or underflow occurred for operation '-4611686018427387904 * -3'" 99 test_expr '0 \* -1' '0' 100 test_expr '0 \* 0' '0' 101 test_expr '0 \* 1' '0' 102} 103 104atf_test_case gtkmm 105gtkmm_head() { 106 atf_set "descr" "Test from gtk-- configure that cause problems on old expr" 107} 108gtkmm_body() { 109 test_expr '3 \> 3 \| 3 = 3 \& 4 \> 4 \| 3 = 3 \& 4 = 4 \& 5 \>= 5' '1' 110 test_expr '3 \> 3 \| 3 = 3 \& 4 \> 4 \| 3 = 3 \& 4 = 4 \& 5 \>= 6' '0' 111 test_expr '3 \> 3 \| 3 = 3 \& 4 \> 4 \| 3 = 3 \& 4 = 3 \& 5 \>= 5' '0' 112 test_expr '3 \> 3 \| 3 = 3 \& 4 \> 4 \| 3 = 2 \& 4 = 4 \& 5 \>= 5' '0' 113 test_expr '3 \> 2 \| 3 = 3 \& 4 \> 4 \| 3 = 3 \& 4 = 4 \& 5 \>= 6' '1' 114 test_expr '3 \> 3 \| 3 = 3 \& 4 \> 3 \| 3 = 3 \& 4 = 4 \& 5 \>= 5' '1' 115} 116 117atf_test_case colon_vs_math 118colon_vs_math_head() { 119 atf_set "descr" "Basic precendence test with the : operator vs. math" 120} 121colon_vs_math_body() { 122 test_expr '2 : 4 / 2' '0' 123 test_expr '4 : 4 % 3' '1' 124} 125 126atf_test_case arithmetic_ops 127arithmetic_ops_head() { 128 atf_set "descr" "Dangling arithemtic operator" 129} 130arithmetic_ops_body() { 131 test_expr '.java_wrapper : /' '0' 132 test_expr '4 : \*' '0' 133 test_expr '4 : +' '0' 134 test_expr '4 : -' '0' 135 test_expr '4 : /' '0' 136 test_expr '4 : %' '0' 137} 138 139atf_test_case basic_math 140basic_math_head() { 141 atf_set "descr" "Basic math test" 142} 143basic_math_body() { 144 test_expr '2 + 4 \* 5' '22' 145} 146 147atf_test_case basic_functional 148basic_functional_head() { 149 atf_set "descr" "Basic functional tests" 150} 151basic_functional_body() { 152 test_expr '2' '2' 153 test_expr '-4' '-4' 154 test_expr 'hello' 'hello' 155} 156 157atf_test_case compare_ops_precedence 158compare_ops_precedence_head() { 159 atf_set "descr" "Compare operator precendence test" 160} 161compare_ops_precedence_body() { 162 test_expr '2 \> 1 \* 17' '0' 163} 164 165atf_test_case compare_ops 166compare_ops_head() { 167 atf_set "descr" "Compare operator tests" 168} 169compare_ops_body() { 170 test_expr '2 \!= 5' '1' 171 test_expr '2 \!= 2' '0' 172 test_expr '2 \<= 3' '1' 173 test_expr '2 \<= 2' '1' 174 test_expr '2 \<= 1' '0' 175 test_expr '2 \< 3' '1' 176 test_expr '2 \< 2' '0' 177 test_expr '2 = 2' '1' 178 test_expr '2 = 4' '0' 179 test_expr '2 \>= 1' '1' 180 test_expr '2 \>= 2' '1' 181 test_expr '2 \>= 3' '0' 182 test_expr '2 \> 1' '1' 183 test_expr '2 \> 2' '0' 184} 185 186atf_test_case multiply 187multiply_head() { 188 atf_set "descr" "Test the multiply operator (PR bin/12838)" 189} 190multiply_body() { 191 test_expr '1 \* -1' '-1' 192 test_expr '2 \> 1 \* 17' '0' 193} 194 195atf_test_case negative 196negative_head() { 197 atf_set "descr" "Test the additive inverse" 198} 199negative_body() { 200 test_expr '-1 + 5' '4' 201 test_expr '- 1 + 5' 'expr: syntax error' 202 203 test_expr '5 + -1' '4' 204 test_expr '5 + - 1' 'expr: syntax error' 205 206 test_expr '1 - -5' '6' 207} 208 209atf_test_case math_precedence 210math_precedence_head() { 211 atf_set "descr" "More complex math test for precedence" 212} 213math_precedence_body() { 214 test_expr '-3 + -1 \* 4 + 3 / -6' '-7' 215} 216 217atf_test_case precedence 218precedence_head() { 219 atf_set "descr" "Test precedence" 220} 221precedence_body() { 222 # This is messy but the shell escapes cause that 223 test_expr 'X1/2/3 : X\\\(.\*[^/]\\\)//\*[^/][^/]\*/\*$ \| . : \\\(.\\\)' '1/2' 224} 225 226atf_test_case regex 227regex_head() { 228 atf_set "descr" "Test proper () returning \1 from a regex" 229} 230regex_body() { 231 # This is messy but the shell escapes cause that 232 test_expr '1/2 : .\*/\\\(.\*\\\)' '2' 233} 234 235atf_init_test_cases() 236{ 237 atf_add_test_case lang 238 atf_add_test_case overflow 239 atf_add_test_case gtkmm 240 atf_add_test_case colon_vs_math 241 atf_add_test_case arithmetic_ops 242 atf_add_test_case basic_math 243 atf_add_test_case basic_functional 244 atf_add_test_case compare_ops_precedence 245 atf_add_test_case compare_ops 246 atf_add_test_case multiply 247 atf_add_test_case negative 248 atf_add_test_case math_precedence 249 atf_add_test_case precedence 250 atf_add_test_case regex 251} 252