sl@0: # Commands covered: source sl@0: # sl@0: # This file contains a collection of tests for one or more of the Tcl sl@0: # built-in commands. Sourcing this file into Tcl runs the tests and sl@0: # generates output for errors. No output means no errors were found. sl@0: # sl@0: # Copyright (c) 1991-1993 The Regents of the University of California. sl@0: # Copyright (c) 1994-1996 Sun Microsystems, Inc. sl@0: # Copyright (c) 1998-2000 by Scriptics Corporation. sl@0: # Contributions from Don Porter, NIST, 2003. (not subject to US copyright) sl@0: # sl@0: # See the file "license.terms" for information on usage and redistribution sl@0: # of this file, and for a DISCLAIMER OF ALL WARRANTIES. sl@0: # sl@0: # RCS: @(#) $Id: source.test,v 1.8.2.2 2004/02/25 23:38:17 dgp Exp $ sl@0: sl@0: if {[catch {package require tcltest 2.1}]} { sl@0: puts stderr "Skipping tests in [info script]. tcltest 2.1 required." sl@0: return sl@0: } sl@0: sl@0: namespace eval ::tcl::test::source { sl@0: namespace import ::tcltest::test sl@0: namespace import ::tcltest::testConstraint sl@0: namespace import ::tcltest::cleanupTests sl@0: namespace import ::tcltest::makeFile sl@0: namespace import ::tcltest::removeFile sl@0: namespace import ::tcltest::customMatch sl@0: sl@0: test source-1.1 {source command} -setup { sl@0: set x "old x value" sl@0: set y "old y value" sl@0: set z "old z value" sl@0: set sourcefile [makeFile { sl@0: set x 22 sl@0: set y 33 sl@0: set z 44 sl@0: } source.file] sl@0: } -body { sl@0: source $sourcefile sl@0: list $x $y $z sl@0: } -cleanup { sl@0: removeFile source.file sl@0: } -result {22 33 44} sl@0: sl@0: test source-1.2 {source command} -setup { sl@0: set sourcefile [makeFile {list result} source.file] sl@0: } -body { sl@0: source $sourcefile sl@0: } -cleanup { sl@0: removeFile source.file sl@0: } -result result sl@0: sl@0: test source-1.3 {source command} -setup { sl@0: set sourcefile [makeFile {} source.file] sl@0: set fd [open $sourcefile w] sl@0: fconfigure $fd -translation lf sl@0: puts $fd "list a b c \\" sl@0: puts $fd "d e f" sl@0: close $fd sl@0: } -body { sl@0: source $sourcefile sl@0: } -cleanup { sl@0: removeFile source.file sl@0: } -result {a b c d e f} sl@0: sl@0: proc ListGlobMatch {expected actual} { sl@0: if {[llength $expected] != [llength $actual]} { sl@0: return 0 sl@0: } sl@0: foreach e $expected a $actual { sl@0: if {![string match $e $a]} { sl@0: return 0 sl@0: } sl@0: } sl@0: return 1 sl@0: } sl@0: customMatch listGlob [namespace which ListGlobMatch] sl@0: sl@0: test source-2.3 {source error conditions} -setup { sl@0: set sourcefile [makeFile { sl@0: set x 146 sl@0: error "error in sourced file" sl@0: set y $x sl@0: } source.file] sl@0: } -body { sl@0: list [catch {source $sourcefile} msg] $msg $::errorInfo sl@0: } -cleanup { sl@0: removeFile source.file sl@0: } -match listGlob -result [list 1 {error in sourced file} \ sl@0: {error in sourced file sl@0: while executing sl@0: "error "error in sourced file"" sl@0: (file "*source.file" line 3) sl@0: invoked from within sl@0: "source $sourcefile"}] sl@0: sl@0: test source-2.4 {source error conditions} -setup { sl@0: set sourcefile [makeFile {break} source.file] sl@0: } -body { sl@0: source $sourcefile sl@0: } -cleanup { sl@0: removeFile source.file sl@0: } -returnCodes break sl@0: sl@0: test source-2.5 {source error conditions} -setup { sl@0: set sourcefile [makeFile {continue} source.file] sl@0: } -body { sl@0: source $sourcefile sl@0: } -cleanup { sl@0: removeFile source.file sl@0: } -returnCodes continue sl@0: sl@0: test source-2.6 {source error conditions} -setup { sl@0: set sourcefile [makeFile {} _non_existent_] sl@0: removeFile _non_existent_ sl@0: } -body { sl@0: list [catch {source $sourcefile} msg] $msg $::errorCode sl@0: } -match listGlob -result [list 1 \ sl@0: {couldn't read file "*_non_existent_": no such file or directory} \ sl@0: {POSIX ENOENT {no such file or directory}}] sl@0: sl@0: sl@0: test source-3.1 {return in middle of source file} -setup { sl@0: set sourcefile [makeFile { sl@0: set x new-x sl@0: return allDone sl@0: set y new-y sl@0: } source.file] sl@0: } -body { sl@0: set x old-x sl@0: set y old-y sl@0: set z [source $sourcefile] sl@0: list $x $y $z sl@0: } -cleanup { sl@0: removeFile source.file sl@0: } -result {new-x old-y allDone} sl@0: sl@0: test source-3.2 {return with special code etc.} -setup { sl@0: set sourcefile [makeFile { sl@0: set x new-x sl@0: return -code break "Silly result" sl@0: set y new-y sl@0: } source.file] sl@0: } -body { sl@0: source $sourcefile sl@0: } -cleanup { sl@0: removeFile source.file sl@0: } -returnCodes break -result {Silly result} sl@0: sl@0: test source-3.3 {return with special code etc.} -setup { sl@0: set sourcefile [makeFile { sl@0: set x new-x sl@0: return -code error "Simulated error" sl@0: set y new-y sl@0: } source.file] sl@0: } -body { sl@0: list [catch {source $sourcefile} msg] $msg $::errorInfo $::errorCode sl@0: } -cleanup { sl@0: removeFile source.file sl@0: } -result {1 {Simulated error} {Simulated error sl@0: while executing sl@0: "source $sourcefile"} NONE} sl@0: sl@0: test source-3.4 {return with special code etc.} -setup { sl@0: set sourcefile [makeFile { sl@0: set x new-x sl@0: return -code error -errorinfo "Simulated errorInfo stuff" sl@0: set y new-y sl@0: } source.file] sl@0: } -body { sl@0: list [catch {source $sourcefile} msg] $msg $::errorInfo $::errorCode sl@0: } -cleanup { sl@0: removeFile source.file sl@0: } -result {1 {} {Simulated errorInfo stuff sl@0: invoked from within sl@0: "source $sourcefile"} NONE} sl@0: sl@0: test source-3.5 {return with special code etc.} -setup { sl@0: set sourcefile [makeFile { sl@0: set x new-x sl@0: return -code error -errorinfo "Simulated errorInfo stuff" \ sl@0: -errorcode {a b c} sl@0: set y new-y sl@0: } source.file] sl@0: } -body { sl@0: list [catch {source $sourcefile} msg] $msg $::errorInfo $::errorCode sl@0: } -cleanup { sl@0: removeFile source.file sl@0: } -result {1 {} {Simulated errorInfo stuff sl@0: invoked from within sl@0: "source $sourcefile"} {a b c}} sl@0: sl@0: sl@0: # Test for the Macintosh specfic features of the source command sl@0: test source-4.1 {source error conditions} -constraints macOnly -body { sl@0: source -rsrc _no_exist_ sl@0: } -result {The resource "_no_exist_" could not be loaded from application.} \ sl@0: -returnCodes error sl@0: sl@0: test source-4.2 {source error conditions} -constraints macOnly -body { sl@0: source -rsrcid bad_id sl@0: } -returnCodes error -result {expected integer but got "bad_id"} sl@0: sl@0: test source-4.3 {source error conditions} -constraints macOnly -body { sl@0: source -rsrc rsrcName fileName extra sl@0: } -returnCodes error -result {wrong # args: should be "source fileName" or "source -rsrc name ?fileName?" or "source -rsrcid id ?fileName?" or "source -encoding name fileName"} sl@0: sl@0: test source-4.4 {source error conditions} -constraints macOnly -body { sl@0: source non_switch rsrcName sl@0: } -returnCodes error -result {bad argument: should be "source fileName" or "source -rsrc name ?fileName?" or "source -rsrcid id ?fileName?" or "source -encoding name fileName"} sl@0: sl@0: test source-4.5 {source error conditions} -constraints macOnly -body { sl@0: source -bad_switch argument sl@0: } -returnCodes error -result {bad argument: should be "source fileName" or "source -rsrc name ?fileName?" or "source -rsrcid id ?fileName?" or "source -encoding name fileName"} sl@0: sl@0: sl@0: testConstraint testWriteTextResource \ sl@0: [llength [info commands testWriteTextResource]] sl@0: sl@0: test source-5.1 {source resource files} -constraints macOnly -setup { sl@0: set sourcefile [makeFile {} bad_file] sl@0: removeFile bad_file sl@0: } -body { sl@0: source -rsrc rsrcName $sourcefile sl@0: } -returnCodes error -match glob -result {Error finding the file: "*bad_file".} sl@0: sl@0: test source-5.2 {source resource files} -constraints macOnly -setup { sl@0: set sourcefile [makeFile {return} source.file] sl@0: } -body { sl@0: source -rsrc rsrcName $sourcefile sl@0: } -cleanup { sl@0: removeFile source.file sl@0: } -returnCodes error -match glob \ sl@0: -result {Error reading the file: "*source.file".} sl@0: sl@0: test source-5.3 {source resource files} -constraints { sl@0: macOnly testWriteTextResource sl@0: } -setup { sl@0: set msg2 unset sl@0: set rsrcFile [makeFile {} rsrc.file] sl@0: removeFile rsrc.file sl@0: testWriteTextResource -rsrc rsrcName -file $rsrc.file {set msg2 ok; return} sl@0: } -body { sl@0: set result [catch {source -rsrc rsrcName rsrc.file} msg] sl@0: list $msg2 $result $msg sl@0: } -cleanup { sl@0: removeFile rsrc.file sl@0: } -result [list ok 0 {}] sl@0: sl@0: test source-5.4 {source resource files} -constraints { sl@0: macOnly testWriteTextResource sl@0: } -setup { sl@0: set msg2 unset sl@0: set rsrsFile [makeFile {} rsrc.file] sl@0: removeFile rsrc.file sl@0: testWriteTextResource -rsrc fileRsrcName \ sl@0: -file $rsrcFile {set msg2 ok; return} sl@0: } -body { sl@0: source -rsrc fileRsrcName $rsrcFile sl@0: set result [catch {source -rsrc fileRsrcName} msg] sl@0: list $msg2 $result $msg sl@0: } -cleanup { sl@0: removeFile rsrc.file sl@0: } -result [list ok 1 {The resource "fileRsrcName" could not be loaded from application.}] sl@0: sl@0: test source-5.5 {source resource files} -constraints { sl@0: macOnly testWriteTextResource sl@0: } -setup { sl@0: set msg2 unset sl@0: set rsrcFile [makeFile {} rsrc.file] sl@0: removeFile rsrc.file sl@0: testWriteTextResource -rsrcid 200 \ sl@0: -file $rsrcFile {set msg2 hello; set msg3 bye} sl@0: } -body { sl@0: set result [catch {source -rsrcid 200 $rsrcFile} msg] sl@0: list $msg2 $result $msg sl@0: } -cleanup { sl@0: removeFile rsrc.file sl@0: } -result [list hello 0 bye] sl@0: sl@0: test source-5.6 {source resource files} -constraints { sl@0: macOnly testWriteTextResource sl@0: } -setup { sl@0: set msg2 unset sl@0: set rsrcFile [makeFile {} rsrc.file] sl@0: removeFile rsrc.file sl@0: testWriteTextResource -rsrcid 200 \ sl@0: -file $rsrcFile {set msg2 hello; error bad; set msg3 bye} sl@0: } -body { sl@0: set result [catch {source -rsrcid 200 rsrc.file} msg] sl@0: list $msg2 $result $msg sl@0: } -cleanup { sl@0: removeFile rsrc.file sl@0: } -result [list hello 1 bad] sl@0: sl@0: sl@0: test source-6.1 {source is binary ok} -setup { sl@0: # Note [makeFile] writes in the system encoding. sl@0: # [source] defaults to reading in the system encoding. sl@0: set sourcefile [makeFile [list set x "a b\0c"] source.file] sl@0: } -body { sl@0: set x {} sl@0: source $sourcefile sl@0: string length $x sl@0: } -cleanup { sl@0: removeFile source.file sl@0: } -result 5 sl@0: sl@0: test source-6.2 {source skips everything after Ctrl-Z: Bug 2040} -setup { sl@0: set sourcefile [makeFile "set x ab\32c" source.file] sl@0: } -body { sl@0: set x {} sl@0: source $sourcefile sl@0: string length $x sl@0: } -cleanup { sl@0: removeFile source.file sl@0: } -result 2 sl@0: sl@0: cleanupTests sl@0: } sl@0: namespace delete ::tcl::test::source sl@0: return