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

通讯编程

开发平台:

Visual C++

  1. # Commands covered:  auto_mkindex auto_import
  2. #
  3. # This file contains tests related to autoloading and generating
  4. # the autoloading index.
  5. #
  6. # Copyright (c) 1998  Lucent Technologies, Inc.
  7. # Copyright (c) 1998-1999 by Scriptics Corporation.
  8. #
  9. # See the file "license.terms" for information on usage and redistribution
  10. # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  11. #
  12. # RCS: @(#) $Id: autoMkindex.test,v 1.14.2.1 2004/10/28 00:01:06 dgp Exp $
  13. if {[lsearch [namespace children] ::tcltest] == -1} {
  14.     package require tcltest 2
  15.     namespace import -force ::tcltest::*
  16. }
  17. makeFile {# Test file for:
  18. #   auto_mkindex
  19. #
  20. # This file provides example cases for testing the Tcl autoloading
  21. # facility.  Things are much more complicated with namespaces and classes.
  22. # The "auto_mkindex" facility can no longer be built on top of a simple
  23. # regular expression parser.  It must recognize constructs like this:
  24. #
  25. #   namespace eval foo {
  26. #       proc test {x y} { ... }
  27. #       namespace eval bar {
  28. #           proc another {args} { ... }
  29. #       }
  30. #   }
  31. #
  32. # Note that procedures and itcl class definitions can be nested inside
  33. # of namespaces.
  34. #
  35. # Copyright (c) 1993-1998  Lucent Technologies, Inc.
  36. # This shouldn't cause any problems
  37. namespace import -force blt::*
  38. # Should be able to handle "proc" definitions, even if they are
  39. # preceded by white space.
  40. proc normal {x y} {return [expr $x+$y]}
  41.   proc indented {x y} {return [expr $x+$y]}
  42. #
  43. # Should be able to handle proc declarations within namespaces,
  44. # even if they have explicit namespace paths.
  45. #
  46. namespace eval buried {
  47.     proc inside {args} {return "inside: $args"}
  48.     namespace export pub_*
  49.     proc pub_one {args} {return "one: $args"}
  50.     proc pub_two {args} {return "two: $args"}
  51. }
  52. proc buried::within {args} {return "within: $args"}
  53. namespace eval buried {
  54.     namespace eval under {
  55.         proc neath {args} {return "neath: $args"}
  56.     }
  57.     namespace eval ::buried {
  58.         proc relative {args} {return "relative: $args"}
  59.         proc ::top {args} {return "top: $args"}
  60.         proc ::buried::explicit {args} {return "explicit: $args"}
  61.     }
  62. }
  63. # With proper hooks, we should be able to support other commands
  64. # that create procedures
  65. proc buried::myproc {name body args} {
  66.     ::proc $name $body $args
  67. }
  68. namespace eval ::buried {
  69.     proc mycmd1 args {return "mycmd"}
  70.     myproc mycmd2 args {return "mycmd"}
  71. }
  72. ::buried::myproc mycmd3 args {return "another"}
  73. proc {buried::my proc} {name body args} {
  74.     ::proc $name $body $args
  75. }
  76. namespace eval ::buried {
  77.     proc mycmd4 args {return "mycmd"}
  78.     {my proc} mycmd5 args {return "mycmd"}
  79. }
  80. {::buried::my proc} mycmd6 args {return "another"}
  81. # A correctly functioning [auto_import] won't choke when a child
  82. # namespace [namespace import]s from its parent.
  83. #
  84. namespace eval ::parent::child {
  85.     namespace import ::parent::*
  86. }
  87. proc ::parent::child::test {} {}
  88. } autoMkindex.tcl
  89. # Save initial state of auto_mkindex_parser
  90. auto_load auto_mkindex
  91. if {[info exists auto_mkindex_parser::initCommands]} {
  92.     set saveCommands $auto_mkindex_parser::initCommands
  93. }
  94. proc AutoMkindexTestReset {} {
  95.     global saveCommands
  96.     if {[info exists saveCommands]} {
  97. set auto_mkindex_parser::initCommands $saveCommands
  98.     } elseif {[info exists auto_mkindex_parser::initCommands]} {
  99. unset auto_mkindex_parser::initCommands
  100.     }
  101. }
  102. set result ""
  103. set origDir [pwd]
  104. cd $::tcltest::temporaryDirectory
  105. test autoMkindex-1.1 {remove any existing tclIndex file} {
  106.     file delete tclIndex
  107.     file exists tclIndex
  108. } {0}
  109. test autoMkindex-1.2 {build tclIndex based on a test file} {
  110.     auto_mkindex . autoMkindex.tcl
  111.     file exists tclIndex
  112. } {1}
  113. set element "{source [file join . autoMkindex.tcl]}"
  114. test autoMkindex-1.3 {examine tclIndex} {
  115.     file delete tclIndex
  116.     auto_mkindex . autoMkindex.tcl
  117.     namespace eval tcl_autoMkindex_tmp {
  118.         set dir "."
  119.         variable auto_index
  120.         source tclIndex
  121.         set ::result ""
  122.         foreach elem [lsort [array names auto_index]] {
  123.             lappend ::result [list $elem $auto_index($elem)]
  124.         }
  125.     }
  126.     namespace delete tcl_autoMkindex_tmp
  127.     set ::result
  128. } "{::buried::explicit $element} {::buried::inside $element} {{::buried::my proc} $element} {::buried::mycmd1 $element} {::buried::mycmd4 $element} {::buried::myproc $element} {::buried::pub_one $element} {::buried::pub_two $element} {::buried::relative $element} {::buried::under::neath $element} {::buried::within $element} {::parent::child::test $element} {indented $element} {normal $element} {top $element}"
  129. test autoMkindex-2.1 {commands on the autoload path can be imported} {
  130.     file delete tclIndex
  131.     auto_mkindex . autoMkindex.tcl
  132.     set interp [interp create]
  133.     set final [$interp eval {
  134.         namespace eval blt {}
  135.         set auto_path [linsert $auto_path 0 .]
  136.         set info [list [catch {namespace import buried::*} result] $result]
  137.         foreach name [lsort [info commands pub_*]] {
  138.             lappend info $name [namespace origin $name]
  139.         }
  140.         set info
  141.     }]
  142.     interp delete $interp
  143.     set final
  144. } "0 {} pub_one ::buried::pub_one pub_two ::buried::pub_two"
  145. # Test auto_mkindex hooks
  146. # Slave hook executes interesting code in the interp used to watch code.
  147. test autoMkindex-3.1 {slaveHook} {
  148.     auto_mkindex_parser::slavehook {
  149. _%@namespace eval ::blt {
  150.     proc foo {} {}
  151.     _%@namespace export foo
  152. }
  153.     }
  154.     auto_mkindex_parser::slavehook { _%@namespace import -force ::blt::* }
  155.     file delete tclIndex
  156.     auto_mkindex . autoMkindex.tcl
  157.      
  158.     # Reset initCommands to avoid trashing other tests
  159.     AutoMkindexTestReset
  160.     file exists tclIndex
  161. } 1 
  162. # The auto_mkindex_parser::command is used to register commands
  163. # that create new commands.
  164. test autoMkindex-3.2 {auto_mkindex_parser::command} {
  165.     auto_mkindex_parser::command buried::myproc {name args} {
  166. variable index
  167. variable scriptFile
  168. append index [list set auto_index([fullname $name])] 
  169. " [list source [file join $dir [list $scriptFile]]]n"
  170.     }
  171.     file delete tclIndex
  172.     auto_mkindex . autoMkindex.tcl
  173.     namespace eval tcl_autoMkindex_tmp {
  174.         set dir "."
  175.         variable auto_index
  176.         source tclIndex
  177.         set ::result ""
  178.         foreach elem [lsort [array names auto_index]] {
  179.             lappend ::result [list $elem $auto_index($elem)]
  180.         }
  181.     }
  182.     namespace delete tcl_autoMkindex_tmp
  183.     # Reset initCommands to avoid trashing other tests
  184.     AutoMkindexTestReset
  185.     set ::result
  186. } "{::buried::explicit $element} {::buried::inside $element} {{::buried::my proc} $element} {::buried::mycmd1 $element} {::buried::mycmd2 $element} {::buried::mycmd4 $element} {::buried::myproc $element} {::buried::pub_one $element} {::buried::pub_two $element} {::buried::relative $element} {::buried::under::neath $element} {::buried::within $element} {::parent::child::test $element} {indented $element} {mycmd3 $element} {normal $element} {top $element}"
  187. test autoMkindex-3.3 {auto_mkindex_parser::command} {knownBug} {
  188.     auto_mkindex_parser::command {buried::my proc} {name args} {
  189. variable index
  190. variable scriptFile
  191. puts "my proc $name"
  192. append index [list set auto_index([fullname $name])] 
  193. " [list source [file join $dir [list $scriptFile]]]n"
  194.     }
  195.     file delete tclIndex
  196.     auto_mkindex . autoMkindex.tcl
  197.     namespace eval tcl_autoMkindex_tmp {
  198.         set dir "."
  199.         variable auto_index
  200.         source tclIndex
  201.         set ::result ""
  202.         foreach elem [lsort [array names auto_index]] {
  203.             lappend ::result [list $elem $auto_index($elem)]
  204.         }
  205.     }
  206.     namespace delete tcl_autoMkindex_tmp
  207.     # Reset initCommands to avoid trashing other tests
  208.     AutoMkindexTestReset
  209.     proc lvalue {list pattern} {
  210. set ix [lsearch $list $pattern]
  211. if {$ix >= 0} {
  212.     return [lindex $list $ix]
  213. } else {
  214.     return {}
  215. }
  216.     }
  217.     list [lvalue $::result *mycmd4*] [lvalue $::result *mycmd5*] [lvalue $::result *mycmd6*]
  218. } "{::buried::mycmd4 $element} {::buried::mycmd5 $element} {mycmd6 $element}"
  219. makeDirectory pkg
  220. makeFile {
  221. package provide football 1.0
  222.     
  223. namespace eval ::pro:: {
  224.     #
  225.     # export only public functions.
  226.     #
  227.     namespace export {[a-z]*}
  228. }
  229. namespace eval ::college:: {
  230.     #
  231.     # export only public functions.
  232.     #
  233.     namespace export {[a-z]*}
  234. }
  235. proc ::pro::team {} {
  236.     puts "go packers!"
  237.     return true
  238. }
  239. proc ::college::team {} {
  240.     puts "go badgers!"
  241.     return true
  242. }
  243. } [file join pkg samename.tcl]
  244. test autoMkindex-4.1 {platform indenpendant source commands} {
  245.     file delete tclIndex
  246.     auto_mkindex . pkg/samename.tcl
  247.     set f [open tclIndex r]
  248.     set dat [split [string trim [read $f]] "n"]
  249.     set len [llength $dat]
  250.     set result [lsort [lrange $dat [expr {$len-2}] [expr {$len-1}]]]
  251.     close $f
  252.     set result
  253. } {{set auto_index(::college::team) [list source [file join $dir pkg samename.tcl]]} {set auto_index(::pro::team) [list source [file join $dir pkg samename.tcl]]}}
  254. removeFile [file join pkg samename.tcl]
  255. makeFile {
  256. set dollar1 "this string contains an unescaped dollar sign -> \$foo"
  257. set dollar2 "this string contains an escaped dollar sign -> $foo \$foo"
  258. set bracket1 "this contains an unescaped bracket [NoSuchProc]"
  259. set bracket2 "this contains an escaped bracket [NoSuchProc]"
  260. set bracket3 "this contains nested unescaped brackets [[NoSuchProc]]"
  261. proc testProc {} {}
  262. } [file join pkg magicchar.tcl]
  263. test autoMkindex-5.1 {escape magic tcl chars in general code} {
  264.     file delete tclIndex
  265.     set result {}
  266.     if { ![catch {auto_mkindex . pkg/magicchar.tcl}] } {
  267. set f [open tclIndex r]
  268. set dat [split [string trim [read $f]] "n"]
  269. set result [lindex $dat end]
  270. close $f
  271.     }
  272.     set result
  273. } {set auto_index(testProc) [list source [file join $dir pkg magicchar.tcl]]}
  274. removeFile [file join pkg magicchar.tcl]
  275. makeFile {
  276. proc {[magic mojo proc]} {} {}
  277. } [file join pkg magicchar2.tcl]
  278. test autoMkindex-5.2 {correctly locate auto loaded procs with []} {
  279.     file delete tclIndex
  280.     set result {}
  281.     if { ![catch {auto_mkindex . pkg/magicchar2.tcl}] } {
  282. # Make a slave interp to test the autoloading
  283. set c [interp create]
  284. $c eval {lappend auto_path [pwd]}
  285. set result [$c eval {catch {{[magic mojo proc]}}}]
  286. interp delete $c
  287.     }
  288.     set result
  289. } 0
  290. removeFile [file join pkg magicchar2.tcl]
  291. removeDirectory pkg
  292. # Clean up.
  293. unset result
  294. AutoMkindexTestReset
  295. if {[info exists saveCommands]} {
  296.     unset saveCommands
  297. }
  298. rename AutoMkindexTestReset ""
  299. removeFile autoMkindex.tcl
  300. if {[file exists tclIndex]} {
  301.     file delete -force tclIndex
  302. }
  303. cd $origDir
  304. ::tcltest::cleanupTests