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

通讯编程

开发平台:

Visual C++

  1. # Commands covered:  proc, return, global
  2. #
  3. # This file, proc-old.test, includes the original set of tests for Tcl's
  4. # proc, return, and global commands. There is now a new file proc.test
  5. # that contains tests for the tclProc.c source file.
  6. #
  7. # Sourcing this file into Tcl runs the tests and generates output for
  8. # errors.  No output means no errors were found.
  9. #
  10. # Copyright (c) 1991-1993 The Regents of the University of California.
  11. # Copyright (c) 1994-1997 Sun Microsystems, Inc.
  12. # Copyright (c) 1998-1999 by Scriptics Corporation.
  13. #
  14. # See the file "license.terms" for information on usage and redistribution
  15. # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  16. #
  17. # RCS: @(#) $Id: proc-old.test,v 1.9.2.1 2003/03/27 21:46:32 msofer Exp $
  18. if {[lsearch [namespace children] ::tcltest] == -1} {
  19.     package require tcltest
  20.     namespace import -force ::tcltest::*
  21. }
  22. catch {rename t1 ""}
  23. catch {rename foo ""}
  24. proc tproc {} {return a; return b}
  25. test proc-old-1.1 {simple procedure call and return} {tproc} a
  26. proc tproc x {
  27.     set x [expr $x+1]
  28.     return $x
  29. }
  30. test proc-old-1.2 {simple procedure call and return} {tproc 2} 3
  31. test proc-old-1.3 {simple procedure call and return} {
  32.     proc tproc {} {return foo}
  33. } {}
  34. test proc-old-1.4 {simple procedure call and return} {
  35.     proc tproc {} {return}
  36.     tproc
  37. } {}
  38. proc tproc1 {a}   {incr a; return $a}
  39. proc tproc2 {a b} {incr a; return $a}
  40. test proc-old-1.5 {simple procedure call and return (2 procs with same body but different parameters)} {
  41.     list [tproc1 123] [tproc2 456 789]
  42. } {124 457}
  43. test proc-old-1.6 {simple procedure call and return (shared proc body string)} {
  44.     set x {}
  45.     proc tproc {} {}   ;# body is shared with x
  46.     list [tproc] [append x foo]
  47. } {{} foo}
  48. test proc-old-2.1 {local and global variables} {
  49.     proc tproc x {
  50. set x [expr $x+1]
  51. return $x
  52.     }
  53.     set x 42
  54.     list [tproc 6] $x
  55. } {7 42}
  56. test proc-old-2.2 {local and global variables} {
  57.     proc tproc x {
  58. set y [expr $x+1]
  59. return $y
  60.     }
  61.     set y 18
  62.     list [tproc 6] $y
  63. } {7 18}
  64. test proc-old-2.3 {local and global variables} {
  65.     proc tproc x {
  66. global y
  67. set y [expr $x+1]
  68. return $y
  69.     }
  70.     set y 189
  71.     list [tproc 6] $y
  72. } {7 7}
  73. test proc-old-2.4 {local and global variables} {
  74.     proc tproc x {
  75. global y
  76. return [expr $x+$y]
  77.     }
  78.     set y 189
  79.     list [tproc 6] $y
  80. } {195 189}
  81. catch {unset _undefined_}
  82. test proc-old-2.5 {local and global variables} {
  83.     proc tproc x {
  84. global _undefined_
  85. return $_undefined_
  86.     }
  87.     list [catch {tproc xxx} msg] $msg
  88. } {1 {can't read "_undefined_": no such variable}}
  89. test proc-old-2.6 {local and global variables} {
  90.     set a 114
  91.     set b 115
  92.     global a b
  93.     list $a $b
  94. } {114 115}
  95. proc do {cmd} {eval $cmd}
  96. test proc-old-3.1 {local and global arrays} {
  97.     catch {unset a}
  98.     set a(0) 22
  99.     list [catch {do {global a; set a(0)}} msg] $msg
  100. } {0 22}
  101. test proc-old-3.2 {local and global arrays} {
  102.     catch {unset a}
  103.     set a(x) 22
  104.     list [catch {do {global a; set a(x) newValue}} msg] $msg $a(x)
  105. } {0 newValue newValue}
  106. test proc-old-3.3 {local and global arrays} {
  107.     catch {unset a}
  108.     set a(x) 22
  109.     set a(y) 33
  110.     list [catch {do {global a; unset a(y)}; array names a} msg] $msg
  111. } {0 x}
  112. test proc-old-3.4 {local and global arrays} {
  113.     catch {unset a}
  114.     set a(x) 22
  115.     set a(y) 33
  116.     list [catch {do {global a; unset a; info exists a}} msg] $msg 
  117.     [info exists a]
  118. } {0 0 0}
  119. test proc-old-3.5 {local and global arrays} {
  120.     catch {unset a}
  121.     set a(x) 22
  122.     set a(y) 33
  123.     list [catch {do {global a; unset a(y); array names a}} msg] $msg
  124. } {0 x}
  125. catch {unset a}
  126. test proc-old-3.6 {local and global arrays} {
  127.     catch {unset a}
  128.     set a(x) 22
  129.     set a(y) 33
  130.     do {global a; do {global a; unset a}; set a(z) 22}
  131.     list [catch {array names a} msg] $msg
  132. } {0 z}
  133. test proc-old-3.7 {local and global arrays} {
  134.     proc t1 {args} {global info; set info 1}
  135.     catch {unset a}
  136.     set info {}
  137.     do {global a; trace var a(1) w t1}
  138.     set a(1) 44
  139.     set info
  140. } 1
  141. test proc-old-3.8 {local and global arrays} {
  142.     proc t1 {args} {global info; set info 1}
  143.     catch {unset a}
  144.     trace var a(1) w t1
  145.     set info {}
  146.     do {global a; trace vdelete a(1) w t1}
  147.     set a(1) 44
  148.     set info
  149. } {}
  150. test proc-old-3.9 {local and global arrays} {
  151.     proc t1 {args} {global info; set info 1}
  152.     catch {unset a}
  153.     trace var a(1) w t1
  154.     do {global a; trace vinfo a(1)}
  155. } {{w t1}}
  156. catch {unset a}
  157. test proc-old-30.1 {arguments and defaults} {
  158.     proc tproc {x y z} {
  159. return [list $x $y $z]
  160.     }
  161.     tproc 11 12 13
  162. } {11 12 13}
  163. test proc-old-30.2 {arguments and defaults} {
  164.     proc tproc {x y z} {
  165. return [list $x $y $z]
  166.     }
  167.     list [catch {tproc 11 12} msg] $msg
  168. } {1 {wrong # args: should be "tproc x y z"}}
  169. test proc-old-30.3 {arguments and defaults} {
  170.     proc tproc {x y z} {
  171. return [list $x $y $z]
  172.     }
  173.     list [catch {tproc 11 12 13 14} msg] $msg
  174. } {1 {wrong # args: should be "tproc x y z"}}
  175. test proc-old-30.4 {arguments and defaults} {
  176.     proc tproc {x {y y-default} {z z-default}} {
  177. return [list $x $y $z]
  178.     }
  179.     tproc 11 12 13
  180. } {11 12 13}
  181. test proc-old-30.5 {arguments and defaults} {
  182.     proc tproc {x {y y-default} {z z-default}} {
  183. return [list $x $y $z]
  184.     }
  185.     tproc 11 12
  186. } {11 12 z-default}
  187. test proc-old-30.6 {arguments and defaults} {
  188.     proc tproc {x {y y-default} {z z-default}} {
  189. return [list $x $y $z]
  190.     }
  191.     tproc 11
  192. } {11 y-default z-default}
  193. test proc-old-30.7 {arguments and defaults} {
  194.     proc tproc {x {y y-default} {z z-default}} {
  195. return [list $x $y $z]
  196.     }
  197.     list [catch {tproc} msg] $msg
  198. } {1 {wrong # args: should be "tproc x ?y? ?z?"}}
  199. test proc-old-30.8 {arguments and defaults} {
  200.     list [catch {
  201. proc tproc {x {y y-default} z} {
  202.     return [list $x $y $z]
  203. }
  204. tproc 2 3
  205.     } msg] $msg
  206. } {1 {wrong # args: should be "tproc x ?y? z"}}
  207. test proc-old-30.9 {arguments and defaults} {
  208.     proc tproc {x {y y-default} args} {
  209. return [list $x $y $args]
  210.     }
  211.     tproc 2 3 4 5
  212. } {2 3 {4 5}}
  213. test proc-old-30.10 {arguments and defaults} {
  214.     proc tproc {x {y y-default} args} {
  215. return [list $x $y $args]
  216.     }
  217.     tproc 2 3
  218. } {2 3 {}}
  219. test proc-old-30.11 {arguments and defaults} {
  220.     proc tproc {x {y y-default} args} {
  221. return [list $x $y $args]
  222.     }
  223.     tproc 2
  224. } {2 y-default {}}
  225. test proc-old-30.12 {arguments and defaults} {
  226.     proc tproc {x {y y-default} args} {
  227. return [list $x $y $args]
  228.     }
  229.     list [catch {tproc} msg] $msg
  230. } {1 {wrong # args: should be "tproc x ?y? args"}}
  231. test proc-old-4.1 {variable numbers of arguments} {
  232.     proc tproc args {return $args}
  233.     tproc
  234. } {}
  235. test proc-old-4.2 {variable numbers of arguments} {
  236.     proc tproc args {return $args}
  237.     tproc 1 2 3 4 5 6 7 8
  238. } {1 2 3 4 5 6 7 8}
  239. test proc-old-4.3 {variable numbers of arguments} {
  240.     proc tproc args {return $args}
  241.     tproc 1 {2 3} {4 {5 6} {{{7}}}} 8
  242. } {1 {2 3} {4 {5 6} {{{7}}}} 8}
  243. test proc-old-4.4 {variable numbers of arguments} {
  244.     proc tproc {x y args} {return $args}
  245.     tproc 1 2 3 4 5 6 7
  246. } {3 4 5 6 7}
  247. test proc-old-4.5 {variable numbers of arguments} {
  248.     proc tproc {x y args} {return $args}
  249.     tproc 1 2
  250. } {}
  251. test proc-old-4.6 {variable numbers of arguments} {
  252.     proc tproc {x missing args} {return $args}
  253.     list [catch {tproc 1} msg] $msg
  254. } {1 {wrong # args: should be "tproc x missing args"}}
  255. test proc-old-5.1 {error conditions} {
  256.     list [catch {proc} msg] $msg
  257. } {1 {wrong # args: should be "proc name args body"}}
  258. test proc-old-5.2 {error conditions} {
  259.     list [catch {proc tproc b} msg] $msg
  260. } {1 {wrong # args: should be "proc name args body"}}
  261. test proc-old-5.3 {error conditions} {
  262.     list [catch {proc tproc b c d e} msg] $msg
  263. } {1 {wrong # args: should be "proc name args body"}}
  264. test proc-old-5.4 {error conditions} {
  265.     list [catch {proc tproc {xyz {return foo}} msg] $msg
  266. } {1 {unmatched open brace in list}}
  267. test proc-old-5.5 {error conditions} {
  268.     list [catch {proc tproc {{} y} {return foo}} msg] $msg
  269. } {1 {procedure "tproc" has argument with no name}}
  270. test proc-old-5.6 {error conditions} {
  271.     list [catch {proc tproc {{} y} {return foo}} msg] $msg
  272. } {1 {procedure "tproc" has argument with no name}}
  273. test proc-old-5.7 {error conditions} {
  274.     list [catch {proc tproc {{x 1 2} y} {return foo}} msg] $msg
  275. } {1 {too many fields in argument specifier "x 1 2"}}
  276. test proc-old-5.8 {error conditions} {
  277.     catch {return}
  278. } 2
  279. test proc-old-5.9 {error conditions} {
  280.     list [catch {global} msg] $msg
  281. } {1 {wrong # args: should be "global varName ?varName ...?"}}
  282. proc tproc {} {
  283.     set a 22
  284.     global a
  285. }
  286. test proc-old-5.10 {error conditions} {
  287.     list [catch {tproc} msg] $msg
  288. } {1 {variable "a" already exists}}
  289. test proc-old-5.11 {error conditions} {
  290.     catch {rename tproc {}}
  291.     catch {
  292. proc tproc {x {} z} {return foo}
  293.     }
  294.     list [catch {tproc 1} msg] $msg
  295. } {1 {invalid command name "tproc"}}
  296. test proc-old-5.12 {error conditions} {
  297.     proc tproc {} {
  298. set a 22
  299. error "error in procedure"
  300. return
  301.     }
  302.     list [catch tproc msg] $msg
  303. } {1 {error in procedure}}
  304. test proc-old-5.13 {error conditions} {
  305.     proc tproc {} {
  306. set a 22
  307. error "error in procedure"
  308. return
  309.     }
  310.     catch tproc msg
  311.     set errorInfo
  312. } {error in procedure
  313.     while executing
  314. "error "error in procedure""
  315.     (procedure "tproc" line 3)
  316.     invoked from within
  317. "tproc"}
  318. test proc-old-5.14 {error conditions} {
  319.     proc tproc {} {
  320. set a 22
  321. break
  322. return
  323.     }
  324.     catch tproc msg
  325.     set errorInfo
  326. } {invoked "break" outside of a loop
  327.     (procedure "tproc" line 1)
  328.     invoked from within
  329. "tproc"}
  330. test proc-old-5.15 {error conditions} {
  331.     proc tproc {} {
  332. set a 22
  333. continue
  334. return
  335.     }
  336.     catch tproc msg
  337.     set errorInfo
  338. } {invoked "continue" outside of a loop
  339.     (procedure "tproc" line 1)
  340.     invoked from within
  341. "tproc"}
  342. test proc-old-5.16 {error conditions} {
  343.     proc foo args {
  344. global fooMsg
  345. set fooMsg "foo was called: $args"
  346.     }
  347.     proc tproc {} {
  348. set x 44
  349. trace var x u foo
  350. while {$x < 100} {
  351.     error "Nested error"
  352. }
  353.     }
  354.     set fooMsg "foo not called"
  355.     list [catch tproc msg] $msg $errorInfo $fooMsg
  356. } {1 {Nested error} {Nested error
  357.     while executing
  358. "error "Nested error""
  359.     (procedure "tproc" line 5)
  360.     invoked from within
  361. "tproc"} {foo was called: x {} u}}
  362. # The tests below will really only be useful when run under Purify or
  363. # some other system that can detect accesses to freed memory...
  364. test proc-old-6.1 {procedure that redefines itself} {
  365.     proc tproc {} {
  366. proc tproc {} {
  367.     return 44
  368. }
  369. return 45
  370.     }
  371.     tproc
  372. } 45
  373. test proc-old-6.2 {procedure that deletes itself} {
  374.     proc tproc {} {
  375. rename tproc {}
  376. return 45
  377.     }
  378.     tproc
  379. } 45
  380. proc tproc code {
  381.     return -code $code abc
  382. }
  383. test proc-old-7.1 {return with special completion code} {
  384.     list [catch {tproc ok} msg] $msg
  385. } {0 abc}
  386. test proc-old-7.2 {return with special completion code} {
  387.     list [catch {tproc error} msg] $msg $errorInfo $errorCode
  388. } {1 abc {abc
  389.     while executing
  390. "tproc error"} NONE}
  391. test proc-old-7.3 {return with special completion code} {
  392.     list [catch {tproc return} msg] $msg
  393. } {2 abc}
  394. test proc-old-7.4 {return with special completion code} {
  395.     list [catch {tproc break} msg] $msg
  396. } {3 abc}
  397. test proc-old-7.5 {return with special completion code} {
  398.     list [catch {tproc continue} msg] $msg
  399. } {4 abc}
  400. test proc-old-7.6 {return with special completion code} {
  401.     list [catch {tproc -14} msg] $msg
  402. } {-14 abc}
  403. test proc-old-7.7 {return with special completion code} {
  404.     list [catch {tproc gorp} msg] $msg
  405. } {1 {bad completion code "gorp": must be ok, error, return, break, continue, or an integer}}
  406. test proc-old-7.8 {return with special completion code} {
  407.     list [catch {tproc 10b} msg] $msg
  408. } {1 {bad completion code "10b": must be ok, error, return, break, continue, or an integer}}
  409. test proc-old-7.9 {return with special completion code} {
  410.     proc tproc2 {} {
  411. tproc return
  412.     }
  413.     list [catch tproc2 msg] $msg
  414. } {0 abc}
  415. test proc-old-7.10 {return with special completion code} {
  416.     proc tproc2 {} {
  417. return -code error
  418.     }
  419.     list [catch tproc2 msg] $msg
  420. } {1 {}}
  421. test proc-old-7.11 {return with special completion code} {
  422.     proc tproc2 {} {
  423. global errorCode errorInfo
  424. catch {open _bad_file_name r} msg
  425. return -code error -errorinfo $errorInfo -errorcode $errorCode $msg
  426.     }
  427.     set msg [list [catch tproc2 msg] $msg $errorInfo $errorCode]
  428.     regsub -all [file join {} _bad_file_name] $msg "_bad_file_name" msg
  429.     normalizeMsg $msg
  430. } {1 {couldn't open "_bad_file_name": no such file or directory} {couldn't open "_bad_file_name": no such file or directory
  431.     while executing
  432. "open _bad_file_name r"
  433.     invoked from within
  434. "tproc2"} {posix enoent {no such file or directory}}}
  435. test proc-old-7.12 {return with special completion code} {
  436.     proc tproc2 {} {
  437. global errorCode errorInfo
  438. catch {open _bad_file_name r} msg
  439. return -code error -errorcode $errorCode $msg
  440.     }
  441.     set msg [list [catch tproc2 msg] $msg $errorInfo $errorCode]
  442.     regsub -all [file join {} _bad_file_name] $msg "_bad_file_name" msg
  443.     normalizeMsg $msg
  444. } {1 {couldn't open "_bad_file_name": no such file or directory} {couldn't open "_bad_file_name": no such file or directory
  445.     while executing
  446. "tproc2"} {posix enoent {no such file or directory}}}
  447. test proc-old-7.13 {return with special completion code} {
  448.     proc tproc2 {} {
  449. global errorCode errorInfo
  450. catch {open _bad_file_name r} msg
  451. return -code error -errorinfo $errorInfo $msg
  452.     }
  453.     set msg [list [catch tproc2 msg] $msg $errorInfo $errorCode]
  454.     regsub -all [file join {} _bad_file_name] $msg "_bad_file_name" msg
  455.     normalizeMsg $msg
  456. } {1 {couldn't open "_bad_file_name": no such file or directory} {couldn't open "_bad_file_name": no such file or directory
  457.     while executing
  458. "open _bad_file_name r"
  459.     invoked from within
  460. "tproc2"} none}
  461. test proc-old-7.14 {return with special completion code} {
  462.     proc tproc2 {} {
  463. global errorCode errorInfo
  464. catch {open _bad_file_name r} msg
  465. return -code error $msg
  466.     }
  467.     set msg [list [catch tproc2 msg] $msg $errorInfo $errorCode]
  468.     regsub -all [file join {} _bad_file_name] $msg "_bad_file_name" msg
  469.     normalizeMsg $msg
  470. } {1 {couldn't open "_bad_file_name": no such file or directory} {couldn't open "_bad_file_name": no such file or directory
  471.     while executing
  472. "tproc2"} none}
  473. test proc-old-7.15 {return with special completion code} {
  474.     list [catch {return -badOption foo message} msg] $msg
  475. } {1 {bad option "-badOption": must be -code, -errorcode, or -errorinfo}}
  476. test proc-old-8.1 {unset and undefined local arrays} {
  477.     proc t1 {} {
  478.         foreach v {xxx, yyy} {
  479.             catch {unset $v}
  480.         }
  481.         set yyy(foo) bar
  482.     }
  483.     t1
  484. } bar
  485. test proc-old-9.1 {empty command name} {
  486.     catch {rename {} ""}
  487.     proc t1 {args} {
  488.         return
  489.     }
  490.     set v [t1]
  491.     catch {$v}
  492. } 1
  493. test proc-old-10.1 {ByteCode epoch change during recursive proc execution} {
  494.     proc t1 x {
  495.         set y 20
  496.         rename expr expr.old
  497.         rename expr.old expr
  498.         if $x then {t1 0} ;# recursive call after foo's code is invalidated
  499.         return 20
  500.     }
  501.     t1 1
  502. } 20
  503. # cleanup
  504. catch {rename t1 ""}
  505. catch {rename foo ""}
  506. ::tcltest::cleanupTests
  507. return