diff options
Diffstat (limited to 'tests/source.test')
| -rw-r--r-- | tests/source.test | 386 | 
1 files changed, 250 insertions, 136 deletions
| diff --git a/tests/source.test b/tests/source.test index b245cd0..0235bd1 100644 --- a/tests/source.test +++ b/tests/source.test @@ -6,193 +6,307 @@  #  # Copyright (c) 1991-1993 The Regents of the University of California.  # Copyright (c) 1994-1996 Sun Microsystems, Inc. -# Copyright (c) 1998-1999 by Scriptics Corporation. +# 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.5 1999/06/26 20:55:13 rjohnson Exp $ -if {[lsearch [namespace children] ::tcltest] == -1} { -    package require tcltest -    namespace import ::tcltest::* +if {[catch {package require tcltest 2.1}]} { +    puts stderr "Skipping tests in [info script]. tcltest 2.1 required." +    return  } -test source-1.1 {source command} { +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" -    makeFile { +    set sourcefile [makeFile {  	set x 22  	set y 33  	set z 44 -    } source.file -    source 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 -    source source.file -} result -test source-1.3 {source command} { -    set y {\ } - -    set fd [open source.file w] +} -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 -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 +} -cleanup { +    removeFile source.file +} -result {a b c d e f} -    source source.file -} {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} { -    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 source.file} msg] $msg $errorInfo -} {1 {error in sourced file} {error in sourced file +    } 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) +    (file "*source.file" line 3)      invoked from within -"source source.file"}} -test source-2.4 {source error conditions} { -    makeFile {break} source.file -    catch {source source.file} -} 3 -test source-2.5 {source error conditions} { -    makeFile {continue} source.file -    catch {source source.file} -} 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}}} +"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} { -    makeFile { +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 source.file] +    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 source.file} 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 source.file} 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 source.file"} NONE} -test source-3.4 {return with special code etc.} { -    makeFile { +"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 -    list [catch {source source.file} 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 source.file"} NONE} -test source-3.5 {return with special code etc.} { -    makeFile { +"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 -    list [catch {source source.file} 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 source.file"} {a b c}} +"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 source.file} msg] $msg -} [list 1 "Error reading the file: \"source.file\"."] -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] -    removeFile rsrc.file -    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]     -    removeFile rsrc.file -    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] -    removeFile rsrc.file -    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] -    removeFile rsrc.file -    list $msg2 $result $msg -} [list hello 1 bad] +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} { +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 source.file +    source $sourcefile      string length $x -} 5 - -# cleanup -catch {::tcltest::removeFile source.file} -::tcltest::cleanupTests -return - - - - - - - - - +} -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: | 
