compExpr.test
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:16k
源码类别:

通讯编程

开发平台:

Visual C++

  1. # This file contains a collection of tests for the procedures in the
  2. # file tclCompExpr.c.  Sourcing this file into Tcl runs the tests and
  3. # generates output for errors.  No output means no errors were found.
  4. #
  5. # Copyright (c) 1997 Sun Microsystems, Inc.
  6. # Copyright (c) 1998-1999 by Scriptics Corporation.
  7. #
  8. # See the file "license.terms" for information on usage and redistribution
  9. # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  10. #
  11. # RCS: @(#) $Id: compExpr.test,v 1.6 2001/12/06 10:59:17 dkf Exp $
  12. if {[lsearch [namespace children] ::tcltest] == -1} {
  13.     package require tcltest
  14.     namespace import -force ::tcltest::*
  15. }
  16. if {([catch {expr T1()} msg] == 1) && ($msg == {unknown math function "T1"})} {
  17.     set gotT1 0
  18.     puts "This application hasn't been compiled with the "T1" and"
  19.     puts ""T2" math functions, so I'll skip some of the expr tests."
  20. } else {
  21.     set gotT1 1
  22. }
  23. catch {unset a}
  24. test compExpr-1.1 {TclCompileExpr procedure, successful expr parse and compile} {
  25.     expr 1+2
  26. } 3
  27. test compExpr-1.2 {TclCompileExpr procedure, error parsing expr} {
  28.     list [catch {expr 1+2+} msg] $msg
  29. } {1 {syntax error in expression "1+2+": premature end of expression}}
  30. test compExpr-1.3 {TclCompileExpr procedure, error compiling expr} {
  31.     list [catch {expr "foo(123)"} msg] $msg
  32. } {1 {unknown math function "foo"}}
  33. test compExpr-1.4 {TclCompileExpr procedure, expr has no operators} {
  34.     set a {000123}
  35.     expr {$a}
  36. } 83
  37. test compExpr-2.1 {CompileSubExpr procedure, TCL_TOKEN_WORD parse token} {
  38.     catch {unset a}
  39.     set a 27
  40.     expr {"foo$a" < "bar"}
  41. } 0
  42. test compExpr-2.2 {CompileSubExpr procedure, error compiling TCL_TOKEN_WORD parse token} {
  43.     list [catch {expr {"00[expr 1+]" + 17}} msg] $msg
  44. } {1 {syntax error in expression "1+": premature end of expression}}
  45. test compExpr-2.3 {CompileSubExpr procedure, TCL_TOKEN_TEXT parse token} {
  46.     expr {{12345}}
  47. } 12345
  48. test compExpr-2.4 {CompileSubExpr procedure, empty TCL_TOKEN_TEXT parse token} {
  49.     expr {{}}
  50. } {}
  51. test compExpr-2.5 {CompileSubExpr procedure, TCL_TOKEN_BS parse token} {
  52.     expr "{  \
  53.  +123 }"
  54. } 123
  55. test compExpr-2.6 {CompileSubExpr procedure, TCL_TOKEN_COMMAND parse token} {
  56.     expr {[info tclversion] != ""}
  57. } 1
  58. test compExpr-2.7 {CompileSubExpr procedure, TCL_TOKEN_COMMAND parse token} {
  59.     expr {[]}
  60. } {}
  61. test compExpr-2.8 {CompileSubExpr procedure, error in TCL_TOKEN_COMMAND parse token} {
  62.     list [catch {expr {[foo "bar"xxx] + 17}} msg] $msg
  63. } {1 {extra characters after close-quote}}
  64. test compExpr-2.9 {CompileSubExpr procedure, TCL_TOKEN_VARIABLE parse token} {
  65.     catch {unset a}
  66.     set a 123
  67.     expr {$a*2}
  68. } 246
  69. test compExpr-2.10 {CompileSubExpr procedure, TCL_TOKEN_VARIABLE parse token} {
  70.     catch {unset a}
  71.     catch {unset b}
  72.     set a(george) martha
  73.     set b geo
  74.     expr {$a(${b}rge)}
  75. } martha
  76. test compExpr-2.11 {CompileSubExpr procedure, error in TCL_TOKEN_VARIABLE parse token} {
  77.     catch {unset a}
  78.     list [catch {expr {$a + 17}} msg] $msg
  79. } {1 {can't read "a": no such variable}}
  80. test compExpr-2.12 {CompileSubExpr procedure, TCL_TOKEN_SUB_EXPR parse token} {
  81.     expr {27||3? 3<<(1+4) : 4&&9}
  82. } 96
  83. test compExpr-2.13 {CompileSubExpr procedure, error in TCL_TOKEN_SUB_EXPR parse token} {
  84.     catch {unset a}
  85.     set a 15
  86.     list [catch {expr {27 || "$a[expr 1+]00"}} msg] $msg
  87. } {1 {syntax error in expression "1+": premature end of expression}}
  88. test compExpr-2.14 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, op found} {
  89.     expr {5*6}
  90. } 30
  91. test compExpr-2.15 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, math function found} {
  92.     format %.6g [expr {sin(2.0)}]
  93. } 0.909297
  94. test compExpr-2.16 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, math function not found} {
  95.     list [catch {expr {fred(2.0)}} msg] $msg
  96. } {1 {unknown math function "fred"}}
  97. test compExpr-2.17 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, normal operator} {
  98.     expr {4*2}
  99. } 8
  100. test compExpr-2.18 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, normal operator} {
  101.     expr {4/2}
  102. } 2
  103. test compExpr-2.19 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, normal operator} {
  104.     expr {4%2}
  105. } 0
  106. test compExpr-2.20 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, normal operator} {
  107.     expr {4<<2}
  108. } 16
  109. test compExpr-2.21 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, normal operator} {
  110.     expr {4>>2}
  111. } 1
  112. test compExpr-2.22 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, normal operator} {
  113.     expr {4<2}
  114. } 0
  115. test compExpr-2.23 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, normal operator} {
  116.     expr {4>2}
  117. } 1
  118. test compExpr-2.24 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, normal operator} {
  119.     expr {4<=2}
  120. } 0
  121. test compExpr-2.25 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, normal operator} {
  122.     expr {4>=2}
  123. } 1
  124. test compExpr-2.26 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, normal operator} {
  125.     expr {4==2}
  126. } 0
  127. test compExpr-2.27 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, normal operator} {
  128.     expr {4!=2}
  129. } 1
  130. test compExpr-2.28 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, normal operator} {
  131.     expr {4&2}
  132. } 0
  133. test compExpr-2.29 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, normal operator} {
  134.     expr {4^2}
  135. } 6
  136. test compExpr-2.30 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, normal operator} {
  137.     expr {4|2}
  138. } 6
  139. test compExpr-2.31 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, normal operator, 1 operand} {
  140.     expr {!4}
  141. } 0
  142. test compExpr-2.32 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, normal operator, 1 operand} {
  143.     expr {~4}
  144. } -5
  145. test compExpr-2.33 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, normal operator, comparison} {
  146.     catch {unset a}
  147.     set a 15
  148.     expr {$a==15}  ;# compiled out-of-line to runtime call on Tcl_ExprObjCmd
  149. } 1
  150. test compExpr-2.34 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, special operator} {
  151.     expr {+2}
  152. } 2
  153. test compExpr-2.35 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, error in special operator} {
  154.     list [catch {expr {+[expr 1+]}} msg] $msg
  155. } {1 {syntax error in expression "1+": premature end of expression}}
  156. test compExpr-2.36 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, special operator} {
  157.     expr {4+2}
  158. } 6
  159. test compExpr-2.37 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, error in special operator} {
  160.     list [catch {expr {[expr 1+]+5}} msg] $msg
  161. } {1 {syntax error in expression "1+": premature end of expression}}
  162. test compExpr-2.38 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, error in special operator} {
  163.     list [catch {expr {5+[expr 1+]}} msg] $msg
  164. } {1 {syntax error in expression "1+": premature end of expression}}
  165. test compExpr-2.39 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, special operator} {
  166.     expr {-2}
  167. } -2
  168. test compExpr-2.40 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, special operator} {
  169.     expr {4-2}
  170. } 2
  171. test compExpr-2.41 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, special operator} {
  172.     catch {unset a}
  173.     set a true
  174.     expr {0||$a}
  175. } 1
  176. test compExpr-2.42 {CompileSubExpr procedure, error in TCL_TOKEN_SUB_EXPR parse token} {
  177.     catch {unset a}
  178.     set a 15
  179.     list [catch {expr {27 || "$a[expr 1+]00"}} msg] $msg
  180. } {1 {syntax error in expression "1+": premature end of expression}}
  181. test compExpr-2.43 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, special operator} {
  182.     catch {unset a}
  183.     set a false
  184.     expr {3&&$a}
  185. } 0
  186. test compExpr-2.44 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, special operator} {
  187.     catch {unset a}
  188.     set a false
  189.     expr {$a||1? 1 : 0}
  190. } 1
  191. test compExpr-2.45 {CompileSubExpr procedure, error in TCL_TOKEN_SUB_EXPR parse token} {
  192.     catch {unset a}
  193.     set a 15
  194.     list [catch {expr {1? 54 : "$a[expr 1+]00"}} msg] $msg
  195. } {1 {syntax error in expression "1+": premature end of expression}}
  196. test compExpr-3.1 {CompileLandOrLorExpr procedure, numeric 1st operand} {
  197.     catch {unset a}
  198.     set a 2
  199.     expr {[set a]||0}
  200. } 1
  201. test compExpr-3.2 {CompileLandOrLorExpr procedure, nonnumeric 1st operand} {
  202.     catch {unset a}
  203.     set a no
  204.     expr {$a&&1}
  205. } 0
  206. test compExpr-3.3 {CompileSubExpr procedure, error in 1st operand} {
  207.     list [catch {expr {[expr *2]||0}} msg] $msg
  208. } {1 {syntax error in expression "*2": unexpected operator *}}
  209. test compExpr-3.4 {CompileLandOrLorExpr procedure, result is 1 or 0} {
  210.     catch {unset a}
  211.     catch {unset b}
  212.     set a no
  213.     set b true
  214.     expr {$a || $b}
  215. } 1
  216. test compExpr-3.5 {CompileLandOrLorExpr procedure, short-circuit semantics} {
  217.     catch {unset a}
  218.     set a yes
  219.     expr {$a || [exit]}
  220. } 1
  221. test compExpr-3.6 {CompileLandOrLorExpr procedure, short-circuit semantics} {
  222.     catch {unset a}
  223.     set a no
  224.     expr {$a && [exit]}
  225. } 0
  226. test compExpr-3.7 {CompileLandOrLorExpr procedure, numeric 2nd operand} {
  227.     catch {unset a}
  228.     set a 2
  229.     expr {0||[set a]}
  230. } 1
  231. test compExpr-3.8 {CompileLandOrLorExpr procedure, nonnumeric 2nd operand} {
  232.     catch {unset a}
  233.     set a no
  234.     expr {1&&$a}
  235. } 0
  236. test compExpr-3.9 {CompileLandOrLorExpr procedure, error in 2nd operand} {
  237.     list [catch {expr {0||[expr %2]}} msg] $msg
  238. } {1 {syntax error in expression "%2": unexpected operator %}}
  239. test compExpr-3.10 {CompileLandOrLorExpr procedure, long lor/land arm} {
  240.     set a "abcdefghijkl"
  241.     set i 7
  242.     expr {[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]] || [string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]] || [string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]] || [string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]}
  243. } 1
  244. test compExpr-4.1 {CompileCondExpr procedure, simple test} {
  245.     catch {unset a}
  246.     set a 2
  247.     expr {($a > 1)? "ok" : "nope"}
  248. } ok
  249. test compExpr-4.2 {CompileCondExpr procedure, complex test, convert to numeric} {
  250.     catch {unset a}
  251.     set a no
  252.     expr {[set a]? 27 : -54}
  253. } -54
  254. test compExpr-4.3 {CompileCondExpr procedure, error in test} {
  255.     list [catch {expr {[expr *2]? +1 : -1}} msg] $msg
  256. } {1 {syntax error in expression "*2": unexpected operator *}}
  257. test compExpr-4.4 {CompileCondExpr procedure, simple "true" clause} {
  258.     catch {unset a}
  259.     set a no
  260.     expr {1? (27-2) : -54}
  261. } 25
  262. test compExpr-4.5 {CompileCondExpr procedure, convert "true" clause to numeric} {
  263.     catch {unset a}
  264.     set a no
  265.     expr {1? $a : -54}
  266. } no
  267. test compExpr-4.6 {CompileCondExpr procedure, error in "true" clause} {
  268.     list [catch {expr {1? [expr *2] : -127}} msg] $msg
  269. } {1 {syntax error in expression "*2": unexpected operator *}}
  270. test compExpr-4.7 {CompileCondExpr procedure, simple "false" clause} {
  271.     catch {unset a}
  272.     set a no
  273.     expr {(2-2)? -3.14159 : "nope"}
  274. } nope
  275. test compExpr-4.8 {CompileCondExpr procedure, convert "false" clause to numeric} {
  276.     catch {unset a}
  277.     set a 00123
  278.     expr {0? 42 : $a}
  279. } 83
  280. test compExpr-4.9 {CompileCondExpr procedure, error in "false" clause} {
  281.     list [catch {expr {1? 15 : [expr *2]}} msg] $msg
  282. } {1 {syntax error in expression "*2": unexpected operator *}}
  283. test compExpr-5.1 {CompileMathFuncCall procedure, math function found} {
  284.     format %.6g [expr atan2(1.0, 2.0)]
  285. } 0.463648
  286. test compExpr-5.2 {CompileMathFuncCall procedure, math function not found} {
  287.     list [catch {expr {do_it()}} msg] $msg
  288. } {1 {unknown math function "do_it"}}
  289. if $gotT1 {
  290.     test compExpr-5.3 {CompileMathFuncCall: call registered math function} {
  291. expr 3*T1()-1
  292.     } 368
  293.     test compExpr-5.4 {CompileMathFuncCall: call registered math function} {
  294. expr T2()*3
  295.     } 1035
  296. }
  297. test compExpr-5.5 {CompileMathFuncCall procedure, too few arguments} {
  298.     list [catch {expr {atan2(1.0)}} msg] $msg
  299. } {1 {too few arguments for math function}}
  300. test compExpr-5.6 {CompileMathFuncCall procedure, complex argument} {
  301.     format %.6g [expr pow(2.1, 27.5-(24.4*(5%2)))]
  302. } 9.97424
  303. test compExpr-5.7 {CompileMathFuncCall procedure, error in argument} {
  304.     list [catch {expr {sinh(2.*)}} msg] $msg
  305. } {1 {syntax error in expression "sinh(2.*)": unexpected close parenthesis}}
  306. test compExpr-5.8 {CompileMathFuncCall procedure, too many arguments} {
  307.     list [catch {expr {sinh(2.0, 3.0)}} msg] $msg
  308. } {1 {too many arguments for math function}}
  309. test compExpr-5.9 {CompileMathFuncCall procedure, too many arguments} {
  310.     list [catch {expr {0 <= rand(5.2)}} msg] $msg
  311. } {1 {too many arguments for math function}}
  312. test compExpr-6.1 {LogSyntaxError procedure, error in expr longer than 60 chars} {
  313.     list [catch {expr {(+0123456)*(+0123456)*(+0123456)*(+0123456)*(+0123456)*(+0123456)*(+0123456)/} -1 foo 3} msg] $msg
  314. } {1 {syntax error in expression "(+0123456)*(+0123456)*(+0123456)*(+0123456)*(+0123456)*(+012...": extra tokens at end of expression}}
  315. # cleanup
  316. catch {unset a}
  317. catch {unset b}
  318. ::tcltest::cleanupTests
  319. return