1 ########################################################################
   2 #                                                                      #
   3 #               This software is part of the ast package               #
   4 #          Copyright (c) 1982-2010 AT&T Intellectual Property          #
   5 #                      and is licensed under the                       #
   6 #                  Common Public License, Version 1.0                  #
   7 #                    by AT&T Intellectual Property                     #
   8 #                                                                      #
   9 #                A copy of the License is available at                 #
  10 #            http://www.opensource.org/licenses/cpl1.0.txt             #
  11 #         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         #
  12 #                                                                      #
  13 #              Information and Software Systems Research               #
  14 #                            AT&T Research                             #
  15 #                           Florham Park NJ                            #
  16 #                                                                      #
  17 #                  David Korn <dgk@research.att.com>                   #
  18 #                                                                      #
  19 ########################################################################
  20 function err_exit
  21 {
  22         print -u2 -n "\t"
  23         print -u2 -r ${Command}[$1]: "${@:2}"
  24         let Errors+=1
  25 }
  26 alias err_exit='err_exit $LINENO'
  27 
  28 Command=${0##*/}
  29 integer Errors=0
  30 if      [[ 'hi there' != "hi there" ]]
  31 then    err_exit "single quotes not the same as double quotes"
  32 fi
  33 x='hi there'
  34 if      [[ $x != 'hi there' ]]
  35 then    err_exit "$x not the same as 'hi there'"
  36 fi
  37 if      [[ $x != "hi there" ]]
  38 then    err_exit "$x not the same as \"hi there \""
  39 fi
  40 if      [[ \a\b\c\*\|\"\ \\ != 'abc*|" \' ]]
  41 then    err_exit " \\ differs from '' "
  42 fi
  43 if      [[ "ab\'\"\$(" != 'ab\'\''"$(' ]]
  44 then    err_exit " \"\" differs from '' "
  45 fi
  46 if      [[ $(print -r - 'abc*|" \') !=  'abc*|" \' ]]
  47 then    err_exit "\$(print -r - '') differs from ''"
  48 fi
  49 if      [[ $(print -r - "abc*|\" \\") !=  'abc*|" \' ]]
  50 then    err_exit "\$(print -r - '') differs from ''"
  51 fi
  52 if      [[ "$(print -r - 'abc*|" \')" !=  'abc*|" \' ]]
  53 then    err_exit "\"\$(print -r - '')\" differs from ''"
  54 fi
  55 if      [[ "$(print -r - "abc*|\" \\")" !=  'abc*|" \' ]]
  56 then    err_exit "\"\$(print -r - "")\" differs from ''"
  57 fi
  58 if      [[ $(print -r - $(print -r - 'abc*|" \')) !=  'abc*|" \' ]]
  59 then    err_exit "nested \$(print -r - '') differs from ''"
  60 fi
  61 if      [[ "$(print -r - $(print -r - 'abc*|" \'))" !=  'abc*|" \' ]]
  62 then    err_exit "\"nested \$(print -r - '')\" differs from ''"
  63 fi
  64 if      [[ $(print -r - "$(print -r - 'abc*|" \')") !=  'abc*|" \' ]]
  65 then    err_exit "nested \"\$(print -r - '')\" differs from ''"
  66 fi
  67 unset x
  68 if      [[ ${x-$(print -r - "abc*|\" \\")} !=  'abc*|" \' ]]
  69 then    err_exit "\${x-\$(print -r - '')} differs from ''"
  70 fi
  71 if      [[ ${x-$(print -r - "a}c*|\" \\")} !=  'a}c*|" \' ]]
  72 then    err_exit "\${x-\$(print -r - '}')} differs from ''"
  73 fi
  74 x=$((echo foo)|(cat))
  75 if      [[ $x != foo  ]]
  76 then    err_exit "((cmd)|(cmd)) failed"
  77 fi
  78 x=$(print -r -- "\"$HOME\"")
  79 if      [[ $x != '"'$HOME'"' ]]
  80 then    err_exit "nested double quotes failed"
  81 fi
  82 : ${z="a{b}c"}
  83 if      [[ $z != 'a{b}c' ]]
  84 then    err_exit '${z="a{b}c"} not correct'
  85 fi
  86 unset z
  87 : "${z="a{b}c"}"
  88 if      [[ $z != 'a{b}c' ]]
  89 then    err_exit '"${z="a{b}c"}" not correct'
  90 fi
  91 if      [[ $(print -r -- "a\*b") !=  'a\*b' ]]
  92 then    err_exit '$(print -r -- "a\*b") differs from  a\*b'
  93 fi
  94 unset x
  95 if      [[ $(print -r -- "a\*b$x") !=  'a\*b' ]]
  96 then    err_exit '$(print -r -- "a\*b$x") differs from  a\*b'
  97 fi
  98 x=hello
  99 set -- ${x+foo bar bam}
 100 if      (( $# !=3 ))
 101 then    err_exit '${x+foo bar bam} does not yield three arguments'
 102 fi
 103 set -- ${x+foo "bar bam"}
 104 if      (( $# !=2 ))
 105 then    err_exit '${x+foo "bar bam"} does not yield two arguments'
 106 fi
 107 set -- ${x+foo 'bar bam'}
 108 if      (( $# !=2 ))
 109 then    err_exit '${x+foo '\''bar bam'\''} does not yield two arguments'
 110 fi
 111 set -- ${x+foo $x bam}
 112 if      (( $# !=3 ))
 113 then    err_exit '${x+foo $x bam} does not yield three arguments'
 114 fi
 115 set -- ${x+foo "$x" bam}
 116 if      (( $# !=3 ))
 117 then    err_exit '${x+foo "$x" bam} does not yield three arguments'
 118 fi
 119 set -- ${x+"foo $x bam"}
 120 if      (( $# !=1 ))
 121 then    err_exit '${x+"foo $x bam"} does not yield one argument'
 122 fi
 123 set -- "${x+foo $x bam}"
 124 if      (( $# !=1 ))
 125 then    err_exit '"${x+foo $x bam}" does not yield one argument'
 126 fi
 127 set -- ${x+foo "$x "bam}
 128 if      (( $# !=2 ))
 129 then    err_exit '${x+foo "$x "bam} does not yield two arguments'
 130 fi
 131 x="ab$'cd"
 132 if      [[ $x != 'ab$'"'cd" ]]
 133 then    err_exit '$'"' inside double quotes not working"
 134 fi
 135 x=`print 'ab$'`
 136 if      [[ $x != 'ab$' ]]
 137 then    err_exit '$'"' inside `` quotes not working"
 138 fi
 139 unset a
 140 x=$(print -r -- "'\
 141 \
 142 ")
 143 if      [[ $x != "'" ]]
 144 then    err_exit 'line continuation in double strings not working'
 145 fi
 146 x=$(print -r -- "'\
 147 $a\
 148 ")
 149 if      [[ $x != "'" ]]
 150 then    err_exit 'line continuation in expanded double strings not working'
 151 fi
 152 x='\*'
 153 if      [[ $(print -r -- $x) != '\*' ]]
 154 then    err_exit 'x="\\*";$x != \*'
 155 fi
 156 x='   hello    world    '
 157 set -- $x
 158 if      (( $# != 2 ))
 159 then    err_exit 'field splitting error'
 160 fi
 161 x=$(print -r -- '1234567890123456789012345678901234567890123456789012345678901234567890 \
 162 1234567890123456789012345678901234567890123456789012345678901234567890 \
 163 1234567890123456789012345678901234567890123456789012345678901234567890 \
 164 1234567890123456789012345678901234567890123456789012345678901234567890 \
 165 1234567890123456789012345678901234567890123456789012345678901234567890 \
 166 1234567890123456789012345678901234567890123456789012345678901234567890 \
 167 1234567890123456789012345678901234567890123456789012345678901234567890 \
 168 1234567890123456789012345678901234567890123456789012345678901234567890 \
 169 1234567890123456789012345678901234567890123456789012345678901234567890 \
 170 1234567890123456789012345678901234567890123456789012345678901234567890 \
 171 1234567890123456789012345678901234567890123456789012345678901234567890 \
 172 1234567890123456789012345678901234567890123456789012345678901234567890 \
 173 1234567890123456789012345678901234567890123456789012345678901234567890 \
 174 1234567890123456789012345678901234567890123456789012345678901234567890 \
 175 1234567890123456789012345678901234567890123456789012345678901234567890')
 176 if      (( ${#x} != (15*73-3) ))
 177 then    err_exit "length of x, ${#x}, is incorrect should be $((15*73-3))"
 178 fi
 179 x='$hi'
 180 if      [[ $x\$ != '$hi$' ]]
 181 then    err_exit ' $x\$, with x=$hi, does not expand to $hi$'
 182 fi
 183 if      [[ $x$ != '$hi$' ]]
 184 then    err_exit ' $x$, with x=$hi, does not expand to $hi$'
 185 fi
 186 set -- $(/bin/echo foo;sleep 1;/bin/echo bar)
 187 if      [[ $# != 2 ]]
 188 then    err_exit 'word splitting after command substitution not working'
 189 fi
 190 unset q
 191 if      [[ "${q:+'}q${q:+'}" != q ]]
 192 then    err_exit 'expansion of "{q:+'\''}" not correct when q unset'
 193 fi
 194 q=1
 195 if      [[ "${q:+'}q${q:+'}" != "'q'" ]]
 196 then    err_exit 'expansion of "{q:+'\''}" not correct when q set'
 197 fi
 198 x=$'x\' #y'
 199 if      [[ $x != "x' #y" ]]
 200 then    err_exit "$'x\' #y'" not working
 201 fi
 202 x=$q$'x\' #y'
 203 if      [[ $x != "1x' #y" ]]
 204 then    err_exit "$q$'x\' #y'" not working
 205 fi
 206 IFS=,
 207 x='a,b\,c,d'
 208 set -- $x
 209 if      [[ $2 != 'b\' ]]
 210 then    err_exit "field splitting of $x with IFS=$IFS not working"
 211 fi
 212 foo=bar
 213 bar=$(print -r -- ${foo+\\n\ })
 214 if      [[ $bar != '\n ' ]]
 215 then    err_exit '${foo+\\n\ } expansion error'
 216 fi
 217 unset bar
 218 bar=$(print -r -- ${foo+\\n\ $bar})
 219 if      [[ $bar != '\n ' ]]
 220 then    err_exit '${foo+\\n\ $bar} expansion error with bar unset'
 221 fi
 222 x='\\(..\\)|&\|\|\\&\\|'
 223 if      [[ $(print -r -- $x) != "$x" ]]
 224 then    err_exit '$x, where x=\\(..\\)|&\|\|\\&\\| not working'
 225 fi
 226 x='\\('
 227 if      [[ $(print -r -- a${x}b) != a"${x}"b ]]
 228 then    err_exit 'a${x}b, where x=\\( not working'
 229 fi
 230 x=
 231 if      [[ $(print -r -- $x'\\1') != '\\1' ]]
 232 then    err_exit 'backreference inside single quotes broken'
 233 fi
 234 set -- ''
 235 set -- "$@"
 236 if      (( $# != 1 ))
 237 then    err_exit '"$@" not preserving nulls'
 238 fi
 239 x=
 240 if      [[ $(print -r s"!\2${x}\1\a!") != 's!\2\1\a!' ]]
 241 then    err_exit  'print -r s"!\2${x}\1\a!" not equal s!\2\1\a!'
 242 fi
 243 if      [[ $(print -r $'foo\n\n\n') != foo ]]
 244 then    err_exit 'trailing newlines on comsubstitution not removed'
 245 fi
 246 unset x
 247 if      [[ ${x:='//'} != '//' ]]
 248 then    err_exit '${x:='//'} != "//"'
 249 fi
 250 if      [[ $(print -r "\"hi$\"")        != '"hi$"' ]]
 251 then    err_exit '$\ not correct inside ""'
 252 fi
 253 unset x
 254 if      [[ "${x-a\}b}" != 'a}b' ]]
 255 then    err_exit '"${x-a\}b}" !=  "a}b"'
 256 fi
 257 if      [[ "\}\]$x\*\{\[\\" != '\}\]\*\{\[\' ]]
 258 then    err_exit '"\}\]$x\*\{\[\\" !=  "\}\]\*\{\[\"'
 259 fi
 260 foo=yes
 261 if      [[ $(print -r -- {\$foo}) != '{$foo}' ]]
 262 then    err_exit '{\$foo}' not expanded correctly
 263 fi
 264 [[ foo == $(
 265 ###########################################################
 266 ###########################################################
 267 ###########################################################
 268 ###########################################################
 269 ###########################################################
 270 ###########################################################
 271 ###########################################################
 272 ###########################################################
 273 ###########################################################
 274 ###########################################################
 275 ###########################################################
 276 ###########################################################
 277 ###########################################################
 278 ###########################################################
 279 ###########################################################
 280 ###########################################################
 281 ###########################################################
 282 ###########################################################
 283 ###########################################################
 284 ###########################################################
 285 ###########################################################
 286 ###########################################################
 287 ###########################################################
 288 ###########################################################
 289 ###########################################################
 290 ###########################################################
 291 ###########################################################
 292 ###########################################################
 293 ###########################################################
 294 ###########################################################
 295 ###########################################################
 296 ###########################################################
 297 ###########################################################
 298 ###########################################################
 299 ###########################################################
 300 ###########################################################
 301 ###########################################################
 302 ###########################################################
 303 print foo) ]] || err_exit "command subsitution with long comments broken"
 304 subject='some/other/words'
 305 re='(?*)/(?*)/(?*)'
 306 [[ ${subject/${re}/\3} != words ]] && err_exit 'string replacement with \3 not working'
 307 [[ ${subject/${re}/'\3'} != '\3' ]] && err_exit 'string replacement with '"'\3'"' not working'
 308 [[ ${subject/${re}/"\\3"} != '\3' ]] && err_exit 'string replacement with "\\3" not working'
 309 [[ ${subject/${re}/"\3"} != '\3' ]] && err_exit 'string replacement with "\3" not working'
 310 string='\3'
 311 [[ ${subject/${re}/${string}} != words ]] && err_exit 'string replacement with $string not working with string=\3'
 312 [[ $(print -r "${subject/${re}/${string}}") != words ]] && err_exit 'string replacement with $string not working with string=\3 using print'
 313 [[ ${subject/${re}/"${string}"} != '\3' ]] && err_exit 'string replacement with "$string" not working with  string=\3'
 314 [[ $(print -r "${subject/${re}/"${string}"}") != '\3' ]] && err_exit 'string replacement with "$string" not working with  string=\3 using print'
 315 string='\\3'
 316 [[ ${subject/${re}/${string}} != '\3' ]] && err_exit 'string replacement with $string not working with string=\\3'
 317 [[ ${subject/${re}/"${string}"} != '\\3' ]] && err_exit 'string replacement with "$string" not working with  string=\\3'
 318 [[ ${subject/${re}/\4} != '\4' ]] && err_exit 'string replacement with \4 not working'
 319 [[ ${subject/${re}/'\4'} != '\4' ]] && err_exit 'string replacement with '\4' not working'
 320 string='\4'
 321 [[ ${subject/${re}/${string}} != '\4' ]] && err_exit 'string replacement with $string not working with string=\4'
 322 [[ ${subject/${re}/"${string}"} != '\4' ]] && err_exit 'string replacement with "$string" not working with  string=\4'
 323 string='&foo'
 324 [[ ${subject/${re}/${string}} != '&foo' ]] && err_exit 'string replacement with $string not working with string=&foo'
 325 [[ ${subject/${re}/"${string}"} != '&foo' ]] && err_exit 'string replacement with "$string" not working with  string=&foo'
 326 {
 327 x=x
 328 x=${x:-`id | sed 's/^[^(]*(\([^)]*\)).*/\1/'`}
 329 } 2> /dev/null || err_exit 'skipping over `` failed'
 330 [[ $x == x ]] || err_exit 'assignment ${x:=`...`} failed'
 331 [[ $($SHELL -c 'print a[') == 'a[' ]] || err_exit "unbalanced '[' in command arg fails"
 332 $SHELL -c $'false && (( `wc -l /dev/null | nawk \'{print $1}\'` > 2 )) && true;:' 2> /dev/null ||  err_exit 'syntax error with ` in arithmetic expression'
 333 { $SHELL  -c '((  1`: "{ }"` ))' ;} 2> /dev/null || err_exit 'problem with ` inside (())'
 334 varname=foobarx
 335 x=`print '"\$'${varname}'"'`
 336 [[ $x == '"$foobarx"' ]] ||  err_exit $'\\$\' not handled correctly inside ``'
 337 
 338 copy1=5 copynum=1
 339 foo="`eval echo "$"{copy$copynum"-0}"`"
 340 [[ $foo == "$copy1" ]] || err_exit '$"..." not being ignored inside ``'
 341 
 342 exit $((Errors))