Import Tcl-core 8.6.6 (as of svn r86089)
This commit is contained in:
312
tests/source.test
Normal file
312
tests/source.test
Normal file
@@ -0,0 +1,312 @@
|
||||
# Commands covered: source
|
||||
#
|
||||
# This file contains a collection of tests for one or more of the Tcl
|
||||
# built-in commands. Sourcing this file into Tcl runs the tests and
|
||||
# generates output for errors. No output means no errors were found.
|
||||
#
|
||||
# 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.
|
||||
|
||||
if {[catch {package require tcltest 2.1}]} {
|
||||
puts stderr "Skipping tests in [info script]. tcltest 2.1 required."
|
||||
return
|
||||
}
|
||||
|
||||
namespace eval ::tcl::test::source {
|
||||
namespace import ::tcltest::*
|
||||
|
||||
test source-1.1 {source command} -setup {
|
||||
set x "old x value"
|
||||
set y "old y value"
|
||||
set z "old z value"
|
||||
set sourcefile [makeFile {
|
||||
set x 22
|
||||
set y 33
|
||||
set z 44
|
||||
} source.file]
|
||||
} -body {
|
||||
source $sourcefile
|
||||
list $x $y $z
|
||||
} -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
|
||||
} -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 $fd "list a b c \\"
|
||||
puts $fd "d e f"
|
||||
close $fd
|
||||
} -body {
|
||||
source $sourcefile
|
||||
} -cleanup {
|
||||
removeFile source.file
|
||||
} -result {a b c d e f}
|
||||
|
||||
proc ListGlobMatch {expected actual} {
|
||||
if {[llength $expected] != [llength $actual]} {
|
||||
return 0
|
||||
}
|
||||
foreach e $expected a $actual {
|
||||
if {![string match $e $a]} {
|
||||
return 0
|
||||
}
|
||||
}
|
||||
return 1
|
||||
}
|
||||
customMatch listGlob [namespace which ListGlobMatch]
|
||||
|
||||
test source-2.3 {source error conditions} -setup {
|
||||
set sourcefile [makeFile {
|
||||
set x 146
|
||||
error "error in sourced file"
|
||||
set y $x
|
||||
} source.file]
|
||||
} -body {
|
||||
list [catch {source $sourcefile} msg] $msg $::errorInfo
|
||||
} -cleanup {
|
||||
removeFile source.file
|
||||
} -match listGlob -result [list 1 {error in sourced file} \
|
||||
{error in sourced file
|
||||
while executing
|
||||
"error "error in sourced file""
|
||||
(file "*source.file" line 3)
|
||||
invoked from within
|
||||
"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 listGlob -result [list 1 \
|
||||
{couldn't read file "*_non_existent_": no such file or directory} \
|
||||
{POSIX ENOENT {no such file or directory}}]
|
||||
test source-2.7 {utf-8 with BOM} -setup {
|
||||
set sourcefile [makeFile {} source.file]
|
||||
} -body {
|
||||
set out [open $sourcefile w]
|
||||
fconfigure $out -encoding utf-8
|
||||
puts $out "\ufeffset y new-y"
|
||||
close $out
|
||||
set y old-y
|
||||
source -encoding utf-8 $sourcefile
|
||||
return $y
|
||||
} -cleanup {
|
||||
removeFile $sourcefile
|
||||
} -result {new-y}
|
||||
|
||||
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]
|
||||
} -body {
|
||||
set x old-x
|
||||
set y old-y
|
||||
set z [source $sourcefile]
|
||||
list $x $y $z
|
||||
} -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]
|
||||
} -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]
|
||||
} -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.} -setup {
|
||||
set sourcefile [makeFile {
|
||||
set x new-x
|
||||
return -code error -errorinfo "Simulated errorInfo stuff"
|
||||
set y new-y
|
||||
} 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.} -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]
|
||||
} -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 source-4.1 {continuation line parsing} -setup {
|
||||
set sourcefile [makeFile [string map {CL \\\n} {
|
||||
format %s "[dict get [info frame 0] type]:CL[dict get [info frame 0] line]CL[dict get [info frame 0] line]CL[dict get [info frame 0] line]"
|
||||
}] source.file]
|
||||
} -body {
|
||||
source $sourcefile
|
||||
} -cleanup {
|
||||
removeFile source.file
|
||||
} -result {source: 3 4 5}
|
||||
|
||||
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 {}
|
||||
source $sourcefile
|
||||
string length $x
|
||||
} -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 {}
|
||||
source $sourcefile
|
||||
string length $x
|
||||
} -cleanup {
|
||||
removeFile source.file
|
||||
} -result 2
|
||||
|
||||
test source-7.1 {source -encoding test} -setup {
|
||||
set sourcefile [makeFile {} source.file]
|
||||
file delete $sourcefile
|
||||
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]
|
||||
file delete $sourcefile
|
||||
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
|
||||
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]
|
||||
file delete $sourcefile
|
||||
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]
|
||||
file delete $sourcefile
|
||||
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*}
|
||||
|
||||
test source-8.1 {source and coroutine/yield} -setup {
|
||||
set sourcefile [makeFile {} source.file]
|
||||
file delete $sourcefile
|
||||
} -body {
|
||||
makeFile {yield 1; yield 2; return 3;} $sourcefile
|
||||
coroutine coro apply {f {yield;source $f}} $sourcefile
|
||||
list [coro] [coro] [coro] [info exist coro]
|
||||
} -cleanup {
|
||||
catch {rename coro {}}
|
||||
removeFile source.file
|
||||
} -result {1 2 3 0}
|
||||
|
||||
cleanupTests
|
||||
}
|
||||
namespace delete ::tcl::test::source
|
||||
return
|
||||
|
||||
# Local Variables:
|
||||
# mode: tcl
|
||||
# End:
|
||||
Reference in New Issue
Block a user