summaryrefslogtreecommitdiffstats
path: root/tests/source.test
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2003-09-05 21:52:11 (GMT)
committerdgp <dgp@users.sourceforge.net>2003-09-05 21:52:11 (GMT)
commitc024a2de4b3868a69fd48901c50a0beedb49ed9d (patch)
treed3430b36c25b01800aa40d815fadb9629ef33770 /tests/source.test
parent4383bd1bfc3daa1d69ddcb095a35c5e723f1ba6b (diff)
downloadtcl-c024a2de4b3868a69fd48901c50a0beedb49ed9d.zip
tcl-c024a2de4b3868a69fd48901c50a0beedb49ed9d.tar.gz
tcl-c024a2de4b3868a69fd48901c50a0beedb49ed9d.tar.bz2
* doc/FileSystem.3: Implementation of
* doc/source.n: TIPs 137/151. Adds * doc/tclsh.1: a -encoding option to * generic/tcl.decls: the [source] command * generic/tclCmdMZ.c (Tcl_SourceObjCmd): and a new C routine, * generic/tclIOUtil.c (Tcl_FSEvalFileEx): Tcl_FSEvalFileEx(), * generic/tclMain.c (Tcl_Main): that provides C access * mac/tclMacResource.c (Tcl_MacSourceObjCmd): to the same function. * tests/cmdMZ.test: Also adds command line * tests/main.test: option handling in Tcl_Main() so that tclsh * tests/source.test: and other apps built on Tcl_Main() respect a -encoding command line option before a script filename. Docs and tests updated as well. [Patch 742683] This is a ***POTENTIAL INCOMPATIBILITY*** only for those C programs that embed Tcl, build on Tcl_Main(), and make use of Tcl_Main's former ability to pass a leading "-encoding" option to interactive shell operations. * generic/tclInt.decls: Added internal stub * generic/tclMain.c (Tcl*StartupScript*): table entries for two new functions Tcl_SetStartupScript() and Tcl_GetStartupScript() that set/get the path and encoding for the startup script to be evaluated by either Tcl_Main() or Tk_Main(). Given public names in anticipation of their exposure by a followup TIP. * generic/tclDecls.h: make genstubs * generic/tclIntDecls.h: * generic/tclStubInit.c:
Diffstat (limited to 'tests/source.test')
-rw-r--r--tests/source.test416
1 files changed, 305 insertions, 111 deletions
diff --git a/tests/source.test b/tests/source.test
index f245d05..413c658 100644
--- a/tests/source.test
+++ b/tests/source.test
@@ -7,187 +7,381 @@
# Copyright (c) 1991-1993 The Regents of the University of California.
# Copyright (c) 1994-1996 Sun Microsystems, Inc.
# Copyright (c) 1998-2000 by Scriptics Corporation.
+# Contributions from Don Porter, NIST, 2003. (not subject to US copyright)
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
-# RCS: @(#) $Id: source.test,v 1.8 2002/07/05 10:38:43 dkf Exp $
+# RCS: @(#) $Id: source.test,v 1.9 2003/09/05 21:52:12 dgp Exp $
-if {[lsearch [namespace children] ::tcltest] == -1} {
- package require tcltest
- namespace import -force ::tcltest::*
+if {[catch {package require tcltest 2.0.2}]} {
+ puts stderr "Skipping tests in [info script]. tcltest 2.0.2 required."
+ return
}
-set sourcefile [makeFile "" source.file]
-test source-1.1 {source command} {
+namespace eval ::tcl::test::source {
+ namespace import ::tcltest::test
+ namespace import ::tcltest::testConstraint
+ namespace import ::tcltest::cleanupTests
+ namespace import ::tcltest::makeFile
+ namespace import ::tcltest::removeFile
+
+test source-1.1 {source command} -setup {
set x "old x value"
set y "old y value"
set z "old z value"
- makeFile {
+ set sourcefile [makeFile {
set x 22
set y 33
set z 44
- } source.file
+ } source.file]
+} -body {
source $sourcefile
list $x $y $z
-} {22 33 44}
-test source-1.2 {source command} {
- makeFile {list result} source.file
+} -cleanup {
+ removeFile source.file
+} -result {22 33 44}
+
+test source-1.2 {source command} -setup {
+ set sourcefile [makeFile {list result} source.file]
+} -body {
source $sourcefile
-} result
-test source-1.3 {source command} {
- set y {\ }
+} -cleanup {
+ removeFile source.file
+} -result result
+test source-1.3 {source command} -setup {
+ set sourcefile [makeFile {} source.file]
set fd [open $sourcefile w]
fconfigure $fd -translation lf
- puts -nonewline $fd "list a b c "
- puts $fd [string index $y 0]
+ puts $fd "list a b c \\"
puts $fd "d e f"
close $fd
-
+} -body {
source $sourcefile
-} {a b c d e f}
+} -cleanup {
+ removeFile source.file
+} -result {a b c d e f}
-test source-2.3 {source error conditions} {
- makeFile {
+
+test source-2.3 {source error conditions} -setup {
+ set sourcefile [makeFile {
set x 146
error "error in sourced file"
set y $x
- } source.file
- list [catch {source $sourcefile} msg] $msg $errorInfo
-} [list 1 {error in sourced file} "error in sourced file
+ } source.file]
+} -body {
+ list [catch {source $sourcefile} msg] $msg $::errorInfo
+} -cleanup {
+ removeFile source.file
+} -match glob -result [list 1 {error in sourced file} \
+ {error in sourced file
while executing
-\"error \"error in sourced file\"\"
- (file \"$sourcefile\" line 3)
+"error "error in sourced file""
+ (file "*source.file" line 3)
invoked from within
-\"source \$sourcefile\""]
-test source-2.4 {source error conditions} {
- makeFile {break} source.file
- catch {source $sourcefile}
-} 3
-test source-2.5 {source error conditions} {
- makeFile {continue} source.file
- catch {source $sourcefile}
-} 4
-test source-2.6 {source error conditions} {
- normalizeMsg [list [catch {source _non_existent_} msg] $msg $errorCode]
-} {1 {couldn't read file "_non_existent_": no such file or directory} {posix enoent {no such file or directory}}}
-
-test source-3.1 {return in middle of source file} {
- makeFile {
+"source $sourcefile"}]
+
+test source-2.4 {source error conditions} -setup {
+ set sourcefile [makeFile {break} source.file]
+} -body {
+ source $sourcefile
+} -cleanup {
+ removeFile source.file
+} -returnCodes break
+
+test source-2.5 {source error conditions} -setup {
+ set sourcefile [makeFile {continue} source.file]
+} -body {
+ source $sourcefile
+} -cleanup {
+ removeFile source.file
+} -returnCodes continue
+
+test source-2.6 {source error conditions} -setup {
+ set sourcefile [makeFile {} _non_existent_]
+ removeFile _non_existent_
+} -body {
+ list [catch {source $sourcefile} msg] $msg $::errorCode
+} -match glob -result [list 1 \
+ {couldn't read file "*_non_existent_": no such file or directory} \
+ {POSIX ENOENT {no such file or directory}}]
+
+
+test source-3.1 {return in middle of source file} -setup {
+ set sourcefile [makeFile {
set x new-x
return allDone
set y new-y
- } source.file
+ } source.file]
+} -body {
set x old-x
set y old-y
set z [source $sourcefile]
list $x $y $z
-} {new-x old-y allDone}
-test source-3.2 {return with special code etc.} {
- makeFile {
+} -cleanup {
+ removeFile source.file
+} -result {new-x old-y allDone}
+
+test source-3.2 {return with special code etc.} -setup {
+ set sourcefile [makeFile {
set x new-x
return -code break "Silly result"
set y new-y
- } source.file
- list [catch {source $sourcefile} msg] $msg
-} {3 {Silly result}}
-test source-3.3 {return with special code etc.} {
- makeFile {
+ } source.file]
+} -body {
+ source $sourcefile
+} -cleanup {
+ removeFile source.file
+} -returnCodes break -result {Silly result}
+
+test source-3.3 {return with special code etc.} -setup {
+ set sourcefile [makeFile {
set x new-x
return -code error "Simulated error"
set y new-y
- } source.file
- list [catch {source $sourcefile} msg] $msg $errorInfo $errorCode
-} {1 {Simulated error} {Simulated error
+ } source.file]
+} -body {
+ list [catch {source $sourcefile} msg] $msg $::errorInfo $::errorCode
+} -cleanup {
+ removeFile source.file
+} -result {1 {Simulated error} {Simulated error
while executing
"source $sourcefile"} NONE}
-test source-3.4 {return with special code etc.} {
- makeFile {
+
+test source-3.4 {return with special code etc.} -setup {
+ set sourcefile [makeFile {
set x new-x
return -code error -errorinfo "Simulated errorInfo stuff"
set y new-y
- } source.file
- list [catch {source $sourcefile} msg] $msg $errorInfo $errorCode
-} {1 {} {Simulated errorInfo stuff
+ } source.file]
+} -body {
+ list [catch {source $sourcefile} msg] $msg $::errorInfo $::errorCode
+} -cleanup {
+ removeFile source.file
+} -result {1 {} {Simulated errorInfo stuff
invoked from within
"source $sourcefile"} NONE}
-test source-3.5 {return with special code etc.} {
- makeFile {
+
+test source-3.5 {return with special code etc.} -setup {
+ set sourcefile [makeFile {
set x new-x
return -code error -errorinfo "Simulated errorInfo stuff" \
-errorcode {a b c}
set y new-y
- } source.file
- list [catch {source $sourcefile} msg] $msg $errorInfo $errorCode
-} {1 {} {Simulated errorInfo stuff
+ } source.file]
+} -body {
+ list [catch {source $sourcefile} msg] $msg $::errorInfo $::errorCode
+} -cleanup {
+ removeFile source.file
+} -result {1 {} {Simulated errorInfo stuff
invoked from within
"source $sourcefile"} {a b c}}
+
# Test for the Macintosh specfic features of the source command
-test source-4.1 {source error conditions} {macOnly} {
- list [catch {source -rsrc _no_exist_} msg] $msg
-} [list 1 "The resource \"_no_exist_\" could not be loaded from application."]
-test source-4.2 {source error conditions} {macOnly} {
- list [catch {source -rsrcid bad_id} msg] $msg
-} [list 1 "expected integer but got \"bad_id\""]
-test source-4.3 {source error conditions} {macOnly} {
- list [catch {source -rsrc rsrcName fileName extra} msg] $msg
-} {1 {wrong # args: should be "source fileName" or "source -rsrc name ?fileName?" or "source -rsrcid id ?fileName?"}}
-test source-4.4 {source error conditions} {macOnly} {
- list [catch {source non_switch rsrcName} msg] $msg
-} {1 {bad argument: should be "source fileName" or "source -rsrc name ?fileName?" or "source -rsrcid id ?fileName?"}}
-test source-4.5 {source error conditions} {macOnly} {
- list [catch {source -bad_switch argument} msg] $msg
-} {1 {bad argument: should be "source fileName" or "source -rsrc name ?fileName?" or "source -rsrcid id ?fileName?"}}
-test source-5.1 {source resource files} {macOnly} {
- list [catch {source -rsrc rsrcName bad_file} msg] $msg
-} [list 1 "Error finding the file: \"bad_file\"."]
-test source-5.2 {source resource files} {macOnly} {
- makeFile {return} source.file
- list [catch {source -rsrc rsrcName $sourcefile} msg] $msg
-} [list 1 "Error reading the file: \"$sourcefile\"."]
-test source-5.3 {source resource files} {macOnly} {
- testWriteTextResource -rsrc rsrcName -file rsrc.file {set msg2 ok; return}
- set result [catch {source -rsrc rsrcName rsrc.file} msg]
+test source-4.1 {source error conditions} -constraints macOnly -body {
+ source -rsrc _no_exist_
+} -result {The resource "_no_exist_" could not be loaded from application.} \
+ -returnCodes error
+
+test source-4.2 {source error conditions} -constraints macOnly -body {
+ source -rsrcid bad_id
+} -returnCodes error -result {expected integer but got "bad_id"}
+
+test source-4.3 {source error conditions} -constraints macOnly -body {
+ source -rsrc rsrcName fileName extra
+} -returnCodes error -result {wrong # args: should be "source fileName" or "source -rsrc name ?fileName?" or "source -rsrcid id ?fileName?" or "source -encoding name fileName"}
+
+test source-4.4 {source error conditions} -constraints macOnly -body {
+ source non_switch rsrcName
+} -returnCodes error -result {bad argument: should be "source fileName" or "source -rsrc name ?fileName?" or "source -rsrcid id ?fileName?" or "source -encoding name fileName"}
+
+test source-4.5 {source error conditions} -constraints macOnly -body {
+ source -bad_switch argument
+} -returnCodes error -result {bad argument: should be "source fileName" or "source -rsrc name ?fileName?" or "source -rsrcid id ?fileName?" or "source -encoding name fileName"}
+
+
+testConstraint testWriteTextResource \
+ [llength [info commands testWriteTextResource]]
+
+test source-5.1 {source resource files} -constraints macOnly -setup {
+ set sourcefile [makeFile {} bad_file]
+ removeFile bad_file
+} -body {
+ source -rsrc rsrcName $sourcefile
+} -returnCodes error -match glob -result {Error finding the file: "*bad_file".}
+
+test source-5.2 {source resource files} -constraints macOnly -setup {
+ set sourcefile [makeFile {return} source.file]
+} -body {
+ source -rsrc rsrcName $sourcefile
+} -cleanup {
+ removeFile source.file
+} -returnCodes error -match glob \
+ -result {Error reading the file: "*source.file".}
+
+test source-5.3 {source resource files} -constraints {
+ macOnly testWriteTextResource
+} -setup {
+ set msg2 unset
+ set rsrcFile [makeFile {} rsrc.file]
removeFile rsrc.file
+ testWriteTextResource -rsrc rsrcName -file $rsrc.file {set msg2 ok; return}
+} -body {
+ set result [catch {source -rsrc rsrcName rsrc.file} msg]
list $msg2 $result $msg
-} [list ok 0 {}]
-test source-5.4 {source resource files} {macOnly} {
- catch {unset msg2}
- testWriteTextResource -rsrc fileRsrcName -file rsrc.file {set msg2 ok; return}
- source -rsrc fileRsrcName rsrc.file
- set result [catch {source -rsrc fileRsrcName} msg]
+} -cleanup {
removeFile rsrc.file
+} -result [list ok 0 {}]
+
+test source-5.4 {source resource files} -constraints {
+ macOnly testWriteTextResource
+} -setup {
+ set msg2 unset
+ set rsrsFile [makeFile {} rsrc.file]
+ removeFile rsrc.file
+ testWriteTextResource -rsrc fileRsrcName \
+ -file $rsrcFile {set msg2 ok; return}
+} -body {
+ source -rsrc fileRsrcName $rsrcFile
+ set result [catch {source -rsrc fileRsrcName} msg]
list $msg2 $result $msg
-} [list ok 1 {The resource "fileRsrcName" could not be loaded from application.}]
-test source-5.5 {source resource files} {macOnly} {
- testWriteTextResource -rsrcid 200 -file rsrc.file {set msg2 hello; set msg3 bye}
- set result [catch {source -rsrcid 200 rsrc.file} msg]
+} -cleanup {
+ removeFile rsrc.file
+} -result [list ok 1 {The resource "fileRsrcName" could not be loaded from application.}]
+
+test source-5.5 {source resource files} -constraints {
+ macOnly testWriteTextResource
+} -setup {
+ set msg2 unset
+ set rsrcFile [makeFile {} rsrc.file]
removeFile rsrc.file
+ testWriteTextResource -rsrcid 200 \
+ -file $rsrcFile {set msg2 hello; set msg3 bye}
+} -body {
+ set result [catch {source -rsrcid 200 $rsrcFile} msg]
list $msg2 $result $msg
-} [list hello 0 bye]
-test source-5.6 {source resource files} {macOnly} {
- testWriteTextResource -rsrcid 200 -file rsrc.file {set msg2 hello; error bad; set msg3 bye}
- set result [catch {source -rsrcid 200 rsrc.file} msg]
+} -cleanup {
+ removeFile rsrc.file
+} -result [list hello 0 bye]
+
+test source-5.6 {source resource files} -constraints {
+ macOnly testWriteTextResource
+} -setup {
+ set msg2 unset
+ set rsrcFile [makeFile {} rsrc.file]
removeFile rsrc.file
+ testWriteTextResource -rsrcid 200 \
+ -file $rsrcFile {set msg2 hello; error bad; set msg3 bye}
+} -body {
+ set result [catch {source -rsrcid 200 rsrc.file} msg]
list $msg2 $result $msg
-} [list hello 1 bad]
+} -cleanup {
+ removeFile rsrc.file
+} -result [list hello 1 bad]
+
-test source-6.1 {source is binary ok} {
+test source-6.1 {source is binary ok} -setup {
+ # Note [makeFile] writes in the system encoding.
+ # [source] defaults to reading in the system encoding.
+ set sourcefile [makeFile [list set x "a b\0c"] source.file]
+} -body {
set x {}
- makeFile [list set x "a b\0c"] source.file
source $sourcefile
string length $x
-} 5
-test source-6.2 {source skips everything after Ctrl-Z: Bug 2040} {
+} -cleanup {
+ removeFile source.file
+} -result 5
+
+test source-6.2 {source skips everything after Ctrl-Z: Bug 2040} -setup {
+ set sourcefile [makeFile "set x ab\32c" source.file]
+} -body {
set x {}
- makeFile [list set x "ab\32c"] source.file
source $sourcefile
string length $x
-} 2
+} -cleanup {
+ removeFile source.file
+} -result 2
+
+test source-7.1 {source -encoding test} -setup {
+ set sourcefile [makeFile {} source.file]
+ removeFile source.file
+ set f [open $sourcefile w]
+ fconfigure $f -encoding utf-8
+ puts $f "set symbol(square-root) \u221A; set x correct"
+ close $f
+} -body {
+ set x unset
+ source -encoding utf-8 $sourcefile
+ set x
+} -cleanup {
+ removeFile source.file
+} -result correct
+
+test source-7.2 {source -encoding test} -setup {
+ # This tests for bad interactions between [source -encoding]
+ # and use of the Control-Z character (\u001A) as a cross-platform
+ # EOF character by [source]. Here we write out and the [source] a
+ # file that contains the byte \x1A, although not the character \u001A in
+ # the indicated encoding.
+ set sourcefile [makeFile {} source.file]
+ removeFile source.file
+ set f [open $sourcefile w]
+ fconfigure $f -encoding unicode
+ puts $f "set symbol(square-root) \u221A; set x correct"
+ close $f
+} -body {
+ set x unset
+ source -encoding unicode $sourcefile
+ set x
+} -cleanup {
+ removeFile source.file
+} -result correct
-# cleanup
-catch {::tcltest::removeFile source.file}
-::tcltest::cleanupTests
+test source-7.3 {source -encoding: syntax} -body {
+ # Have to spell out the -encoding option
+ source -e utf-8 no_file
+} -returnCodes 1 -match glob -result {bad option*}
+
+test source-7.4 {source -encoding: syntax} -setup {
+ set sourcefile [makeFile {} source.file]
+} -body {
+ source -encoding no-such-encoding $sourcefile
+} -cleanup {
+ removeFile source.file
+} -returnCodes 1 -match glob -result {unknown encoding*}
+
+test source-7.5 {source -encoding: correct operation} -setup {
+ set sourcefile [makeFile {} source.file]
+ removeFile source.file
+ set f [open $sourcefile w]
+ fconfigure $f -encoding utf-8
+ puts $f "proc \u20ac {} {return foo}"
+ close $f
+} -body {
+ source -encoding utf-8 $sourcefile
+ \u20ac
+} -cleanup {
+ removeFile source.file
+ rename \u20ac {}
+} -result foo
+
+test source-7.6 {source -encoding: mismatch encoding error} -setup {
+ set sourcefile [makeFile {} source.file]
+ removeFile source.file
+ set f [open $sourcefile w]
+ fconfigure $f -encoding utf-8
+ puts $f "proc \u20ac {} {return foo}"
+ close $f
+} -body {
+ source -encoding ascii $sourcefile
+ \u20ac
+} -cleanup {
+ removeFile source.file
+} -returnCodes error -match glob -result {invalid command name*}
+
+cleanupTests
+}
+namespace delete ::tcl::test::source
return