1 # Commands covered: auto_mkindex auto_import
3 # This file contains tests related to autoloading and generating
4 # the autoloading index.
6 # Copyright (c) 1998 Lucent Technologies, Inc.
7 # Copyright (c) 1998-1999 by Scriptics Corporation.
9 # See the file "license.terms" for information on usage and redistribution
10 # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
14 if {[lsearch [namespace children] ::tcltest] == -1} {
15 package require tcltest
16 namespace import -force ::tcltest::*
19 # temporarily copy the autoMkindex.tcl file from testsDirectory to
21 set origMkindexFile [file join $::tcltest::testsDirectory autoMkindex.tcl]
22 set newMkindexFile [file join $::tcltest::temporaryDirectory autoMkindex.tcl]
23 if {![catch {file copy $origMkindexFile $newMkindexFile}]} {
24 set removeAutoMkindex 1
27 # Save initial state of auto_mkindex_parser
29 auto_load auto_mkindex
30 if {[info exist auto_mkindex_parser::initCommands]} {
31 set saveCommands $auto_mkindex_parser::initCommands
33 proc AutoMkindexTestReset {} {
35 if {[info exist saveCommands]} {
36 set auto_mkindex_parser::initCommands $saveCommands
37 } elseif {[info exist auto_mkindex_parser::initCommands]} {
38 unset auto_mkindex_parser::initCommands
45 cd $::tcltest::testsDirectory
47 test autoMkindex-1.1 {remove any existing tclIndex file} {
52 test autoMkindex-1.2 {build tclIndex based on a test file} {
53 auto_mkindex . autoMkindex.tcl
57 set element "{source [file join . autoMkindex.tcl]}"
59 test autoMkindex-1.3 {examine tclIndex} {
61 auto_mkindex . autoMkindex.tcl
62 namespace eval tcl_autoMkindex_tmp {
67 foreach elem [lsort [array names auto_index]] {
68 lappend ::result [list $elem $auto_index($elem)]
71 namespace delete tcl_autoMkindex_tmp
73 } "{::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} {indented $element} {normal $element} {top $element}"
76 test autoMkindex-2.1 {commands on the autoload path can be imported} {
78 auto_mkindex . autoMkindex.tcl
79 set interp [interp create]
80 set final [$interp eval {
82 set auto_path [linsert $auto_path 0 .]
83 set info [list [catch {namespace import buried::*} result] $result]
84 foreach name [lsort [info commands pub_*]] {
85 lappend info $name [namespace origin $name]
91 } "0 {} pub_one ::buried::pub_one pub_two ::buried::pub_two"
93 # Test auto_mkindex hooks
95 # Slave hook executes interesting code in the interp used to watch code.
97 test autoMkindex-3.1 {slaveHook} {
98 auto_mkindex_parser::slavehook {
99 _%@namespace eval ::blt {
101 _%@namespace export foo
104 auto_mkindex_parser::slavehook { _%@namespace import -force ::blt::* }
106 auto_mkindex . autoMkindex.tcl
108 # Reset initCommands to avoid trashing other tests
114 # The auto_mkindex_parser::command is used to register commands
115 # that create new commands.
117 test autoMkindex-3.2 {auto_mkindex_parser::command} {
118 auto_mkindex_parser::command buried::myproc {name args} {
121 append index [list set auto_index([fullname $name])] \
122 " \[list source \[file join \$dir [list $scriptFile]\]\]\n"
125 auto_mkindex . autoMkindex.tcl
126 namespace eval tcl_autoMkindex_tmp {
131 foreach elem [lsort [array names auto_index]] {
132 lappend ::result [list $elem $auto_index($elem)]
135 namespace delete tcl_autoMkindex_tmp
137 # Reset initCommands to avoid trashing other tests
141 } "{::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} {indented $element} {mycmd3 $element} {normal $element} {top $element}"
144 test autoMkindex-3.3 {auto_mkindex_parser::command} {knownBug} {
145 auto_mkindex_parser::command {buried::my proc} {name args} {
149 append index [list set auto_index([fullname $name])] \
150 " \[list source \[file join \$dir [list $scriptFile]\]\]\n"
153 auto_mkindex . autoMkindex.tcl
154 namespace eval tcl_autoMkindex_tmp {
159 foreach elem [lsort [array names auto_index]] {
160 lappend ::result [list $elem $auto_index($elem)]
163 namespace delete tcl_autoMkindex_tmp
165 # Reset initCommands to avoid trashing other tests
168 proc lvalue {list pattern} {
169 set ix [lsearch $list $pattern]
171 return [lindex $list $ix]
176 list [lvalue $::result *mycmd4*] [lvalue $::result *mycmd5*] [lvalue $::result *mycmd6*]
177 } "{::buried::mycmd4 $element} {::buried::mycmd5 $element} {mycmd6 $element}"
179 test autoMkindex-4.1 {platform indenpendant source commands} {
181 auto_mkindex . pkg/samename.tcl
182 set f [open tclIndex r]
183 set dat [split [string trim [read $f]] "\n"]
184 set len [llength $dat]
185 set result [lsort [lrange $dat [expr {$len-2}] [expr {$len-1}]]]
188 } {{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]]}}
190 test autoMkindex-5.1 {escape magic tcl chars in general code} {
193 if { ![catch {auto_mkindex . pkg/magicchar.tcl}] } {
194 set f [open tclIndex r]
195 set dat [split [string trim [read $f]] "\n"]
196 set result [lindex $dat end]
200 } {set auto_index(testProc) [list source [file join $dir pkg magicchar.tcl]]}
201 test autoMkindex-5.2 {correctly locate auto loaded procs with []} {
204 if { ![catch {auto_mkindex . pkg/magicchar2.tcl}] } {
205 # Make a slave interp to test the autoloading
206 set c [interp create]
207 $c eval {lappend auto_path [pwd]}
208 set res [$c eval {catch {{[magic mojo proc]}}}]
218 if {[info exist saveCommands]} {
221 rename AutoMkindexTestReset ""
223 if {[info exists removeAutoMkindex]} {
224 catch {file delete $newMkindexFile}
226 if {[file exists tclIndex]} {
227 file delete -force tclIndex
232 ::tcltest::cleanupTests