diff options
author | dgp <dgp@users.sourceforge.net> | 2003-09-05 21:52:11 (GMT) |
---|---|---|
committer | dgp <dgp@users.sourceforge.net> | 2003-09-05 21:52:11 (GMT) |
commit | c024a2de4b3868a69fd48901c50a0beedb49ed9d (patch) | |
tree | d3430b36c25b01800aa40d815fadb9629ef33770 /tests | |
parent | 4383bd1bfc3daa1d69ddcb095a35c5e723f1ba6b (diff) | |
download | tcl-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')
-rw-r--r-- | tests/cmdMZ.test | 15 | ||||
-rw-r--r-- | tests/main.test | 68 | ||||
-rw-r--r-- | tests/source.test | 416 |
3 files changed, 382 insertions, 117 deletions
diff --git a/tests/cmdMZ.test b/tests/cmdMZ.test index 4609365..2e2a978 100644 --- a/tests/cmdMZ.test +++ b/tests/cmdMZ.test @@ -11,7 +11,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: cmdMZ.test,v 1.17 2003/08/29 17:43:24 dgp Exp $ +# RCS: @(#) $Id: cmdMZ.test,v 1.18 2003/09/05 21:52:12 dgp Exp $ if {[catch {package require tcltest 2.0.2}]} { puts stderr "Skipping tests in [info script]. tcltest 2.0.2 required." @@ -187,6 +187,7 @@ foreach script { # The tests for Tcl_ScanObjCmd are in scan.test # Tcl_SourceObjCmd +# More tests of Tcl_SourceObjCmd are in source.test test cmdMZ-3.1 {Tcl_SourceObjCmd: error conditions} {macOnly} { list [catch {source} msg] $msg @@ -194,12 +195,16 @@ test cmdMZ-3.1 {Tcl_SourceObjCmd: error conditions} {macOnly} { test cmdMZ-3.2 {Tcl_SourceObjCmd: error conditions} {macOnly} { list [catch {source a b} msg] $msg } {1 {bad argument: should be "source fileName" or "source -rsrc name ?fileName?" or "source -rsrcid id ?fileName?"}} -test cmdMZ-3.3 {Tcl_SourceObjCmd: error conditions} {unixOrPc} { +test cmdMZ-3.3 {Tcl_SourceObjCmd: error conditions} -constraints { + unixOrPc +} -body { list [catch {source} msg] $msg -} {1 {wrong # args: should be "source fileName"}} -test cmdMZ-3.4 {Tcl_SourceObjCmd: error conditions} {unixOrPc} { +} -match glob -result {1 {wrong # args: should be "source*fileName"}} +test cmdMZ-3.4 {Tcl_SourceObjCmd: error conditions} -constraints { + unixOrPc +} -body { list [catch {source a b} msg] $msg -} {1 {wrong # args: should be "source fileName"}} +} -match glob -result {1 {wrong # args: should be "source*fileName"}} test cmdMZ-3.5 {Tcl_SourceObjCmd: error in script} -body { set file [makeFile { set x 146 diff --git a/tests/main.test b/tests/main.test index 6778b88..605bab8 100644 --- a/tests/main.test +++ b/tests/main.test @@ -1,6 +1,6 @@ # This file contains a collection of tests for generic/tclMain.c. # -# RCS: @(#) $Id: main.test,v 1.13 2003/02/16 01:36:32 msofer Exp $ +# RCS: @(#) $Id: main.test,v 1.14 2003/09/05 21:52:12 dgp Exp $ if {[catch {package require tcltest 2.0.2}]} { puts stderr "Skipping tests in [info script]. tcltest 2.0.2 required." @@ -139,6 +139,72 @@ namespace eval ::tcl::test::main { } -result [list [list [encoding convertfrom [encoding system] \ [encoding convertto [encoding system] \u20ac]]] {} 0]\n + test Tcl_Main-1.7 { + Tcl_Main: startup script - -encoding option + } -constraints { + stdio + } -setup { + set script [makeFile {} script] + removeFile script + set f [open $script w] + fconfigure $f -encoding utf-8 + puts $f {puts [list $argv0 $argv $tcl_interactive]} + puts -nonewline $f {puts [string equal \u20ac } + puts $f "\u20ac]" + close $f + catch {set f [open "|[list [interpreter] -encoding utf-8 script]" r]} + } -body { + read $f + } -cleanup { + close $f + removeFile script + } -result [list script {} 0]\n1\n + + test Tcl_Main-1.8 { + Tcl_Main: startup script - -encoding option - mismatched encodings + } -constraints { + stdio + } -setup { + set script [makeFile {} script] + removeFile script + set f [open $script w] + fconfigure $f -encoding utf-8 + puts $f {puts [list $argv0 $argv $tcl_interactive]} + puts -nonewline $f {puts [string equal \u20ac } + puts $f "\u20ac]" + close $f + catch {set f [open "|[list [interpreter] -encoding ascii script]" r]} + } -body { + read $f + } -cleanup { + close $f + removeFile script + } -result [list script {} 0]\n0\n + + test Tcl_Main-1.9 { + Tcl_Main: startup script - -encoding option - no abbrevation + } -constraints { + stdio + } -setup { + set script [makeFile {} script] + removeFile script + set f [open $script w] + fconfigure $f -encoding utf-8 + puts $f {puts [list $argv0 $argv $tcl_interactive]} + puts -nonewline $f {puts [string equal \u20ac } + puts $f "\u20ac]" + close $f + catch {set f [open "|[list [interpreter] -enc utf-8 script]" r+]} + } -body { + type $f { + puts $argv + } + list [catch {gets $f} line] $line + } -cleanup { + close $f + removeFile script + } -result {0 {-enc utf-8 script}} + # Tests Tcl_Main-2.*: application-initialization procedure test Tcl_Main-2.1 { 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 |