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

通讯编程

开发平台:

Visual C++

  1. # This file contains tests for the pkg_mkIndex command.
  2. # Note that the tests are limited to Tcl scripts only, there are no shared
  3. # libraries against which to test.
  4. #
  5. # Sourcing this file into Tcl runs the tests and generates output for
  6. # errors.  No output means no errors were found.
  7. #
  8. # Copyright (c) 1998-1999 by Scriptics Corporation.
  9. # All rights reserved.
  10. #
  11. # RCS: @(#) $Id: pkgMkIndex.test,v 1.23.2.1 2003/07/24 08:23:39 rmax Exp $
  12. if {[lsearch [namespace children] ::tcltest] == -1} {
  13.     package require tcltest 2
  14.     namespace import -force ::tcltest::*
  15. }
  16. set fullPkgPath [makeDirectory pkg]
  17. namespace eval pkgtest {
  18.     # Namespace for procs we can discard
  19. }
  20. # pkgtest::parseArgs --
  21. #
  22. #  Parse an argument list.
  23. #
  24. # Arguments:
  25. #  <flags> (optional) arguments starting with a dash are collected
  26. # as options to pkg_mkIndex and passed to pkg_mkIndex.
  27. #  dirPath the directory to index
  28. #  pattern0 pattern to index
  29. #  ... pattern to index
  30. #  patternN pattern to index
  31. #
  32. # Results:
  33. #  Returns a three element list:
  34. #    0: the options
  35. #    1: the directory to index
  36. #    2: the patterns list
  37. proc pkgtest::parseArgs { args } {
  38.     set options ""
  39.     set argc [llength $args]
  40.     for {set iarg 0} {$iarg < $argc} {incr iarg} {
  41. set a [lindex $args $iarg]
  42. if {[regexp {^-} $a]} {
  43.     lappend options $a
  44.     if {[string compare -load $a] == 0} {
  45. incr iarg
  46. lappend options [lindex $args $iarg]
  47.     }
  48. } else {
  49.     break
  50. }
  51.     }
  52.     set dirPath [lindex $args $iarg]
  53.     incr iarg
  54.     set patternList [lrange $args $iarg end]
  55.     return [list $options $dirPath $patternList]
  56. }
  57. # pkgtest::parseIndex --
  58. #
  59. #  Loads a pkgIndex.tcl file, records all the calls to "package ifneeded".
  60. #
  61. # Arguments:
  62. #  filePath path to the pkgIndex.tcl file.
  63. #
  64. # Results:
  65. #  Returns a list, in "array set/get" format, where the keys are the package
  66. #  name and version (in the form "$name:$version"), and the values the rest
  67. #  of the command line.
  68. proc pkgtest::parseIndex { filePath } {
  69.     # create a slave interpreter, where we override "package ifneeded"
  70.     set slave [interp create]
  71.     if {[catch {
  72. $slave eval {
  73.     rename package package_original
  74.     proc package { args } {
  75. if {[string compare [lindex $args 0] ifneeded] == 0} {
  76.     set pkg [lindex $args 1]
  77.     set ver [lindex $args 2]
  78.     set ::PKGS($pkg:$ver) [lindex $args 3]
  79. } else {
  80.     return [eval package_original $args]
  81. }
  82.     }
  83.     array set ::PKGS {}
  84. }
  85. set dir [file dirname $filePath]
  86. $slave eval {set curdir [pwd]}
  87. $slave eval [list cd $dir]
  88. $slave eval [list set dir $dir]
  89. $slave eval [list source [file tail $filePath]]
  90. $slave eval {cd $curdir}
  91. # Create the list in sorted order, so that we don't get spurious
  92. # errors because the order has changed.
  93. array set P {}
  94. foreach {k v} [$slave eval {array get ::PKGS}] {
  95.     set P($k) $v
  96. }
  97. set PKGS ""
  98. foreach k [lsort [array names P]] {
  99.     lappend PKGS $k $P($k)
  100. }
  101.     } err]} {
  102. set ei $::errorInfo
  103. set ec $::errorCode
  104. catch {interp delete $slave}
  105. error $ei $ec
  106.     }
  107.     interp delete $slave
  108.     return $PKGS
  109. }
  110. # pkgtest::createIndex --
  111. #
  112. #  Runs pkg_mkIndex for the given directory and set of patterns.
  113. #  This procedure deletes any pkgIndex.tcl file in the target directory,
  114. #  then runs pkg_mkIndex.
  115. #
  116. # Arguments:
  117. #  <flags> (optional) arguments starting with a dash are collected
  118. # as options to pkg_mkIndex and passed to pkg_mkIndex.
  119. #  dirPath the directory to index
  120. #  pattern0 pattern to index
  121. #  ... pattern to index
  122. #  patternN pattern to index
  123. #
  124. # Results:
  125. #  Returns a two element list:
  126. #    0: 1 if the procedure encountered an error, 0 otherwise.
  127. #    1: the error result if element 0 was 1
  128. proc pkgtest::createIndex { args } {
  129.     set parsed [eval parseArgs $args]
  130.     set options [lindex $parsed 0]
  131.     set dirPath [lindex $parsed 1]
  132.     set patternList [lindex $parsed 2]
  133.     file mkdir $dirPath
  134.     if {[catch {
  135. file delete [file join $dirPath pkgIndex.tcl]
  136. eval pkg_mkIndex $options [list $dirPath] $patternList
  137.     } err]} {
  138. return [list 1 $err]
  139.     }
  140.     return [list 0 {}]
  141. }
  142. # makePkgList --
  143. #
  144. #  Takes the output of a pkgtest::parseIndex call, filters it and returns a
  145. #  cleaned up list of packages and their actions.
  146. #
  147. # Arguments:
  148. #  inList output from a pkgtest::parseIndex.
  149. #
  150. # Results:
  151. #  Returns a list of two element lists:
  152. #    0: the name:version
  153. #    1: a list describing the package.
  154. # For tclPkgSetup packages it consists of:
  155. #  0: the keyword tclPkgSetup
  156. #  1: the first file to source, with its exported procedures
  157. #  2: the second file ...
  158. #  N: the N-1st file ...
  159. proc makePkgList { inList } {
  160.     set pkgList ""
  161.     foreach {k v} $inList {
  162. switch [lindex $v 0] {
  163.     tclPkgSetup {
  164. set l tclPkgSetup
  165. foreach s [lindex $v 4] {
  166.     lappend l $s
  167. }
  168.     }
  169.     source {
  170. set l $v
  171.     }
  172.     default {
  173. error "can't handle $k $v"
  174.     }
  175. }
  176. lappend pkgList [list $k $l]
  177.     }
  178.     return $pkgList
  179. }
  180. # pkgtest::runIndex --
  181. #
  182. #  Runs pkg_mkIndex, parses the generated index file.
  183. #
  184. # Arguments:
  185. #  <flags> (optional) arguments starting with a dash are collected
  186. # as options to pkg_mkIndex and passed to pkg_mkIndex.
  187. #  dirPath the directory to index
  188. #  pattern0 pattern to index
  189. #  ... pattern to index
  190. #  patternN pattern to index
  191. #
  192. # Results:
  193. #  Returns a two element list:
  194. #    0: 1 if the procedure encountered an error, 0 otherwise.
  195. #    1: if no error, this is the parsed generated index file, in the format
  196. # returned by pkgtest::parseIndex.
  197. # If error, this is the error result.
  198. proc pkgtest::runCreatedIndex {rv args} {
  199.     if {[lindex $rv 0] == 0} {
  200. set parsed [eval parseArgs $args]
  201. set dirPath [lindex $parsed 1]
  202. set idxFile [file join $dirPath pkgIndex.tcl]
  203. if {[catch {
  204.     set result [list 0 [makePkgList [parseIndex $idxFile]]]
  205. } err]} {
  206.     set result [list 1 $err]
  207. file delete $idxFile
  208.     } else {
  209. set result $rv
  210.     }
  211.     return $result
  212. }
  213. proc pkgtest::runIndex { args } {
  214.     set rv [eval createIndex $args]
  215.     return [eval [list runCreatedIndex $rv] $args]
  216. }
  217. # If there is no match to the patterns, make sure the directory hasn't
  218. # changed on us
  219. test pkgMkIndex-1.1 {nothing matches pattern - current dir is the same} {
  220.     list [pkgtest::runIndex -lazy $fullPkgPath nomatch.tcl] [pwd]
  221. } [list {1 {no files matched glob pattern "nomatch.tcl"}} [pwd]]
  222. makeFile {
  223. #  This is a simple package, just to check basic functionality.
  224. package provide simple 1.0
  225. namespace eval simple {
  226.     namespace export lower upper
  227. }
  228. proc simple::lower { stg } {
  229.     return [string tolower $stg]
  230. }
  231. proc simple::upper { stg } {
  232.     return [string toupper $stg]
  233. }
  234. } [file join pkg simple.tcl]
  235. test pkgMkIndex-2.1 {simple package} {
  236.     pkgtest::runIndex -lazy $fullPkgPath simple.tcl
  237. } {0 {{simple:1.0 {tclPkgSetup {simple.tcl source {::simple::lower ::simple::upper}}}}}}
  238. test pkgMkIndex-2.2 {simple package - use -direct} {
  239.     pkgtest::runIndex -direct $fullPkgPath simple.tcl
  240. } "0 {{simple:1.0 {[list source [file join $fullPkgPath simple.tcl]]}}}"
  241. test pkgMkIndex-2.3 {simple package - direct loading is default} {
  242.     pkgtest::runIndex $fullPkgPath simple.tcl
  243. } "0 {{simple:1.0 {[list source [file join $fullPkgPath simple.tcl]]}}}"
  244. test pkgMkIndex-2.4 {simple package - use -verbose} -body {
  245.     pkgtest::runIndex -verbose $fullPkgPath simple.tcl
  246. } -result "0 {{simple:1.0 {[list source [file join $fullPkgPath simple.tcl]]}}}" 
  247.     -errorOutput {successful sourcing of simple.tcl
  248. packages provided were {simple 1.0}
  249. processed simple.tcl
  250. }
  251. removeFile [file join pkg simple.tcl]
  252. makeFile {
  253. #  Contains global symbols, used to check that they don't have a leading ::
  254. package provide global 1.0
  255. proc global_lower { stg } {
  256.     return [string tolower $stg]
  257. }
  258. proc global_upper { stg } {
  259.     return [string toupper $stg]
  260. }
  261. } [file join pkg global.tcl]
  262. test pkgMkIndex-3.1 {simple package with global symbols} {
  263.     pkgtest::runIndex -lazy $fullPkgPath global.tcl
  264. } {0 {{global:1.0 {tclPkgSetup {global.tcl source {global_lower global_upper}}}}}}
  265. removeFile [file join pkg global.tcl]
  266. makeFile {
  267. #  This package is required by pkg1.
  268. #  This package is split into two files, to test packages that are split
  269. #  over multiple files.
  270. package provide pkg2 1.0
  271. namespace eval pkg2 {
  272.     namespace export p2-1
  273. }
  274. proc pkg2::p2-1 { num } {
  275.     return [expr $num * 2]
  276. }
  277. } [file join pkg pkg2_a.tcl]
  278. makeFile {
  279. #  This package is required by pkg1.
  280. #  This package is split into two files, to test packages that are split
  281. #  over multiple files.
  282. package provide pkg2 1.0
  283. namespace eval pkg2 {
  284.     namespace export p2-2
  285. }
  286. proc pkg2::p2-2 { num } {
  287.     return [expr $num * 3]
  288. }
  289. } [file join pkg pkg2_b.tcl]
  290. test pkgMkIndex-4.1 {split package} {
  291.     pkgtest::runIndex -lazy $fullPkgPath pkg2_a.tcl pkg2_b.tcl
  292. } {0 {{pkg2:1.0 {tclPkgSetup {pkg2_a.tcl source ::pkg2::p2-1} {pkg2_b.tcl source ::pkg2::p2-2}}}}}
  293. test pkgMkIndex-4.2 {split package - direct loading} {
  294.     pkgtest::runIndex -direct $fullPkgPath pkg2_a.tcl pkg2_b.tcl
  295. } "0 {{pkg2:1.0 {[list source [file join $fullPkgPath pkg2_a.tcl]]
  296. [list source [file join $fullPkgPath pkg2_b.tcl]]}}}"
  297. # Add the direct1 directory to auto_path, so that the direct1 package 
  298. # can be found.
  299. set direct1 [makeDirectory direct1]
  300. lappend auto_path $direct1
  301. makeFile {
  302. #  This is referenced by pkgIndex.tcl as a -direct script.
  303. package provide direct1 1.0
  304. namespace eval direct1 {
  305.     namespace export pd1 pd2
  306. }
  307. proc direct1::pd1 { stg } {
  308.     return [string tolower $stg]
  309. }
  310. proc direct1::pd2 { stg } {
  311.     return [string toupper $stg]
  312. }
  313. } [file join direct1 direct1.tcl]
  314. pkg_mkIndex -direct $direct1 direct1.tcl
  315. makeFile {
  316. #  Does a package require of direct1, whose pkgIndex.tcl entry
  317. #  is created above with option -direct.  This tests that pkg_mkIndex
  318. #  can handle code that is sourced in pkgIndex.tcl files.
  319. package require direct1
  320. package provide std 1.0
  321. namespace eval std {
  322.     namespace export p1 p2
  323. }
  324. proc std::p1 { stg } {
  325.     return [string tolower $stg]
  326. }
  327. proc std::p2 { stg } {
  328.     return [string toupper $stg]
  329. }
  330. } [file join pkg std.tcl]
  331. test pkgMkIndex-5.1 {requires -direct package} {
  332.     pkgtest::runIndex -lazy $fullPkgPath std.tcl
  333. } {0 {{std:1.0 {tclPkgSetup {std.tcl source {::std::p1 ::std::p2}}}}}}
  334. removeFile [file join direct1 direct1.tcl]
  335. file delete [file join $direct1 pkgIndex.tcl]
  336. removeDirectory direct1
  337. removeFile [file join pkg std.tcl]
  338. makeFile {
  339. #  This package requires pkg3, but it does
  340. #  not use any of pkg3's procs in the code that is executed by the file
  341. #  (i.e. references to pkg3's procs are in the proc bodies only).
  342. package require pkg3 1.0
  343. package provide pkg1 1.0
  344. namespace eval pkg1 {
  345.     namespace export p1-1 p1-2
  346. }
  347. proc pkg1::p1-1 { num } {
  348.     return [pkg3::p3-1 $num]
  349. }
  350. proc pkg1::p1-2 { num } {
  351.     return [pkg3::p3-2 $num]
  352. }
  353. } [file join pkg pkg1.tcl]
  354. makeFile {
  355. package provide pkg3 1.0
  356. namespace eval pkg3 {
  357.     namespace export p3-1 p3-2
  358. }
  359. proc pkg3::p3-1 { num } {
  360.     return {[expr $num * 2]}
  361. }
  362. proc pkg3::p3-2 { num } {
  363.     return {[expr $num * 3]}
  364. }
  365. } [file join pkg pkg3.tcl]
  366. test pkgMkIndex-6.1 {pkg1 requires pkg3} {
  367.     pkgtest::runIndex -lazy $fullPkgPath pkg1.tcl pkg3.tcl
  368. } {0 {{pkg1:1.0 {tclPkgSetup {pkg1.tcl source {::pkg1::p1-1 ::pkg1::p1-2}}}} {pkg3:1.0 {tclPkgSetup {pkg3.tcl source {::pkg3::p3-1 ::pkg3::p3-2}}}}}}
  369. test pkgMkIndex-6.2 {pkg1 requires pkg3 - use -direct} {
  370.     pkgtest::runIndex -direct $fullPkgPath pkg1.tcl pkg3.tcl
  371. } "0 {{pkg1:1.0 {[list source [file join $fullPkgPath pkg1.tcl]]}} {pkg3:1.0 {[list source [file join $fullPkgPath pkg3.tcl]]}}}"
  372. removeFile [file join pkg pkg1.tcl]
  373. makeFile {
  374. #  This package requires pkg3, and it calls
  375. #  a pkg3 proc in the code that is executed by the file
  376. package require pkg3 1.0
  377. package provide pkg4 1.0
  378. namespace eval pkg4 {
  379.     namespace export p4-1 p4-2
  380.     variable m2 [pkg3::p3-1 10]
  381. }
  382. proc pkg4::p4-1 { num } {
  383.     variable m2
  384.     return [expr {$m2 * $num}]
  385. }
  386. proc pkg4::p4-2 { num } {
  387.     return [pkg3::p3-2 $num]
  388. }
  389. } [file join pkg pkg4.tcl]
  390. test pkgMkIndex-7.1 {pkg4 uses pkg3} {
  391.     pkgtest::runIndex -lazy $fullPkgPath pkg4.tcl pkg3.tcl
  392. } {0 {{pkg3:1.0 {tclPkgSetup {pkg3.tcl source {::pkg3::p3-1 ::pkg3::p3-2}}}} {pkg4:1.0 {tclPkgSetup {pkg4.tcl source {::pkg4::p4-1 ::pkg4::p4-2}}}}}}
  393. test pkgMkIndex-7.2 {pkg4 uses pkg3 - use -direct} {
  394.     pkgtest::runIndex -direct $fullPkgPath pkg4.tcl pkg3.tcl
  395. } "0 {{pkg3:1.0 {[list source [file join $fullPkgPath pkg3.tcl]]}} {pkg4:1.0 {[list source [file join $fullPkgPath pkg4.tcl]]}}}"
  396. removeFile [file join pkg pkg4.tcl]
  397. removeFile [file join pkg pkg3.tcl]
  398. makeFile {
  399. #  This package requires pkg2, and it calls
  400. #  a pkg2 proc in the code that is executed by the file.
  401. #  Pkg2 is a split package.
  402. package require pkg2 1.0
  403. package provide pkg5 1.0
  404. namespace eval pkg5 {
  405.     namespace export p5-1 p5-2
  406.     variable m2 [pkg2::p2-1 10]
  407.     variable m3 [pkg2::p2-2 10]
  408. }
  409. proc pkg5::p5-1 { num } {
  410.     variable m2
  411.     return [expr {$m2 * $num}]
  412. }
  413. proc pkg5::p5-2 { num } {
  414.     variable m2
  415.     return [expr {$m2 * $num}]
  416. }
  417. } [file join pkg pkg5.tcl]
  418. test pkgMkIndex-8.1 {pkg5 uses pkg2} {
  419.     pkgtest::runIndex -lazy $fullPkgPath pkg5.tcl pkg2_a.tcl pkg2_b.tcl
  420. } {0 {{pkg2:1.0 {tclPkgSetup {pkg2_a.tcl source ::pkg2::p2-1} {pkg2_b.tcl source ::pkg2::p2-2}}} {pkg5:1.0 {tclPkgSetup {pkg5.tcl source {::pkg5::p5-1 ::pkg5::p5-2}}}}}}
  421. test pkgMkIndex-8.2 {pkg5 uses pkg2 - use -direct} {
  422.     pkgtest::runIndex -direct $fullPkgPath pkg5.tcl pkg2_a.tcl pkg2_b.tcl
  423. } "0 {{pkg2:1.0 {[list source [file join $fullPkgPath pkg2_a.tcl]]
  424. [list source [file join $fullPkgPath pkg2_b.tcl]]}} {pkg5:1.0 {[list source [file join $fullPkgPath pkg5.tcl]]}}}"
  425. removeFile [file join pkg pkg5.tcl]
  426. removeFile [file join pkg pkg2_a.tcl]
  427. removeFile [file join pkg pkg2_b.tcl]
  428. makeFile {
  429. #  This package requires circ2, and circ2
  430. #  requires circ3, which in turn requires circ1.
  431. #  In case of cirularities, pkg_mkIndex should give up when it gets stuck.
  432. package require circ2 1.0
  433. package provide circ1 1.0
  434. namespace eval circ1 {
  435.     namespace export c1-1 c1-2 c1-3 c1-4
  436. }
  437. proc circ1::c1-1 { num } {
  438.     return [circ2::c2-1 $num]
  439. }
  440. proc circ1::c1-2 { num } {
  441.     return [circ2::c2-2 $num]
  442. }
  443. proc circ1::c1-3 {} {
  444.     return 10
  445. }
  446. proc circ1::c1-4 {} {
  447.     return 20
  448. }
  449. } [file join pkg circ1.tcl]
  450. makeFile {
  451. #  This package is required by circ1, and
  452. #  requires circ3. Circ3, in turn, requires circ1 to give us a circularity.
  453. package require circ3 1.0
  454. package provide circ2 1.0
  455. namespace eval circ2 {
  456.     namespace export c2-1 c2-2
  457. }
  458. proc circ2::c2-1 { num } {
  459.     return [expr $num * [circ3::c3-1]]
  460. }
  461. proc circ2::c2-2 { num } {
  462.     return [expr $num * [circ3::c3-2]]
  463. }
  464. } [file join pkg circ2.tcl]
  465. makeFile {
  466. #  This package is required by circ2, and in
  467. #  turn requires circ1. This closes the circularity.
  468. package require circ1 1.0
  469. package provide circ3 1.0
  470. namespace eval circ3 {
  471.     namespace export c3-1 c3-4
  472. }
  473. proc circ3::c3-1 {} {
  474.     return [circ1::c1-3]
  475. }
  476. proc circ3::c3-2 {} {
  477.     return [circ1::c1-4]
  478. }
  479. } [file join pkg circ3.tcl]
  480. test pkgMkIndex-9.1 {circular packages} {
  481.     pkgtest::runIndex -lazy $fullPkgPath circ1.tcl circ2.tcl circ3.tcl
  482. } {0 {{circ1:1.0 {tclPkgSetup {circ1.tcl source {::circ1::c1-1 ::circ1::c1-2 ::circ1::c1-3 ::circ1::c1-4}}}} {circ2:1.0 {tclPkgSetup {circ2.tcl source {::circ2::c2-1 ::circ2::c2-2}}}} {circ3:1.0 {tclPkgSetup {circ3.tcl source ::circ3::c3-1}}}}}
  483. removeFile [file join pkg circ1.tcl]
  484. removeFile [file join pkg circ2.tcl]
  485. removeFile [file join pkg circ3.tcl]
  486. # Some tests require the existence of one of the DLLs in the dltest directory
  487. set x [file join [file dirname [info nameofexecutable]] dltest 
  488. pkga[info sharedlibextension]]
  489. set dll "[file tail $x]Required"
  490. ::tcltest::testConstraint $dll [file exists $x]
  491. if {[testConstraint $dll]} {
  492. makeFile {
  493. #  This package provides Pkga, which is also provided by a DLL.
  494. package provide Pkga 1.0
  495. proc pkga_neq { x } {
  496.     return [expr {! [pkgq_eq $x]}]
  497. }
  498. } [file join pkg pkga.tcl]
  499. file copy -force $x $fullPkgPath
  500. }
  501. testConstraint exec [llength [info commands ::exec]]
  502. test pkgMkIndex-10.1 {package in DLL and script} [list exec $dll] {
  503.     # Do all [load]ing of shared libraries in another process, so 
  504.     # we can delete the file and not get stuck because we're holding
  505.     # a reference to it.
  506.     set cmd [list pkg_mkIndex -lazy $fullPkgPath [file tail $x] pkga.tcl]
  507.     exec [interpreter] << $cmd
  508.     pkgtest::runCreatedIndex {0 {}} -lazy $fullPkgPath pkga[info sharedlibextension] pkga.tcl
  509. } "0 {{Pkga:1.0 {tclPkgSetup {pkga[info sharedlibextension] load {pkga_eq pkga_quote}} {pkga.tcl source pkga_neq}}}}"
  510. test pkgMkIndex-10.2 {package in DLL hidden by -load} [list exec $dll] {
  511.     # Do all [load]ing of shared libraries in another process, so 
  512.     # we can delete the file and not get stuck because we're holding
  513.     # a reference to it.
  514.     #
  515.     # This test depends on context from prior test, so repeat it.
  516.     set script "[list pkg_mkIndex -lazy $fullPkgPath [file tail $x] pkga.tcl]n"
  517.     append script 
  518.     "[list pkg_mkIndex -lazy -load Pkg* $fullPkgPath [file tail $x]]"
  519.     exec [interpreter] << $script
  520.     pkgtest::runCreatedIndex {0 {}} -lazy -load Pkg* -- $fullPkgPath pkga[info sharedlibextension]
  521. } {0 {}}
  522. if {[testConstraint $dll]} {
  523. file delete -force [file join $fullPkgPath [file tail $x]]
  524. removeFile [file join pkg pkga.tcl]
  525. }
  526. # Tolerate "namespace import" at the global scope
  527. makeFile {
  528. package provide fubar 1.0
  529. namespace eval ::fubar:: {
  530.     #
  531.     # export only public functions.
  532.     #
  533.     namespace export {[a-z]*}
  534. }
  535. proc ::fubar::foo {bar} {
  536.     puts "$bar"
  537.     return true
  538. }
  539. namespace import ::fubar::foo
  540. } [file join pkg import.tcl]
  541. test pkgMkIndex-11.1 {conflicting namespace imports} {
  542.     pkgtest::runIndex -lazy $fullPkgPath import.tcl
  543. } {0 {{fubar:1.0 {tclPkgSetup {import.tcl source ::fubar::foo}}}}}
  544. removeFile [file join pkg import.tcl]
  545. # Verify that the auto load list generated is correct even when there
  546. # is a proc name conflict between two namespaces (ie, ::foo::baz and
  547. # ::bar::baz)
  548. makeFile {
  549. package provide football 1.0
  550. namespace eval ::pro:: {
  551.     #
  552.     # export only public functions.
  553.     #
  554.     namespace export {[a-z]*}
  555. }
  556. namespace eval ::college:: {
  557.     #
  558.     # export only public functions.
  559.     #
  560.     namespace export {[a-z]*}
  561. }
  562. proc ::pro::team {} {
  563.     puts "go packers!"
  564.     return true
  565. }
  566. proc ::college::team {} {
  567.     puts "go badgers!"
  568.     return true
  569. }
  570. } [file join pkg samename.tcl]
  571. test pkgMkIndex-12.1 {same name procs in different namespace} {
  572.     pkgtest::runIndex -lazy $fullPkgPath samename.tcl
  573. } {0 {{football:1.0 {tclPkgSetup {samename.tcl source {::college::team ::pro::team}}}}}}
  574. removeFile [file join pkg samename.tcl]
  575. # Proc names with embedded spaces are properly listed (ie, correct number of
  576. # braces) in result
  577. makeFile {
  578. package provide spacename 1.0
  579. proc {a b} {} {}
  580. proc {c d} {} {}
  581. } [file join pkg spacename.tcl]
  582. test pkgMkIndex-13.1 {proc names with embedded spaces} {
  583.     pkgtest::runIndex -lazy $fullPkgPath spacename.tcl
  584. } {0 {{spacename:1.0 {tclPkgSetup {spacename.tcl source {{a b} {c d}}}}}}}
  585. removeFile [file join pkg spacename.tcl]
  586. # Test the pkg_compareExtension helper function
  587. test pkgMkIndex-14.1 {pkg_compareExtension} {unixOnly} {
  588.     pkg_compareExtension foo.so .so
  589. } 1
  590. test pkgMkIndex-14.2 {pkg_compareExtension} {unixOnly} {
  591.     pkg_compareExtension foo.so.bar .so
  592. } 0
  593. test pkgMkIndex-14.3 {pkg_compareExtension} {unixOnly} {
  594.     pkg_compareExtension foo.so.1 .so
  595. } 1
  596. test pkgMkIndex-14.4 {pkg_compareExtension} {unixOnly} {
  597.     pkg_compareExtension foo.so.1.2 .so
  598. } 1
  599. test pkgMkIndex-14.5 {pkg_compareExtension} {unixOnly} {
  600.     pkg_compareExtension foo .so
  601. } 0
  602. test pkgMkIndex-14.6 {pkg_compareExtension} {unixOnly} {
  603.     pkg_compareExtension foo.so.1.2.bar .so
  604. } 0
  605. # cleanup
  606. removeDirectory pkg
  607. namespace delete pkgtest
  608. ::tcltest::cleanupTests
  609. return