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

通讯编程

开发平台:

Visual C++

  1. # -*- tcl -*-
  2. # Commands covered:  info
  3. #
  4. # This file contains a collection of tests for one or more of the Tcl
  5. # built-in commands.  Sourcing this file into Tcl runs the tests and
  6. # generates output for errors.  No output means no errors were found.
  7. #
  8. # Copyright (c) 1991-1994 The Regents of the University of California.
  9. # Copyright (c) 1994-1997 Sun Microsystems, Inc.
  10. # Copyright (c) 1998-1999 by Scriptics Corporation.
  11. # Copyright (c) 2006      ActiveState
  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: info.test,v 1.24.2.5 2006/11/28 22:20:02 andreas_kupries Exp $
  17. if {[lsearch [namespace children] ::tcltest] == -1} {
  18.     package require tcltest 2
  19.     namespace import -force ::tcltest::*
  20. }
  21. # Set up namespaces needed to test operation of "info args", "info body",
  22. # "info default", and "info procs" with imported procedures.
  23. catch {namespace delete test_ns_info1 test_ns_info2}
  24. namespace eval test_ns_info1 {
  25.     namespace export *
  26.     proc p {x} {return "x=$x"}
  27.     proc q {{y 27} {z {}}} {return "y=$y"}
  28. }
  29. testConstraint tip280  [info exists tcl_platform(tip,280)]
  30. testConstraint !tip280 [expr {![info exists tcl_platform(tip,280)]}]
  31. test info-1.1 {info args option} {
  32.     proc t1 {a bbb c} {return foo}
  33.     info args t1
  34. } {a bbb c}
  35. test info-1.2 {info args option} {
  36.     proc t1 {{a default1} {bbb default2} {c default3} args} {return foo}
  37.     info a t1
  38. } {a bbb c args}
  39. test info-1.3 {info args option} {
  40.     proc t1 "" {return foo}
  41.     info args t1
  42. } {}
  43. test info-1.4 {info args option} {
  44.     catch {rename t1 {}}
  45.     list [catch {info args t1} msg] $msg
  46. } {1 {"t1" isn't a procedure}}
  47. test info-1.5 {info args option} {
  48.     list [catch {info args set} msg] $msg
  49. } {1 {"set" isn't a procedure}}
  50. test info-1.6 {info args option} {
  51.     proc t1 {a b} {set c 123; set d $c}
  52.     t1 1 2
  53.     info args t1
  54. } {a b}
  55. test info-1.7 {info args option} {
  56.     catch {namespace delete test_ns_info2}
  57.     namespace eval test_ns_info2 {
  58.         namespace import ::test_ns_info1::*
  59.         list [info args p] [info args q]
  60.     }
  61. } {x {y z}}
  62. test info-2.1 {info body option} {
  63.     proc t1 {} {body of t1}
  64.     info body t1
  65. } {body of t1}
  66. test info-2.2 {info body option} {
  67.     list [catch {info body set} msg] $msg
  68. } {1 {"set" isn't a procedure}}
  69. test info-2.3 {info body option} {
  70.     list [catch {info args set 1} msg] $msg
  71. } {1 {wrong # args: should be "info args procname"}}
  72. test info-2.4 {info body option} {
  73.     catch {namespace delete test_ns_info2}
  74.     namespace eval test_ns_info2 {
  75.         namespace import ::test_ns_info1::*
  76.         list [info body p] [info body q]
  77.     }
  78. } {{return "x=$x"} {return "y=$y"}}
  79. # Prior to 8.3.0 this would cause a crash because [info body]
  80. # would return the bytecompiled version of foo, which the catch
  81. # would then try and eval out of the foo context, accessing
  82. # compiled local indices
  83. test info-2.5 {info body option, returning bytecompiled bodies} {
  84.     catch {unset args}
  85.     proc foo {args} {
  86. foreach v $args {
  87.     upvar $v var
  88.     return "variable $v existence: [info exists var]"
  89. }
  90.     }
  91.     foo a
  92.     list [catch [info body foo] msg] $msg
  93. } {1 {can't read "args": no such variable}}
  94. # Fix for problem tested for in info-2.5 caused problems when
  95. # procedure body had no string rep (i.e. was not yet bytecode)
  96. # causing an empty string to be returned [Bug #545644]
  97. test info-2.6 {info body option, returning list bodies} {
  98.     proc foo args [list subst bar]
  99.     list [string bytelength [info body foo]] 
  100.     [foo; string bytelength [info body foo]]
  101. } {9 9}
  102. # "info cmdcount" is no longer accurate for compiled commands!
  103. # The expected result for info-3.1 used to be "3" and is now "1"
  104. # since the "set"s have been compiled away.  info-3.2 was corrected
  105. # in 8.3 because the eval'ed body won't be compiled.
  106. proc testinfocmdcount {} {
  107.     set x [info cmdcount]
  108.     set y 12345
  109.     set z [info cm]
  110.     expr $z-$x
  111. }
  112. test info-3.1 {info cmdcount compiled} {
  113.     testinfocmdcount
  114. } 1
  115. test info-3.2 {info cmdcount evaled} {
  116.     set x [info cmdcount]
  117.     set y 12345
  118.     set z [info cm]
  119.     expr $z-$x
  120. } 3
  121. test info-3.3 {info cmdcount evaled} [info body testinfocmdcount] 3
  122. test info-3.4 {info cmdcount option} {
  123.     list [catch {info cmdcount 1} msg] $msg
  124. } {1 {wrong # args: should be "info cmdcount"}}
  125. test info-4.1 {info commands option} {
  126.     proc t1 {} {}
  127.     proc t2 {} {}
  128.     set x " [info commands] "
  129.     list [string match {* t1 *} $x] [string match {* t2 *} $x] 
  130.             [string match {* set *} $x] [string match {* list *} $x]
  131. } {1 1 1 1}
  132. test info-4.2 {info commands option} {
  133.     proc t1 {} {}
  134.     rename t1 {}
  135.     set x [info comm]
  136.     string match {* t1 *} $x
  137. } 0
  138. test info-4.3 {info commands option} {
  139.     proc _t1_ {} {}
  140.     proc _t2_ {} {}
  141.     info commands _t1_
  142. } _t1_
  143. test info-4.4 {info commands option} {
  144.     proc _t1_ {} {}
  145.     proc _t2_ {} {}
  146.     lsort [info commands _t*]
  147. } {_t1_ _t2_}
  148. catch {rename _t1_ {}}
  149. catch {rename _t2_ {}}
  150. test info-4.5 {info commands option} {
  151.     list [catch {info commands a b} msg] $msg
  152. } {1 {wrong # args: should be "info commands ?pattern?"}}
  153. test info-5.1 {info complete option} {
  154.     list [catch {info complete} msg] $msg
  155. } {1 {wrong # args: should be "info complete command"}}
  156. test info-5.2 {info complete option} {
  157.     info complete abc
  158. } 1
  159. test info-5.3 {info complete option} {
  160.     info complete "{abcd "
  161. } 0
  162. test info-5.4 {info complete option} {
  163.     info complete {# Comment should be complete command}
  164. } 1
  165. test info-5.5 {info complete option} {
  166.     info complete {[a [b] }
  167. } 0
  168. test info-5.6 {info complete option} {
  169.     info complete {[a [b]}
  170. } 0
  171. test info-6.1 {info default option} {
  172.     proc t1 {a b {c d} {e "long default value"}} {}
  173.     info default t1 a value
  174. } 0
  175. test info-6.2 {info default option} {
  176.     proc t1 {a b {c d} {e "long default value"}} {}
  177.     set value 12345
  178.     info d t1 a value
  179.     set value
  180. } {}
  181. test info-6.3 {info default option} {
  182.     proc t1 {a b {c d} {e "long default value"}} {}
  183.     info default t1 c value
  184. } 1
  185. test info-6.4 {info default option} {
  186.     proc t1 {a b {c d} {e "long default value"}} {}
  187.     set value 12345
  188.     info default t1 c value
  189.     set value
  190. } d
  191. test info-6.5 {info default option} {
  192.     proc t1 {a b {c d} {e "long default value"}} {}
  193.     set value 12345
  194.     set x [info default t1 e value]
  195.     list $x $value
  196. } {1 {long default value}}
  197. test info-6.6 {info default option} {
  198.     list [catch {info default a b} msg] $msg
  199. } {1 {wrong # args: should be "info default procname arg varname"}}
  200. test info-6.7 {info default option} {
  201.     list [catch {info default _nonexistent_ a b} msg] $msg
  202. } {1 {"_nonexistent_" isn't a procedure}}
  203. test info-6.8 {info default option} {
  204.     proc t1 {a b} {}
  205.     list [catch {info default t1 x value} msg] $msg
  206. } {1 {procedure "t1" doesn't have an argument "x"}}
  207. test info-6.9 {info default option} {
  208.     catch {unset a}
  209.     set a(0) 88
  210.     proc t1 {a b} {}
  211.     list [catch {info default t1 a a} msg] $msg
  212. } {1 {couldn't store default value in variable "a"}}
  213. test info-6.10 {info default option} {
  214.     catch {unset a}
  215.     set a(0) 88
  216.     proc t1 {{a 18} b} {}
  217.     list [catch {info default t1 a a} msg] $msg
  218. } {1 {couldn't store default value in variable "a"}}
  219. test info-6.11 {info default option} {
  220.     catch {namespace delete test_ns_info2}
  221.     namespace eval test_ns_info2 {
  222.         namespace import ::test_ns_info1::*
  223.         list [info default p x foo] $foo [info default q y bar] $bar
  224.     }
  225. } {0 {} 1 27}
  226. catch {unset a}
  227. test info-7.1 {info exists option} {
  228.     set value foo
  229.     info exists value
  230. } 1
  231. catch {unset _nonexistent_}
  232. test info-7.2 {info exists option} {
  233.     info exists _nonexistent_
  234. } 0
  235. test info-7.3 {info exists option} {
  236.     proc t1 {x} {return [info exists x]}
  237.     t1 2
  238. } 1
  239. test info-7.4 {info exists option} {
  240.     proc t1 {x} {
  241.         global _nonexistent_
  242.         return [info exists _nonexistent_]
  243.     }
  244.     t1 2
  245. } 0
  246. test info-7.5 {info exists option} {
  247.     proc t1 {x} {
  248.         set y 47
  249.         return [info exists y]
  250.     }
  251.     t1 2
  252. } 1
  253. test info-7.6 {info exists option} {
  254.     proc t1 {x} {return [info exists value]}
  255.     t1 2
  256. } 0
  257. test info-7.7 {info exists option} {
  258.     catch {unset x}
  259.     set x(2) 44
  260.     list [info exists x] [info exists x(1)] [info exists x(2)]
  261. } {1 0 1}
  262. catch {unset x}
  263. test info-7.8 {info exists option} {
  264.     list [catch {info exists} msg] $msg
  265. } {1 {wrong # args: should be "info exists varName"}}
  266. test info-7.9 {info exists option} {
  267.     list [catch {info exists 1 2} msg] $msg
  268. } {1 {wrong # args: should be "info exists varName"}}
  269. test info-8.1 {info globals option} {
  270.     set x 1
  271.     set y 2
  272.     set value 23
  273.     set a " [info globals] "
  274.     list [string match {* x *} $a] [string match {* y *} $a] 
  275.             [string match {* value *} $a] [string match {* _foobar_ *} $a]
  276. } {1 1 1 0}
  277. test info-8.2 {info globals option} {
  278.     set _xxx1 1
  279.     set _xxx2 2
  280.     lsort [info g _xxx*]
  281. } {_xxx1 _xxx2}
  282. test info-8.3 {info globals option} {
  283.     list [catch {info globals 1 2} msg] $msg
  284. } {1 {wrong # args: should be "info globals ?pattern?"}}
  285. test info-8.4 {info globals option: may have leading namespace qualifiers} {
  286.     set x 0
  287.     list [info globals x] [info globals :x] [info globals ::x] [info globals :::x] [info globals ::::x]
  288. } {x {} x x x}
  289. test info-8.5 {info globals option: only return existing global variables} {
  290.     -setup {
  291. catch {unset ::NO_SUCH_VAR}
  292. proc evalInProc script {eval $script}
  293.     }
  294.     -body {
  295. evalInProc {global NO_SUCH_VAR; info globals NO_SUCH_VAR}
  296.     }
  297.     -cleanup {
  298. rename evalInProc {}
  299.     }
  300.     -result {}
  301. }
  302. test info-9.1 {info level option} {
  303.     info level
  304. } 0
  305. test info-9.2 {info level option} {
  306.     proc t1 {a b} {
  307.         set x [info le]
  308.         set y [info level 1]
  309.         list $x $y
  310.     }
  311.     t1 146 testString
  312. } {1 {t1 146 testString}}
  313. test info-9.3 {info level option} {
  314.     proc t1 {a b} {
  315.         t2 [expr $a*2] $b
  316.     }
  317.     proc t2 {x y} {
  318.         list [info level] [info level 1] [info level 2] [info level -1] 
  319.                 [info level 0]
  320.     }
  321.     t1 146 {a {b c} {{{c}}}}
  322. } {2 {t1 146 {a {b c} {{{c}}}}} {t2 292 {a {b c} {{{c}}}}} {t1 146 {a {b c} {{{c}}}}} {t2 292 {a {b c} {{{c}}}}}}
  323. test info-9.4 {info level option} {
  324.     proc t1 {} {
  325.         set x [info level]
  326.         set y [info level 1]
  327.         list $x $y
  328.     }
  329.     t1
  330. } {1 t1}
  331. test info-9.5 {info level option} {
  332.     list [catch {info level 1 2} msg] $msg
  333. } {1 {wrong # args: should be "info level ?number?"}}
  334. test info-9.6 {info level option} {
  335.     list [catch {info level 123a} msg] $msg
  336. } {1 {expected integer but got "123a"}}
  337. test info-9.7 {info level option} {
  338.     list [catch {info level 0} msg] $msg
  339. } {1 {bad level "0"}}
  340. test info-9.8 {info level option} {
  341.     proc t1 {} {info level -1}
  342.     list [catch {t1} msg] $msg
  343. } {1 {bad level "-1"}}
  344. test info-9.9 {info level option} {
  345.     proc t1 {x} {info level $x}
  346.     list [catch {t1 -3} msg] $msg
  347. } {1 {bad level "-3"}}
  348. test info-9.10 {info level option, namespaces} {
  349.     set msg [namespace eval t {info level 0}]
  350.     namespace delete t
  351.     set msg
  352. } {namespace eval t {info level 0}}
  353. set savedLibrary $tcl_library
  354. test info-10.1 {info library option} {
  355.     list [catch {info library x} msg] $msg
  356. } {1 {wrong # args: should be "info library"}}
  357. test info-10.2 {info library option} {
  358.     set tcl_library 12345
  359.     info library
  360. } {12345}
  361. test info-10.3 {info library option} {
  362.     unset tcl_library
  363.     list [catch {info library} msg] $msg
  364. } {1 {no library has been specified for Tcl}}
  365. set tcl_library $savedLibrary
  366. test info-11.1 {info loaded option} {
  367.     list [catch {info loaded a b} msg] $msg
  368. } {1 {wrong # args: should be "info loaded ?interp?"}}
  369. test info-11.2 {info loaded option} {
  370.     list [catch {info loaded {}}] [catch {info loaded gorp} msg] $msg
  371. } {0 1 {could not find interpreter "gorp"}}
  372. test info-12.1 {info locals option} {
  373.     set a 22
  374.     proc t1 {x y} {
  375.         set b 13
  376.         set c testing
  377.         global a
  378. global aa
  379. set aa 23
  380.         return [info locals]
  381.     }
  382.     lsort [t1 23 24]
  383. } {b c x y}
  384. test info-12.2 {info locals option} {
  385.     proc t1 {x y} {
  386.         set xx1 2
  387.         set xx2 3
  388.         set y 4
  389.         return [info loc x*]
  390.     }
  391.     lsort [t1 2 3]
  392. } {x xx1 xx2}
  393. test info-12.3 {info locals option} {
  394.     list [catch {info locals 1 2} msg] $msg
  395. } {1 {wrong # args: should be "info locals ?pattern?"}}
  396. test info-12.4 {info locals option} {
  397.     info locals
  398. } {}
  399. test info-12.5 {info locals option} {
  400.     proc t1 {} {return [info locals]}
  401.     t1
  402. } {}
  403. test info-12.6 {info locals vs unset compiled locals} {
  404.     proc t1 {lst} {
  405.         foreach $lst $lst {}
  406.         unset lst
  407.         return [info locals]
  408.     }
  409.     lsort [t1 {a b c c d e f}]
  410. } {a b c d e f}
  411. test info-12.7 {info locals with temporary variables} {
  412.     proc t1 {} {
  413.         foreach a {b c} {}
  414.         info locals
  415.     }
  416.     t1
  417. } {a}
  418. test info-13.1 {info nameofexecutable option} {
  419.     list [catch {info nameofexecutable foo} msg] $msg
  420. } {1 {wrong # args: should be "info nameofexecutable"}}
  421. test info-14.1 {info patchlevel option} {
  422.     set a [info patchlevel]
  423.     regexp {[0-9]+.[0-9]+([p[0-9]+)?} $a
  424. } 1
  425. test info-14.2 {info patchlevel option} {
  426.     list [catch {info patchlevel a} msg] $msg
  427. } {1 {wrong # args: should be "info patchlevel"}}
  428. test info-14.3 {info patchlevel option} {
  429.     set t $tcl_patchLevel
  430.     unset tcl_patchLevel
  431.     set result [list [catch {info patchlevel} msg] $msg]
  432.     set tcl_patchLevel $t
  433.     set result
  434. } {1 {can't read "tcl_patchLevel": no such variable}}
  435. test info-15.1 {info procs option} {
  436.     proc t1 {} {}
  437.     proc t2 {} {}
  438.     set x " [info procs] "
  439.     list [string match {* t1 *} $x] [string match {* t2 *} $x] 
  440.             [string match {* _undefined_ *} $x]
  441. } {1 1 0}
  442. test info-15.2 {info procs option} {
  443.     proc _tt1 {} {}
  444.     proc _tt2 {} {}
  445.     lsort [info pr _tt*]
  446. } {_tt1 _tt2}
  447. catch {rename _tt1 {}}
  448. catch {rename _tt2 {}}
  449. test info-15.3 {info procs option} {
  450.     list [catch {info procs 2 3} msg] $msg
  451. } {1 {wrong # args: should be "info procs ?pattern?"}}
  452. test info-15.4 {info procs option} {
  453.     catch {namespace delete test_ns_info2}
  454.     namespace eval test_ns_info2 {
  455.         namespace import ::test_ns_info1::*
  456.         proc r {} {}
  457.         list [info procs] [info procs p*]
  458.     }
  459. } {{p q r} p}
  460. test info-15.5 {info procs option with a proc in a namespace} {
  461.     catch {namespace delete test_ns_info2}
  462.     namespace eval test_ns_info2 {
  463. proc p1 { arg } {
  464.     puts cmd
  465. }
  466.         proc p2 { arg } {
  467.     puts cmd
  468. }
  469.     }
  470.     info procs ::test_ns_info2::p1
  471. } {::test_ns_info2::p1}
  472. test info-15.6 {info procs option with a pattern in a namespace} {
  473.     catch {namespace delete test_ns_info2}
  474.     namespace eval test_ns_info2 {
  475. proc p1 { arg } {
  476.     puts cmd
  477. }
  478.         proc p2 { arg } {
  479.     puts cmd
  480. }
  481.     }
  482.     lsort [info procs ::test_ns_info2::p*]
  483. } [lsort [list ::test_ns_info2::p1 ::test_ns_info2::p2]]
  484. test info-15.7 {info procs option with a global shadowing proc} {
  485.     catch {namespace delete test_ns_info2}
  486.     proc string_cmd { arg } {
  487.         puts cmd
  488.     }
  489.     namespace eval test_ns_info2 {
  490. proc string_cmd { arg } {
  491.     puts cmd
  492. }
  493.     }
  494.     info procs test_ns_info2::string*
  495. } {::test_ns_info2::string_cmd}
  496. # This regression test is currently commented out because it requires
  497. # that the implementation of "info procs" looks into the global namespace,
  498. # which it does not (in contrast to "info commands")
  499. if {0} {
  500. test info-15.8 {info procs option with a global shadowing proc} {
  501.     catch {namespace delete test_ns_info2}
  502.     proc string_cmd { arg } {
  503.         puts cmd
  504.     }
  505.     proc string_cmd2 { arg } {
  506.         puts cmd
  507.     }
  508.     namespace eval test_ns_info2 {
  509. proc string_cmd { arg } {
  510.     puts cmd
  511. }
  512.     }
  513.     namespace eval test_ns_info2 {
  514.         lsort [info procs string*]
  515.     }
  516. } [lsort [list string_cmd string_cmd2]]
  517. }
  518. test info-16.1 {info script option} {
  519.     list [catch {info script x x} msg] $msg
  520. } {1 {wrong # args: should be "info script ?filename?"}}
  521. test info-16.2 {info script option} {
  522.     file tail [info sc]
  523. } "info.test"
  524. set gorpfile [makeFile "info scriptn" gorp.info]
  525. test info-16.3 {info script option} {
  526.     list [source $gorpfile] [file tail [info script]]
  527. } [list $gorpfile info.test]
  528. test info-16.4 {resetting "info script" after errors} {
  529.     catch {source ~_nobody_/foo}
  530.     file tail [info script]
  531. } "info.test"
  532. test info-16.5 {resetting "info script" after errors} {
  533.     catch {source _nonexistent_}
  534.     file tail [info script]
  535. } "info.test"
  536. test info-16.6 {info script option} {
  537.     set script [info script]
  538.     list [file tail [info script]] 
  539.     [info script newname.txt] 
  540.     [file tail [info script $script]]
  541. } [list info.test newname.txt info.test]
  542. test info-16.7 {info script option} {
  543.     set script [info script]
  544.     info script newname.txt
  545.     list [source $gorpfile] [file tail [info script]] 
  546.     [file tail [info script $script]]
  547. } [list $gorpfile newname.txt info.test]
  548. removeFile gorp.info
  549. set gorpfile [makeFile {list [info script] [info script foo.bar]} gorp.info]
  550. test info-16.8 {info script option} {
  551.     list [source $gorpfile] [file tail [info script]]
  552. } [list [list $gorpfile foo.bar] info.test]
  553. removeFile gorp.info
  554. test info-17.1 {info sharedlibextension option} {
  555.     list [catch {info sharedlibextension foo} msg] $msg
  556. } {1 {wrong # args: should be "info sharedlibextension"}}
  557. test info-18.1 {info tclversion option} {
  558.     set x [info tclversion]
  559.     scan $x "%d.%d%c" a b c
  560. } 2
  561. test info-18.2 {info tclversion option} {
  562.     list [catch {info t 2} msg] $msg
  563. } {1 {wrong # args: should be "info tclversion"}}
  564. test info-18.3 {info tclversion option} {
  565.     set t $tcl_version
  566.     unset tcl_version
  567.     set result [list [catch {info tclversion} msg] $msg]
  568.     set tcl_version $t
  569.     set result
  570. } {1 {can't read "tcl_version": no such variable}}
  571. test info-19.1 {info vars option} {
  572.     set a 1
  573.     set b 2
  574.     proc t1 {x y} {
  575.         global a b
  576.         set c 33
  577.         return [info vars]
  578.     }
  579.     lsort [t1 18 19]
  580. } {a b c x y}
  581. test info-19.2 {info vars option} {
  582.     set xxx1 1
  583.     set xxx2 2
  584.     proc t1 {xxa y} {
  585.         global xxx1 xxx2
  586.         set c 33
  587.         return [info vars x*]
  588.     }
  589.     lsort [t1 18 19]
  590. } {xxa xxx1 xxx2}
  591. test info-19.3 {info vars option} {
  592.     lsort [info vars]
  593. } [lsort [info globals]]
  594. test info-19.4 {info vars option} {
  595.     list [catch {info vars a b} msg] $msg
  596. } {1 {wrong # args: should be "info vars ?pattern?"}}
  597. test info-19.5 {info vars with temporary variables} {
  598.     proc t1 {} {
  599.         foreach a {b c} {}
  600.         info vars
  601.     }
  602.     t1
  603. } {a}
  604. test info-19.6 {info vars: Bug 1072654} -setup {
  605.     namespace eval :: unset -nocomplain foo
  606.     catch {namespace delete x}
  607. } -body {
  608.     namespace eval x info vars foo
  609. } -cleanup {
  610.     namespace delete x
  611. } -result {}
  612. # Check whether the extra testing functions are defined...
  613. if {([catch {expr T1()} msg] == 1) && ($msg == {unknown math function "T1"})} {
  614.     set functions {abs acos asin atan atan2 ceil cos cosh double exp floor fmod hypot int log log10 pow rand round sin sinh sqrt srand tan tanh wide}
  615. } else {
  616.     set functions {T1 T2 T3 abs acos asin atan atan2 ceil cos cosh double exp floor fmod hypot int log log10 pow rand round sin sinh sqrt srand tan tanh wide}
  617. }
  618. test info-20.1 {info functions option} {info functions sin} sin
  619. test info-20.2 {info functions option} {lsort [info functions]} $functions
  620. test info-20.3 {info functions option} {
  621.     lsort [info functions a*]
  622. } {abs acos asin atan atan2}
  623. test info-20.4 {info functions option} {
  624.     lsort [info functions *tan*]
  625. } {atan atan2 tan tanh}
  626. test info-20.5 {info functions option} {
  627.     list [catch {info functions raise an error} msg] $msg
  628. } {1 {wrong # args: should be "info functions ?pattern?"}}
  629. test info-21.1 {miscellaneous error conditions} {
  630.     list [catch {info} msg] $msg
  631. } {1 {wrong # args: should be "info option ?arg arg ...?"}}
  632. test info-21.2 {miscellaneous error conditions} !tip280 {
  633.     list [catch {info gorp} msg] $msg
  634. } {1 {bad option "gorp": must be args, body, cmdcount, commands, complete, default, exists, functions, globals, hostname, level, library, loaded, locals, nameofexecutable, patchlevel, procs, script, sharedlibextension, tclversion, or vars}}
  635. test info-21.2-280 {miscellaneous error conditions} tip280 {
  636.     list [catch {info gorp} msg] $msg
  637. } {1 {bad option "gorp": must be args, body, cmdcount, commands, complete, default, exists, frame, functions, globals, hostname, level, library, loaded, locals, nameofexecutable, patchlevel, procs, script, sharedlibextension, tclversion, or vars}}
  638. test info-21.3 {miscellaneous error conditions} !tip280 {
  639.     list [catch {info c} msg] $msg
  640. } {1 {ambiguous option "c": must be args, body, cmdcount, commands, complete, default, exists, functions, globals, hostname, level, library, loaded, locals, nameofexecutable, patchlevel, procs, script, sharedlibextension, tclversion, or vars}}
  641. test info-21.3-280 {miscellaneous error conditions} tip280 {
  642.     list [catch {info c} msg] $msg
  643. } {1 {ambiguous option "c": must be args, body, cmdcount, commands, complete, default, exists, frame, functions, globals, hostname, level, library, loaded, locals, nameofexecutable, patchlevel, procs, script, sharedlibextension, tclversion, or vars}}
  644. test info-21.4 {miscellaneous error conditions} !tip280 {
  645.     list [catch {info l} msg] $msg
  646. } {1 {ambiguous option "l": must be args, body, cmdcount, commands, complete, default, exists, functions, globals, hostname, level, library, loaded, locals, nameofexecutable, patchlevel, procs, script, sharedlibextension, tclversion, or vars}}
  647. test info-21.4-280 {miscellaneous error conditions} tip280 {
  648.     list [catch {info l} msg] $msg
  649. } {1 {ambiguous option "l": must be args, body, cmdcount, commands, complete, default, exists, frame, functions, globals, hostname, level, library, loaded, locals, nameofexecutable, patchlevel, procs, script, sharedlibextension, tclversion, or vars}}
  650. test info-21.5 {miscellaneous error conditions} !tip280 {
  651.     list [catch {info s} msg] $msg
  652. } {1 {ambiguous option "s": must be args, body, cmdcount, commands, complete, default, exists, functions, globals, hostname, level, library, loaded, locals, nameofexecutable, patchlevel, procs, script, sharedlibextension, tclversion, or vars}}
  653. test info-21.5-280 {miscellaneous error conditions} tip280 {
  654.     list [catch {info s} msg] $msg
  655. } {1 {ambiguous option "s": must be args, body, cmdcount, commands, complete, default, exists, frame, functions, globals, hostname, level, library, loaded, locals, nameofexecutable, patchlevel, procs, script, sharedlibextension, tclversion, or vars}}
  656. ##
  657. # ### ### ### ######### ######### #########
  658. ## info frame
  659. ## Helper
  660. # For the more complex results we cut the file name down to remove
  661. # path dependencies, and we use only part of the first line of the
  662. # reported command. The latter is required because otherwise the whole
  663. # test case may appear in some results, but the result is part of the
  664. # testcase. An infinite string would be required to describe that. The
  665. # cutting-down breaks this.
  666. proc reduce {frame} {
  667.     set pos [lsearch -exact $frame cmd]
  668.     incr pos
  669.     set cmd   [lindex $frame $pos]
  670.     if {[regexp n $cmd]} {
  671. set first [string range [lindex [split $cmd n] 0] 0 end-11]
  672. set frame [lreplace $frame $pos $pos $first]
  673.     }
  674.     set pos [lsearch -exact $frame file]
  675.     if {$pos >=0} {
  676. incr pos
  677. set tail  [file tail [lindex $frame $pos]]
  678. set frame [lreplace $frame $pos $pos $tail]
  679.     }
  680.     set frame
  681. }
  682. ## Helper
  683. # Generate a stacktrace from the current location to top.  This code
  684. # not only depends on the exact location of things, but also on the
  685. # implementation of tcltest. Any changes and these tests will have to
  686. # be updated.
  687. proc etrace {} {
  688.     set res {}
  689.     set level [info frame]
  690.     while {$level} {
  691. lappend res [list $level [reduce [info frame $level]]]
  692. incr level -1
  693.     }
  694.     return $res
  695. }
  696. ##
  697. test info-22.0 {info frame, levels} tip280 {
  698.     info frame
  699. } 7
  700. test info-22.1 {info frame, bad level relative} tip280 {
  701.     # catch is another level!, i.e. we have 8, not 7
  702.     catch {info frame -8} msg
  703.     set msg
  704. } {bad level "-8"}
  705. test info-22.2 {info frame, bad level absolute} tip280 {
  706.     # catch is another level!, i.e. we have 8, not 7
  707.     catch {info frame 9} msg
  708.     set msg
  709. } {bad level "9"}
  710. test info-22.3 {info frame, current, relative} tip280 {
  711.     info frame 0
  712. } {type eval line 2 cmd {info frame 0}}
  713. test info-22.4 {info frame, current, relative, nested} tip280 {
  714.     set res [info frame 0]
  715. } {type eval line 2 cmd {info frame 0}}
  716. test info-22.5 {info frame, current, absolute} tip280 {
  717.     reduce [info frame 7]
  718. } {type eval line 2 cmd {info frame 7}}
  719. test info-22.6 {info frame, global, relative} tip280 {
  720.     reduce [info frame -6]
  721. } {type source line 759 file info.test cmd test info-22.6 {info frame, global, relativ}
  722. test info-22.7 {info frame, global, absolute} tip280 {
  723.     reduce [info frame 1]
  724. } {type source line 763 file info.test cmd test info-22.7 {info frame, global, absolut}
  725. test info-22.8 {info frame, basic trace} tip280 {
  726.     join [etrace] n
  727. } {8 {type source line 723 file info.test cmd {info frame $level} proc ::etrace level 0}
  728. 7 {type eval line 2 cmd etrace}
  729. 6 {type source line 2277 file tcltest.tcl cmd {uplevel 1 $script} proc ::tcltest::RunTest}
  730. 5 {type eval line 1 cmd {::tcltest::RunTest }}
  731. 4 {type source line 1619 file tcltest.tcl cmd {uplevel 1 $script} proc ::tcltest::Eval}
  732. 3 {type eval line 1 cmd ::tcltest::Eval {::tcltest::RunTest }
  733. 2 {type source line 1966 file tcltest.tcl cmd {uplevel 1 [list [namespace origin Eval] $command 1]} proc ::tcltest::test}
  734. 1 {type source line 767 file info.test cmd test info-22.8 {info frame, basic trac}}
  735. ## The line 1966 is off by 5 from the true value of 1971. This is a knownBug, see testcase 30.0
  736. test info-23.0 {eval'd info frame} tip280 {
  737.     eval {info frame}
  738. } 8
  739. test info-23.1 {eval'd info frame, semi-dynamic} tip280 {
  740.     eval info frame
  741. } 8
  742. test info-23.2 {eval'd info frame, dynamic} tip280 {
  743.     set script {info frame}
  744.     eval $script
  745. } 8
  746. test info-23.3 {eval'd info frame, literal} tip280 {
  747.     eval {
  748. info frame 0
  749.     }
  750. } {type eval line 2 cmd {info frame 0}}
  751. test info-23.4 {eval'd info frame, semi-dynamic} tip280 {
  752.     eval info frame 0
  753. } {type eval line 1 cmd {info frame 0}}
  754. test info-23.5 {eval'd info frame, dynamic} tip280 {
  755.     set script {info frame 0}
  756.     eval $script
  757. } {type eval line 1 cmd {info frame 0}}
  758. test info-23.6 {eval'd info frame, trace} tip280 {
  759.     set script {etrace}
  760.     join [eval $script] n
  761. } {9 {type source line 723 file info.test cmd {info frame $level} proc ::etrace level 0}
  762. 8 {type eval line 1 cmd etrace}
  763. 7 {type eval line 3 cmd {eval $script}}
  764. 6 {type source line 2277 file tcltest.tcl cmd {uplevel 1 $script} proc ::tcltest::RunTest}
  765. 5 {type eval line 1 cmd {::tcltest::RunTest }}
  766. 4 {type source line 1619 file tcltest.tcl cmd {uplevel 1 $script} proc ::tcltest::Eval}
  767. 3 {type eval line 1 cmd ::tcltest::Eval {::tcltest::RunTest }
  768. 2 {type source line 1966 file tcltest.tcl cmd {uplevel 1 [list [namespace origin Eval] $command 1]} proc ::tcltest::test}
  769. 1 {type source line 806 file info.test cmd test info-23.6 {eval'd info frame, trac}}
  770. ## The line 1966 is off by 5 from the true value of 1971. This is a knownBug, see testcase 30.0
  771. # -------------------------------------------------------------------------
  772. # Procedures defined in scripts which are arguments to control
  773. # structures (like 'namespace eval', 'interp eval', 'if', 'while',
  774. # 'switch', 'catch', 'for', 'foreach', etc.) have no absolute
  775. # location. The command implementations execute such scripts through
  776. # Tcl_EvalObjEx. Flag 0 causes it to use the bytecode compiler. This
  777. # causes the connection to the context to be lost. Currently only
  778. # procedure bodies are able to remember their context.
  779. # -------------------------------------------------------------------------
  780. namespace eval foo {
  781.     proc bar {} {info frame 0}
  782. }
  783. test info-24.0 {info frame, interaction, namespace eval} tip280 {
  784.     reduce [foo::bar]
  785. } {type source line 832 file info.test cmd {info frame 0} proc ::foo::bar level 0}
  786. namespace delete foo
  787. # -------------------------------------------------------------------------
  788. set flag 1
  789. if {$flag} {
  790.     namespace eval foo {}
  791.     proc ::foo::bar {} {info frame 0}
  792. }
  793. test info-24.1 {info frame, interaction, if} tip280 {
  794.     reduce [foo::bar]
  795. } {type source line 846 file info.test cmd {info frame 0} proc ::foo::bar level 0}
  796. namespace delete foo
  797. # -------------------------------------------------------------------------
  798. set flag 1
  799. while {$flag} {
  800.     namespace eval foo {}
  801.     proc ::foo::bar {} {info frame 0}
  802.     set flag 0
  803. }
  804. test info-24.2 {info frame, interaction, while} tip280 {
  805.     reduce [foo::bar]
  806. } {type source line 860 file info.test cmd {info frame 0} proc ::foo::bar level 0}
  807. namespace delete foo
  808. # -------------------------------------------------------------------------
  809. catch {
  810.     namespace eval foo {}
  811.     proc ::foo::bar {} {info frame 0}
  812. }
  813. test info-24.3 {info frame, interaction, catch} tip280 {
  814.     reduce [foo::bar]
  815. } {type source line 874 file info.test cmd {info frame 0} proc ::foo::bar level 0}
  816. namespace delete foo
  817. # -------------------------------------------------------------------------
  818. foreach var val {
  819.     namespace eval foo {}
  820.     proc ::foo::bar {} {info frame 0}
  821.     break
  822. }
  823. test info-24.4 {info frame, interaction, foreach} tip280 {
  824.     reduce [foo::bar]
  825. } {type source line 887 file info.test cmd {info frame 0} proc ::foo::bar level 0}
  826. namespace delete foo
  827. # -------------------------------------------------------------------------
  828. for {} {1} {} {
  829.     namespace eval foo {}
  830.     proc ::foo::bar {} {info frame 0}
  831.     break
  832. }
  833. test info-24.5 {info frame, interaction, for} tip280 {
  834.     reduce [foo::bar]
  835. } {type source line 901 file info.test cmd {info frame 0} proc ::foo::bar level 0}
  836. namespace delete foo
  837. # -------------------------------------------------------------------------
  838. eval {
  839.     proc bar {} {info frame 0}
  840. }
  841. test info-25.0 {info frame, proc in eval} tip280 {
  842.     reduce [bar]
  843. } {type source line 914 file info.test cmd {info frame 0} proc ::bar level 0}
  844. proc bar {} {info frame 0}
  845. test info-25.1 {info frame, regular proc} tip280 {
  846.     reduce [bar]
  847. } {type source line 921 file info.test cmd {info frame 0} proc ::bar level 0}
  848. rename bar {}
  849. test info-30.0 {bs+nl in literal words} {tip280 knownBug} {
  850.     if {1} {
  851. set res 
  852.     [reduce [info frame 0]]
  853.     }
  854.     set res
  855.     # This is reporting line 3 instead of the correct 4 because the
  856.     # bs+nl combination is subst by the parser before the 'if'
  857.     # command, and the the bcc sees the word. To fix record the
  858.     # offsets of all bs+nl sequences in literal words, then use the
  859.     # information in the bcc to bump line numbers when parsing over
  860.     # the location. Also affected: testcases 22.8 and 23.6.
  861. } {type eval line 4 cmd {info frame 0} proc ::tcltest::RunTest}
  862. # -------------------------------------------------------------------------
  863. # See 24.0 - 24.5 for similar situations, using literal scripts.
  864. set body {set flag 0
  865.     set a c
  866.     set res [info frame 0]} ;# line 3!
  867. test info-31.0 {ns eval, script in variable} tip280 {
  868.     namespace eval foo $body
  869.     set res
  870. } {type eval line 3 cmd {info frame 0} level 0}
  871. catch {namespace delete foo}
  872. test info-31.1 {if, script in variable} tip280 {
  873.     if 1 $body
  874.     set res
  875. } {type eval line 3 cmd {info frame 0} proc ::tcltest::RunTest}
  876. test info-31.1a {if, script in variable} tip280 {
  877.     if 1 then $body
  878.     set res
  879. } {type eval line 3 cmd {info frame 0} proc ::tcltest::RunTest}
  880. test info-31.2 {while, script in variable} tip280 {
  881.     set flag 1
  882.     while {$flag} $body
  883.     set res
  884. } {type eval line 3 cmd {info frame 0} proc ::tcltest::RunTest}
  885. # .3 - proc - scoping prevent return of result ...
  886. test info-31.4 {foreach, script in variable} tip280 {
  887.     foreach var val $body
  888.     set res
  889. } {type eval line 3 cmd {info frame 0} proc ::tcltest::RunTest}
  890. test info-31.5 {for, script in variable} tip280 {
  891.     set flag 1
  892.     for {} {$flag} {} $body
  893.     set res
  894. } {type eval line 3 cmd {info frame 0} proc ::tcltest::RunTest}
  895. test info-31.6 {eval, script in variable} tip280 {
  896.     eval $body
  897.     set res
  898. } {type eval line 3 cmd {info frame 0}}
  899. # -------------------------------------------------------------------------
  900. namespace eval foo {}
  901. set x foo
  902. switch -exact -- $x {
  903.     foo {
  904. proc ::foo::bar {} {info frame 0}
  905.     }
  906. }
  907. test info-24.6.0 {info frame, interaction, switch, list body} tip280 {
  908.     reduce [foo::bar]
  909. } {type source line 1001 file info.test cmd {info frame 0} proc ::foo::bar level 0}
  910. namespace delete foo
  911. unset x
  912. # -------------------------------------------------------------------------
  913. namespace eval foo {}
  914. set x foo
  915. switch -exact -- $x foo {
  916.     proc ::foo::bar {} {info frame 0}
  917. }
  918. test info-24.6.1 {info frame, interaction, switch, multi-body} tip280 {
  919.     reduce [foo::bar]
  920. } {type source line 1017 file info.test cmd {info frame 0} proc ::foo::bar level 0}
  921. namespace delete foo
  922. unset x
  923. # -------------------------------------------------------------------------
  924. namespace eval foo {}
  925. set x foo
  926. switch -exact -- $x [list foo {
  927.     proc ::foo::bar {} {info frame 0}
  928. }]
  929. test info-24.6.2 {info frame, interaction, switch, list body, dynamic} tip280 {
  930.     reduce [foo::bar]
  931. } {type proc line 1 cmd {info frame 0} proc ::foo::bar level 0}
  932. namespace delete foo
  933. unset x
  934. # -------------------------------------------------------------------------
  935. set body {
  936.     foo {
  937. proc ::foo::bar {} {info frame 0}
  938.     }
  939. }
  940. namespace eval foo {}
  941. set x foo
  942. switch -exact -- $x $body
  943. test info-31.7 {info frame, interaction, switch, dynamic} tip280 {
  944.     reduce [foo::bar]
  945. } {type proc line 1 cmd {info frame 0} proc ::foo::bar level 0}
  946. namespace delete foo
  947. unset x
  948. # -------------------------------------------------------------------------
  949. set body {
  950.     proc ::foo::bar {} {info frame 0}
  951. }
  952. namespace eval foo {}
  953. eval $body
  954. test info-32.0 {info frame, dynamic procedure} tip280 {
  955.     reduce [foo::bar]
  956. } {type proc line 1 cmd {info frame 0} proc ::foo::bar level 0}
  957. namespace delete foo
  958. # -------------------------------------------------------------------------
  959. # cleanup
  960. catch {namespace delete test_ns_info1 test_ns_info2}
  961. ::tcltest::cleanupTests
  962. return