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

通讯编程

开发平台:

Visual C++

  1. # Commands covered:  set (plus basic command syntax).  Also tests the
  2. # procedures in the file tclOldParse.c.  This set of tests is an old
  3. # one that predates the new parser in Tcl 8.1.
  4. #
  5. # This file contains a collection of tests for one or more of the Tcl
  6. # built-in commands.  Sourcing this file into Tcl runs the tests and
  7. # generates output for errors.  No output means no errors were found.
  8. #
  9. # Copyright (c) 1991-1993 The Regents of the University of California.
  10. # Copyright (c) 1994-1996 Sun Microsystems, Inc.
  11. # Copyright (c) 1998-1999 by Scriptics Corporation.
  12. #
  13. # See the file "license.terms" for information on usage and redistribution
  14. # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  15. #
  16. # RCS: @(#) $Id: parseOld.test,v 1.11.2.1 2003/03/27 13:49:22 dkf Exp $
  17. if {[lsearch [namespace children] ::tcltest] == -1} {
  18.     package require tcltest
  19.     namespace import -force ::tcltest::*
  20. }
  21. tcltest::testConstraint testwordend 
  22. [string equal "testwordend" [info commands testwordend]]
  23. # Save the argv value for restoration later
  24. set savedArgv $argv
  25. proc fourArgs {a b c d} {
  26.     global arg1 arg2 arg3 arg4
  27.     set arg1 $a
  28.     set arg2 $b
  29.     set arg3 $c
  30.     set arg4 $d
  31. }
  32. proc getArgs args {
  33.     global argv
  34.     set argv $args
  35. }
  36. # Basic argument parsing.
  37. test parseOld-1.1 {basic argument parsing} {
  38.     set arg1 {}
  39.     fourArgs a b c   d
  40.     list $arg1 $arg2 $arg3 $arg4
  41. } {a b c d}
  42. test parseOld-1.2 {basic argument parsing} {
  43.     set arg1 {}
  44.     eval "fourArgs 123v4f56r7890"
  45.     list $arg1 $arg2 $arg3 $arg4
  46. } {123 4 56 7890}
  47. # Quotes.
  48. test parseOld-2.1 {quotes and variable-substitution} {
  49.     getArgs "a b c" d
  50.     set argv
  51. } {{a b c} d}
  52. test parseOld-2.2 {quotes and variable-substitution} {
  53.     set a 101
  54.     getArgs "a$a b c"
  55.     set argv
  56. } {{a101 b c}}
  57. test parseOld-2.3 {quotes and variable-substitution} {
  58.     set argv "xy[format xabc]"
  59.     set argv
  60. } {xyxabc}
  61. test parseOld-2.4 {quotes and variable-substitution} {
  62.     set argv "xyt"
  63.     set argv
  64. } xyt
  65. test parseOld-2.5 {quotes and variable-substitution} {
  66.     set argv "a b c
  67. d e f"
  68.     set argv
  69. } a btcnd e f
  70. test parseOld-2.6 {quotes and variable-substitution} {
  71.     set argv a"bcd"e
  72.     set argv
  73. } {a"bcd"e}
  74. # Braces.
  75. test parseOld-3.1 {braces} {
  76.     getArgs {a b c} d
  77.     set argv
  78. } "{a b c} d"
  79. test parseOld-3.2 {braces} {
  80.     set a 101
  81.     set argv {a$a b c}
  82.     set b [string index $argv 1]
  83.     set b
  84. } {$}
  85. test parseOld-3.3 {braces} {
  86.     set argv {a[format xyz] b}
  87.     string length $argv
  88. } 15
  89. test parseOld-3.4 {braces} {
  90.     set argv {anb}}
  91.     string length $argv
  92. } 6
  93. test parseOld-3.5 {braces} {
  94.     set argv {{{{}}}}
  95.     set argv
  96. } "{{{}}}"
  97. test parseOld-3.6 {braces} {
  98.     set argv a{{}}b
  99.     set argv
  100. } "a{{}}b"
  101. test parseOld-3.7 {braces} {
  102.     set a [format "last]"]
  103.     set a
  104. } {last]}
  105. # Command substitution.
  106. test parseOld-4.1 {command substitution} {
  107.     set a [format xyz]
  108.     set a
  109. } xyz
  110. test parseOld-4.2 {command substitution} {
  111.     set a a[format xyz]b[format q]
  112.     set a
  113. } axyzbq
  114. test parseOld-4.3 {command substitution} {
  115.     set a a[
  116. set b 22;
  117. format %s $b
  118. ]b
  119.     set a
  120. } a22b
  121. test parseOld-4.4 {command substitution} {
  122.     set a 7.7
  123.     if [catch {expr int($a)}] {set a foo}
  124.     set a
  125. } 7.7
  126. # Variable substitution.
  127. test parseOld-5.1 {variable substitution} {
  128.     set a 123
  129.     set b $a
  130.     set b
  131. } 123
  132. test parseOld-5.2 {variable substitution} {
  133.     set a 345
  134.     set b x$a.b
  135.     set b
  136. } x345.b
  137. test parseOld-5.3 {variable substitution} {
  138.     set _123z xx
  139.     set b $_123z^
  140.     set b
  141. } xx^
  142. test parseOld-5.4 {variable substitution} {
  143.     set a 78
  144.     set b a${a}b
  145.     set b
  146. } a78b
  147. test parseOld-5.5 {variable substitution} {catch {$_non_existent_} msg} 1
  148. test parseOld-5.6 {variable substitution} {
  149.     catch {$_non_existent_} msg
  150.     set msg
  151. } {can't read "_non_existent_": no such variable}
  152. test parseOld-5.7 {array variable substitution} {
  153.     catch {unset a}
  154.     set a(xyz) 123
  155.     set b $a(xyz)foo
  156.     set b
  157. } 123foo
  158. test parseOld-5.8 {array variable substitution} {
  159.     catch {unset a}
  160.     set "a(x y z)" 123
  161.     set b $a(x y z)foo
  162.     set b
  163. } 123foo
  164. test parseOld-5.9 {array variable substitution} {
  165.     catch {unset a}; catch {unset qqq}
  166.     set "a(x y z)" qqq
  167.     set $a([format x] y [format z]) foo
  168.     set qqq
  169. } foo
  170. test parseOld-5.10 {array variable substitution} {
  171.     catch {unset a}
  172.     list [catch {set b $a(22)} msg] $msg
  173. } {1 {can't read "a(22)": no such variable}}
  174. test parseOld-5.11 {array variable substitution} {
  175.     set b a$!
  176.     set b
  177. } {a$!}
  178. test parseOld-5.12 {empty array name support} {
  179.     list [catch {set b a$()} msg] $msg
  180. } {1 {can't read "()": no such variable}}
  181. catch {unset a}
  182. test parseOld-5.13 {array variable substitution} {
  183.     catch {unset a}
  184.     set long {This is a very long variable, long enough to cause storage 
  185. allocation to occur in Tcl_ParseVar.  If that storage isn't getting 
  186. freed up correctly, then a core leak will occur when this test is 
  187. run.  This text is probably beginning to sound like drivel, but I've 
  188. run out of things to say and I need more characters still.}
  189.     set a($long) 777
  190.     set b $a($long)
  191.     list $b [array names a]
  192. } {777 {{This is a very long variable, long enough to cause storage 
  193. allocation to occur in Tcl_ParseVar.  If that storage isn't getting 
  194. freed up correctly, then a core leak will occur when this test is 
  195. run.  This text is probably beginning to sound like drivel, but I've 
  196. run out of things to say and I need more characters still.}}}
  197. test parseOld-5.14 {array variable substitution} {
  198.     catch {unset a}; catch {unset b}; catch {unset a1}
  199.     set a1(22) foo
  200.     set a(foo) bar
  201.     set b $a($a1(22))
  202.     set b
  203. } bar
  204. catch {unset a}; catch {unset a1}
  205. test parseOld-7.1 {backslash substitution} {
  206.     set a "acn]}"
  207.     string length $a
  208. } 5
  209. test parseOld-7.2 {backslash substitution} {
  210.     set a {acn]}}
  211.     string length $a
  212. } 10
  213. test parseOld-7.3 {backslash substitution} {
  214.     set a "abc
  215. def"
  216.     set a
  217. } {abc def}
  218. test parseOld-7.4 {backslash substitution} {
  219.     set a {abc
  220. def}
  221.     set a
  222. } {abc def}
  223. test parseOld-7.5 {backslash substitution} {
  224.     set msg {}
  225.     set a xxx
  226.     set error [catch {if {24 < 
  227. 35} {set a 22} {set 
  228.     a 33}} msg]
  229.     list $error $msg $a
  230. } {0 22 22}
  231. test parseOld-7.6 {backslash substitution} {
  232.     eval "concat abc\"
  233. } "abc\"
  234. test parseOld-7.7 {backslash substitution} {
  235.     eval "concat \na"
  236. } "a"
  237. test parseOld-7.8 {backslash substitution} {
  238.     eval "concat x\n    a"
  239. } "x a"
  240. test parseOld-7.9 {backslash substitution} {
  241.     eval "concat \x"
  242. } "x"
  243. test parseOld-7.10 {backslash substitution} {
  244.     eval "list a b\nc d"
  245. } {a b c d}
  246. test parseOld-7.11 {backslash substitution} {
  247.     eval "list a "b c"\nd e"
  248. } {a {b c} d e}
  249. test parseOld-7.12 {backslash substitution} {
  250.     list ua2
  251. } [bytestring "xc2xa2"]
  252. test parseOld-7.13 {backslash substitution} {
  253.     list u4e21
  254. } [bytestring "xe4xb8xa1"]
  255. test parseOld-7.14 {backslash substitution} {
  256.     list u4e2k
  257. } [bytestring "xd3xa2k"]
  258. # Semi-colon.
  259. test parseOld-8.1 {semi-colons} {
  260.     set b 0
  261.     getArgs a;set b 2
  262.     set argv
  263. } a
  264. test parseOld-8.2 {semi-colons} {
  265.     set b 0
  266.     getArgs a;set b 2
  267.     set b
  268. } 2
  269. test parseOld-8.3 {semi-colons} {
  270.     getArgs a b ; set b 1
  271.     set argv
  272. } {a b}
  273. test parseOld-8.4 {semi-colons} {
  274.     getArgs a b ; set b 1
  275.     set b
  276. } 1
  277. # The following checks are to ensure that the interpreter's result
  278. # gets re-initialized by Tcl_Eval in all the right places.
  279. test parseOld-9.1 {result initialization} {concat abc} abc
  280. test parseOld-9.2 {result initialization} {concat abc; proc foo {} {}} {}
  281. test parseOld-9.3 {result initialization} {concat abc; proc foo {} $a} {}
  282. test parseOld-9.4 {result initialization} {proc foo {} [concat abc]} {}
  283. test parseOld-9.5 {result initialization} {concat abc; } abc
  284. test parseOld-9.6 {result initialization} {
  285.     eval {
  286.     concat abc
  287. }} abc
  288. test parseOld-9.7 {result initialization} {} {}
  289. test parseOld-9.8 {result initialization} {concat abc; ; ;} abc
  290. # Syntax errors.
  291. test parseOld-10.1 {syntax errors} {catch "set a {bcd" msg} 1
  292. test parseOld-10.2 {syntax errors} {
  293. catch "set a {bcd" msg
  294. set msg
  295. } {missing close-brace}
  296. test parseOld-10.3 {syntax errors} {catch {set a "bcd} msg} 1
  297. test parseOld-10.4 {syntax errors} {
  298. catch {set a "bcd} msg
  299. set msg
  300. } {missing "}
  301. #" Emacs formatting >:^(
  302. test parseOld-10.5 {syntax errors} {catch {set a "bcd"xy} msg} 1
  303. test parseOld-10.6 {syntax errors} {
  304. catch {set a "bcd"xy} msg
  305. set msg
  306. } {extra characters after close-quote}
  307. test parseOld-10.7 {syntax errors} {catch "set a {bcd}xy" msg} 1
  308. test parseOld-10.8 {syntax errors} {
  309. catch "set a {bcd}xy" msg
  310. set msg
  311. } {extra characters after close-brace}
  312. test parseOld-10.9 {syntax errors} {catch {set a [format abc} msg} 1
  313. test parseOld-10.10 {syntax errors} {
  314. catch {set a [format abc} msg
  315. set msg
  316. } {missing close-bracket}
  317. test parseOld-10.11 {syntax errors} {catch gorp-a-lot msg} 1
  318. test parseOld-10.12 {syntax errors} {
  319. catch gorp-a-lot msg
  320. set msg
  321. } {invalid command name "gorp-a-lot"}
  322. test parseOld-10.13 {syntax errors} {
  323.     set a [concat {a}
  324.  {b}]
  325.     set a
  326. } {a b}
  327. # The next test will fail on the Mac, 'cause the MSL uses a fixed sized
  328. # buffer for %d conversions (LAME!).  I won't leave the test out, however,
  329. # since MetroWerks may some day fix this.
  330. test parseOld-10.14 {syntax errors} {
  331.     list [catch {eval $x[format "%01000d" 0](} msg] $msg $errorInfo
  332. } {1 {missing )} {missing )
  333.     while executing
  334. "$x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000..."
  335.     ("eval" body line 1)
  336.     invoked from within
  337. "eval $x[format "%01000d" 0]("}}
  338. test parseOld-10.15 {syntax errors, missplaced braces} {
  339.     catch {
  340.         proc misplaced_end_brace {} {
  341.             set what foo
  342.             set when [expr ${what}size - [set off$what]}]
  343.     } msg
  344.     set msg
  345. } {extra characters after close-brace}
  346. test parseOld-10.16 {syntax errors, missplaced braces} {
  347.     catch {
  348.         set a {
  349.             set what foo
  350.             set when [expr ${what}size - [set off$what]}]
  351.     } msg
  352.     set msg
  353. } {extra characters after close-brace}
  354. test parseOld-10.17 {syntax errors, unusual spacing} {
  355.     list [catch {return [ [1]]} msg] $msg
  356. } {1 {invalid command name "1"}}
  357. # Long values (stressing storage management)
  358. set a {1111 2222 3333 4444 5555 6666 7777 8888 9999 aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii jjjj kkkk llll mmmm nnnn oooo pppp qqqq rrrr ssss tttt uuuu vvvv wwww xxxx yyyy zzzz AAAA BBBB CCCC DDDD EEEE FFFF GGGG HHHH}
  359. test parseOld-11.1 {long values} {
  360.     string length $a
  361. } 214
  362. test parseOld-11.2 {long values} {
  363.     llength $a
  364. } 43
  365. test parseOld-11.3 {long values} {
  366.     set b "1111 2222 3333 4444 5555 6666 7777 8888 9999 aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii jjjj kkkk llll mmmm nnnn oooo pppp qqqq rrrr ssss tttt uuuu vvvv wwww xxxx yyyy zzzz AAAA BBBB CCCC DDDD EEEE FFFF GGGG HHHH"
  367.     set b
  368. } $a
  369. test parseOld-11.4 {long values} {
  370.     set b "$a"
  371.     set b
  372. } $a
  373. test parseOld-11.5 {long values} {
  374.     set b [set a]
  375.     set b
  376. } $a
  377. test parseOld-11.6 {long values} {
  378.     set b [concat 1111 2222 3333 4444 5555 6666 7777 8888 9999 aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii jjjj kkkk llll mmmm nnnn oooo pppp qqqq rrrr ssss tttt uuuu vvvv wwww xxxx yyyy zzzz AAAA BBBB CCCC DDDD EEEE FFFF GGGG HHHH]
  379.     string length $b
  380. } 214
  381. test parseOld-11.7 {long values} {
  382.     set b [concat 1111 2222 3333 4444 5555 6666 7777 8888 9999 aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii jjjj kkkk llll mmmm nnnn oooo pppp qqqq rrrr ssss tttt uuuu vvvv wwww xxxx yyyy zzzz AAAA BBBB CCCC DDDD EEEE FFFF GGGG HHHH]
  383.     llength $b
  384. } 43
  385. test parseOld-11.8 {long values} {
  386.     set b
  387. } $a
  388. test parseOld-11.9 {long values} {
  389.     set a [concat 0000 1111 2222 3333 4444 5555 6666 7777 8888 9999 aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii jjjj kkkk llll mmmm nnnn oooo pppp qqqq rrrr ssss tttt uuuu vvvv wwww xxxx yyyy zzzz AAAA BBBB CCCC DDDD EEEE FFFF GGGG HHHH IIII JJJJ KKKK LLLL MMMM NNNN OOOO PPPP QQQQ RRRR SSSS TTTT UUUU VVVV WWWW XXXX YYYY ZZZZ]
  390.     llength $a
  391. } 62
  392. set i 0
  393. foreach j [concat 0000 1111 2222 3333 4444 5555 6666 7777 8888 9999 aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii jjjj kkkk llll mmmm nnnn oooo pppp qqqq rrrr ssss tttt uuuu vvvv wwww xxxx yyyy zzzz AAAA BBBB CCCC DDDD EEEE FFFF GGGG HHHH IIII JJJJ KKKK LLLL MMMM NNNN OOOO PPPP QQQQ RRRR SSSS TTTT UUUU VVVV WWWW XXXX YYYY ZZZZ] {
  394.     set test [string index 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ $i]
  395.     set test $test$test$test$test
  396.     test parseOld-11.10-[incr i] {long values} {
  397. set j
  398.     } $test
  399. }
  400. test parseOld-11.11 {test buffer overflow in backslashes in braces} {
  401.     expr {"a" == {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy101101101101101101101101101101101101101101101101101101101101101101101101101101}}
  402. } 0
  403. test parseOld-12.1 {comments} {
  404.     set a old
  405.     eval {  # set a new}
  406.     set a
  407. } {old}
  408. test parseOld-12.2 {comments} {
  409.     set a old
  410.     eval "  # set a newnset a new"
  411.     set a
  412. } {new}
  413. test parseOld-12.3 {comments} {
  414.     set a old
  415.     eval "  # set a new\nset a new"
  416.     set a
  417. } {old}
  418. test parseOld-12.4 {comments} {
  419.     set a old
  420.     eval "  # set a new\\nset a new"
  421.     set a
  422. } {new}
  423. test parseOld-13.1 {comments at the end of a bracketed script} {
  424.     set x "[
  425. expr 1+1
  426. # skip this!
  427. ]"
  428. } {2}
  429. test parseOld-14.1 {TclWordEnd procedure} {testwordend} {
  430.     testwordend "  n abc"
  431. } {c}
  432. test parseOld-14.2 {TclWordEnd procedure} {testwordend} {
  433.     testwordend "   \n"
  434. } {}
  435. test parseOld-14.3 {TclWordEnd procedure} {testwordend} {
  436.     testwordend "   \n "
  437. } { }
  438. test parseOld-14.4 {TclWordEnd procedure} {testwordend} {
  439.     testwordend {"abc"}
  440. } {"}
  441. #" Emacs formatting >:^(
  442. test parseOld-14.5 {TclWordEnd procedure} {testwordend} {
  443.     testwordend {{xyz}}
  444. } }
  445. test parseOld-14.6 {TclWordEnd procedure} {testwordend} {
  446.     testwordend {{a{}b{}}} xyz}
  447. } "} xyz"
  448. test parseOld-14.7 {TclWordEnd procedure} {testwordend} {
  449.     testwordend {abc[this is a]def ghi}
  450. } {f ghi}
  451. test parseOld-14.8 {TclWordEnd procedure} {testwordend} {
  452.     testwordend "puts\nn  "
  453. } "s\nn  "
  454. test parseOld-14.9 {TclWordEnd procedure} {testwordend} {
  455.     testwordend "puts\n    "
  456. } "s\n    "
  457. test parseOld-14.10 {TclWordEnd procedure} {testwordend} {
  458.     testwordend "puts\n    xyz"
  459. } "s\n    xyz"
  460. test parseOld-14.11 {TclWordEnd procedure} {testwordend} {
  461.     testwordend {a$x.$y(a long index) foo}
  462. } ") foo"
  463. test parseOld-14.12 {TclWordEnd procedure} {testwordend} {
  464.     testwordend {abc; def}
  465. } {; def}
  466. test parseOld-14.13 {TclWordEnd procedure} {testwordend} {
  467.     testwordend {abc def}
  468. } {c def}
  469. test parseOld-14.14 {TclWordEnd procedure} {testwordend} {
  470.     testwordend {abc def}
  471. } {c def}
  472. test parseOld-14.15 {TclWordEnd procedure} {testwordend} {
  473.     testwordend "abcndef"
  474. } "cndef"
  475. test parseOld-14.16 {TclWordEnd procedure} {testwordend} {
  476.     testwordend "abc"
  477. } {c}
  478. test parseOld-14.17 {TclWordEnd procedure} {testwordend} {
  479.     testwordend "a00bc"
  480. } {c}
  481. test parseOld-14.18 {TclWordEnd procedure} {testwordend} {
  482.     testwordend [a00]
  483. } {]}
  484. test parseOld-14.19 {TclWordEnd procedure} {testwordend} {
  485.     testwordend "a00"
  486. } {"}
  487. #" Emacs formatting >:^(
  488. test parseOld-14.20 {TclWordEnd procedure} {testwordend} {
  489.     testwordend a{00}b
  490. } {b}
  491. test parseOld-14.21 {TclWordEnd procedure} {testwordend} {
  492.     testwordend "   00b"
  493. } {b}
  494. test parseOld-15.1 {TclScriptEnd procedure} {
  495.     info complete {puts [
  496. expr 1+1
  497. #this is a comment ]}
  498. } {0}
  499. test parseOld-15.2 {TclScriptEnd procedure} {
  500.     info complete "abc\n"
  501. } {0}
  502. test parseOld-15.3 {TclScriptEnd procedure} {
  503.     info complete "abc\\n"
  504. } {1}
  505. test parseOld-15.4 {TclScriptEnd procedure} {
  506.     info complete "xyz [abc {abc]"
  507. } {0}
  508. test parseOld-15.5 {TclScriptEnd procedure} {
  509.     info complete "xyz [abc"
  510. } {0}
  511. # cleanup
  512. set argv $savedArgv
  513. ::tcltest::cleanupTests
  514. return