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

通讯编程

开发平台:

Visual C++

  1. # This file contains a collection of tests for the procedures in the
  2. # file tclParse.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: parse.test,v 1.11.2.5 2006/03/07 05:30:24 dgp Exp $
  12. if {[lsearch [namespace children] ::tcltest] == -1} {
  13.     package require tcltest 2
  14.     namespace import -force ::tcltest::*
  15. }
  16. if {[info commands testparser] == {}} {
  17.     puts "This application hasn't been compiled with the "testparser""
  18.     puts "command, so I can't test the Tcl parser."
  19.     ::tcltest::cleanupTests
  20.     return 
  21. }
  22. test parse-1.1 {Tcl_ParseCommand procedure, computing string length} {
  23.     testparser [bytestring "foo bar"] -1
  24. } {- foo 1 simple foo 1 text foo 0 {}}
  25. test parse-1.2 {Tcl_ParseCommand procedure, computing string length} {
  26.     testparser "foo bar" -1
  27. } {- {foo bar} 2 simple foo 1 text foo 0 simple bar 1 text bar 0 {}}
  28. test parse-1.3 {Tcl_ParseCommand procedure, leading space} {
  29.     testparser "  nt   foo" 0
  30. } {- foo 1 simple foo 1 text foo 0 {}}
  31. test parse-1.4 {Tcl_ParseCommand procedure, leading space} {
  32.     testparser "frvfoo" 0
  33. } {- foo 1 simple foo 1 text foo 0 {}}
  34. test parse-1.5 {Tcl_ParseCommand procedure, backslash-newline in leading space} {
  35.     testparser "  \n foo" 0
  36. } {- foo 1 simple foo 1 text foo 0 {}}
  37. test parse-1.6 {Tcl_ParseCommand procedure, backslash-newline in leading space} {
  38.     testparser {  a foo} 0
  39. } {- {a foo} 2 word {a} 1 backslash {a} 0 simple foo 1 text foo 0 {}}
  40. test parse-1.7 {Tcl_ParseCommand procedure, missing continuation line in leading space} {
  41.     testparser "   \n" 0
  42. } {- {} 0 {}}
  43. test parse-1.8 {Tcl_ParseCommand procedure, eof in leading space} {
  44.     testparser "      foo" 3
  45. } {- {} 0 {   foo}}
  46. test parse-2.1 {Tcl_ParseCommand procedure, comments} {
  47.     testparser "# foo barn foo" 0
  48. } {{# foo bar
  49. } foo 1 simple foo 1 text foo 0 {}}
  50. test parse-2.2 {Tcl_ParseCommand procedure, several comments} {
  51.     testparser " # foo barn # another commentnn   foo" 0
  52. } {{# foo bar
  53.  # another comment
  54. } foo 1 simple foo 1 text foo 0 {}}
  55. test parse-2.3 {Tcl_ParseCommand procedure, backslash-newline in comments} {
  56.     testparser " # foo bar\ncomment on continuation linenfoo" 0
  57. } {# foo bar\ncomment on continuation linen foo 1 simple foo 1 text foo 0 {}}
  58. test parse-2.4 {Tcl_ParseCommand procedure, missing continuation line in comment} {
  59.     testparser "#   \n" 0
  60. } {#   \n {} 0 {}}
  61. test parse-2.5 {Tcl_ParseCommand procedure, eof in comment} {
  62.     testparser " # foo barnfoo" 8
  63. } {{# foo b} {} 0 {ar
  64. foo}}
  65. test parse-3.1 {Tcl_ParseCommand procedure, parsing words, skipping space} {
  66.     testparser "foo  barttx" 0
  67. } {- {foo  bar x} 3 simple foo 1 text foo 0 simple bar 1 text bar 0 simple x 1 text x 0 {}}
  68. test parse-3.2 {Tcl_ParseCommand procedure, missing continuation line in leading space} {
  69.     testparser "abc  \n" 0
  70. } {- abc  \n 1 simple abc 1 text abc 0 {}}
  71. test parse-3.3 {Tcl_ParseCommand procedure, parsing words, command ends in space} {
  72.     testparser "foo  ;  bar x" 0
  73. } {- {foo  ;} 1 simple foo 1 text foo 0 {  bar x}}
  74. test parse-3.4 {Tcl_ParseCommand procedure, parsing words, command ends in space} {
  75.     testparser "foo       " 5
  76. } {- {foo  } 1 simple foo 1 text foo 0 {     }}
  77. test parse-3.5 {Tcl_ParseCommand procedure, quoted words} {
  78.     testparser {foo "a b c" d "efg";} 0
  79. } {- {foo "a b c" d "efg";} 4 simple foo 1 text foo 0 simple {"a b c"} 1 text {a b c} 0 simple d 1 text d 0 simple {"efg"} 1 text efg 0 {}}
  80. test parse-3.6 {Tcl_ParseCommand procedure, words in braces} {
  81.     testparser {foo {a $b [concat foo]} {c d}} 0
  82. } {- {foo {a $b [concat foo]} {c d}} 3 simple foo 1 text foo 0 simple {{a $b [concat foo]}} 1 text {a $b [concat foo]} 0 simple {{c d}} 1 text {c d} 0 {}}
  83. test parse-3.7 {Tcl_ParseCommand procedure, error in unquoted word} {
  84.     list [catch {testparser "foo ${abc" 0} msg] $msg $errorInfo
  85. } {1 {missing close-brace for variable name} missing close-brace for variable namen    (remainder of script: "{abc")n    invoked from withinn"testparser "foo \$\{abc" 0"}
  86. test parse-4.1 {Tcl_ParseCommand procedure, simple words} {
  87.     testparser {foo} 0
  88. } {- foo 1 simple foo 1 text foo 0 {}}
  89. test parse-4.2 {Tcl_ParseCommand procedure, simple words} {
  90.     testparser {{abc}} 0
  91. } {- {{abc}} 1 simple {{abc}} 1 text abc 0 {}}
  92. test parse-4.3 {Tcl_ParseCommand procedure, simple words} {
  93.     testparser {"c d"} 0
  94. } {- {"c d"} 1 simple {"c d"} 1 text {c d} 0 {}}
  95. test parse-4.4 {Tcl_ParseCommand procedure, simple words} {
  96.     testparser {x$d} 0
  97. } {- {x$d} 1 word {x$d} 3 text x 0 variable {$d} 1 text d 0 {}}
  98. test parse-4.5 {Tcl_ParseCommand procedure, simple words} {
  99.     testparser {"a [foo] b"} 0
  100. } {- {"a [foo] b"} 1 word {"a [foo] b"} 3 text {a } 0 command {[foo]} 0 text { b} 0 {}}
  101. test parse-4.6 {Tcl_ParseCommand procedure, simple words} {
  102.     testparser {$x} 0
  103. } {- {$x} 1 word {$x} 2 variable {$x} 1 text x 0 {}}
  104. test parse-5.1 {Tcl_ParseCommand procedure, backslash-newline terminates word} {
  105.     testparser "{abc}\n" 0
  106. } {- {abc}\n 1 simple {{abc}} 1 text abc 0 {}}
  107. test parse-5.2 {Tcl_ParseCommand procedure, backslash-newline terminates word} {
  108.     testparser "foo\nbar" 0
  109. } {- foo\nbar 2 simple foo 1 text foo 0 simple bar 1 text bar 0 {}}
  110. test parse-5.3 {Tcl_ParseCommand procedure, word terminator is command terminator} {
  111.     testparser "foon bar" 0
  112. } {- {foo
  113. } 1 simple foo 1 text foo 0 { bar}}
  114. test parse-5.4 {Tcl_ParseCommand procedure, word terminator is command terminator} {
  115.     testparser "foo; bar" 0
  116. } {- {foo;} 1 simple foo 1 text foo 0 { bar}}
  117. test parse-5.5 {Tcl_ParseCommand procedure, word terminator is end of string} {
  118.     testparser ""foo" bar" 5
  119. } {- {"foo"} 1 simple {"foo"} 1 text foo 0 { bar}}
  120. test parse-5.6 {Tcl_ParseCommand procedure, junk after close quote} {
  121.     list [catch {testparser {foo "bar"x} 0} msg] $msg $errorInfo
  122. } {1 {extra characters after close-quote} {extra characters after close-quote
  123.     (remainder of script: "x")
  124.     invoked from within
  125. "testparser {foo "bar"x} 0"}}
  126. test parse-5.7 {Tcl_ParseCommand procedure, backslash-newline after close quote} {
  127.     testparser "foo "bar"\nx" 0
  128. } {- foo "bar"\nx 3 simple foo 1 text foo 0 simple {"bar"} 1 text bar 0 simple x 1 text x 0 {}}
  129. test parse-5.8 {Tcl_ParseCommand procedure, junk after close brace} {
  130.     list [catch {testparser {foo {bar}x} 0} msg] $msg $errorInfo
  131. } {1 {extra characters after close-brace} {extra characters after close-brace
  132.     (remainder of script: "x")
  133.     invoked from within
  134. "testparser {foo {bar}x} 0"}}
  135. test parse-5.9 {Tcl_ParseCommand procedure, backslash-newline after close brace} {
  136.     testparser "foo {bar}\nx" 0
  137. } {- foo {bar}\nx 3 simple foo 1 text foo 0 simple {{bar}} 1 text bar 0 simple x 1 text x 0 {}}
  138. test parse-5.10 {Tcl_ParseCommand procedure, multiple deletion of non-static buffer} {
  139.     # This test is designed to catch bug 1681.
  140.     list [catch {testparser "a "\1\2\3\4\5\6\7\8\9\1\2\3\4\5\6\7\8" 0} msg] $msg $errorInfo
  141. } "1 {missing "} {missing "
  142.     (remainder of script: ""\1\2\3\4\5\6\7\8\9\1\2\3\4\5\6\7\8")
  143.     invoked from within
  144. "testparser "a \"\\1\\2\\3\\4\\5\\6\\7\\8\\9\\1\\2\\3\\4\\5\\6\\7\\8" 0"}"
  145. test parse-6.1 {ParseTokens procedure, empty word} {
  146.     testparser {""} 0
  147. } {- {""} 1 simple {""} 1 text {} 0 {}}
  148. test parse-6.2 {ParseTokens procedure, simple range} {
  149.     testparser {"abc$x.e"} 0
  150. } {- {"abc$x.e"} 1 word {"abc$x.e"} 4 text abc 0 variable {$x} 1 text x 0 text .e 0 {}}
  151. test parse-6.3 {ParseTokens procedure, variable reference} {
  152.     testparser {abc$x.e $y(z)} 0
  153. } {- {abc$x.e $y(z)} 2 word {abc$x.e} 4 text abc 0 variable {$x} 1 text x 0 text .e 0 word {$y(z)} 3 variable {$y(z)} 2 text y 0 text z 0 {}}
  154. test parse-6.4 {ParseTokens procedure, variable reference} {
  155.     list [catch {testparser {$x([a )} 0} msg] $msg
  156. } {1 {missing close-bracket}}
  157. test parse-6.5 {ParseTokens procedure, command substitution} {
  158.     testparser {[foo $x bar]z} 0
  159. } {- {[foo $x bar]z} 1 word {[foo $x bar]z} 2 command {[foo $x bar]} 0 text z 0 {}}
  160. test parse-6.6 {ParseTokens procedure, command substitution} {
  161.     testparser {[foo ] [a b]]} 0
  162. } {- {[foo ] [a b]]} 1 word {[foo ] [a b]]} 1 command {[foo ] [a b]]} 0 {}}
  163. test parse-6.7 {ParseTokens procedure, error in command substitution} {
  164.     list [catch {testparser {a [b {}c d] e} 0} msg] $msg $errorInfo
  165. } {1 {extra characters after close-brace} {extra characters after close-brace
  166.     (remainder of script: "c d] e")
  167.     invoked from within
  168. "testparser {a [b {}c d] e} 0"}}
  169. test parse-6.8 {ParseTokens procedure, error in command substitution} {
  170.     info complete {a [b {}c d]}
  171. } {1}
  172. test parse-6.9 {ParseTokens procedure, error in command substitution} {
  173.     info complete {a [b "c d}
  174. } {0}
  175. test parse-6.10 {ParseTokens procedure, incomplete sub-command} {
  176.     info complete {puts [
  177. expr 1+1
  178. #this is a comment ]}
  179. } {0}
  180. test parse-6.11 {ParseTokens procedure, memory allocation for big nested command} {
  181.     testparser {[$a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b)]} 0
  182. } {- {[$a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b)]} 1 word {[$a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b)]} 1 command {[$a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b)]} 0 {}}
  183. test parse-6.12 {ParseTokens procedure, missing close bracket} {
  184.     list [catch {testparser {[foo $x bar} 0} msg] $msg $errorInfo
  185. } {1 {missing close-bracket} {missing close-bracket
  186.     (remainder of script: "[foo $x bar")
  187.     invoked from within
  188. "testparser {[foo $x bar} 0"}}
  189. test parse-6.13 {ParseTokens procedure, backslash-newline without continuation line} {
  190.     list [catch {testparser ""a b\n" 0} msg] $msg $errorInfo
  191. } {1 {missing "} missing "n    (remainder of script: ""a b\n")n    invoked from withinn"testparser "\"a b\\\n" 0"}
  192. test parse-6.14 {ParseTokens procedure, backslash-newline} {
  193.     testparser "b\nc" 0
  194. } {- b\nc 2 simple b 1 text b 0 simple c 1 text c 0 {}}
  195. test parse-6.15 {ParseTokens procedure, backslash-newline} {
  196.     testparser ""b\nc"" 0
  197. } {- "b\nc" 1 word "b\nc" 3 text b 0 backslash \n 0 text c 0 {}}
  198. test parse-6.16 {ParseTokens procedure, backslash substitution} {
  199.     testparser {nax7f} 0
  200. } {- {nax7f} 1 word {nax7f} 3 backslash {n} 0 backslash {a} 0 backslash {x7f} 0 {}}
  201. test parse-6.17 {ParseTokens procedure, null characters} {
  202.     testparser [bytestring "foozz"] 0
  203. } "- [bytestring foozz] 1 word [bytestring foozz] 3 text foo 0 text [bytestring ] 0 text zz 0 {}"
  204. test parse-6.18 {ParseTokens procedure, seek past numBytes for close-bracket} {
  205.     # Test for Bug 681841
  206.     list [catch {testparser {[a]} 2} msg] $msg
  207. } {1 {missing close-bracket}}
  208. test parse-7.1 {Tcl_FreeParse and ExpandTokenArray procedures} {
  209.     testparser {$a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) } 0
  210. } {- {$a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) $a(b) } 16 word {$a(b)} 3 variable {$a(b)} 2 text a 0 text b 0 word {$a(b)} 3 variable {$a(b)} 2 text a 0 text b 0 word {$a(b)} 3 variable {$a(b)} 2 text a 0 text b 0 word {$a(b)} 3 variable {$a(b)} 2 text a 0 text b 0 word {$a(b)} 3 variable {$a(b)} 2 text a 0 text b 0 word {$a(b)} 3 variable {$a(b)} 2 text a 0 text b 0 word {$a(b)} 3 variable {$a(b)} 2 text a 0 text b 0 word {$a(b)} 3 variable {$a(b)} 2 text a 0 text b 0 word {$a(b)} 3 variable {$a(b)} 2 text a 0 text b 0 word {$a(b)} 3 variable {$a(b)} 2 text a 0 text b 0 word {$a(b)} 3 variable {$a(b)} 2 text a 0 text b 0 word {$a(b)} 3 variable {$a(b)} 2 text a 0 text b 0 word {$a(b)} 3 variable {$a(b)} 2 text a 0 text b 0 word {$a(b)} 3 variable {$a(b)} 2 text a 0 text b 0 word {$a(b)} 3 variable {$a(b)} 2 text a 0 text b 0 word {$a(b)} 3 variable {$a(b)} 2 text a 0 text b 0 {}}
  211. testConstraint testevalobjv [llength [info commands testevalobjv]]
  212. testConstraint testevalex [llength [info commands testevalex]]
  213. test parse-8.1 {Tcl_EvalObjv procedure} testevalobjv {
  214.     testevalobjv 0 concat this is a test
  215. } {this is a test}
  216. test parse-8.2 {Tcl_EvalObjv procedure, unknown commands} testevalobjv {
  217.     rename unknown unknown.old
  218.     set x [catch {testevalobjv 10 asdf poiu} msg]
  219.     rename unknown.old unknown
  220.     list $x $msg
  221. } {1 {invalid command name "asdf"}}
  222. test parse-8.3 {Tcl_EvalObjv procedure, unknown commands} testevalobjv {
  223.     rename unknown unknown.old
  224.     proc unknown args {
  225. return "unknown $args"
  226.     }
  227.     set x [catch {testevalobjv 0 asdf poiu} msg]
  228.     rename unknown {}
  229.     rename unknown.old unknown
  230.     list $x $msg
  231. } {0 {unknown asdf poiu}}
  232. test parse-8.4 {Tcl_EvalObjv procedure, unknown commands} testevalobjv {
  233.     rename unknown unknown.old
  234.     proc unknown args {
  235. error "I don't like that command"
  236.     }
  237.     set x [catch {testevalobjv 0 asdf poiu} msg]
  238.     rename unknown {}
  239.     rename unknown.old unknown
  240.     list $x $msg
  241. } {1 {I don't like that command}}
  242. test parse-8.5 {Tcl_EvalObjv procedure, command traces} testevalobjv {
  243.     testevalobjv 0 set x 123
  244.     testcmdtrace tracetest {testevalobjv 0 set x $x}
  245. } {{testevalobjv 0 set x $x} {testevalobjv 0 set x 123} {set x 123} {set x 123}}
  246. test parse-8.7 {Tcl_EvalObjv procedure, TCL_EVAL_GLOBAL flag} testevalobjv {
  247.     proc x {} {
  248. set y 23
  249. set z [testevalobjv 1 set y]
  250. return [list $z $y]
  251.     }
  252.     catch {unset y}
  253.     set y 16
  254.     x
  255. } {16 23}
  256. test parse-8.8 {Tcl_EvalObjv procedure, async handlers} testevalobjv {
  257.     proc async1 {result code} {
  258. global aresult acode
  259. set aresult $result
  260. set acode $code
  261. return "new result"
  262.     }
  263.     set handler1 [testasync create async1]
  264.     set aresult xxx
  265.     set acode yyy
  266.     set x [list [catch [list testevalobjv 0 testasync mark $handler1 original 0] msg] $msg $acode $aresult]
  267.     testasync delete
  268.     set x
  269. } {0 {new result} 0 original}
  270. test parse-8.9 {Tcl_EvalObjv procedure, exceptional return} testevalobjv {
  271.     list [catch {testevalobjv 0 error message} msg] $msg
  272. } {1 message}
  273. test parse-8.10 {Tcl_EvalObjv procedure, TCL_EVAL_GLOBAL} testevalobjv {
  274.     rename ::unknown unknown.save
  275.     proc ::unknown args {lappend ::info [info level]}
  276.     catch {rename ::noSuchCommand {}}
  277.     set ::info {}
  278.     namespace eval test_ns_1 {
  279. testevalobjv 1 noSuchCommand
  280. uplevel #0 noSuchCommand
  281.     }
  282.     namespace delete test_ns_1
  283.     rename ::unknown {}
  284.     rename unknown.save ::unknown
  285.     set ::info
  286. } {1 1}
  287. test parse-8.11 {Tcl_EvalObjv procedure, TCL_EVAL_INVOKE} testevalobjv {
  288.     rename ::unknown unknown.save
  289.     proc ::unknown args {lappend ::info [info level]; uplevel 1 foo}
  290.     proc ::foo args {lappend ::info global}
  291.     catch {rename ::noSuchCommand {}}
  292.     set ::slave [interp create]
  293.     $::slave alias bar noSuchCommand
  294.     set ::info {}
  295.     namespace eval test_ns_1 {
  296. proc foo args {lappend ::info namespace}
  297. $::slave eval bar
  298. testevalobjv 1 [list $::slave eval bar]
  299. uplevel #0 [list $::slave eval bar]
  300.     }
  301.     namespace delete test_ns_1
  302.     rename ::foo {}
  303.     rename ::unknown {}
  304.     rename unknown.save ::unknown
  305.     set ::info
  306. } [subst {[set level 2; incr level [info level]] global 1 global 1 global}]
  307. test parse-8.12 {Tcl_EvalObjv procedure, TCL_EVAL_INVOKE} {
  308.     set ::auto_index(noSuchCommand) {
  309. proc noSuchCommand {} {lappend ::info global}
  310.     }
  311.     set ::auto_index(::[string trimleft [namespace current]::test_ns_1::noSuchCommand :]) [list 
  312. proc [namespace current]::test_ns_1::noSuchCommand {} {
  313.     lappend ::info ns
  314. }]
  315.     catch {rename ::noSuchCommand {}}
  316.     set ::slave [interp create]
  317.     $::slave alias bar noSuchCommand
  318.     set ::info {}
  319.     namespace eval test_ns_1 {
  320. $::slave eval bar
  321.     }
  322.     namespace delete test_ns_1
  323.     interp delete $::slave
  324.     catch {rename ::noSuchCommand {}}
  325.     set ::info
  326. } global
  327. test parse-9.1 {Tcl_LogCommandInfo, line numbers} {
  328.     catch {unset x}
  329.     list [catch {testevalex {for {} 1 {} {
  330. # asdf
  331. set x
  332.     }}}] $errorInfo
  333. } {1 {can't read "x": no such variable
  334.     while executing
  335. "set x"
  336.     ("for" body line 5)
  337.     invoked from within
  338. "for {} 1 {} {
  339. # asdf
  340. set x
  341.     }"
  342.     invoked from within
  343. "testevalex {for {} 1 {} {
  344. # asdf
  345. set x
  346.     }}"}}
  347. test parse-9.2 {Tcl_LogCommandInfo, truncating long commands} {
  348.     list [testevalex {catch {set a b 111111111 222222222 333333333 444444444 555555555 666666666 777777777 888888888 999999999 000000000 aaaaaaaaa bbbbbbbbb ccccccccc ddddddddd eeeeeeeee fffffffff ggggggggg}}] $errorInfo
  349. } {1 {wrong # args: should be "set varName ?newValue?"
  350.     while executing
  351. "set a b 111111111 222222222 333333333 444444444 555555555 666666666 777777777 888888888 999999999 000000000 aaaaaaaaa bbbbbbbbb ccccccccc ddddddddd ee..."}}
  352. test parse-10.1 {Tcl_EvalTokens, simple text} {
  353.     testevalex {concat test}
  354. } {test}
  355. test parse-10.2 {Tcl_EvalTokens, backslash sequences} {
  356.     testevalex {concat test6362test}
  357. } {test32test}
  358. test parse-10.3 {Tcl_EvalTokens, nested commands} {
  359.     testevalex {concat [expr 2 + 6]}
  360. } {8}
  361. test parse-10.4 {Tcl_EvalTokens, nested commands} {
  362.     catch {unset a}
  363.     list [catch {testevalex {concat xxx[expr $a]}} msg] $msg
  364. } {1 {can't read "a": no such variable}}
  365. test parse-10.5 {Tcl_EvalTokens, simple variables} {
  366.     set a hello
  367.     testevalex {concat $a}
  368. } {hello}
  369. test parse-10.6 {Tcl_EvalTokens, array variables} {
  370.     catch {unset a}
  371.     set a(12) 46
  372.     testevalex {concat $a(12)}
  373. } {46}
  374. test parse-10.7 {Tcl_EvalTokens, array variables} {
  375.     catch {unset a}
  376.     set a(12) 46
  377.     testevalex {concat $a(1[expr 3 - 1])}
  378. } {46}
  379. test parse-10.8 {Tcl_EvalTokens, array variables} {
  380.     catch {unset a}
  381.     list [catch {testevalex {concat $x($a)}} msg] $msg
  382. } {1 {can't read "a": no such variable}}
  383. test parse-10.9 {Tcl_EvalTokens, array variables} {
  384.     catch {unset a}
  385.     list [catch {testevalex {concat xyz$a(1)}} msg] $msg
  386. } {1 {can't read "a(1)": no such variable}}
  387. test parse-10.10 {Tcl_EvalTokens, object values} {
  388.     set a 123
  389.     testevalex {concat $a}
  390. } {123}
  391. test parse-10.11 {Tcl_EvalTokens, object values} {
  392.     set a 123
  393.     testevalex {concat $a$a$a}
  394. } {123123123}
  395. test parse-10.12 {Tcl_EvalTokens, object values} {
  396.     testevalex {concat [expr 2][expr 4][expr 6]}
  397. } {246}
  398. test parse-10.13 {Tcl_EvalTokens, string values} {
  399.     testevalex {concat {a" b"}}
  400. } {a" b"}
  401. test parse-10.14 {Tcl_EvalTokens, string values} {
  402.     set a 111
  403.     testevalex {concat x$a.$a.$a}
  404. } {x111.111.111}
  405. test parse-11.1 {Tcl_EvalEx, TCL_EVAL_GLOBAL flag} {
  406.     proc x {} {
  407. set y 777
  408. set z [testevalex "set y" global]
  409. return [list $z $y]
  410.     }
  411.     catch {unset y}
  412.     set y 321
  413.     x
  414. } {321 777}
  415. test parse-11.2 {Tcl_EvalEx, error while parsing} {
  416.     list [catch {testevalex {concat "abc}} msg] $msg
  417. } {1 {missing "}}
  418. test parse-11.3 {Tcl_EvalEx, error while collecting words} {
  419.     catch {unset a}
  420.     list [catch {testevalex {concat xyz $a}} msg] $msg
  421. } {1 {can't read "a": no such variable}}
  422. test parse-11.4 {Tcl_EvalEx, error in Tcl_EvalObjv call} {
  423.     catch {unset a}
  424.     list [catch {testevalex {_bogus_ a b c d}} msg] $msg
  425. } {1 {invalid command name "_bogus_"}}
  426. test parse-11.5 {Tcl_EvalEx, exceptional return} {
  427.     list [catch {testevalex {break}} msg] $msg
  428. } {3 {}}
  429. test parse-11.6 {Tcl_EvalEx, freeing memory} {
  430.     testevalex {concat a b c d e f g h i j k l m n o p q r s t u v w x y z}
  431. } {a b c d e f g h i j k l m n o p q r s t u v w x y z}
  432. test parse-11.7 {Tcl_EvalEx, multiple commands in script} {
  433.     list [testevalex {set a b; set c d}] $a $c
  434. } {d b d}
  435. test parse-11.8 {Tcl_EvalEx, multiple commands in script} {
  436.     list [testevalex {
  437. set a b
  438. set c d
  439.     }] $a $c
  440. } {d b d}
  441. test parse-11.9 {Tcl_EvalEx, freeing memory after error} {
  442.     catch {unset a}
  443.     list [catch {testevalex {concat a b c d e f g h i j k l m n o p q r s t u v w x y z $a}} msg] $msg
  444. } {1 {can't read "a": no such variable}}
  445. test parse-11.10 {Tcl_EvalTokens, empty commands} {
  446.     testevalex {concat xyz;   }
  447. } {xyz}
  448. test parse-11.11 {Tcl_EvalTokens, empty commands} {
  449.     testevalex "concat abc; ; # this is a commentn"
  450. } {abc}
  451. test parse-11.12 {Tcl_EvalTokens, empty commands} {
  452.     testevalex {}
  453. } {}
  454. test parse-12.1 {Tcl_ParseVarName procedure, initialization} {
  455.     list [catch {testparsevarname {$a([first second])} 8 0} msg] $msg
  456. } {1 {missing close-bracket}}
  457. test parse-12.2 {Tcl_ParseVarName procedure, initialization} {
  458.     testparsevarname {$a([first second])} 0 0
  459. } {- {} 0 variable {$a([first second])} 2 text a 0 command {[first second]} 0 {}}
  460. test parse-12.3 {Tcl_ParseVarName procedure, initialization} {
  461.     list [catch {testparsevarname {$abcd} 3 0} msg] $msg
  462. } {0 {- {} 0 variable {$ab} 1 text ab 0 cd}}
  463. test parse-12.4 {Tcl_ParseVarName procedure, initialization} {
  464.     testparsevarname {$abcd} 0 0
  465. } {- {} 0 variable {$abcd} 1 text abcd 0 {}}
  466. test parse-12.5 {Tcl_ParseVarName procedure, just a dollar sign} {
  467.     testparsevarname {$abcd} 1 0
  468. } {- {} 0 text {$} 0 abcd}
  469. test parse-12.6 {Tcl_ParseVarName procedure, braced variable name} {
  470.     testparser {${..[]b}cd} 0
  471. } {- {${..[]b}cd} 1 word {${..[]b}cd} 3 variable {${..[]b}} 1 text {..[]b} 0 text cd 0 {}}
  472. test parse-12.7 {Tcl_ParseVarName procedure, braced variable name} {
  473.     testparser "${{} " 0
  474. } {- ${{}  1 word ${{} 2 variable ${{} 1 text { 0 {}}
  475. test parse-12.8 {Tcl_ParseVarName procedure, missing close brace} {
  476.     list [catch {testparser "${abc" 0} msg] $msg $errorInfo
  477. } {1 {missing close-brace for variable name} missing close-brace for variable namen    (remainder of script: "{abc")n    invoked from withinn"testparser "$\{abc" 0"}
  478. test parse-12.9 {Tcl_ParseVarName procedure, missing close brace} {
  479.     list [catch {testparsevarname {${bcd}} 4 0} msg] $msg
  480. } {1 {missing close-brace for variable name}}
  481. test parse-12.10 {Tcl_ParseVarName procedure, missing close brace} {
  482.     list [catch {testparsevarname {${bc}} 4 0} msg] $msg
  483. } {1 {missing close-brace for variable name}}
  484. test parse-12.11 {Tcl_ParseVarName procedure, simple variable name} {
  485.     testparser {$az_AZ.} 0
  486. } {- {$az_AZ.} 1 word {$az_AZ.} 3 variable {$az_AZ} 1 text az_AZ 0 text . 0 {}}
  487. test parse-12.12 {Tcl_ParseVarName procedure, simple variable name} {
  488.     testparser {$abcdefg} 4
  489. } {- {$abc} 1 word {$abc} 2 variable {$abc} 1 text abc 0 defg}
  490. test parse-12.13 {Tcl_ParseVarName procedure, simple variable name with ::} {
  491.     testparser {$xyz::ab:c} 0
  492. } {- {$xyz::ab:c} 1 word {$xyz::ab:c} 3 variable {$xyz::ab} 1 text xyz::ab 0 text :c 0 {}}
  493. test parse-12.14 {Tcl_ParseVarName procedure, variable names with many colons} {
  494.     testparser {$xyz:::::c} 0
  495. } {- {$xyz:::::c} 1 word {$xyz:::::c} 2 variable {$xyz:::::c} 1 text xyz:::::c 0 {}}
  496. test parse-12.15 {Tcl_ParseVarName procedure, : vs. ::} {
  497.     testparsevarname {$ab:cd} 0 0
  498. } {- {} 0 variable {$ab} 1 text ab 0 :cd}
  499. test parse-12.16 {Tcl_ParseVarName procedure, eof in ::} {
  500.     testparsevarname {$ab::cd} 4 0
  501. } {- {} 0 variable {$ab} 1 text ab 0 ::cd}
  502. test parse-12.17 {Tcl_ParseVarName procedure, eof in ::} {
  503.     testparsevarname {$ab:::cd} 5 0
  504. } {- {} 0 variable {$ab::} 1 text ab:: 0 :cd}
  505. test parse-12.18 {Tcl_ParseVarName procedure, no variable name} {
  506.     testparser {$$ $.} 0
  507. } {- {$$ $.} 2 word {$$} 2 text {$} 0 text {$} 0 word {$.} 2 text {$} 0 text . 0 {}}
  508. test parse-12.19 {Tcl_ParseVarName procedure, EOF before (} {
  509.     testparsevarname {$ab(cd)} 3 0
  510. } {- {} 0 variable {$ab} 1 text ab 0 (cd)}
  511. test parse-12.20 {Tcl_ParseVarName procedure, array reference} {
  512.     testparser {$x(abc)} 0
  513. } {- {$x(abc)} 1 word {$x(abc)} 3 variable {$x(abc)} 2 text x 0 text abc 0 {}}
  514. test parse-12.21 {Tcl_ParseVarName procedure, array reference} {
  515.     testparser {$x(ab$cde[foo bar])} 0
  516. } {- {$x(ab$cde[foo bar])} 1 word {$x(ab$cde[foo bar])} 6 variable {$x(ab$cde[foo bar])} 5 text x 0 text ab 0 variable {$cde} 1 text cde 0 command {[foo bar]} 0 {}}
  517. test parse-12.22 {Tcl_ParseVarName procedure, array reference} {
  518.     testparser {$x([cmd arg]zz)} 0
  519. } {- {$x([cmd arg]zz)} 1 word {$x([cmd arg]zz)} 4 variable {$x([cmd arg]zz)} 3 text x 0 command {[cmd arg]} 0 text zz 0 {}}
  520. test parse-12.23 {Tcl_ParseVarName procedure, missing close paren in array reference} {
  521.     list [catch {testparser {$x(poiu} 0} msg] $msg $errorInfo
  522. } {1 {missing )} {missing )
  523.     (remainder of script: "(poiu")
  524.     invoked from within
  525. "testparser {$x(poiu} 0"}}
  526. test parse-12.24 {Tcl_ParseVarName procedure, missing close paren in array reference} {
  527.     list [catch {testparsevarname {$ab(cd)} 6 0} msg] $msg $errorInfo
  528. } {1 {missing )} {missing )
  529.     (remainder of script: "(cd)")
  530.     invoked from within
  531. "testparsevarname {$ab(cd)} 6 0"}}
  532. test parse-12.25 {Tcl_ParseVarName procedure, nested array reference} {
  533.     testparser {$x(a$y(b$z))} 0
  534. } {- {$x(a$y(b$z))} 1 word {$x(a$y(b$z))} 8 variable {$x(a$y(b$z))} 7 text x 0 text a 0 variable {$y(b$z)} 4 text y 0 text b 0 variable {$z} 1 text z 0 {}}
  535. test parse-13.1 {Tcl_ParseVar procedure} {
  536.     set abc 24
  537.     testparsevar {$abc.fg}
  538. } {24 .fg}
  539. test parse-13.2 {Tcl_ParseVar procedure, no variable name} {
  540.     testparsevar {$}
  541. } {{$} {}}
  542. test parse-13.3 {Tcl_ParseVar procedure, no variable name} {
  543.     testparsevar {$.123}
  544. } {{$} .123}
  545. test parse-13.4 {Tcl_ParseVar procedure, error looking up variable} {
  546.     catch {unset abc}
  547.     list [catch {testparsevar {$abc}} msg] $msg
  548. } {1 {can't read "abc": no such variable}}
  549. test parse-13.5 {Tcl_ParseVar procedure, error looking up variable} {
  550.     catch {unset abc}
  551.     list [catch {testparsevar {$abc([bogus x y z])}} msg] $msg
  552. } {1 {invalid command name "bogus"}}
  553. test parse-14.1 {Tcl_ParseBraces procedure, computing string length} {
  554.     testparser [bytestring "foo bar"] -1
  555. } {- foo 1 simple foo 1 text foo 0 {}}
  556. test parse-14.2 {Tcl_ParseBraces procedure, computing string length} {
  557.     testparser "foo bar" -1
  558. } {- {foo bar} 2 simple foo 1 text foo 0 simple bar 1 text bar 0 {}}
  559. test parse-14.3 {Tcl_ParseBraces procedure, words in braces} {
  560.     testparser {foo {a $b [concat foo]} {c d}} 0
  561. } {- {foo {a $b [concat foo]} {c d}} 3 simple foo 1 text foo 0 simple {{a $b [concat foo]}} 1 text {a $b [concat foo]} 0 simple {{c d}} 1 text {c d} 0 {}}
  562. test parse-14.4 {Tcl_ParseBraces procedure, empty nested braces} {
  563.     testparser {foo {{}}} 0
  564. } {- {foo {{}}} 2 simple foo 1 text foo 0 simple {{{}}} 1 text {{}} 0 {}}
  565. test parse-14.5 {Tcl_ParseBraces procedure, nested braces} {
  566.     testparser {foo {{a {b} c} {} {d e}}} 0
  567. } {- {foo {{a {b} c} {} {d e}}} 2 simple foo 1 text foo 0 simple {{{a {b} c} {} {d e}}} 1 text {{a {b} c} {} {d e}} 0 {}}
  568. test parse-14.6 {Tcl_ParseBraces procedure, backslashes in words in braces} {
  569.     testparser "foo {a \n\{}" 0
  570. } {- {foo {a n{}} 2 simple foo 1 text foo 0 simple {{a n{}} 1 text {a n{} 0 {}}
  571. test parse-14.7 {Tcl_ParseBraces procedure, missing continuation line in braces} {
  572.     list [catch {testparser "{abc\n" 0} msg] $msg $errorInfo
  573. } {1 {missing close-brace} missing close-bracen    (remainder of script: "{abc\n")n    invoked from withinn"testparser "\{abc\\\n" 0"}
  574. test parse-14.8 {Tcl_ParseBraces procedure, backslash-newline in braces} {
  575.     testparser "foo {\nx}" 0
  576. } {- foo {\nx} 2 simple foo 1 text foo 0 word {\nx} 2 backslash \n 0 text x 0 {}}
  577. test parse-14.9 {Tcl_ParseBraces procedure, backslash-newline in braces} {
  578.     testparser "foo {a \n   b}" 0
  579. } {- foo {a \n   b} 2 simple foo 1 text foo 0 word {a \n   b} 3 text {a } 0 backslash \n    0 text b 0 {}}
  580. test parse-14.10 {Tcl_ParseBraces procedure, backslash-newline in braces} {
  581.     testparser "foo {xyz\n }" 0
  582. } {- foo {xyz\n } 2 simple foo 1 text foo 0 word {xyz\n } 2 text xyz 0 backslash \n  0 {}}
  583. test parse-14.11 {Tcl_ParseBraces procedure, empty braced string} {
  584.     testparser {foo {}} 0
  585. } {- {foo {}} 2 simple foo 1 text foo 0 simple {{}} 1 text {} 0 {}}
  586. test parse-14.12 {Tcl_ParseBraces procedure, missing close brace} {
  587.     list [catch {testparser "foo {xy\nz" 0} msg] $msg $errorInfo
  588. } {1 {missing close-brace} missing close-bracen    (remainder of script: "{xy\nz")n    invoked from withinn"testparser "foo \{xy\\\nz" 0"}
  589. test parse-15.1 {Tcl_ParseQuotedString procedure, computing string length} {
  590.     testparser [bytestring "foo bar"] -1
  591. } {- foo 1 simple foo 1 text foo 0 {}}
  592. test parse-15.2 {Tcl_ParseQuotedString procedure, computing string length} {
  593.     testparser "foo bar" -1
  594. } {- {foo bar} 2 simple foo 1 text foo 0 simple bar 1 text bar 0 {}}
  595. test parse-15.3 {Tcl_ParseQuotedString procedure, word is quoted string} {
  596.     testparser {foo "a b c" d "efg";} 0
  597. } {- {foo "a b c" d "efg";} 4 simple foo 1 text foo 0 simple {"a b c"} 1 text {a b c} 0 simple d 1 text d 0 simple {"efg"} 1 text efg 0 {}}
  598. test parse-15.4 {Tcl_ParseQuotedString procedure, garbage after quoted string} {
  599.     list [catch {testparser {foo "a b c"d} 0} msg] $msg $errorInfo
  600. } {1 {extra characters after close-quote} {extra characters after close-quote
  601.     (remainder of script: "d")
  602.     invoked from within
  603. "testparser {foo "a b c"d} 0"}}
  604. test parse-15.5 {CommandComplete procedure} {
  605.     info complete ""
  606. } 1
  607. test parse-15.6 {CommandComplete procedure} {
  608.     info complete "  n"
  609. } 1
  610. test parse-15.7 {CommandComplete procedure} {
  611.     info complete "abc def"
  612. } 1
  613. test parse-15.8 {CommandComplete procedure} {
  614.     info complete "a b c d e f tn"
  615. } 1
  616. test parse-15.9 {CommandComplete procedure} {
  617.     info complete {a b c"d}
  618. } 1
  619. test parse-15.10 {CommandComplete procedure} {
  620.     info complete {a b "c d" e}
  621. } 1
  622. test parse-15.11 {CommandComplete procedure} {
  623.     info complete {a b "c d"}
  624. } 1
  625. test parse-15.12 {CommandComplete procedure} {
  626.     info complete {a b "c d"}
  627. } 1
  628. test parse-15.13 {CommandComplete procedure} {
  629.     info complete {a b "c d}
  630. } 0
  631. test parse-15.14 {CommandComplete procedure} {
  632.     info complete {a b "}
  633. } 0
  634. test parse-15.15 {CommandComplete procedure} {
  635.     info complete {a b "cd"xyz}
  636. } 1
  637. test parse-15.16 {CommandComplete procedure} {
  638.     info complete {a b "c $d() d"}
  639. } 1
  640. test parse-15.17 {CommandComplete procedure} {
  641.     info complete {a b "c $dd("}
  642. } 0
  643. test parse-15.18 {CommandComplete procedure} {
  644.     info complete {a b "c "}
  645. } 0
  646. test parse-15.19 {CommandComplete procedure} {
  647.     info complete {a b "c [d e f]"}
  648. } 1
  649. test parse-15.20 {CommandComplete procedure} {
  650.     info complete {a b "c [d e f] g"}
  651. } 1
  652. test parse-15.21 {CommandComplete procedure} {
  653.     info complete {a b "c [d e f"}
  654. } 0
  655. test parse-15.22 {CommandComplete procedure} {
  656.     info complete {a {b c d} e}
  657. } 1
  658. test parse-15.23 {CommandComplete procedure} {
  659.     info complete {a {b c d}}
  660. } 1
  661. test parse-15.24 {CommandComplete procedure} {
  662.     info complete "a b{c d"
  663. } 1
  664. test parse-15.25 {CommandComplete procedure} {
  665.     info complete "a b {c"
  666. } 0
  667. test parse-15.26 {CommandComplete procedure} {
  668.     info complete "a b {c{ }"
  669. } 0
  670. test parse-15.27 {CommandComplete procedure} {
  671.     info complete "a b {c d e}xxx"
  672. } 1
  673. test parse-15.28 {CommandComplete procedure} {
  674.     info complete "a b {c \{d e}xxx"
  675. } 1
  676. test parse-15.29 {CommandComplete procedure} {
  677.     info complete {a b [ab cd ef]}
  678. } 1
  679. test parse-15.30 {CommandComplete procedure} {
  680.     info complete {a b x[ab][cd][ef] gh}
  681. } 1
  682. test parse-15.31 {CommandComplete procedure} {
  683.     info complete {a b x[ab][cd[ef] gh}
  684. } 0
  685. test parse-15.32 {CommandComplete procedure} {
  686.     info complete {a b x[ gh}
  687. } 0
  688. test parse-15.33 {CommandComplete procedure} {
  689.     info complete {[]]]}
  690. } 1
  691. test parse-15.34 {CommandComplete procedure} {
  692.     info complete {abc x$yyy}
  693. } 1
  694. test parse-15.35 {CommandComplete procedure} {
  695.     info complete "abc x${abc[\d} xyz"
  696. } 1
  697. test parse-15.36 {CommandComplete procedure} {
  698.     info complete "abc x${ xyz"
  699. } 0
  700. test parse-15.37 {CommandComplete procedure} {
  701.     info complete {word $a(xyz)}
  702. } 1
  703. test parse-15.38 {CommandComplete procedure} {
  704.     info complete {word $a(}
  705. } 0
  706. test parse-15.39 {CommandComplete procedure} {
  707.     info complete "set a \n"
  708. } 0
  709. test parse-15.40 {CommandComplete procedure} {
  710.     info complete "set a \\n"
  711. } 1
  712. test parse-15.41 {CommandComplete procedure} {
  713.     info complete "set a \n "
  714. } 1
  715. test parse-15.42 {CommandComplete procedure} {
  716.     info complete "set a \"
  717. } 1
  718. test parse-15.43 {CommandComplete procedure} {
  719.     info complete "foo \n{"
  720. } 0
  721. test parse-15.44 {CommandComplete procedure} {
  722.     info complete "anbn# {n# {ncn"
  723. } 1
  724. test parse-15.45 {CommandComplete procedure} {
  725.     info complete "#Incomplete comment\n"
  726. } 0
  727. test parse-15.46 {CommandComplete procedure} {
  728.     info complete "#Incomplete comment\nBut now it's complete.n"
  729. } 1
  730. test parse-15.47 {CommandComplete procedure} {
  731.     info complete "# Complete comment\\n"
  732. } 1
  733. test parse-15.48 {CommandComplete procedure} {
  734.     info complete "abc\n def"
  735. } 1
  736. test parse-15.49 {CommandComplete procedure} {
  737.     info complete "abc\n "
  738. } 1
  739. test parse-15.50 {CommandComplete procedure} {
  740.     info complete "abc\n"
  741. } 0
  742. test parse-15.51 {CommandComplete procedure} "
  743.     info complete "\{abc\}\{"
  744. " 1
  745. test parse-15.52 {CommandComplete procedure} {
  746.     info complete ""abc"("
  747. } 1
  748. test parse-15.53 {CommandComplete procedure} "
  749.     info complete " # {"
  750. " 1
  751. test parse-15.54 {CommandComplete procedure} "
  752.     info complete "foo bar;# {"
  753. " 1
  754. test parse-15.55 {CommandComplete procedure} {
  755.     info complete "set x [bytestring ]; puts hi"
  756. } 1
  757. test parse-15.56 {CommandComplete procedure} {
  758.     info complete "set x [bytestring ]; {"
  759. } 0
  760. test parse-15.57 {CommandComplete procedure} {
  761.     info complete "# Comment should be complete command"
  762. } 1
  763. test parse-15.58 {CommandComplete procedure, memory leaks} {
  764.     info complete "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22"
  765. } 1
  766. test parse-15.59 {CommandComplete procedure} {
  767.     # Test for Tcl Bug 684744
  768.     info complete [encoding convertfrom identity "x00;if 1 {"]
  769. } 0
  770. test parse-16.1 {Tcl_EvalEx, check termOffset is set correctly for non TCL_OK cases, bug 2535} {
  771.     subst {[eval {return foo}]bar}
  772. } foobar
  773. test parse-17.1 {Correct return codes from errors during substitution} {
  774.     catch {eval {w[continue]}}
  775. } 4
  776. test parse-19.1 {Bug 1115904: recursion limit in Tcl_EvalEx} -constraints {
  777.     testevalex
  778. } -setup {
  779.     interp create i
  780.     load {} Tcltest i
  781.     i eval {proc {} args {}}
  782.     interp recursionlimit i 3
  783. } -body {
  784.     i eval {testevalex {[]}}
  785. } -cleanup {
  786.     interp delete i
  787. }
  788. test parse-19.2 {Bug 1115904: recursion limit in Tcl_EvalEx} -constraints {
  789.     testevalex
  790. } -setup {
  791.     interp create i
  792.     load {} Tcltest i
  793.     i eval {proc {} args {}}
  794.     interp recursionlimit i 3
  795. } -body {
  796.     i eval {testevalex {[[]]}}
  797. } -cleanup {
  798.     interp delete i
  799. } -returnCodes error -match glob -result {too many nested*}
  800. test parse-19.3 {Bug 1115904: recursion limit in Tcl_EvalEx} -setup {
  801.     interp create i
  802.     i eval {proc {} args {}}
  803.     interp recursionlimit i 3
  804. } -body {
  805.     i eval {subst {[]}}
  806. } -cleanup {
  807.     interp delete i
  808. }
  809. test parse-19.4 {Bug 1115904: recursion limit in Tcl_EvalEx} -setup {
  810.     interp create i
  811.     i eval {proc {} args {}}
  812.     interp recursionlimit i 3
  813. } -body {
  814.     i eval {subst {[[]]}}
  815. } -cleanup {
  816.     interp delete i
  817. } -returnCodes error -match glob -result {too many nested*}
  818. # cleanup
  819. catch {unset a}
  820. ::tcltest::cleanupTests
  821. return