1#! /bin/sh 2# 3# @(#)arith.sh 1.26 18/01/02 Copyright 2016-2017 J. Schilling 4# 5 6# Read test core functions 7. ../../common/test-common 8 9# 10# Basic tests to check whether the supported operators work 11# 12expect_fail_save=$expect_fail 13expect_fail=true 14# 15# Unspecified by POSIX 16# 17docommand a00 "$SHELL -c 'echo \$(())'" 0 "0\n" "" 18expect_fail=$expect_fail_save 19if [ "$failed" = true ]; then 20 echo 21 echo "Test $cmd_label is unspecified behavior by POSIX." 22 echo 23fi 24 25docommand a01 "$SHELL -c 'echo \$((/))'" "!=0" "" IGNORE 26 27docommand a02 "$SHELL -c 'echo \$((1))'" 0 "1\n" "" 28docommand a03 "$SHELL -c 'echo \$((1+2))'" 0 "3\n" "" 29docommand a04 "$SHELL -c 'echo \$((1-2))'" 0 "-1\n" "" 30docommand a05 "$SHELL -c 'echo \$((2*3))'" 0 "6\n" "" 31docommand a06 "$SHELL -c 'echo \$((2*-3))'" 0 "-6\n" "" 32docommand a07 "$SHELL -c 'echo \$((10/2))'" 0 "5\n" "" 33 34docommand a08 "$SHELL -c 'echo \$((18%3))'" 0 "0\n" "" 35docommand a09 "$SHELL -c 'echo \$((17%3))'" 0 "2\n" "" 36docommand a10 "$SHELL -c 'echo \$((-17%3))'" 0 "-2\n" "" 37 38docommand a11 "$SHELL -c 'echo \$((1 << 1))'" 0 "2\n" "" 39expect_fail_save=$expect_fail 40expect_fail=true 41docommand a12 "$SHELL -c 'echo \$((1 << 31))'" 0 "2147483648\n" "" 42expect_fail=$expect_fail_save 43if [ "$failed" = true ]; then 44 have_longlong=false 45 echo 46 echo "Test $cmd_label is unspecified behavior by POSIX." 47 echo "Test $cmd_label needs more than 'signed long'." 48 echo "Skipping long long tests." 49 echo 50else 51 have_longlong=true 52fi 53if [ $have_longlong = true ]; then 54docommand a13 "$SHELL -c 'echo \$((1 << 33))'" 0 "8589934592\n" "" 55fi 56docommand a14 "$SHELL -c 'echo \$((2 >> 1))'" 0 "1\n" "" 57docommand a15 "$SHELL -c 'echo \$((64 >> 5))'" 0 "2\n" "" 58if [ $have_longlong = true ]; then 59docommand a16 "$SHELL -c 'echo \$((2147483648 >> 31))'" 0 "1\n" "" 60docommand a17 "$SHELL -c 'echo \$((8589934592 >> 33))'" 0 "1\n" "" 61fi 62 63docommand a18 "$SHELL -c 'echo \$((5 > 4))'" 0 "1\n" "" 64docommand a19 "$SHELL -c 'echo \$((4 > 4))'" 0 "0\n" "" 65docommand a20 "$SHELL -c 'echo \$((3 < 4))'" 0 "1\n" "" 66docommand a21 "$SHELL -c 'echo \$((4 < 4))'" 0 "0\n" "" 67docommand a22 "$SHELL -c 'echo \$((4 <= 4))'" 0 "1\n" "" 68docommand a23 "$SHELL -c 'echo \$((5 <= 4))'" 0 "0\n" "" 69docommand a24 "$SHELL -c 'echo \$((4 >= 4))'" 0 "1\n" "" 70docommand a25 "$SHELL -c 'echo \$((3 >= 4))'" 0 "0\n" "" 71docommand a26 "$SHELL -c 'echo \$((4 == 4))'" 0 "1\n" "" 72docommand a27 "$SHELL -c 'echo \$((3 == 4))'" 0 "0\n" "" 73docommand a28 "$SHELL -c 'echo \$((3 != 4))'" 0 "1\n" "" 74docommand a29 "$SHELL -c 'echo \$((4 != 4))'" 0 "0\n" "" 75 76docommand a30 "$SHELL -c 'echo \$((123 & 7))'" 0 "3\n" "" 77docommand a31 "$SHELL -c 'echo \$((123 ^ 7))'" 0 "124\n" "" 78docommand a32 "$SHELL -c 'echo \$((123 | 7))'" 0 "127\n" "" 79 80docommand a33 "$SHELL -c 'echo \$((1 && 2))'" 0 "1\n" "" 81docommand a34 "$SHELL -c 'echo \$((1 && 0))'" 0 "0\n" "" 82docommand a35 "$SHELL -c 'echo \$((0 && 2))'" 0 "0\n" "" 83docommand a36 "$SHELL -c 'echo \$((0 && 0))'" 0 "0\n" "" 84 85docommand a37 "$SHELL -c 'echo \$((1 || 2))'" 0 "1\n" "" 86docommand a38 "$SHELL -c 'echo \$((1 || 0))'" 0 "1\n" "" 87docommand a39 "$SHELL -c 'echo \$((0 || 2))'" 0 "1\n" "" 88docommand a40 "$SHELL -c 'echo \$((0 || 0))'" 0 "0\n" "" 89 90docommand a41 "$SHELL -c 'echo \$((+1))'" 0 "1\n" "" 91docommand a42 "$SHELL -c 'echo \$((+ 1))'" 0 "1\n" "" 92docommand a43 "$SHELL -c 'echo \$((-1))'" 0 "-1\n" "" 93docommand a44 "$SHELL -c 'echo \$((- 1))'" 0 "-1\n" "" 94 95docommand a45 "$SHELL -c 'echo \$((~1))'" 0 "-2\n" "" 96docommand a46 "$SHELL -c 'echo \$((~63))'" 0 "-64\n" "" 97docommand a47 "$SHELL -c 'echo \$((~1023))'" 0 "-1024\n" "" 98 99docommand a48 "$SHELL -c 'echo \$((!0))'" 0 "1\n" "" 100docommand a49 "$SHELL -c 'echo \$((!1))'" 0 "0\n" "" 101docommand a50 "$SHELL -c 'echo \$((!2))'" 0 "0\n" "" 102docommand a51 "$SHELL -c 'echo \$((!!999))'" 0 "1\n" "" 103 104docommand a52 "$SHELL -c 'echo \$((+-~!1))'" 0 "1\n" "" 105docommand a53 "$SHELL -c 'echo \$((+-~!(1)))'" 0 "1\n" "" 106 107docommand a54 "$SHELL -c 'unset a; echo \$((a))'" 0 "0\n" "" 108 109expect_fail_save=$expect_fail 110expect_fail=true 111docommand a55 "$SHELL -c 'unset a; echo \$((a++))'" 0 "0\n" "" 112expect_fail=$expect_fail_save 113if [ "$failed" = true ]; then 114 var_incr=false 115 echo 116 echo "The shell $SHELL does not support variable increment like a++." 117 echo "This is not required by POSIX." 118 echo 119else 120 var_incr=true 121 docommand a56 "$SHELL -c 'unset a; echo \$((a--))'" 0 "0\n" "" 122 docommand a57 "$SHELL -c 'unset a; echo \$((++a))'" 0 "1\n" "" 123 docommand a58 "$SHELL -c 'unset a; echo \$((--a))'" 0 "-1\n" "" 124 125 docommand a59 "$SHELL -c 'unset a; echo \$((a++)); echo \$a'" 0 "0\n1\n" "" 126 docommand a60 "$SHELL -c 'unset a; echo \$((a--)); echo \$a'" 0 "0\n-1\n" "" 127 docommand a61 "$SHELL -c 'unset a; echo \$((++a)); echo \$a'" 0 "1\n1\n" "" 128 docommand a62 "$SHELL -c 'unset a; echo \$((--a)); echo \$a'" 0 "-1\n-1\n" "" 129 130 docommand a63 "$SHELL -c 'unset a; echo \$((++a++)); echo \$a'" "!=0" "" IGNORE 131 docommand a64 "$SHELL -c 'unset a; echo \$((--a--)); echo \$a'" "!=0" "" IGNORE 132 133 docommand a56 "$SHELL -c 'echo \$((\$((A=2))++--++--++--A))'" "!=0" "" IGNORE 134 docommand a57 "$SHELL -c 'echo \$((++--++--++--A))'" "!=0" "" IGNORE 135fi 136docommand a58 "$SHELL -c 'echo \$(( 1371+2+3))'" 0 "6\n" "" 138docommand a59 "$SHELL -c 'echo \$((1 139+2+3))'" 0 "6\n" "" 140docommand a60 "$SHELL -c 'echo \$((1+ 1412+3))'" 0 "6\n" "" 142docommand a61 "$SHELL -c 'echo \$((1+2 143+3))'" 0 "6\n" "" 144docommand a62 "$SHELL -c 'echo \$((1+2+ 1453))'" 0 "6\n" "" 146docommand a63 "$SHELL -c 'echo \$((1+2+3 147))'" 0 "6\n" "" 148docommand a64 "$SHELL -c 'echo \$((1+ 149(2+3)))'" 0 "6\n" "" 150docommand a65 "$SHELL -c 'echo \$((1+( 1512+3)))'" 0 "6\n" "" 152docommand a66 "$SHELL -c 'echo \$((1+(2 153+3)))'" 0 "6\n" "" 154docommand a67 "$SHELL -c 'echo \$((1+(2+3 155)))'" 0 "6\n" "" 156docommand a68 "$SHELL -c 'echo \$((1+(2+3) 157))'" 0 "6\n" "" 158 159# 160# Tests for number base 161# 162docommand a100 "$SHELL -c 'echo \$((0x1))'" 0 "1\n" "" 163docommand a101 "$SHELL -c 'echo \$((0x01))'" 0 "1\n" "" 164docommand a102 "$SHELL -c 'echo \$((01))'" 0 "1\n" "" 165docommand a103 "$SHELL -c 'echo \$((0x10))'" 0 "16\n" "" 166 167expect_fail_save=$expect_fail 168expect_fail=true 169docommand a104 "$SHELL -c 'echo \$((0100))'" 0 "64\n" "" 170expect_fail=$expect_fail_save 171if [ "$failed" = true ]; then 172 octal_numbers=false 173 echo 174 echo "The shell $SHELL does not correctly convert octal numbers." 175 echo "This is required by POSIX, so this shell is not POSIX compliant." 176 echo "Skipping more octal tests." 177 echo 178else 179 octal_numbers=true 180fi 181if [ $octal_numbers = true ] ; then 182docommand a105 "$SHELL -c 'echo \$((010+10))'" 0 "18\n" "" 183expect_fail_save=$expect_fail 184expect_fail=true 185docommand a106 "$SHELL -c 'echo \$((019))'" "!=0" "" IGNORE 186expect_fail=$expect_fail_save 187if [ "$failed" = true ]; then 188 echo 189 echo "The shell $SHELL does not correctly flag illegal octal numbers." 190 echo "This is required by POSIX, so this shell is not POSIX compliant." 191 echo 192fi 193fi 194 195# 196# Tests for precedence and chained operators 197# 198docommand a120 "$SHELL -c 'echo \$((1+2*3))'" 0 "7\n" "" 199docommand a121 "$SHELL -c 'echo \$((1+(2*3)))'" 0 "7\n" "" 200docommand a122 "$SHELL -c 'echo \$((2*5+2*3))'" 0 "16\n" "" 201docommand a123 "$SHELL -c 'echo \$((2*5+2*3+1))'" 0 "17\n" "" 202docommand a124 "$SHELL -c 'echo \$((2*5+2*3+1+2+3))'" 0 "22\n" "" 203docommand a125 "$SHELL -c 'echo \$(((1)+(2)))'" 0 "3\n" "" 204docommand a126 "$SHELL -c 'echo \$(((2/3)!=(5/3)==(3/3)))'" 0 "1\n" "" 205docommand a127 "$SHELL -c 'echo \$((0!=1==1))'" 0 "1\n" "" 206docommand a128 "$SHELL -c 'echo \$((0!=3==3))'" 0 "0\n" "" 207docommand a129 "$SHELL -c 'echo \$((2*5+2*3*2+1))'" 0 "23\n" "" 208docommand a130 "$SHELL -c 'echo \$((20 / 2 / 2))'" 0 "5\n" "" 209 210# 211# Tests for the assignment operators 212# 213docommand a150 "$SHELL -c 'unset a; echo \$((a += 3))'" 0 "3\n" "" 214docommand a151 "$SHELL -c 'a=0; echo \$((a += 3))'" 0 "3\n" "" 215docommand a152 "$SHELL -c 'a=0; echo \$((a -= 3))'" 0 "-3\n" "" 216docommand a153 "$SHELL -c 'a=2; echo \$((a *= 3))'" 0 "6\n" "" 217docommand a154 "$SHELL -c 'a=2; echo \$((a /= 2))'" 0 "1\n" "" 218docommand a155 "$SHELL -c 'a=17; echo \$((a %= 5))'" 0 "2\n" "" 219docommand a156 "$SHELL -c 'a=1; echo \$((a <<= 3))'" 0 "8\n" "" 220docommand a157 "$SHELL -c 'a=8; echo \$((a >>= 3))'" 0 "1\n" "" 221docommand a158 "$SHELL -c 'a=123; echo \$((a &= 7))'" 0 "3\n" "" 222docommand a159 "$SHELL -c 'a=123; echo \$((a ^= 7))'" 0 "124\n" "" 223docommand a160 "$SHELL -c 'a=123; echo \$((a |= 7))'" 0 "127\n" "" 224docommand a161 "$SHELL -c 'a=0;b=9; echo \$((a = b = 2)); echo \$a; echo \$b'" 0 "2\n2\n2\n" "" 225docommand a162 "$SHELL -c 'a=0;b=9;c=6; echo \$((a = b = c = 2)); echo \$a; echo \$b; echo \$c'" 0 "2\n2\n2\n2\n" "" 226docommand a162 "$SHELL -c 'i=1 j=2 k=3; echo \$((i += j += k)); echo \$i,\$j,\$k'" 0 "6\n6,5,3\n" "" 227 228# 229# Tests for command expansion inside arithmetic expansion 230# 231docommand a180 "$SHELL -c 'echo \$(($(true)==$(true)))'" "!=0" "" IGNORE 232docommand a181 "$SHELL -c 'echo \$((`true`==`true`))'" "!=0" "" IGNORE 233docommand a182 "$SHELL -c 'echo \$(($(echo 1)==$(echo 1)))'" 0 "1\n" "" 234docommand a183 "$SHELL -c 'echo \$((`echo 1`==`echo 1`))'" 0 "1\n" "" 235 236# 237# Tests to check whether 0 && x or 1 || x correctly do not 238# evaluate x 239# 240docommand a200 "$SHELL -c 'echo \$((0 && 1))'" 0 "0\n" "" 241docommand a201 "$SHELL -c 'echo \$((0 && 1/0))'" 0 "0\n" "" 242docommand a202 "$SHELL -c 'echo \$((0 && (1/0)))'" 0 "0\n" "" 243docommand a203 "$SHELL -c 'echo \$((1 && (1/0)))'" "!=0" "" IGNORE 244 245docommand a204 "$SHELL -c 'echo \$((1 || 1))'" 0 "1\n" "" 246docommand a205 "$SHELL -c 'echo \$((1 || 1/0))'" 0 "1\n" "" 247docommand a206 "$SHELL -c 'echo \$((1 || (1/0)))'" 0 "1\n" "" 248docommand a207 "$SHELL -c 'echo \$((0 || (1/0)))'" "!=0" "" IGNORE 249 250if [ "$var_incr" = true ]; then 251docommand a208 "$SHELL -c 'unset a; echo \$((1 && a++)); echo \$a'" 0 "0\n1\n" "" 252docommand a209 "$SHELL -c 'unset a; echo \$((0 && a++)); echo \$a'" 0 "0\n\n" "" 253docommand a210 "$SHELL -c 'unset a; echo \$((0 && (a++))); echo \$a'" 0 "0\n\n" "" 254 255docommand a211 "$SHELL -c 'unset a; echo \$((0 || a++)); echo \$a'" 0 "0\n1\n" "" 256docommand a212 "$SHELL -c 'unset a; echo \$((1 || a++)); echo \$a'" 0 "1\n\n" "" 257docommand a213 "$SHELL -c 'unset a; echo \$((1 || (a++))); echo \$a'" 0 "1\n\n" "" 258 259docommand a214 "$SHELL -c 'unset a; echo \$((1 && --a)); echo \$a'" 0 "1\n-1\n" "" 260docommand a215 "$SHELL -c 'unset a; echo \$((0 && --a)); echo \$a'" 0 "0\n\n" "" 261docommand a216 "$SHELL -c 'unset a; echo \$((0 && (--a))); echo \$a'" 0 "0\n\n" "" 262 263docommand a217 "$SHELL -c 'unset a; echo \$((0 || --a)); echo \$a'" 0 "1\n-1\n" "" 264docommand a218 "$SHELL -c 'unset a; echo \$((1 || --a)); echo \$a'" 0 "1\n\n" "" 265docommand a219 "$SHELL -c 'unset a; echo \$((1 || (--a))); echo \$a'" 0 "1\n\n" "" 266else 267 echo 268 echo "Skipping more variable pre/post increment/decrement tests..." 269 echo 270fi 271 272# 273# Tests for conditional expressions 274# 275docommand a250 "$SHELL -c 'echo \$((1 ? 15 : 12))'" 0 "15\n" "" 276docommand a251 "$SHELL -c 'echo \$((0 ? 15 : 12))'" 0 "12\n" "" 277docommand a252 "$SHELL -c 'echo \$((1 ? (15) : (12)))'" 0 "15\n" "" 278docommand a253 "$SHELL -c 'echo \$((0 ? (15) : (12)))'" 0 "12\n" "" 279docommand a254 "$SHELL -c 'echo \$((1 ? 1+2+3 : 4+5+6))'" 0 "6\n" "" 280docommand a255 "$SHELL -c 'echo \$((0 ? 1+2+3 : 4+5+6))'" 0 "15\n" "" 281docommand a256 "$SHELL -c 'echo \$((1 ? (1+2+3) : (4+5+6)))'" 0 "6\n" "" 282docommand a257 "$SHELL -c 'echo \$((0 ? (1+2+3) : (4+5+6)))'" 0 "15\n" "" 283 284if [ "$var_incr" = true ]; then 285docommand a258 "$SHELL -c 'unset a; unset b; echo \$((1 ? a++ : b--)); echo \$a; echo \$b'" 0 "0\n1\n\n" "" 286docommand a259 "$SHELL -c 'unset a; unset b; echo \$((0 ? a++ : b--)); echo \$a; echo \$b'" 0 "0\n\n-1\n" "" 287docommand a260 "$SHELL -c 'unset a; b=-1; echo \$((0 ? a++ : b--)); echo \$a; echo \$b'" 0 "-1\n\n-2\n" "" 288docommand a261 "$SHELL -c 'unset a; unset b; echo \$((1 ? (a++) : (b--))); echo \$a; echo \$b'" 0 "0\n1\n\n" "" 289docommand a262 "$SHELL -c 'unset a; unset b; echo \$((0 ? (a++) : (b--))); echo \$a; echo \$b'" 0 "0\n\n-1\n" "" 290docommand a263 "$SHELL -c 'unset a; b=-1; echo \$((0 ? (a++) : (b--))); echo \$a; echo \$b'" 0 "-1\n\n-2\n" "" 291fi 292 293docommand a264 "$SHELL -c 'echo \$((0?(9+4<1):12))'" 0 "12\n" "" 294docommand a265 "$SHELL -c 'echo \$((1?(9+4<1):12))'" 0 "0\n" "" 295docommand a266 "$SHELL -c 'echo \$((0?9+4<1:12))'" 0 "12\n" "" 296docommand a267 "$SHELL -c 'echo \$((1?9+4<1:12))'" 0 "0\n" "" 297docommand a268 "$SHELL -c 'echo \$((0?A=9+4<1:12))'" 0 "12\n" "" 298docommand a269 "$SHELL -c 'echo \$((1?A=9+4<1:12))'" 0 "0\n" "" 299 300docommand a270 "$SHELL -c 'echo \$((!!(-02<=-04)^1 ?+9+(+4):+3+(+12)))'" 0 "13\n" "" 301docommand a271 "$SHELL -c 'echo \$((!(-02<=-04)^1 ?+9+(+4):+3+(+12)))'" 0 "15\n" "" 302docommand a272 "$SHELL -c 'echo \$((!!(-02<=-04)^1 ?+9+(+4) <<1:+3+(+12)<<2))'" 0 "26\n" "" 303docommand a273 "$SHELL -c 'echo \$((!(-02<=-04)^1 ?+9+(+4) <<1:+3+(+12)<<2))'" 0 "60\n" "" 304docommand a274 "$SHELL -c 'echo \$((!(!(-02<=-04))^1 ?+9+(+4) <<1:+3+(+12)<<2))'" 0 "26\n" "" 305docommand a275 "$SHELL -c 'echo \$(((!(-02<=-04))^1 ?+9+(+4) <<1:+3+(+12)<<2))'" 0 "60\n" "" 306 307docommand a276 "$SHELL -c 'echo \$((1?0?-2:2:3))'" 0 "2\n" "" 308docommand a277 "$SHELL -c 'echo \$((0?2?-2:2:3))'" 0 "3\n" "" 309docommand a278 "$SHELL -c 'echo \$((1?2?-2:2:3))'" 0 "-2\n" "" 310docommand a279 "$SHELL -c 'echo \$((0?0?-2:2:3))'" 0 "3\n" "" 311 312docommand a280 "$SHELL -c 'echo \$((1?3:0?-2:2))'" 0 "3\n" "" 313docommand a281 "$SHELL -c 'echo \$((0?3:2?-2:2))'" 0 "-2\n" "" 314docommand a282 "$SHELL -c 'echo \$((1?3:2?-2:2))'" 0 "3\n" "" 315docommand a283 "$SHELL -c 'echo \$((0?3:0?-2:2))'" 0 "2\n" "" 316 317docommand a284 "$SHELL -c 'echo \$((1?(0?-2:2):3))'" 0 "2\n" "" 318docommand a285 "$SHELL -c 'echo \$((0?(2?-2:2):3))'" 0 "3\n" "" 319docommand a286 "$SHELL -c 'echo \$((1?(2?-2:2):3))'" 0 "-2\n" "" 320docommand a287 "$SHELL -c 'echo \$((0?(0?-2:2):3))'" 0 "3\n" "" 321 322docommand a288 "$SHELL -c 'echo \$((1?3:(0?-2:2)))'" 0 "3\n" "" 323docommand a289 "$SHELL -c 'echo \$((0?3:(2?-2:2)))'" 0 "-2\n" "" 324docommand a290 "$SHELL -c 'echo \$((1?3:(2?-2:2)))'" 0 "3\n" "" 325docommand a291 "$SHELL -c 'echo \$((0?3:(0?-2:2)))'" 0 "2\n" "" 326 327docommand a292 "$SHELL -c 'echo \$((1?0^0:1?-2:3))'" 0 "0\n" "" 328docommand a293 "$SHELL -c 'echo \$((0?0^0:1?-2:3))'" 0 "-2\n" "" 329docommand a294 "$SHELL -c 'echo \$((1?0^0:0?-2:3))'" 0 "0\n" "" 330docommand a295 "$SHELL -c 'echo \$((0?0^0:0?-2:3))'" 0 "3\n" "" 331 332docommand a296 "$SHELL -c 'echo \$(( 0 ? 2 : 3 , 0 ? 7 : 4 ))'" 0 "4\n" "" 333docommand a297 "$SHELL -c 'echo \$(( 1 ? 2 : 3 , 0 ? 7 : 4 ))'" 0 "4\n" "" 334docommand a298 "$SHELL -c 'echo \$(( 0 ? 2 : 3 , 1 ? 7 : 4 ))'" 0 "7\n" "" 335docommand a299 "$SHELL -c 'echo \$(( 1 ? 2 : 3 , 1 ? 7 : 4 ))'" 0 "7\n" "" 336docommand a300 "$SHELL -c 'echo \$(( 1 ? 2 : 3 , 1 ? 7 : 4 , 9 ))'" 0 "9\n" "" 337 338if [ "$var_incr" = true ]; then 339docommand a301 "$SHELL -c 'echo \$((QQ_*=XCd<<=Y++^O++?Y>>=H++:T++!=C++))'" 0 "0\n" "" 340docommand a302 "$SHELL -c 'echo \$((YHz-=M++|Z++<<X++>N++==(M|=P_+=L+++T++)))'" 0 "0\n" "" 341# 342# The next may fail nor not, C does not permit it as a parenthesis is missing. 343# So we do not run it. 344# 345#docommand a302b "$SHELL -c 'echo \$((YHz-=M++|Z++<<X++>N++==M|=P_+=L+++T++))'" "!=0" "" IGNORE 346else 347 echo 348 echo "Skipping more variable pre/post increment/decrement tests..." 349 echo 350fi 351 352docommand a303 "$SHELL -c 'echo \$((N>>=U+=F&=J!=(H*=S-P<=K<<I-X!=G<<V>=(Z|=R<I<<O))))'" 0 "0\n" "" 353# 354# The next may fail nor not, C does not permit it as a parenthesis is missing. 355# So we do not run it. 356# 357#docommand a303b "$SHELL -c 'echo \$((N>>=U+=F&=J!=H*=S-P<=K<<I-X!=G<<V>=Z|=R<I<<O))'" "!=0" "" IGNORE 358 359# 360# lvalue and division by zero - so this must fail 361# 362docommand a310 "$SHELL -c 'echo \$((F-=B>>=D|D<=E*=Q|S!=W!=R|B&=M+O?Y?A:Q<G>>P:M*=N%=Q>>Q))'" "!=0" "" IGNORE 363docommand a312 "$SHELL -c 'echo \$((t%=r&=U-O*U+=J))'" "!=0" "" IGNORE 364 365# 366# Tests for the comma operator 367# 368expect_fail_save=$expect_fail 369expect_fail=true 370docommand a400 "$SHELL -c 'echo \$((1 , 15))'" 0 "15\n" "" 371expect_fail=$expect_fail_save 372if [ "$failed" = true ]; then 373 comma_operator=false 374 echo 375 echo "Test $cmd_label checks requires POSIX syntax (comma operator)." 376 echo 377else 378 comma_operator=true 379fi 380if [ "$comma_operator" = true ]; then 381docommand a401 "$SHELL -c 'echo \$((a=2 , 15)); echo \$a'" 0 "15\n2\n" "" 382docommand a402 "$SHELL -c 'echo \$((a=2*3 , 15)); echo \$a'" 0 "15\n6\n" "" 383docommand a403 "$SHELL -c 'echo \$((a=2*3*4 , 15)); echo \$a'" 0 "15\n24\n" "" 384docommand a404 "$SHELL -c 'echo \$(((1) , (15)))'" 0 "15\n" "" 385docommand a405 "$SHELL -c 'echo \$(((a=2) , (15))); echo \$a'" 0 "15\n2\n" "" 386docommand a406 "$SHELL -c 'echo \$(((a=2*3) , (15))); echo \$a'" 0 "15\n6\n" "" 387docommand a407 "$SHELL -c 'echo \$((a=(2*3) , (15))); echo \$a'" 0 "15\n6\n" "" 388docommand a408 "$SHELL -c 'echo \$(((a=2*3*4) , (15))); echo \$a'" 0 "15\n24\n" "" 389docommand a409 "$SHELL -c 'unset a; echo \$((a++ , 15)); echo \$a'" 0 "15\n1\n" "" 390docommand a410 "$SHELL -c 'unset a; echo \$((a++ , ++a)); echo \$a'" 0 "2\n2\n" "" 391docommand a411 "$SHELL -c 'unset a; echo \$((a++ , a++)); echo \$a'" 0 "1\n2\n" "" 392else 393 echo 394 echo "Skipping comma operator tests." 395 echo 396fi 397 398docommand a500 "$SHELL -c 'set -u; unset x; echo \$(( x+=3 )); echo \$x'" !=0 "" NONEMPTY 399docommand a501 "$SHELL -c 'set -u; unset a; echo \$((a++ , a++)); echo \$a'" !=0 "" NONEMPTY 400docommand a502 "$SHELL -c 'set -u; unset x; echo \$(( x = 3 )); echo \$x'" 0 "3\n3\n" "" 401 402docommand a600 "$SHELL -c 'echo \$(( `echo 77` `printf %s -` `echo 44` ))'" 0 "33\n" "" 403docommand a601 "$SHELL -c 'echo \$(( \$(echo 77) \$(printf %s -) \$(echo 44) ))'" 0 "33\n" "" 404 405docommand a900 "$SHELL -c 'echo \$(( 3 ))'" 0 "3\n" "" 406docommand a901 "$SHELL -c 'echo \$(( 3 )'" !=0 "" NONEMPTY 407docommand a902 "$SHELL -c 'echo \$(( 3 '" !=0 "" NONEMPTY 408docommand a903 "$SHELL -c 'echo \$(( 1 + 3 + ))'" !=0 "" NONEMPTY 409docommand a904 "$SHELL -c 'echo \$(( 1 + 3 = ))'" !=0 "" NONEMPTY 410docommand a905 "$SHELL -c 'echo \$(( 1 + 3 ? ))'" !=0 "" NONEMPTY 411 412# 413# Test whether strange state causes problems 414# 415docommand a1000 "$SHELL -c 'x=foo; : \$((x=1)); echo \$x'" 0 "1\n" "" 416docommand a1001 "$SHELL -c 'x=foo; : \$((x += 1)); echo \$x'" "!=0" IGNORE NONEMPTY 417 418# 419# Test cases that are similar to the tests from ksh93 420# 421docommand ak01a "$SHELL -c 'x=1 y=2 z=3; echo \$((2+2))'" 0 "4\n" "" 422docommand ak01b "$SHELL -c 'x=1 y=2 z=3; echo \$((2+2 != 4))'" 0 "0\n" "" 423docommand ak02a "$SHELL -c 'x=1 y=2 z=3; echo \$((x+y))'" 0 "3\n" "" 424docommand ak02b "$SHELL -c 'x=1 y=2 z=3; echo \$((x+y!=z))'" 0 "0\n" "" 425docommand ak03a "$SHELL -c 'x=1 y=2 z=3; echo \$((\$x+\$y))'" 0 "3\n" "" 426docommand ak03b "$SHELL -c 'x=1 y=2 z=3; echo \$((\$x+\$y!=\$z))'" 0 "0\n" "" 427docommand ak04a "$SHELL -c 'x=1 y=2 z=3; echo \$(((x|y)))'" 0 "3\n" "" 428docommand ak04b "$SHELL -c 'x=1 y=2 z=3; echo \$(((x|y)!=z))'" 0 "0\n" "" 429docommand ak05 "$SHELL -c 'x=1 y=2 z=3; echo \$((x >= z))'" 0 "0\n" "" 430docommand ak06 "$SHELL -c 'x=1 y=2 z=3; echo \$((y+3 != z+2))'" 0 "0\n" "" 431docommand ak07 "$SHELL -c 'x=1 y=2 z=3; echo \$((y<<2 != 1<<3))'" 0 "0\n" "" 432docommand ak08 "$SHELL -c 'x=1 y=2 z=3; echo \$((133%10 != 3))'" 0 "0\n" "" 433docommand ak09 "$SHELL -c 'd=0; echo \$((d || 1))'" 0 "1\n" "" 434if [ "$var_incr" = true ]; then 435docommand ak10 "$SHELL -c 'd=0; echo \$((d++ != 0))'" 0 "0\n" "" 436docommand ak11 "$SHELL -c 'd=1; echo \$((--d != 0))'" 0 "0\n" "" 437fi 438if [ "$comma_operator" = true ]; then 439docommand ak12 "$SHELL -c 'd=0; echo \$(( (d++,6)!=6 && d!=1))'" 0 "0\n" "" 440fi 441if [ "$var_incr" = true ]; then 442docommand ak13 "$SHELL -c 'd=0; echo \$(( (1?2+1:3*4+d++)!=3 || d!=0))'" 0 "0\n" "" 443fi 444docommand ak14 "$SHELL -c 'i=1; echo \$(( (i?0:1)))'" 0 "0\n" "" 445docommand ak15 "$SHELL -c 'i=1; echo \$(( (1 || 1 && 0) != 1))'" 0 "0\n" "" 446docommand ak16 "$SHELL -c 'x=1; echo \$(( (x=-x) != -1 ))'" 0 "0\n" "" 447docommand ak17 "$SHELL -c 'x=2; echo \$(( 1\$((\$x))3 != 123 ))'" 0 "0\n" "" 448 449 450success 451